Repository: iberezansky/flip-book-jquery Branch: master Commit: cbc3b2b82f5c Files: 17 Total size: 3.1 MB Directory structure: gitextract_rn_nh3ga/ ├── .gitignore ├── LICENSE ├── README.md ├── css/ │ ├── black-book-view.css │ ├── short-black-book-view.css │ ├── short-white-book-view.css │ └── white-book-view.css ├── dist/ │ └── flip-book.js ├── fonts/ │ └── FontAwesome.otf ├── index.js ├── js/ │ ├── default-book-view.js │ └── pdf.worker.js ├── package.json ├── src/ │ ├── 3dflipbook.js │ └── libs.js ├── templates/ │ └── default-book-view.html └── webpack.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ /node_modules ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, 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 or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's 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 give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the 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 Program 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 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 Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. 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. {description} Copyright (C) {year} {fullname} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; 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. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. {signature of Ty Coon}, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ================================================ FILE: README.md ================================================

3D FlipBook jQuery plugin

3D FlipBook is jQuery plugin that allows to browse images, PDFs or HTMLs as a flipping book. It can be used for demonstration magazines, books, cards, brochures, booklets and much more in natural way. It helps to attract user attention and make more impression on him.

3D FlipBook Demonstration

Start from the live preview.

Main features

Version 1.7

Version 1.6

Version 1.5

Version 1.4

Version 1.3

Version 1.2

Version 1.1

Version 1.0

Details

Realistic view

3D FlipBook allows to create volume book, with page thickness. It is the most exact computer model of a book or a magazine from real world.

The plugin is able to simulate book opening process. Modeled book repeat the same actions as its real prototype: while the cover is opening or closing the internal pages are deforming as it happens in life. The deformation can be customized. You can reduce it or switch off.

Natural behaviour

The plugin is called 3D FlipBook, for sure, it can perform page flipping animation.

But this is very common ability so all typical plugins are able to do it. 3D FlipBook allows to customize the shape of flipping pages but it is still not enough to be unique.

The main feature is using specially designed physics engine that perform all interaction with a user. This engine is based on physics laws so all user actions with the model seems realistic. The plugin allow you drag and throw pages together. The engine solve the collisions and show natural scene.

Physics engine has a lot of properties: gravity, mass, flexibility, page flipping velocities and much more. But it is little necessary to know for using the plugin because all those properties have default presets.

Flexible page corners

The main goal of 3D FlipBook is maximum user friendly. Main key of being friendly is behave in habitual for user way. How are we used to turn pages in books? - of course it is dragging a page while holding a corner! 3D FlipBook is one known 3D plugin that has such feature.

Skins support

Supporting skins makes customization very easy. It is necessary just to choose appropriate skin and that is all. Now there are available skins for light and dark themes - the most universal ones.

Smart pan

3d FlipBook has smart algorithm to show the book in maximum comfortable and appropriate for user way. It automatically chooses book scale and alignment on the screen, disallows user to drag the book out of view port. The pan makes only smooth moves that seems very friendly for user. All these abilities help the book to look richer.

HTML, PDF, images as sources

The plugin can use PDF, images and HTMLs as texture for pages. Supporting HTML format as texture is a new technology no one of other plugins support it. HTML allow easily create interactive books, handle user events, manage plugin behaviour. Using HTML textures is next important step in development web animation.

User behaviour prediction system

The plugin is not just pretty but it is smart. It has user behaviour prediction system. 3D FlipBook tracks user actions and try to predict next necessary pages. In the background it loads predicted pages and renders them. When the user go to next page it is ready to be shown.

3D FlipBook uses priorities for page loading. First of all it loads visible for user pages then predicted ones. It is possible to customize amount of pages to predict and quantity of used by user pages for predicting his behaviour.

User friendly

3D FlipBook is designed to be maximum user friendly. It has familiar to user page flipping control. Flexible corners help user to understand that he can turn the page by means drag and drop technology. Physics engine computes page transforms in similar to real world way. Modeling book is close to natural book - it has the same volume and shape. It is possible to use hard flat covers to create hard bending and use flexible pages, make whole book flexible or flat.

The plugin has specially designed animation of page loading process. It is created automatically for different page colors. 3D FlipBook computes animation colors as inversion of page color. It looks nice for all colors.

3D FlipBook supports fullscreen mode. It is comfortable to watch magazines in this mode, they look like alive.

Sometimes it is useful to change lightning. 3D FlipBook gives to its users such ability. User can change lightning to do it appropriate for him. It is important option for reading long texts.

High performance

The plugin performance does not depend on number of pages because it does not manage single pages. 3D FlipBook works with blocks of pages, it allows to keep in memory just visible for user pages. So if the book is closed then there are 2 or 3 blocks. The first is left cover, the second is right cover and third is internal pages. If the book is opened there can be two blocks for left and right internal pages. There can be more blocks just when the flipping animation is performing. The plugin has no problem with more than 50 simultaneously flipping blocks. When the turn is finished the turned block merges with neighbour block.

For fast rendering 3D graphics 3D FlipBook uses WebGL. WebGL is a API for creating interactive 3D graphics without using plugins.

Interactive

Supporting HTML opens wide abilities for creating interactive books. It allows to use CSS3 and JavaScript, create navigation, use hover effects and much more.

Responsive

3D FlipBook is designed to occupy whole container where you place it. So if the container size changes the plagin recompute its dimensions. So keep the container responsive and plugin will be responsive too.

Easy to use and customize

3D FlipBook is well documented, has a lot of examples and getting started manual. It is easy to start. The plugin supports skins, so it is possible to create own skins or customize style or template files of existing.

The plugin has a lot of customization options (see the documentation). If it is not enough you can edit the project. It is written in modern JavaScript (ES6) object oriented style. Very easy to understand how it works.

How to use

See the example.

Rebuilding

Clone a copy of the main git repo by running: ```bash git clone https://github.com/iberezansky/flip-book-jquery.git ``` Enter the flip-book-jquery-example directory and run the installation: ```bash cd flip-book-jquery && npm install ``` To build debug version: ```bash npm run build-debug ``` To build production version: ```bash npm run build-production ``` ================================================ FILE: css/black-book-view.css ================================================ .flip-book { position: relative; height: 100%; } .flip-book .view { text-align: center; height: 100%; } .flip-book .view .fnav { } .flip-book .view .prev, .flip-book .view .next { position: absolute; top: 50%; transform: translate(0, -50%); z-index: 1; } .flip-book .view .prev { left: 20px; } .flip-book .view .next { right: 20px; } .flip-book .view .fnav a { font-size: 72pt; color: #666; } .flip-book .view .fnav a:hover { cursor: pointer; text-shadow: 0 0 7px #000; } .flip-book .view .fnav a:active { font-size: 70pt; } .flip-book .view .fnav .hidden { display: none; } .flip-book .view .fnav .active { color: #555; } .flip-book .view .fnav .disabled { color: #aaa; } .flip-book .view .fnav .disabled:hover { cursor: not-allowed; text-shadow: none; } .flip-book .view .loading-progress { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .flip-book .view .loading-progress.hidden { display: none; } .flip-book .loading-progress .progress { background-color: #555; background-image: none; width: 50px; height: 50px; margin: 0 auto; border-radius: 30px; padding: 5px; box-shadow: 0px 0px 3px #000; margin-bottom: 10px; } .flip-book .loading-progress .progress::after { content: ' '; display: block; width: 100%; height: 100%; background-size: contain; background-image: url('../images/light-loader.gif'); } .flip-book .page-loading { width: 50px; height: 50px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1; } .flip-book .page-loading.hidden { display: none; } .flip-book .page-loading::after { content: ' '; display: block; width: 100%; height: 100%; background-size: contain; background-image: url('../images/light-loader.gif'); } .flip-book .loading-progress .caption { background-color: #555; border: 1px solid #333; padding: 7px 10px; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 10pt; border-radius: 5px; font-style: italic; color: #eee; } .flip-book .controls { position: absolute; bottom: 0px; width: 100%; } .flip-book .controls .fnavbar { margin: 0 auto; opacity: 0.3; transition: opacity 2s ease-in-out 3s; } .flip-book .controls .fnavbar:hover { opacity: 1; transition: opacity 1s ease; } .ctrl { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; } .ctrl ul { margin: 0; padding: 0; } .ctrl .fnavbar { text-align: center; background-image: linear-gradient(to bottom,#3c3c3c 0,#222 100%); background-repeat: repeat-x; padding: 3px; overflow: visible; background-color: #3c3c3c; } .ctrl .fnavbar a { text-decoration: none; font-size: 14px; } .ctrl .fnavbar .fnav { font-size: 0; display: inline-block; text-align: left; } .ctrl .fnavbar .fnav li{ font-size: 12pt; margin: 0; width: auto; } .ctrl .fnavbar .fnav .fnav-item { display: inline-block; } .ctrl .fnavbar .fnav .hidden { display: none; } .ctrl .fnavbar .fnav .fnav-item>a { padding: 10px; display: inline-block; color: #ccc; } .ctrl .fnavbar .fnav>.active>a { color: #fff; } .ctrl .fnavbar .fnav .fnav-item>a:hover { color: #fff; cursor: pointer; } .ctrl .fnavbar .fnav .fnav-item>a:active { text-shadow: 0 0 2px #fff; } .ctrl .fnavbar .fnav>.disabled>a { color: #888; } .ctrl .fnavbar .fnav>.disabled>a:hover { color: #888; cursor: not-allowed; } .ctrl .fnavbar .fnav>.active { background: #222; } .ctrl .fnavbar .fnav .dropdown, .ctrl .fnavbar .fnav .dropup { position: relative; } .ctrl .fnavbar .fnav .dropdown .menu { top: 100%; box-shadow: 3px 0 3px #222; } .ctrl .fnavbar .fnav .dropdown .caret { display: inline-block; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #ccc; } .ctrl .fnavbar .fnav .dropup .menu { bottom: 100%; box-shadow: 3px 0 3px #222; } .ctrl .fnavbar .fnav .dropup .caret { display: inline-block; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 5px solid #ccc; } .ctrl .fnavbar .menu { position: absolute; border: 1px solid #444; background-color: #222; z-index: 10; min-width: 160px; } .ctrl .fnavbar .menu li { display: block; padding: 5px 10px; } .ctrl .fnavbar .menu .divider { height: 1px; background-color: #444; padding: 0; margin: 5px 0; } .ctrl .fnavbar .menu .active { background-color: #444; } .ctrl .fnavbar .menu .active:hover { /*background-color: #444;*/ } .ctrl .fnavbar .menu li:hover { background-color: #333; cursor: pointer; } .ctrl .fnavbar .menu li a { color: #fff; } .ctrl .fnavbar .menu .disabled a { color: #aaa; cursor: not-allowed; } .ctrl .fnavbar .menu .icon { display: inline-block; width: 14px; height: 14px; text-align: center; } .ctrl .pages { padding: 0 10px; display: inline-block; font-size: 0; } .ctrl .pages .number, .ctrl .pages .amount { width: 50px; height: 20px; text-align: center; display: inline-block; font-size: 11pt; border: 0; color: #000; background-color: #ccc; font-weight: bold; border-radius: 0; margin: 0; padding: 2px; } .ctrl .pages .number { border-top-left-radius: 5px; border-bottom-left-radius: 5px; background-color: #ddd; } .ctrl .pages .amount { border-top-right-radius: 5px; border-bottom-right-radius: 5px; } /* floating window */ .flip-book .float-wnd { position: absolute; top: 10px; left: 10px; border-radius: 5px 5px 0 0; background-color: #1a1a1a; width: 300px; z-index: 1; box-shadow: 3px 0 3px #222; } .flip-book .float-wnd.hidden { display: none; } .flip-book .float-wnd .header { border-radius: 4px 4px 0 0; background-color: #3c3c3c; background-image: linear-gradient(to bottom,#3c3c3c 0,#222 100%); background-repeat: repeat-x; padding: 7px 10px; border: 1px solid #444; border-bottom: none; color: #fff; font-weight: bold; cursor: move; } .flip-book .float-wnd .header .close { top: 5px; right: 8px; font-size: 14px; position: absolute; color: #ccc; } .flip-book .float-wnd .header .close:hover { color: #fff; } .flip-book .float-wnd .header .close:active { font-size: 12px; padding-top: 1px; padding-right: 1px; } .flip-book .float-wnd .body { border: 1px solid #444; border-top: none; } /* toc */ .ctrl .toc { font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; } .ctrl .toc a { text-decoration: none; } .ctrl .toc .hidden { display: none; } .ctrl .toc .toc-menu { padding: 5px 10px; } .ctrl .toc .toc-menu ul { list-style: none; padding: 0; } .ctrl .toc .toc-menu li { display: inline-block; padding-right: 5px; } .ctrl .toc .toc-menu a { color: #ccc; font-size: 14px; } .ctrl .toc .toc-menu a:hover { color: #fff; } .ctrl .toc .toc-menu a:active { text-shadow: 0 0 2px #fff; } .ctrl .toc .toc-menu .active a { color: #fff; } .ctrl .toc .toc-view { padding: 10px 0; max-height: 80vh; overflow-y: auto; overflow-x: hidden; } .ctrl .toc .toc-view::-webkit-scrollbar { width: 7px; height: 7px; } .ctrl .toc .toc-view::-webkit-scrollbar-button { width: 0; height: 0; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb { background: #4a4a4a; border-radius: 2px; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb:hover { background: #3a3a3a; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb:active { background: #5a5a5a; } .ctrl .toc .toc-view::-webkit-scrollbar-track { background: #2a2a2a; border-left: 2px solid #1a1a1a; border-right: 2px solid #1a1a1a; } .ctrl .bookmarks .white-space, .ctrl .bookmarks .togle, .ctrl .bookmarks .togle i { width: 18px; height: 18px; } .ctrl .bookmarks .white-space { display: inline-block; } .ctrl .bookmarks li { width: 10000px; } .ctrl .bookmarks .item .area { padding: 2px 0; } .ctrl .bookmarks .level-0 .area { padding-left: 5px; } .ctrl .bookmarks .level-1 .area { padding-left: 10px; } .ctrl .bookmarks .level-2 .area { padding-left: 15px; } .ctrl .bookmarks .level-3 .area { padding-left: 20px; } .ctrl .bookmarks .level-4 .area { padding-left: 25px; } .ctrl .bookmarks .item .area:hover { background-color: #444; } .ctrl .bookmarks .item .area:active { background-color: #333; } .ctrl .bookmarks .item a { color: #fff; font-size: 14px; } .ctrl .bookmarks ul { list-style: none; padding: 0; } .ctrl .bookmarks .togle { display: inline-block; text-align: center; position: relative; } .ctrl .bookmarks .togle::before { content: ' '; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); border-radius: 50%; border: 0px solid #222; transition: border 0.2s; } .ctrl .bookmarks .togle:active::before { border: 12px solid #222; transition: border 0.05s; } .ctrl .bookmarks .togle i { transform: rotateZ(0deg); transition: transform 0.2s; } .ctrl .bookmarks .togle.minimized i { transform: rotateZ(90deg); transition: transform 0.2s; } .ctrl .thumbnails .item a { color: #fff; font-size: 14px; } .ctrl .thumbnails { padding: 10px 0; text-align: center; } .ctrl .thumbnails .thumbnail { height: 170px; margin-bottom: 5px; background-size: contain; background-repeat: no-repeat; background-position: center; } .ctrl .thumbnails .loading { position: relative; } .ctrl .thumbnails .loading::after { content: ' '; position: absolute; width: 40px; height: 40px; left: 50%; top: 50%; transform: translate(-50%, -50%); background-size: contain; background-image: url('../images/light-loader.gif'); } .ctrl .thumbnails .item { display: inline-block; width: 128px; padding: 5px 5px; border: 1px solid transparent; border-radius: 3px; } .ctrl .thumbnails .item:hover { border: 1px solid #555; background-color: #444; } .ctrl .thumbnails .heading { overflow: hidden; height: 20px; } .ctrl .search .result { padding: 7px 10px; cursor: pointer; } .ctrl .search .result:hover { background-color: #444; } .ctrl .search .results a { color: #fff; font-size: 14px; } .ctrl .search .query { padding: 0 10px; padding-bottom: 10px; } .ctrl .search .query input { width: 100%; } .ctrl .search .status { text-align: center; color: #ccc; font-size: 12px; } ================================================ FILE: css/short-black-book-view.css ================================================ .flip-book { position: relative; height: 100%; } .flip-book .view { text-align: center; height: 100%; } .flip-book .view .fnav { } .flip-book .view .prev, .flip-book .view .next { position: absolute; top: 50%; transform: translate(0, -50%); z-index: 1; } .flip-book .view .prev { left: 20px; } .flip-book .view .next { right: 20px; } .flip-book .view .fnav a { font-size: 72pt; color: #666; } .flip-book .view .fnav a:hover { cursor: pointer; text-shadow: 0 0 7px #000; } .flip-book .view .fnav a:active { font-size: 70pt; } .flip-book .view .fnav .hidden { display: none; } .flip-book .view .fnav .active { color: #555; } .flip-book .view .fnav .disabled { color: #aaa; } .flip-book .view .fnav .disabled:hover { cursor: not-allowed; text-shadow: none; } .flip-book .view .loading-progress { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .flip-book .view .loading-progress.hidden { display: none; } .flip-book .loading-progress .progress { background-color: #555; background-image: none; width: 50px; height: 50px; margin: 0 auto; border-radius: 30px; padding: 5px; box-shadow: 0px 0px 3px #000; margin-bottom: 10px; } .flip-book .loading-progress .progress::after { content: ' '; display: block; width: 100%; height: 100%; background-size: contain; background-image: url('../images/light-loader.gif'); } .flip-book .page-loading { width: 50px; height: 50px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1; } .flip-book .page-loading.hidden { display: none; } .flip-book .page-loading::after { content: ' '; display: block; width: 100%; height: 100%; background-size: contain; background-image: url('../images/light-loader.gif'); } .flip-book .loading-progress .caption { background-color: #555; border: 1px solid #333; padding: 7px 10px; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 10pt; border-radius: 5px; font-style: italic; color: #eee; } .flip-book .controls { position: relative; } .flip-book .controls .fnavbar { margin: 0 auto; opacity: 0.3; transition: opacity 2s ease-in-out 3s; } .flip-book .controls .fnavbar:hover { opacity: 1; transition: opacity 1s ease; } .flip-book .controls .ctrl { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; position: absolute; bottom: 10px; } .ctrl ul { margin: 0; padding: 0; } .ctrl .fnavbar { text-align: center; background-image: linear-gradient(to bottom,#3c3c3c 0,#222 100%); background-repeat: repeat-x; padding: 3px; overflow: visible; background-color: #3c3c3c; border-radius: 4px; } .ctrl .fnavbar a { text-decoration: none; font-size: 14px; } .ctrl .fnavbar .fnav { font-size: 0; display: flex; text-align: left; } .ctrl .fnavbar .fnav li{ font-size: 12pt; margin: 0; width: auto; } .ctrl .fnavbar .fnav .fnav-item { display: inline-block; } .ctrl .fnavbar .fnav .hidden { display: none; } .ctrl .fnavbar .fnav .fnav-item>a { padding: 10px; display: inline-block; color: #ccc; } .ctrl .fnavbar .fnav>.active>a { color: #fff; } .ctrl .fnavbar .fnav .fnav-item>a:hover { color: #fff; cursor: pointer; } .ctrl .fnavbar .fnav .fnav-item>a:active { text-shadow: 0 0 2px #fff; } .ctrl .fnavbar .fnav>.disabled>a { color: #888; } .ctrl .fnavbar .fnav>.disabled>a:hover { color: #888; cursor: not-allowed; } .ctrl .fnavbar .fnav>.active { background: #222; } .ctrl .fnavbar .fnav .dropdown, .ctrl .fnavbar .fnav .dropup { position: relative; } .ctrl .fnavbar .fnav .dropdown .menu { top: 100%; box-shadow: 3px 0 3px #222; } .ctrl .fnavbar .fnav .icon-caret { width: 26px; display: inline-block; } .ctrl .fnavbar .fnav .dropdown .caret { display: inline-block; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #ccc; } .ctrl .fnavbar .fnav .dropup .menu { bottom: 100%; box-shadow: 3px 0 3px #222; } .ctrl .fnavbar .fnav .dropup .caret { display: inline-block; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 5px solid #ccc; } .ctrl .fnavbar .menu { position: absolute; border: 1px solid #444; background-color: #222; z-index: 10; min-width: 160px; } .ctrl .fnavbar .menu li { display: block; padding: 5px 10px; } .ctrl .fnavbar .menu .divider { height: 1px; background-color: #444; padding: 0; margin: 5px 0; } .ctrl .fnavbar .menu .active { background-color: #444; } .ctrl .fnavbar .menu .active:hover { /*background-color: #444;*/ } .ctrl .fnavbar .menu li:hover { background-color: #333; cursor: pointer; } .ctrl .fnavbar .menu li a { color: #fff; } .ctrl .fnavbar .menu .disabled a { color: #aaa; cursor: not-allowed; } .ctrl .fnavbar .menu .icon { display: inline-block; width: 14px; height: 14px; text-align: center; } .ctrl .pages { padding: 8px 10px; display: flex; font-size: 0; } .ctrl .pages .number, .ctrl .pages .amount { width: 50px; height: 20px; text-align: center; display: inline-block; font-size: 11pt; border: 0; color: #000; background-color: #ccc; font-weight: bold; border-radius: 0; margin: 0; padding: 2px; } .ctrl .pages .number { border-top-left-radius: 5px; border-bottom-left-radius: 5px; background-color: #ddd; } .ctrl .pages .amount { border-top-right-radius: 5px; border-bottom-right-radius: 5px; } /* floating window */ .flip-book .float-wnd { position: absolute; top: 10px; left: 10px; border-radius: 5px 5px 0 0; background-color: #1a1a1a; width: 300px; z-index: 1; box-shadow: 3px 0 3px #222; } .flip-book .float-wnd.hidden { display: none; } .flip-book .float-wnd .header { border-radius: 4px 4px 0 0; background-color: #3c3c3c; background-image: linear-gradient(to bottom,#3c3c3c 0,#222 100%); background-repeat: repeat-x; padding: 7px 10px; border: 1px solid #444; border-bottom: none; color: #fff; font-weight: bold; cursor: move; } .flip-book .float-wnd .header .close { top: 5px; right: 8px; font-size: 14px; position: absolute; color: #ccc; } .flip-book .float-wnd .header .close:hover { color: #fff; } .flip-book .float-wnd .header .close:active { font-size: 12px; padding-top: 1px; padding-right: 1px; } .flip-book .float-wnd .body { border: 1px solid #444; border-top: none; } /* toc */ .ctrl .toc { font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; } .ctrl .toc a { text-decoration: none; } .ctrl .toc .hidden { display: none; } .ctrl .toc .toc-menu { padding: 5px 10px; } .ctrl .toc .toc-menu ul { list-style: none; padding: 0; } .ctrl .toc .toc-menu li { display: inline-block; padding-right: 5px; } .ctrl .toc .toc-menu a { color: #ccc; font-size: 14px; } .ctrl .toc .toc-menu a:hover { color: #fff; } .ctrl .toc .toc-menu a:active { text-shadow: 0 0 2px #fff; } .ctrl .toc .toc-menu .active a { color: #fff; } .ctrl .toc .toc-view { padding: 10px 0; max-height: 80vh; overflow-y: auto; overflow-x: hidden; } .ctrl .toc .toc-view::-webkit-scrollbar { width: 7px; height: 7px; } .ctrl .toc .toc-view::-webkit-scrollbar-button { width: 0; height: 0; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb { background: #4a4a4a; border-radius: 2px; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb:hover { background: #3a3a3a; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb:active { background: #5a5a5a; } .ctrl .toc .toc-view::-webkit-scrollbar-track { background: #2a2a2a; border-left: 2px solid #1a1a1a; border-right: 2px solid #1a1a1a; } .ctrl .bookmarks .white-space, .ctrl .bookmarks .togle, .ctrl .bookmarks .togle i { width: 18px; height: 18px; } .ctrl .bookmarks .white-space { display: inline-block; } .ctrl .bookmarks li { width: 10000px; } .ctrl .bookmarks .item .area { padding: 2px 0; } .ctrl .bookmarks .level-0 .area { padding-left: 5px; } .ctrl .bookmarks .level-1 .area { padding-left: 10px; } .ctrl .bookmarks .level-2 .area { padding-left: 15px; } .ctrl .bookmarks .level-3 .area { padding-left: 20px; } .ctrl .bookmarks .level-4 .area { padding-left: 25px; } .ctrl .bookmarks .item .area:hover { background-color: #444; } .ctrl .bookmarks .item .area:active { background-color: #333; } .ctrl .bookmarks .item a { color: #fff; font-size: 14px; } .ctrl .bookmarks ul { list-style: none; padding: 0; } .ctrl .bookmarks .togle { display: inline-block; text-align: center; position: relative; } .ctrl .bookmarks .togle::before { content: ' '; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); border-radius: 50%; border: 0px solid #222; transition: border 0.2s; } .ctrl .bookmarks .togle:active::before { border: 12px solid #222; transition: border 0.05s; } .ctrl .bookmarks .togle i { transform: rotateZ(0deg); transition: transform 0.2s; } .ctrl .bookmarks .togle.minimized i { transform: rotateZ(90deg); transition: transform 0.2s; } .ctrl .thumbnails .item a { color: #fff; font-size: 14px; } .ctrl .thumbnails { padding: 10px 0; text-align: center; } .ctrl .thumbnails .thumbnail { height: 170px; margin-bottom: 5px; background-size: contain; background-repeat: no-repeat; background-position: center; } .ctrl .thumbnails .loading { position: relative; } .ctrl .thumbnails .loading::after { content: ' '; position: absolute; width: 40px; height: 40px; left: 50%; top: 50%; transform: translate(-50%, -50%); background-size: contain; background-image: url('../images/light-loader.gif'); } .ctrl .thumbnails .item { display: inline-block; width: 128px; padding: 5px 5px; border: 1px solid transparent; border-radius: 3px; } .ctrl .thumbnails .item:hover { border: 1px solid #555; background-color: #444; } .ctrl .thumbnails .heading { overflow: hidden; height: 20px; } .ctrl .search .result { padding: 7px 10px; cursor: pointer; } .ctrl .search .result:hover { background-color: #444; } .ctrl .search .results a { color: #fff; font-size: 14px; } .ctrl .search .query { padding: 0 10px; padding-bottom: 10px; } .ctrl .search .query input { width: 100%; } .ctrl .search .status { text-align: center; color: #ccc; font-size: 12px; } ================================================ FILE: css/short-white-book-view.css ================================================ .flip-book { position: relative; height: 100%; } .flip-book .view { position: relative; height: 100%; } .flip-book .view .fnav { } .flip-book .view .prev, .flip-book .view .next { position: absolute; top: 50%; transform: translate(0, -50%); z-index: 1; } .flip-book .view .prev { left: 20px; } .flip-book .view .next { right: 20px; } .flip-book .view .fnav a { font-size: 72pt; color: #ccc; } .flip-book .view .fnav a:hover { cursor: pointer; text-shadow: 0 0 7px #fff; } .flip-book .view .fnav a:active { font-size: 70pt; } .flip-book .view .fnav .hidden { display: none; } .flip-book .view .fnav .active { color: #ddd; } .flip-book .view .fnav .disabled { color: #888; } .flip-book .view .fnav .disabled:hover { cursor: not-allowed; text-shadow: none; } .flip-book .view .loading-progress { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .flip-book .view .loading-progress.hidden { display: none; } .flip-book .loading-progress .progress { background-color: #eee; background-image: none; width: 50px; height: 50px; margin: 0 auto; border-radius: 30px; padding: 5px; box-shadow: 0px 0px 3px #fff; margin-bottom: 10px; } .flip-book .loading-progress .progress::after { content: ' '; display: block; width: 100%; height: 100%; background-size: contain; background-image: url('../images/dark-loader.gif'); } .flip-book .page-loading { width: 50px; height: 50px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1; } .flip-book .page-loading.hidden { display: none; } .flip-book .page-loading::after { content: ' '; display: block; width: 100%; height: 100%; background-size: contain; background-image: url('../images/dark-loader.gif'); } .flip-book .loading-progress .caption { background-color: #eee; border: 1px solid #fff; padding: 7px 10px; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 10pt; border-radius: 5px; font-style: italic; color: #111; } .flip-book .controls { position: relative; } .flip-book .controls .fnavbar { margin: 0 auto; opacity: 0.3; transition: opacity 2s ease-in-out 3s; } .flip-book .controls .fnavbar:hover { opacity: 1; transition: opacity 1s ease; } .flip-book .controls .ctrl { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; position: absolute; bottom: 10px; } .ctrl ul { margin: 0; padding: 0; } .ctrl .fnavbar { background-image: linear-gradient(to bottom,#fff 0,#f8f8f8 100%); background-repeat: repeat-x; padding: 3px; overflow: visible; background-color: #f8f8f8; border-radius: 4px; } .ctrl .fnavbar a { text-decoration: none; font-size: 14px; } .ctrl .fnavbar .fnav { font-size: 0; display: flex; text-align: left; } .ctrl .fnavbar .fnav li{ font-size: 12pt; margin: 0; width: auto; } .ctrl .fnavbar .fnav .fnav-item { display: inline-block; } .ctrl .fnavbar .fnav .hidden { display: none; } .ctrl .fnavbar .fnav .fnav-item>a { padding: 10px; display: inline-block; color: #777; } .ctrl .fnavbar .fnav>.active>a { color: #000; } .ctrl .fnavbar .fnav .fnav-item>a:hover { color: #000; cursor: pointer; } .ctrl .fnavbar .fnav .fnav-item>a:active { text-shadow: 0 0 1px #000; } .ctrl .fnavbar .fnav>.disabled>a { color: #aaa; } .ctrl .fnavbar .fnav>.disabled>a:hover { color: #aaa; cursor: not-allowed; } .ctrl .fnavbar .fnav>.active { background: #fff; } .ctrl .fnavbar .fnav .dropdown, .ctrl .fnavbar .fnav .dropup { position: relative; } .ctrl .fnavbar .fnav .dropdown .menu { top: 100%; box-shadow: 3px 0 3px #ddd; } .ctrl .fnavbar .fnav .icon-caret { width: 26px; display: inline-block; } .ctrl .fnavbar .fnav .dropdown .caret { display: inline-block; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #777; } .ctrl .fnavbar .fnav .dropup .menu { bottom: 100%; box-shadow: 3px 0 3px #ddd; } .ctrl .fnavbar .fnav .dropup .caret { display: inline-block; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 5px solid #777; } .ctrl .fnavbar .menu { position: absolute; border: 1px solid #ddd; background-color: #fff; z-index: 10; min-width: 160px; } .ctrl .fnavbar .menu li { display: block; padding: 5px 10px; } .ctrl .fnavbar .menu .divider { height: 1px; background-color: #ddd; padding: 0; margin: 5px 0; } .ctrl .fnavbar .menu .active { background-color: #e0e0e0; } .ctrl .fnavbar .menu .active:hover { /*background-color: #e0e0e0;*/ } .ctrl .fnavbar .menu li:hover { background-color: #eee; cursor: pointer; } .ctrl .fnavbar .menu li a { color: #000; } .ctrl .fnavbar .menu .disabled a { color: #777; cursor: not-allowed; } .ctrl .fnavbar .menu .icon { display: inline-block; width: 14px; height: 14px; text-align: center; } .ctrl .pages { padding: 8px 10px; display: flex; font-size: 0; } .ctrl .pages .number, .ctrl .pages .amount { width: 50px; height: 20px; text-align: center; display: inline-block; font-size: 11pt; border: 0; color: #fff; background-color: #444; font-weight: bold; border-radius: 0; margin: 0; padding: 2px; } .ctrl .pages .number { border-top-left-radius: 5px; border-bottom-left-radius: 5px; background-color: #000; } .ctrl .pages .amount { border-top-right-radius: 5px; border-bottom-right-radius: 5px; } /* floating window */ .flip-book .float-wnd { position: absolute; top: 10px; left: 10px; border-radius: 5px 5px 0 0; background-color: #fff; width: 300px; z-index: 1; box-shadow: 3px 0 3px #ddd; } .flip-book .float-wnd.hidden { display: none; } .flip-book .float-wnd .header { border-radius: 4px 4px 0 0; background-color: #fff; background-image: linear-gradient(to bottom,#fff 0,#f8f8f8 100%); background-repeat: repeat-x; padding: 7px 10px; border: 1px solid #ddd; border-bottom: none; font-weight: bold; cursor: move; } .flip-book .float-wnd .header .close { top: 5px; right: 8px; font-size: 14px; position: absolute; color: #777; } .flip-book .float-wnd .header .close:hover { color: #000; } .flip-book .float-wnd .header .close:active { font-size: 12px; padding-top: 1px; padding-right: 1px; } .flip-book .float-wnd .body { border: 1px solid #ddd; border-top: none; } /* toc */ .ctrl .toc { font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; } .ctrl .toc a { text-decoration: none; } .ctrl .toc .hidden { display: none; } .ctrl .toc .toc-menu { padding: 5px 10px; } .ctrl .toc .toc-menu ul { list-style: none; padding: 0; } .ctrl .toc .toc-menu li { display: inline-block; padding-right: 5px; } .ctrl .toc .toc-menu a { color: #777; font-size: 14px; } .ctrl .toc .toc-menu a:hover { color: #000; } .ctrl .toc .toc-menu a:active { text-shadow: 0 0 1px rgba(0,0,0,0.3); } .ctrl .toc .toc-menu .active a { color: #000; } .ctrl .toc .toc-view { padding: 10px 0; max-height: 80vh; overflow-y: auto; overflow-x: hidden; } .ctrl .toc .toc-view::-webkit-scrollbar { width: 7px; height: 7px; } .ctrl .toc .toc-view::-webkit-scrollbar-button { width: 0; height: 0; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb { background: #ccc; border-radius: 2px; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb:hover { background: #ddd; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb:active { background: #bbb; } .ctrl .toc .toc-view::-webkit-scrollbar-track { background: #eee; border-left: 2px solid #fff; border-right: 2px solid #fff; } .ctrl .bookmarks .white-space, .ctrl .bookmarks .togle, .ctrl .bookmarks .togle i { width: 18px; height: 18px; } .ctrl .bookmarks .white-space { display: inline-block; } .ctrl .bookmarks li { width: 10000px; } .ctrl .bookmarks .item .area { padding: 2px 0; } .ctrl .bookmarks .level-0 .area { padding-left: 5px; } .ctrl .bookmarks .level-1 .area { padding-left: 10px; } .ctrl .bookmarks .level-2 .area { padding-left: 15px; } .ctrl .bookmarks .level-3 .area { padding-left: 20px; } .ctrl .bookmarks .level-4 .area { padding-left: 25px; } .ctrl .bookmarks .item .area:hover { background-color: #eee; } .ctrl .bookmarks .item .area:active { background-color: #e0e0e0; } .ctrl .bookmarks .item a { color: #000; font-size: 14px; } .ctrl .bookmarks ul { list-style: none; padding: 0; } .ctrl .bookmarks .togle { display: inline-block; text-align: center; position: relative; } .ctrl .bookmarks .togle::before { content: ' '; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); border-radius: 50%; border: 0px solid #f5f5f5; transition: border 0.2s; } .ctrl .bookmarks .togle:active::before { border: 12px solid #f5f5f5; transition: border 0.05s; } .ctrl .bookmarks .togle i { transform: rotateZ(0deg); transition: transform 0.2s; } .ctrl .bookmarks .togle.minimized i { transform: rotateZ(90deg); transition: transform 0.2s; } .ctrl .thumbnails .item a { color: #000; font-size: 14px; } .ctrl .thumbnails { padding: 10px 0; text-align: center; } .ctrl .thumbnails .thumbnail { height: 170px; margin-bottom: 5px; background-size: contain; background-repeat: no-repeat; background-position: center; } .ctrl .thumbnails .loading { position: relative; } .ctrl .thumbnails .loading::after { content: ' '; position: absolute; width: 40px; height: 40px; left: 50%; top: 50%; transform: translate(-50%, -50%); background-size: contain; background-image: url('../images/dark-loader.gif'); } .ctrl .thumbnails .item { display: inline-block; width: 128px; padding: 5px 5px; border: 1px solid transparent; border-radius: 3px; } .ctrl .thumbnails .item:hover { border: 1px solid #ddd; background-color: #eee; } .ctrl .thumbnails .heading { overflow: hidden; height: 20px; } .ctrl .search .result { padding: 7px 10px; cursor: pointer; } .ctrl .search .result:hover { background-color: #ddd; } .ctrl .search .results a { color: #000; font-size: 14px; } .ctrl .search .query { padding: 0 10px; padding-bottom: 10px; } .ctrl .search .query input { width: 100%; } .ctrl .search .status { text-align: center; color: #333; font-size: 12px; } ================================================ FILE: css/white-book-view.css ================================================ .flip-book { position: relative; height: 100%; } .flip-book .view { text-align: center; height: 100%; } .flip-book .view .fnav { } .flip-book .view .prev, .flip-book .view .next { position: absolute; top: 50%; transform: translate(0, -50%); z-index: 1; } .flip-book .view .prev { left: 20px; } .flip-book .view .next { right: 20px; } .flip-book .view .fnav a { font-size: 72pt; color: #ccc; } .flip-book .view .fnav a:hover { cursor: pointer; text-shadow: 0 0 7px #fff; } .flip-book .view .fnav a:active { font-size: 70pt; } .flip-book .view .fnav .hidden { display: none; } .flip-book .view .fnav .active { color: #ddd; } .flip-book .view .fnav .disabled { color: #888; } .flip-book .view .fnav .disabled:hover { cursor: not-allowed; text-shadow: none; } .flip-book .view .loading-progress { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .flip-book .view .loading-progress.hidden { display: none; } .flip-book .loading-progress .progress { background-color: #eee; background-image: none; width: 50px; height: 50px; margin: 0 auto; border-radius: 30px; padding: 5px; box-shadow: 0px 0px 3px #fff; margin-bottom: 10px; } .flip-book .loading-progress .progress::after { content: ' '; display: block; width: 100%; height: 100%; background-size: contain; background-image: url('../images/dark-loader.gif'); } .flip-book .page-loading { width: 50px; height: 50px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 1; } .flip-book .page-loading.hidden { display: none; } .flip-book .page-loading::after { content: ' '; display: block; width: 100%; height: 100%; background-size: contain; background-image: url('../images/dark-loader.gif'); } .flip-book .loading-progress .caption { background-color: #eee; border: 1px solid #fff; padding: 7px 10px; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 10pt; border-radius: 5px; font-style: italic; color: #111; } .flip-book .controls { position: absolute; bottom: 0px; width: 100%; } .flip-book .controls .fnavbar { margin: 0 auto; opacity: 0.3; transition: opacity 2s ease-in-out 3s; } .flip-book .controls .fnavbar:hover { opacity: 1; transition: opacity 1s ease; } .ctrl { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; } .ctrl ul { margin: 0; padding: 0; } .ctrl .fnavbar { text-align: center; background-image: linear-gradient(to bottom,#fff 0,#f8f8f8 100%); background-repeat: repeat-x; padding: 3px; overflow: visible; background-color: #f8f8f8; } .ctrl .fnavbar a { text-decoration: none; font-size: 14px; } .ctrl .fnavbar .fnav { font-size: 0; display: inline-block; text-align: left; } .ctrl .fnavbar .fnav li{ font-size: 12pt; margin: 0; width: auto; } .ctrl .fnavbar .fnav .fnav-item { display: inline-block; } .ctrl .fnavbar .fnav .hidden { display: none; } .ctrl .fnavbar .fnav .fnav-item>a { padding: 10px; display: inline-block; color: #777; } .ctrl .fnavbar .fnav>.active>a { color: #000; } .ctrl .fnavbar .fnav .fnav-item>a:hover { color: #000; cursor: pointer; } .ctrl .fnavbar .fnav .fnav-item>a:active { text-shadow: 0 0 1px #000; } .ctrl .fnavbar .fnav>.disabled>a { color: #aaa; } .ctrl .fnavbar .fnav>.disabled>a:hover { color: #aaa; cursor: not-allowed; } .ctrl .fnavbar .fnav>.active { background: #fff; } .ctrl .fnavbar .fnav .dropdown, .ctrl .fnavbar .fnav .dropup { position: relative; } .ctrl .fnavbar .fnav .dropdown .menu { top: 100%; box-shadow: 3px 0 3px #ddd; } .ctrl .fnavbar .fnav .dropdown .caret { display: inline-block; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #777; } .ctrl .fnavbar .fnav .dropup .menu { bottom: 100%; box-shadow: 3px 0 3px #ddd; } .ctrl .fnavbar .fnav .dropup .caret { display: inline-block; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 5px solid #777; } .ctrl .fnavbar .menu { position: absolute; border: 1px solid #ddd; background-color: #fff; z-index: 10; min-width: 160px; } .ctrl .fnavbar .menu li { display: block; padding: 5px 10px; } .ctrl .fnavbar .menu .divider { height: 1px; background-color: #ddd; padding: 0; margin: 5px 0; } .ctrl .fnavbar .menu .active { background-color: #e0e0e0; } .ctrl .fnavbar .menu .active:hover { /*background-color: #e0e0e0;*/ } .ctrl .fnavbar .menu li:hover { background-color: #eee; cursor: pointer; } .ctrl .fnavbar .menu li a { color: #000; } .ctrl .fnavbar .menu .disabled a { color: #777; cursor: not-allowed; } .ctrl .fnavbar .menu .icon { display: inline-block; width: 14px; height: 14px; text-align: center; } .ctrl .pages { padding: 0 10px; display: inline-block; font-size: 0; } .ctrl .pages .number, .ctrl .pages .amount { width: 50px; height: 20px; text-align: center; display: inline-block; font-size: 11pt; border: 0; color: #fff; background-color: #444; font-weight: bold; border-radius: 0; margin: 0; padding: 2px; } .ctrl .pages .number { border-top-left-radius: 5px; border-bottom-left-radius: 5px; background-color: #000; } .ctrl .pages .amount { border-top-right-radius: 5px; border-bottom-right-radius: 5px; } /* floating window */ .flip-book .float-wnd { position: absolute; top: 10px; left: 10px; border-radius: 5px 5px 0 0; background-color: #fff; width: 300px; z-index: 1; box-shadow: 3px 0 3px #ddd; } .flip-book .float-wnd.hidden { display: none; } .flip-book .float-wnd .header { border-radius: 4px 4px 0 0; background-color: #fff; background-image: linear-gradient(to bottom,#fff 0,#f8f8f8 100%); background-repeat: repeat-x; padding: 7px 10px; border: 1px solid #ddd; border-bottom: none; font-weight: bold; cursor: move; } .flip-book .float-wnd .header .close { top: 5px; right: 8px; font-size: 14px; position: absolute; color: #777; } .flip-book .float-wnd .header .close:hover { color: #000; } .flip-book .float-wnd .header .close:active { font-size: 12px; padding-top: 1px; padding-right: 1px; } .flip-book .float-wnd .body { border: 1px solid #ddd; border-top: none; } /* toc */ .ctrl .toc { font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; } .ctrl .toc a { text-decoration: none; } .ctrl .toc .hidden { display: none; } .ctrl .toc .toc-menu { padding: 5px 10px; } .ctrl .toc .toc-menu ul { list-style: none; padding: 0; } .ctrl .toc .toc-menu li { display: inline-block; padding-right: 5px; } .ctrl .toc .toc-menu a { color: #777; font-size: 14px; } .ctrl .toc .toc-menu a:hover { color: #000; } .ctrl .toc .toc-menu a:active { text-shadow: 0 0 1px rgba(0,0,0,0.3); } .ctrl .toc .toc-menu .active a { color: #000; } .ctrl .toc .toc-view { padding: 10px 0; max-height: 80vh; overflow-y: auto; overflow-x: hidden; } .ctrl .toc .toc-view::-webkit-scrollbar { width: 7px; height: 7px; } .ctrl .toc .toc-view::-webkit-scrollbar-button { width: 0; height: 0; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb { background: #ccc; border-radius: 2px; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb:hover { background: #ddd; } .ctrl .toc .toc-view::-webkit-scrollbar-thumb:active { background: #bbb; } .ctrl .toc .toc-view::-webkit-scrollbar-track { background: #eee; border-left: 2px solid #fff; border-right: 2px solid #fff; } .ctrl .bookmarks .white-space, .ctrl .bookmarks .togle, .ctrl .bookmarks .togle i { width: 18px; height: 18px; } .ctrl .bookmarks .white-space { display: inline-block; } .ctrl .bookmarks li { width: 10000px; } .ctrl .bookmarks .item .area { padding: 2px 0; } .ctrl .bookmarks .level-0 .area { padding-left: 5px; } .ctrl .bookmarks .level-1 .area { padding-left: 10px; } .ctrl .bookmarks .level-2 .area { padding-left: 15px; } .ctrl .bookmarks .level-3 .area { padding-left: 20px; } .ctrl .bookmarks .level-4 .area { padding-left: 25px; } .ctrl .bookmarks .item .area:hover { background-color: #eee; } .ctrl .bookmarks .item .area:active { background-color: #e0e0e0; } .ctrl .bookmarks .item a { color: #000; font-size: 14px; } .ctrl .bookmarks ul { list-style: none; padding: 0; } .ctrl .bookmarks .togle { display: inline-block; text-align: center; position: relative; } .ctrl .bookmarks .togle::before { content: ' '; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); border-radius: 50%; border: 0px solid #f5f5f5; transition: border 0.2s; } .ctrl .bookmarks .togle:active::before { border: 12px solid #f5f5f5; transition: border 0.05s; } .ctrl .bookmarks .togle i { transform: rotateZ(0deg); transition: transform 0.2s; } .ctrl .bookmarks .togle.minimized i { transform: rotateZ(90deg); transition: transform 0.2s; } .ctrl .thumbnails .item a { color: #000; font-size: 14px; } .ctrl .thumbnails { padding: 10px 0; text-align: center; } .ctrl .thumbnails .thumbnail { height: 170px; margin-bottom: 5px; background-size: contain; background-repeat: no-repeat; background-position: center; } .ctrl .thumbnails .loading { position: relative; } .ctrl .thumbnails .loading::after { content: ' '; position: absolute; width: 40px; height: 40px; left: 50%; top: 50%; transform: translate(-50%, -50%); background-size: contain; background-image: url('../images/dark-loader.gif'); } .ctrl .thumbnails .item { display: inline-block; width: 128px; padding: 5px 5px; border: 1px solid transparent; border-radius: 3px; } .ctrl .thumbnails .item:hover { border: 1px solid #ddd; background-color: #eee; } .ctrl .thumbnails .heading { overflow: hidden; height: 20px; } .ctrl .search .result { padding: 7px 10px; cursor: pointer; } .ctrl .search .result:hover { background-color: #ddd; } .ctrl .search .results a { color: #000; font-size: 14px; } .ctrl .search .query { padding: 0 10px; padding-bottom: 10px; } .ctrl .search .query input { width: 100%; } .ctrl .search .status { text-align: center; color: #333; font-size: 12px; } ================================================ FILE: dist/flip-book.js ================================================ /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 3); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _libs = __webpack_require__(2); __webpack_require__(1); exports.default = _libs.$; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /******/(function (modules) { // webpackBootstrap /******/ // The module cache /******/var installedModules = {}; /******/ /******/ // The require function /******/function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/if (installedModules[moduleId]) /******/return installedModules[moduleId].exports; /******/ /******/ // Create a new module (and put it into the cache) /******/var module = installedModules[moduleId] = { /******/i: moduleId, /******/l: false, /******/exports: {} /******/ }; /******/ /******/ // Execute the module function /******/modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/module.l = true; /******/ /******/ // Return the exports of the module /******/return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/__webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/__webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/__webpack_require__.i = function (value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/__webpack_require__.d = function (exports, name, getter) { /******/if (!__webpack_require__.o(exports, name)) { /******/Object.defineProperty(exports, name, { /******/configurable: false, /******/enumerable: true, /******/get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/__webpack_require__.n = function (module) { /******/var getter = module && module.__esModule ? /******/function getDefault() { return module['default']; } : /******/function getModuleExports() { return module; }; /******/__webpack_require__.d(getter, 'a', getter); /******/return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/__webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/return __webpack_require__(__webpack_require__.s = 72); /******/ })( /************************************************************************/ /******/[ /* 0 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _$ = true ? window.jQuery : require('jquery'), _html2canvas = true ? window.html2canvas : require('html2canvas'), _THREE = true ? window.THREE : require('three'), _React = true ? window.React : require('react'), _ReactDOM = true ? window.ReactDOM : require('react-dom'), _PDFJS = true ? window.PDFJS : require('pdfjs'), _tr = function _tr(s) { return (window.iberezansky || {}).tr && window.iberezansky.tr(s) || s; }; exports.$ = _$; exports.html2canvas = _html2canvas; exports.THREE = _THREE; exports.React = _React; exports.ReactDOM = _ReactDOM; exports.PDFJS = _PDFJS; exports.tr = _tr; /***/ }, /* 1 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _$ = true ? window.jQuery : require('jquery'), _html2canvas = true ? window.html2canvas : require('html2canvas'), _THREE = true ? window.THREE : require('three'), _PDFJS = true ? window.PDFJS : require('pdfjs'), _tr = function _tr(s) { return (window.iberezansky || {}).tr && window.iberezansky.tr(s) || s; }; if (window.FB3D_LOCALE) { window.iberezansky = _extends({}, window.iberezansky, { tr: function tr(s) { return (FB3D_LOCALE.dictionary || {})[s] || s; } }); } exports.$ = _$; exports.html2canvas = _html2canvas; exports.THREE = _THREE; exports.PDFJS = _PDFJS; exports.tr = _tr; /***/ }, /* 2 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var BaseMathUtils = function () { function BaseMathUtils() { _classCallCheck(this, BaseMathUtils); } BaseMathUtils.sum1 = function sum1(ka, a, kb, b) { return [ka * a[0] + kb * b[0]]; }; BaseMathUtils.sum2 = function sum2(ka, a, kb, b) { return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1]]; }; BaseMathUtils.sum3 = function sum3(ka, a, kb, b) { return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1], ka * a[2] + kb * b[2]]; }; BaseMathUtils.sum4 = function sum4(ka, a, kb, b) { return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1], ka * a[2] + kb * b[2], ka * a[3] + kb * b[3]]; }; BaseMathUtils.rk4 = function rk4(dy, t, dt, y) { var sum = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : BaseMathUtils.sum[y.length - 1]; var k1 = dy(t, y), k2 = dy(t + dt / 2, sum(1, y, dt / 2, k1)), k3 = dy(t + dt / 2, sum(1, y, dt / 2, k2)), k4 = dy(t + dt, sum(1, y, dt, k3)); return sum(1, y, dt / 6, sum(1, sum(1, k1, 2, k2), 1, sum(2, k3, 1, k4))); }; BaseMathUtils.extrapolateLinear = function extrapolateLinear(x, y, xi) { return y[0] + (y[1] - y[0]) / (x[1] - x[0]) * (xi - x[0]); }; BaseMathUtils.interpolateLinear = function interpolateLinear(x, y, xi) { var yi = void 0; if (x[0] > x[1]) { x = x.reverse(); y = y.reverse(); } if (xi < x[0]) { yi = y[0]; } else if (xi > x[1]) { yi = y[1]; } else { yi = BaseMathUtils.extrapolateLinear(x, y, xi); } return yi; }; BaseMathUtils.calcScale = function calcScale(srcW, srcH, dstW, dstH) { return Math.min(dstW / srcW, dstH / srcH); }; BaseMathUtils.mulM = function mulM(a, b) { var r = []; for (var i = 0; i < a.length; ++i) { r.push([]); for (var j = 0; j < b[0].length; ++j) { r[i][j] = 0; for (var k = 0; k < b.length; ++k) { r[i][j] += a[i][k] * b[k][j]; } } } return r; }; BaseMathUtils.transM = function transM(m) { var r = []; for (var i = 0; i < m.length; ++i) { for (var j = 0; j < m[0].length; ++j) { if (!r[j]) { r[j] = []; } r[j][i] = m[i][j]; } } return r; }; BaseMathUtils.mat = function mat(data) { var s = 0; for (var _iterator = data, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var x = _ref; s += x; } return s / data.length; }; BaseMathUtils.disp = function disp(data) { var M = BaseMathUtils.mat(data); var s = 0; for (var _iterator2 = data, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var x = _ref2; s += (x - M) * (x - M); } return s / data.length; }; BaseMathUtils.predict = function predict(data, num) { var r = [], l = data.length, D = BaseMathUtils.disp(data); if (D < l && l > 1) { var am = [], bm = []; for (var i = 0; i < l; ++i) { am.push([i, 1]); bm.push([data[i]]); } var ta = BaseMathUtils.transM(am), a = BaseMathUtils.mulM(ta, am), b = BaseMathUtils.mulM(ta, bm), d = a[0][0] * a[1][1] - a[1][0] * a[0][1], p = [-(a[0][1] * b[1][0] - b[0][0] * a[1][1]) / d, (a[0][0] * b[1][0] - a[1][0] * b[0][0]) / d]; for (var _i3 = 0; _i3 < num; ++_i3) { var v = Math.round(p[0] * (_i3 + l) + p[1]); if (r.indexOf(v) === -1) { r.push(v); } } } return r; }; BaseMathUtils.getUnique = function getUnique() { return Math.ceil(1e9 * Math.random()); }; BaseMathUtils.setSplinePoints = function setSplinePoints(spline, ps) { if (spline.points.length !== ps.x.length) { console.warn('setSplinePoints: bad points'); } for (var i = 0; i < spline.points.length; ++i) { spline.points[i].set(ps.x[i], ps.y[i], ps.z ? ps.z[i] : 0); } }; BaseMathUtils.mapl2L = function mapl2L(ls, len, n, f) { var dL = len / (n - 1); var L = 0; for (var i = 0, d = ls[0]; i < ls.length - 1 && L < len + 0.1 * dL; ++i, d += ls[i]) { if (Math.abs(L - d) < Math.abs(L - d - ls[i + 1])) { f(i, L); L += dL; } } if (L < len + 0.1 * dL) { console.warn('mapl2L: ls is not enought'); } }; BaseMathUtils.det2 = function det2(a, b, c, d) { return a * d - b * c; }; BaseMathUtils.solve2Lin = function solve2Lin(a1, b1, a2, b2) { var res = void 0; var d = BaseMathUtils.det2(a1[0], a1[1], a2[0], a2[1]); if (Math.abs(d) > BaseMathUtils.eps) { var dx = BaseMathUtils.det2(b1, a1[1], b2, a2[1]), dy = BaseMathUtils.det2(a1[0], b1, a2[0], b2); res = { x: dx / d, y: dy / d }; } return res; }; BaseMathUtils.isInsidePoly = function isInsidePoly(ps, p) { var done = false, ct = void 0; for (var i = 0; i < ps.length; ++i) { if (BaseMathUtils.v2dist(p, ps[i]) < BaseMathUtils.eps) { ct = 1; done = true; break; } } while (!done) { done = true; ct = 0; var np = { x: p.x + Math.random() - 0.5, y: p.y + Math.random() - 0.5 }, rn = { x: np.x - p.x, y: np.y - p.y }, a1 = [rn.y, -rn.x], b1 = p.x * rn.y - p.y * rn.x; for (var _i4 = 0; _i4 < ps.length; ++_i4) { var p0 = ps[_i4], p1 = ps[(_i4 + 1) % ps.length], n = { x: p1.x - p0.x, y: p1.y - p0.y }, a2 = [n.y, -n.x], b2 = p0.x * n.y - p0.y * n.x, ip = BaseMathUtils.solve2Lin(a1, b1, a2, b2); if (ip) { if (BaseMathUtils.v2dist(ip, p0) < BaseMathUtils.eps || BaseMathUtils.v2dist(ip, p1) < BaseMathUtils.eps) { done = false; break; } else if (ip.x > Math.min(p0.x, p1.x) - BaseMathUtils.eps && ip.x < Math.max(p0.x, p1.x) + BaseMathUtils.eps && ip.y > Math.min(p0.y, p1.y) - BaseMathUtils.eps && ip.y < Math.max(p0.y, p1.y) + BaseMathUtils.eps) { if (BaseMathUtils.v2dist(ip, p) < BaseMathUtils.eps) { ct = 1; break; } else { var tn = { x: ip.x - p.x, y: ip.y - p.y }; ct += tn.x * rn.x + tn.y * rn.y > 0; } } } } } return ct % 2; }; BaseMathUtils.isInsideConvPoly = function isInsideConvPoly(ps, p) { var sg = [0, 0]; for (var i = 0; i < ps.length; ++i) { var p0 = ps[i], p1 = ps[(i + 1) % ps.length], a = { x: p0.x - p.x, y: p0.y - p.y }, b = { x: p1.x - p.x, y: p1.y - p.y }; ++sg[(a.x * b.y - a.y * b.x < 0) + 0]; } return ~sg.indexOf(ps.length); }; BaseMathUtils.v2len = function v2len(v2) { return Math.sqrt(v2.x * v2.x + v2.y * v2.y); }; BaseMathUtils.v2dist = function v2dist(v21, v22) { return BaseMathUtils.v2len({ x: v22.x - v21.x, y: v22.y - v21.y }); }; BaseMathUtils.computeSquare = function computeSquare(ps) { var a = []; var p = 0; for (var i = 0; i < ps.length; ++i) { a.push(BaseMathUtils.v2dist(ps[i], ps[(i + 1) % ps.length])); p += 0.5 * a[i]; } return Math.sqrt(p * (p - a[0]) * (p - a[1]) * (p - a[2])); }; BaseMathUtils.computeInterpCoefs = function computeInterpCoefs(tri, p) { var s = BaseMathUtils.computeSquare(tri), coefs = [], l = tri.length; for (var i = 0; i < l; ++i) { coefs[i] = BaseMathUtils.computeSquare([p, tri[(i + 1) % l], tri[(i + 2) % l]]) / s; } return coefs; }; return BaseMathUtils; }(); BaseMathUtils.sum = [BaseMathUtils.sum1, BaseMathUtils.sum2, BaseMathUtils.sum3, BaseMathUtils.sum4]; BaseMathUtils.eps = 1e-4; exports.default = BaseMathUtils; /***/ }, /* 3 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _BaseMathUtils2 = __webpack_require__(2); var _BaseMathUtils3 = _interopRequireDefault(_BaseMathUtils2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var MathUtils = function (_BaseMathUtils) { _inherits(MathUtils, _BaseMathUtils); function MathUtils() { _classCallCheck(this, MathUtils); return _possibleConstructorReturn(this, _BaseMathUtils.apply(this, arguments)); } MathUtils.splitSpline = function splitSpline(spline, N) { var o = { len: 0, ls: [0] }, dl = 1 / N; for (var i = 0; i <= N; ++i) { var p = spline.getPoint(i * dl); if (i) { var d = MathUtils.v1.distanceTo(p); o.len += d; o.ls.push(d); } MathUtils.v1.copy(p); } return o; }; MathUtils.getLinearIndeces = function getLinearIndeces(spline, n) { var del = 5000, dDel = 1 / del; var ls = [0]; var l = 0; for (var i = 0; i <= del; ++i) { var p = spline.getPoint(i * dDel); if (i) { var d = MathUtils.v1.distanceTo(p); l += d; ls.push(d); } MathUtils.v1.copy(p); } ls.push(1e7); var res = [], dl = l / (n - 1); for (var _i = 0, L = 0, _d = ls[0]; _i < ls.length - 1; ++_i, _d += ls[_i]) { if (Math.abs(L - _d) < Math.abs(L - _d - ls[_i + 1])) { res.push(_i * dDel); L += dl; } } return res; }; MathUtils.refinePoly = function refinePoly(poly, maxDl) { var res = []; for (var i = 0; i < poly.length; ++i) { var p0 = poly[i], p1 = poly[(i + 1) % poly.length], l = _BaseMathUtils3.default.v2dist(p0, p1), n = Math.ceil(l / maxDl), dl = l / n; res.push(p0); for (var j = 1; j < n; ++j) { res.push(new _libs.THREE.Vector2(p0.x + j * dl * (p1.x - p0.x) / l, p0.y + j * dl * (p1.y - p0.y) / l)); } } return res; }; return MathUtils; }(_BaseMathUtils3.default); MathUtils.v1 = new _libs.THREE.Vector3(); exports.default = MathUtils; /***/ }, /* 4 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Utils = function () { function Utils() { _classCallCheck(this, Utils); } Utils.normalizeUrl = function normalizeUrl(url) { function split(s) { return s.replace(/\\/g, '/').split('/'); } var base = split(window.location.href); url = split(url); if (base[2] === url[2]) { url[0] = base[0]; } return url.join('/'); }; Utils.extends = function _extends(der, base) { for (var name in base) { if (!der.hasOwnProperty(name)) { der[name] = base[name]; } } }; Utils.defaultCmp = function defaultCmp(a, b) { return a - b; }; Utils.lowerBound = function lowerBound(a, x, cmp) { cmp = cmp || Utils.defaultCmp; var l = 0, h = a.length - 1; while (h - l > 1) { var mid = Math.floor((l + h) / 2); if (cmp(x, a[mid]) < 0) { h = mid; } else { l = mid; } } return cmp(x, a[h]) >= 0 ? h : l; }; return Utils; }(); exports.default = Utils; /***/ }, /* 5 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _GraphUtils = __webpack_require__(7); var _GraphUtils2 = _interopRequireDefault(_GraphUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ImageBase = function () { function ImageBase(context, width, height, color) { _classCallCheck(this, ImageBase); this.context = context; this.wnd = context.wnd; this.doc = context.doc; this.element = context.element || context.doc.body; this.c = context.renderCanvas || ImageBase.renderCanvas; this.ctx = context.renderCanvasCtx || ImageBase.renderCanvasCtx; this.resW = this.width = width; this.resH = this.height = height; this.color = color; } ImageBase.prototype.setResolution = function setResolution(res) { this.resW = res.width; this.resH = res.height; }; ImageBase.prototype.dispose = function dispose() {}; ImageBase.prototype.renderBlankPage = function renderBlankPage() { this.ctx.beginPath(); this.ctx.fillStyle = _GraphUtils2.default.color2Rgba(this.color, 1); this.ctx.rect(0, 0, this.c.width, this.c.height); this.ctx.fill(); }; ImageBase.prototype.renderImage = function renderImage(image) { this.pushCtx(); this.ctx.drawImage(image, 0, 0); this.popCtx(); }; ImageBase.prototype.normToConv = function normToConv(p) { return { x: p.x * this.c.width, y: (1 - p.y) * this.c.height }; }; ImageBase.prototype.renderHit = function renderHit(poly) { var ctx = this.ctx; ctx.fillStyle = 'rgba(255,255,0,0.4)'; ctx.beginPath(); var p = this.normToConv(poly[0]); ctx.moveTo(p.x, p.y); for (var i = 1; i < poly.length; ++i) { p = this.normToConv(poly[i]); ctx.lineTo(p.x, p.y); } ctx.closePath(); ctx.fill(); }; ImageBase.prototype.pushCtx = function pushCtx() { if (this.resW != this.c.width) { this.c.width = this.resW; } if (this.resH != this.c.height) { this.c.height = this.resH; } this.ctx.save(); this.ctx.scale(this.c.width / this.width, this.c.height / this.height); return this.ctx; }; ImageBase.prototype.popCtx = function popCtx() { this.ctx.restore(); }; ImageBase.prototype.renderNotFoundPage = function renderNotFoundPage() { this.renderBlankPage(); }; ImageBase.prototype.finishRender = function finishRender() { if (this.onChange) { this.onChange(this.c); } }; ImageBase.prototype.finishLoad = function finishLoad() { if (this.onLoad) { this.onLoad(); } else { this.startRender(); } }; ImageBase.prototype.getSimulatedDoc = function getSimulatedDoc() { return undefined; }; return ImageBase; }(); ImageBase.renderCanvas = (0, _libs.$)('')[0]; ImageBase.renderCanvasCtx = ImageBase.renderCanvas.getContext('2d'); exports.default = ImageBase; /***/ }, /* 6 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var EventConverter = function () { // virtuals // getObject(e, data); // getCallback(object); // test(object1, object1); function EventConverter(wnd, doc) { _classCallCheck(this, EventConverter); this.wnd = wnd; this.doc = doc; this.enabled = true; } EventConverter.prototype.setEnable = function setEnable(vl) { if (!vl) { if (this.mCapObject) { this.notify(this.mCapObject, _libs.$.Event('mouseup'), 'mouseup'); this.mCapObject = undefined; } if (this.mHovObject) { this.notify(this.mHovObject, _libs.$.Event('mouseout'), 'mouseout'); this.mHovObject = undefined; } } this.enabled = vl; }; EventConverter.prototype.getCallback = function getCallback(object) { return undefined; }; EventConverter.prototype.notify = function notify(object, e, type) { var callback = this.getCallback(object); if (callback) { var props = _extends({}, e, { type: type, view: this.wnd }); var jE = _libs.$.Event(type, props); callback(jE, object); } }; EventConverter.prototype.convert = function convert(e, data) { if (!this.enabled) return; if (this.filter) { e = this.filter(this.element, e); } var object = this.getObject(e, data), notify = ~e.type.indexOf('touch') ? this.convertTouch(e, data, object) : this.convertMouse(e, data, object); if (notify && object) { this.notify(object, e, e.type); } }; EventConverter.prototype.convertTouch = function convertTouch(e, data, object) { var notify = true; switch (e.type) { case 'touchstart': { if (this.tCapObject) { this.notify(this.tCapObject, e, 'touchend'); } this.tCapObject = object; break; } case 'touchend': { if (this.tCapObject && !this.test(this.tCapObject, object)) { this.notify(this.tCapObject, e, 'touchend'); notify = false; } else if (object && this.test(this.tCapObject, object)) { this.notify(object, e, 'touchtap'); } this.tCapObject = undefined; break; } case 'touchtap': { notify = false; break; } } return notify; }; EventConverter.prototype.convertMouse = function convertMouse(e, data, object) { var notify = true; switch (e.type) { case 'mousedown': { if (this.mCapObject) { this.notify(this.mCapObject, e, 'mouseup'); } this.mCapObject = object; break; } case 'mouseup': { if (this.mCapObject && !this.test(this.mCapObject, object)) { this.notify(this.mCapObject, e, 'mouseup'); notify = false; } break; } case 'click': { notify = this.test(this.mCapObject, object); this.mCapObject = undefined; break; } case 'mouseenter': case 'mouseover': case 'mousemove': { if (!this.test(this.mHovObject, object) && this.mHovObject) { this.notify(this.mHovObject, e, 'mouseout'); this.mHovObject = undefined; } if (!this.mHovObject && object) { this.notify(object, e, 'mouseover'); this.mHovObject = object; } notify = e.type === 'mousemove'; break; } case 'mouseleave': case 'mouseout': { if (this.mHovObject) { this.notify(this.mHovObject, e, 'mouseout'); this.mHovObject = undefined; } notify = false; break; } } return notify; }; return EventConverter; }(); exports.default = EventConverter; /***/ }, /* 7 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var GraphUtils = function () { function GraphUtils() { _classCallCheck(this, GraphUtils); } GraphUtils.extrapolateLinear = function extrapolateLinear(x, y, xi) { return y[0] + (y[1] - y[0]) / (x[1] - x[0]) * (xi - x[0]); }; GraphUtils.interpolate01 = function interpolate01(y1, y2, t) { return GraphUtils.extrapolateLinear([0, 1], [y1, y2], t); }; GraphUtils.getColorBytes = function getColorBytes(color) { return [color >> 16 & 0xFF, color >> 8 & 0xFF, color & 0xFF]; }; GraphUtils.inverseColor = function inverseColor(color) { var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var bs = GraphUtils.getColorBytes(color), ibs = [0xFF - bs[0], 0xFF - bs[1], 0xFF - bs[2]], nbs = [Math.round(GraphUtils.interpolate01(bs[0], ibs[0], t)), Math.round(GraphUtils.interpolate01(bs[1], ibs[1], t)), Math.round(GraphUtils.interpolate01(bs[2], ibs[2], t))]; return GraphUtils.bytes2Color(nbs); }; GraphUtils.color2Rgba = function color2Rgba(color, a) { return GraphUtils.bytes2Rgba(GraphUtils.getColorBytes(color), a); }; GraphUtils.bytes2Rgba = function bytes2Rgba(bs, a) { return 'rgba(' + bs.join(',') + ',' + a + ')'; }; GraphUtils.bytes2Color = function bytes2Color(bs) { return bs[2] | bs[1] << 8 | bs[0] << 16; }; return GraphUtils; }(); exports.default = GraphUtils; /***/ }, /* 8 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Cache = __webpack_require__(14); var _Cache2 = _interopRequireDefault(_Cache); var _BlankImage = __webpack_require__(43); var _BlankImage2 = _interopRequireDefault(_BlankImage); var _StaticImage = __webpack_require__(59); var _StaticImage2 = _interopRequireDefault(_StaticImage); var _PdfImage = __webpack_require__(57); var _PdfImage2 = _interopRequireDefault(_PdfImage); var _InteractiveImage = __webpack_require__(51); var _InteractiveImage2 = _interopRequireDefault(_InteractiveImage); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ImageFactory = function () { function ImageFactory(context, cache) { _classCallCheck(this, ImageFactory); this.context = context; this.cache = cache || new _Cache2.default(); } ImageFactory.prototype.build = function build(info) { var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var widthTexels = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 210; var heightTexels = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 297; var color = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0xFFFFFF; var injector = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined; var image = void 0; switch (info.type) { case 'html': { image = new _InteractiveImage2.default(this.context, widthTexels, heightTexels, color, info.src, this.cache, injector); break; } case 'image': { image = new _StaticImage2.default(this.context, widthTexels, heightTexels, color, info.src); break; } case 'pdf': { image = new _PdfImage2.default(this.context, widthTexels, heightTexels, color, info.src, n); break; } case 'blank': default: { image = new _BlankImage2.default(this.context, widthTexels, heightTexels, color); break; } } return image; }; return ImageFactory; }(); exports.default = ImageFactory; /***/ }, /* 9 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _book = __webpack_require__(11); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var BookPropsBuilder = function () { function BookPropsBuilder(onReady) { _classCallCheck(this, BookPropsBuilder); this.onReady = onReady; this.defaults = (0, _book.props)(); } BookPropsBuilder.prototype.dispose = function dispose() {}; BookPropsBuilder.prototype.calcSize = function calcSize(width, height) { var scale = _BaseMathUtils2.default.calcScale(width, height, this.defaults.width, this.defaults.height); return { width: scale * width, height: scale * height }; }; BookPropsBuilder.prototype.calcTexels = function calcTexels(width, height) { var sheet = this.defaults.sheet, scale = _BaseMathUtils2.default.calcScale(width, height, sheet.widthTexels, sheet.heightTexels); return { widthTexels: scale * width, heightTexels: scale * height }; }; BookPropsBuilder.prototype.calcProps = function calcProps(width, height) { this.props = _extends({}, this.defaults, this.calcSize(width, height), { sheet: _extends({}, this.defaults.sheet, this.calcTexels(width, height)), cover: _extends({}, this.defaults.cover), page: _extends({}, this.defaults.page) }); }; BookPropsBuilder.prototype.calcSheets = function calcSheets(pages) { return this.sheets = Math.ceil(Math.max(0, pages - 4) / 2); }; BookPropsBuilder.prototype.getSheets = function getSheets() { return this.sheets; }; BookPropsBuilder.prototype.getProps = function getProps() { return this.props; }; BookPropsBuilder.prototype.getPageCallback = function getPageCallback() { return this.binds.pageCallback; }; BookPropsBuilder.prototype.ready = function ready() { if (this.onReady) { this.onReady(this.getProps(), this.getSheets(), this.getPageCallback()); } }; return BookPropsBuilder; }(); exports.default = BookPropsBuilder; /***/ }, /* 10 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); }; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(1); var _sheetBlock = __webpack_require__(41); var _sheetBlock2 = _interopRequireDefault(_sheetBlock); var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); var _ThreeUtils = __webpack_require__(20); var _ThreeUtils2 = _interopRequireDefault(_ThreeUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // import ThreeMarkup from './ThreeMarkup'; var SheetBlock = function () { function SheetBlock(visual, p, first, last) { var angle = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; var _this = this; var state = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'closed'; var height = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0; _classCallCheck(this, SheetBlock); this.visual = visual; this.p = _extends({}, p, { first: first, last: last }); var props = this.getProps(); var loadedPoints = this.loadPoints(); Object.keys(loadedPoints).map(function (k) { _this[k] = loadedPoints[k][props.shape] || loadedPoints[k][0]; }); this.pSpline = new _libs.THREE.Spline([]); for (var i = 0; i < this.interpolationPoints.x[0].length; ++i) { this.pSpline.points.push(new _libs.THREE.Vector3()); } this.iSpline = new _libs.THREE.Spline([]); for (var _i = 0; _i < _sheetBlock2.default.resX; ++_i) { this.iSpline.points.push(new _libs.THREE.Vector3()); } this.aSplines = []; //this.three = new THREE.Object3D(); this.geometry = _sheetBlock2.default.geometry.clone(); this.p.sideFaces = [{ first: 0, last: _sheetBlock2.default.faces[0] }, { first: _sheetBlock2.default.faces[0], last: _sheetBlock2.default.faces[1] }]; this.sideTexture = new _libs.THREE.Texture(); this.sideTexture.wrapT = _libs.THREE.RepeatWrapping; this.sideTexture.repeat.set(0, last - first); this.sideTexture.image = props.sideTexture; this.sideTexture.needsUpdate = true; this.materials = [new _libs.THREE.MeshPhongMaterial(), new _libs.THREE.MeshPhongMaterial(), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture })]; this.p.setTexture(this.materials[0], 2 * first); this.p.setTexture(this.materials[1], 2 * last - 1); this.mesh = new _libs.THREE.Mesh(this.geometry, new _libs.THREE.MeshFaceMaterial(this.materials)); this.mesh.castShadow = false; this.mesh.receiveShadow = false; // this.mesh.frustumCulled = true; //this.three.add(this.mesh); this.three = this.mesh; this.three.userData.self = this; this.markers = []; if (this.p.marker.use) { var l = this.geometry.vertices.length; var is = void 0; // is = [0, sheetBlock.resX-1, (sheetBlock.resZ-1)*sheetBlock.resX, sheetBlock.resZ*sheetBlock.resX-1]; is = Array.apply(0, Array(l)).map(function (_, i) { return i; }); for (var _iterator = is, _isArray = Array.isArray(_iterator), _i2 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i2 >= _iterator.length) break; _ref = _iterator[_i2++]; } else { _i2 = _iterator.next(); if (_i2.done) break; _ref = _i2.value; } var _i3 = _ref; var marker = _ThreeUtils2.default.createMarker(this.geometry.vertices[_i3], _i3 < l / 2 ? 0xFF0000 : 0x00FF00, this.p.marker.size); this.markers.push({ marker: marker, vertex: _i3 }); this.three.add(marker); } } this.corner = { use: true, height: 0, maxDistance: 0, points: [], OZ: new _libs.THREE.Vector3(0, 0, 1), axis: new _libs.THREE.Vector3() }; this.set(0, 'closed', height, first, last); // calculate corner points this.set(angle, state, height, first, last); // init position // if(!SheetBlock.markup) { // SheetBlock.markup=true; // this.markup = new ThreeMarkup(this, 0, [{ // x: 0, // y: 0, // }, { // x: 0.5, // y: 1 // }, { // x: 1, // y: 0 // }].map((p)=>new THREE.Vector2(p.x, p.y)), {}); // } } SheetBlock.prototype.dispose = function dispose() { for (var _iterator2 = this.materials, _isArray2 = Array.isArray(_iterator2), _i4 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i4 >= _iterator2.length) break; _ref2 = _iterator2[_i4++]; } else { _i4 = _iterator2.next(); if (_i4.done) break; _ref2 = _i4.value; } var m = _ref2; if (m.map) { m.map = null; m.needsUpdate = true; } m.dispose(); } delete this.materials; this.geometry.dispose(); }; SheetBlock.prototype.getSize = function getSize() { return this.p.last - this.p.first; }; SheetBlock.prototype.getProps = function getProps() { return _extends({}, this.p.page, { sheets: this.p.sheets }); }; SheetBlock.prototype.getTopCerners = function getTopCerners() { var off = this.angle > Math.PI / 2 ? this.geometry.vertices.length / 2 : 0; return [this.geometry.vertices[off], this.geometry.vertices[_sheetBlock2.default.resX - 1 + off], this.geometry.vertices[(_sheetBlock2.default.resZ - 1) * _sheetBlock2.default.resX + off], this.geometry.vertices[_sheetBlock2.default.resZ * _sheetBlock2.default.resX - 1 + off]]; }; SheetBlock.prototype.getTopSize = function getTopSize() { // const l=this.geometry.vertices.length, off = this.angle>Math.PI/2? l/2: 0, // v0 = this.geometry.vertices[off], v1 = this.geometry.vertices[sheetBlock.resZ*sheetBlock.resX-1+off]; // // is = [0, sheetBlock.resX-1, (sheetBlock.resZ-1)*sheetBlock.resX, sheetBlock.resZ*sheetBlock.resX-1]; // return { // width: Math.abs(v1.x-v0.x), // height: Math.abs(v1.z-v0.z) // }; var vs = this.getTopCerners(); return { width: vs[0].distanceTo(vs[1]), height: vs[0].distanceTo(vs[2]) }; }; SheetBlock.prototype.getTopWorldRotation = function getTopWorldRotation(q) { q.x = -Math.PI / 2; return q; }; SheetBlock.prototype.getTopWorldPosition = function getTopWorldPosition(v) { var l = this.geometry.vertices.length, off = this.angle > Math.PI / 2 ? l / 2 : 0, vs = [this.geometry.vertices[off], this.geometry.vertices[_sheetBlock2.default.resX - 1 + off], this.geometry.vertices[(_sheetBlock2.default.resZ - 1) * _sheetBlock2.default.resX + off], this.geometry.vertices[_sheetBlock2.default.resZ * _sheetBlock2.default.resX - 1 + off]]; v.set(0, 0, 0); for (var _iterator3 = vs, _isArray3 = Array.isArray(_iterator3), _i5 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i5 >= _iterator3.length) break; _ref3 = _iterator3[_i5++]; } else { _i5 = _iterator3.next(); if (_i5.done) break; _ref3 = _i5.value; } var vi = _ref3; v.x += 0.25 * vi.x; v.y += 0.25 * vi.y; v.z += 0.25 * vi.z; } this.three.localToWorld(v); return v; }; SheetBlock.prototype.getInterpolationPoints = function getInterpolationPoints(inds, mod) { var ps = { x: [], y: [] }, K = this.getProps().wave; for (var _iterator4 = inds, _isArray4 = Array.isArray(_iterator4), _i6 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i6 >= _iterator4.length) break; _ref4 = _iterator4[_i6++]; } else { _i6 = _iterator4.next(); if (_i6.done) break; _ref4 = _i6.value; } var i = _ref4; ps.x.push([].concat(this.interpolationPoints.x[i])); ps.y.push(~mod.indexOf(i) ? this.interpolationPoints.y[i].map(function (n) { return K * n; }) : [].concat(this.interpolationPoints.y[i])); } return ps; }; SheetBlock.prototype.set = function set(angle) { var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.state; var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.corner.height; var first = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.p.first; var last = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.p.last; var PI = Math.PI; this.state = state; var closedAngle = void 0, binderTurn = void 0; if ((typeof angle === 'undefined' ? 'undefined' : _typeof(angle)) === 'object') { this.angle = angle.openedAngle; closedAngle = angle.closedAngle; binderTurn = angle.binderTurn > PI / 2 ? PI - angle.binderTurn : angle.binderTurn; } else { this.angle = angle; } this.corner.height = height; if (this.p.first !== first || this.p.last !== last) { this.sideTexture.repeat.set(0, last - first); this.sideTexture.needsUpdate = true; if (this.p.first !== first) { this.p.setTexture(this.materials[0], 2 * first); } if (this.p.last !== last) { this.p.setTexture(this.materials[1], 2 * last - 1); } } this.p.first = first; this.p.last = last; var points = void 0; var props = this.getProps(); if (this.state === 'closed') { points = this.getInterpolationPoints(this.closedInterpolationIndeces, this.closedInterpolationIndeces); } else if (this.state === 'opened') { if (closedAngle !== undefined && Math.abs(closedAngle - PI / 2) > 1e-2) { points = this.getInterpolationPoints(this.flatInterpolationIndeces, []); var ps = this.getPointsAtAngle(this.getInterpolationPoints(this.closedInterpolationIndeces, this.closedInterpolationIndeces), closedAngle > PI / 2 ? PI - closedAngle : closedAngle); points.x = [ps.x].concat(points.x); points.y = [ps.y].concat(points.y); // console.log(ps); } else { points = this.getInterpolationPoints(this.openedInterpolationIndeces, this.closedInterpolationIndeces); } } var hl = void 0, hr = void 0, offset = 0.5 * props.sheets * props.depth; if (this.state === 'closed') { offset -= 7e-6 * this.p.scale; } if (this.angle <= PI / 2) { hl = (props.sheets - first) * props.depth; hr = (props.sheets - last) * props.depth; } else { hl = first * props.depth; hr = last * props.depth; } var inAngle = this.angle > PI / 2 ? PI - this.angle : this.angle, hAngle = this.state === 'closed' ? inAngle : binderTurn === undefined ? PI / 2 : binderTurn; var _getPointsAtAngleAndH = this.getPointsAtAngleAndHs(points, inAngle, hAngle, [hl / props.width, hr / props.width]), left = _getPointsAtAngleAndH[0], right = _getPointsAtAngleAndH[1]; if (this.angle > PI / 2) { this.inverse(left); this.inverse(right); offset = -offset; } this.setPoints(left, right, offset); }; SheetBlock.prototype.setPoints = function setPoints(left, right, offset) { var _this2 = this; var p = this.getProps(); var i = 0; var ys = [right, left]; for (var y = 0; y < _sheetBlock2.default.resY; ++y) { for (var z = 0; z < _sheetBlock2.default.resZ; ++z) { for (var x = 0; x < _sheetBlock2.default.resX; ++x) { this.geometry.vertices[i++].set(ys[y].x[x] * p.width + offset, ys[y].y[x] * p.width, z * p.height / (_sheetBlock2.default.resZ - 1) - 0.5 * p.height); } } } if (i !== this.geometry.vertices.length) { console.warn('setPoints: bad mapping!'); } if (this.corner.use && !this.corner.points.length) { var plane = new _libs.THREE.Plane(), normal = plane.normal, planeOffset = (1 - this.getProps().flexibleCorner) * Math.min(p.width, p.height), proj = new _libs.THREE.Vector3(); plane.setFromNormalAndCoplanarPoint(new _libs.THREE.Vector3(-1, 0, -1).normalize(), new _libs.THREE.Vector3(planeOffset + offset, 0, 0.5 * p.height)); for (var _i7 = 0, l = this.geometry.vertices.length; _i7 < l; ++_i7) { plane.projectPoint(this.geometry.vertices[_i7], proj); proj.sub(this.geometry.vertices[_i7]); if (proj.x * normal.x + proj.y * normal.y + proj.z * normal.z > 0) { var d = proj.length() / planeOffset; this.corner.maxDistance = Math.max(this.corner.maxDistance, d); this.corner.points.push({ vertex: _i7, distance: d }); } } } if (this.corner.use && Math.abs(this.corner.height) > 1e-3) { var d2Angle = function d2Angle(d) { return p.cornerDeviation * _this2.corner.height / (1 + Math.exp(-p.bending * (d - 0.5 * _this2.corner.maxDistance))); }; this.corner.axis.set(-1, 0, 1).normalize(); this.corner.axis.applyAxisAngle(this.corner.OZ, this.angle); for (var _iterator5 = this.corner.points, _isArray5 = Array.isArray(_iterator5), _i8 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i8 >= _iterator5.length) break; _ref5 = _iterator5[_i8++]; } else { _i8 = _iterator5.next(); if (_i8.done) break; _ref5 = _i8.value; } var point = _ref5; this.geometry.vertices[point.vertex].applyAxisAngle(this.corner.axis, d2Angle(point.distance)); } } for (var _iterator6 = this.markers, _isArray6 = Array.isArray(_iterator6), _i9 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i9 >= _iterator6.length) break; _ref6 = _iterator6[_i9++]; } else { _i9 = _iterator6.next(); if (_i9.done) break; _ref6 = _i9.value; } var m = _ref6; m.marker.position.copy(this.geometry.vertices[m.vertex]); } this.geometry.computeVertexNormals(); //this.geometry.computeFaceNormals(); this.geometry.computeBoundingSphere(); //this.geometry.computeBoundingBox(); this.geometry.verticesNeedUpdate = true; if (this.markup) { this.markup.computeVertices(); } }; SheetBlock.prototype.inverse = function inverse(ps) { for (var i = 0; i < ps.x.length; ++i) { ps.x[i] = -ps.x[i]; } return ps; }; SheetBlock.prototype.getPointsAtHs = function getPointsAtHs(ps, angle, hs) { var _this3 = this; var N = 1000; _MathUtils2.default.setSplinePoints(this.pSpline, ps); var bl = _MathUtils2.default.splitSpline(this.pSpline, N), r = []; { var p1 = _extends({}, this.pSpline.getPoint((N - 1) / N)), p2 = _extends({}, this.pSpline.getPoint(1)), dp = { x: p2.x - p1.x, y: p2.y - p1.y }, ln = Math.sqrt(dp.x * dp.x + dp.y * dp.y), sp = this.pSpline.points[this.pSpline.points.length - 1]; sp.set(sp.x + 0.1 * dp.x / ln, sp.y + 0.1 * dp.y / ln, 0); bl = _MathUtils2.default.splitSpline(this.pSpline, N); } bl.ls.push(1e7); _MathUtils2.default.mapl2L(bl.ls, bl.len, _sheetBlock2.default.resX, function (i) { for (var j = 0; j < hs.length; ++j) { if (!i) { r[j] = { x: [-hs[j] * Math.sin(angle)], y: [hs[j] * Math.cos(angle)] }; } else { var p0 = _extends({}, _this3.pSpline.getPoint((i - 1) / N)), _p = _this3.pSpline.getPoint(i / N), x = -(_p.y - p0.y), y = _p.x - p0.x, l = Math.sqrt(x * x + y * y); r[j].x.push(_p.x + x / l * hs[j]); r[j].y.push(_p.y + y / l * hs[j]); } } }); var nps = []; var _loop = function _loop(j) { nps[j] = { x: [], y: [] }; _MathUtils2.default.setSplinePoints(_this3.iSpline, r[j]); var l = _MathUtils2.default.splitSpline(_this3.iSpline, N); l.ls.push(1e7); _MathUtils2.default.mapl2L(l.ls, 1, _sheetBlock2.default.resX, function (i) { var p = _this3.iSpline.getPoint(i / N); nps[j].x.push(p.x); nps[j].y.push(p.y); }); }; for (var j = 0; j < hs.length; ++j) { _loop(j); } return nps; }; SheetBlock.prototype.getPointsAtAngleAndHs = function getPointsAtAngleAndHs(points, angle, hAngle, hs) { var ps = this.getPointsAtAngle(points, angle); return this.getPointsAtHs(ps, hAngle, hs); }; SheetBlock.prototype.getPointsAtAngle = function getPointsAtAngle(points, angle) { var ps = { x: [], y: [] }, angles = []; angle /= Math.PI / 2; for (var j = 0; j < points.x.length; ++j) { angles.push(j / (points.x.length - 1)); } for (var i = 0; i < points.x[0].length; ++i) { var xps = [], yps = []; for (var _j = 0; _j < points.x.length; ++_j) { xps.push(points.x[_j][i]); yps.push(points.y[_j][i]); } ps.x.push(this.interpolate(angles, xps, angle)); ps.y.push(this.interpolate(angles, yps, angle)); } return ps; }; SheetBlock.prototype.interpolate = function interpolate(x, y, xi) { if (!this.aSplines[x.length]) { this.aSplines[x.length] = new _libs.THREE.Spline([]); var ps = this.aSplines[x.length].points; for (var i = 0; i < x.length; ++i) { ps.push(new _libs.THREE.Vector3()); } } var spline = this.aSplines[x.length]; for (var _i10 = 0; _i10 < x.length; ++_i10) { spline.points[_i10].set(x[_i10], y[_i10], 0); } return spline.getPoint(Math.min(1, Math.max(xi, 0))).y; }; SheetBlock.prototype.loadPoints = function loadPoints() { var x = [], y = []; var _arr = [0, 0.2877, 0.6347, 0.8174, 1.0000]; for (var _i11 = 0; _i11 < _arr.length; _i11++) { var r = _arr[_i11]; x.push(r * Math.cos(0.9 * Math.PI / 4)); y.push(r * Math.sin(0.9 * Math.PI / 4)); } var openedInterpolationIndeces = [[2, 3, 4], [2, 3, 4, 5, 6]], closedInterpolationIndeces = [[0, 1, 2], [0, 1, 2]], flatInterpolationIndeces = [[5, 4], [7, 6]], interpolationPoints = [{ x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0.000, 0.286, 0.632, 0.815, 0.997], [0.000, 0.279, 0.623, 0.806, 0.988], [0.000, 0.126, 0.411, 0.593, 0.774], [0, 0, 0, 0, 0], x], y: [[0, 0, 0, 0, 0], [0.000, 0.030, 0.010, 0.002, 0.000], [0.000, 0.060, 0.017, 0.004, 0.000], [0.000, 0.259, 0.440, 0.446, 0.429], [0, 0.2877, 0.6347, 0.8174, 1.0000], y] }, { x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0.000, 0.286, 0.632, 0.815, 0.997], [0.000, 0.279, 0.623, 0.806, 0.988], [0.000, 0.233, 0.563, 0.746, 0.927], [0.000, 0.144, 0.433, 0.613, 0.796], [0.000, 0.070, 0.288, 0.455, 0.626], [0, 0, 0, 0, 0], x], y: [[0, 0, 0, 0, 0], [0.000, 0.030, 0.010, 0.002, 0.000], [0.000, 0.060, 0.017, 0.004, 0.000], [0.000, 0.168, 0.269, 0.270, 0.255], [0.000, 0.245, 0.435, 0.458, 0.460], [0.000, 0.278, 0.544, 0.614, 0.673], [0, 0.2877, 0.6347, 0.8174, 1.0000], y] }]; return { interpolationPoints: interpolationPoints, openedInterpolationIndeces: openedInterpolationIndeces, closedInterpolationIndeces: closedInterpolationIndeces, flatInterpolationIndeces: flatInterpolationIndeces }; }; return SheetBlock; }(); exports.default = SheetBlock; /***/ }, /* 11 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; exports.props = props; function props() { // const props = { // height, // width, // gravity, // injector, // cachedPages, // renderInactivePages, // renderWhileFlipping, // pagesForPredicting, // preloadPages, // sheet: { // startVelocity, // cornerDeviation, // flexibility, // flexibleCorner, // bending, // wave, // shape, // widthTexels, // heightTexels, // color, // sideTexture // }, // cover: { // ...sheet, // padding, // binderTexture, // depth, // mass // }, // page: { // ...sheet, // depth, // mass // } // }; return { height: 0.297, width: 0.21, gravity: 1, cachedPages: 50, renderInactivePages: true, renderInactivePagesOnMobile: false, renderWhileFlipping: false, pagesForPredicting: 5, preloadPages: 5, rtl: false, sheet: { startVelocity: 0.9, cornerDeviation: 0.25, flexibility: 10, flexibleCorner: 0.5, bending: 11, wave: 0.5, shape: 0, widthTexels: 5 * 210, heightTexels: 5 * 297, color: 0xFFFFFF }, cover: { binderTexture: '', depth: 0.0003, padding: 0, mass: 0.003 }, page: { depth: 0.0001, mass: 0.001 }, cssLayerProps: { width: 1024 } }; }; /***/ }, /* 12 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; exports.CSS3DSprite = exports.CSS3DObject = undefined; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } _libs.THREE.CSS3DObject = function (_THREE$Object3D) { _inherits(CSS3DObject, _THREE$Object3D); function CSS3DObject() { var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; _classCallCheck(this, CSS3DObject); var _this = _possibleConstructorReturn(this, _THREE$Object3D.call(this)); if (element) { _this.set(element); } return _this; } CSS3DObject.prototype.set = function set(element) { this.element = element; this.element.style.position = 'absolute'; this.addEventListener('removed', function () { if (this.element.parentNode !== null) { this.element.parentNode.removeChild(this.element); } }); }; return CSS3DObject; }(_libs.THREE.Object3D); _libs.THREE.CSS3DSprite = function (_THREE$CSS3DObject) { _inherits(CSS3DSprite, _THREE$CSS3DObject); function CSS3DSprite(element) { _classCallCheck(this, CSS3DSprite); return _possibleConstructorReturn(this, _THREE$CSS3DObject.call(this, element)); } return CSS3DSprite; }(_libs.THREE.CSS3DObject); _libs.THREE.CSS3DRenderer = function CSS3DRenderer() { _classCallCheck(this, CSS3DRenderer); var _width, _height; var _widthHalf, _heightHalf; var matrix = new _libs.THREE.Matrix4(); var cache = { camera: { fov: 0, style: '' }, objects: {} }; var domElement = document.createElement('div'); domElement.style.overflow = 'hidden'; this.domElement = domElement; var cameraElement = document.createElement('div'); cameraElement.style.WebkitTransformStyle = 'preserve-3d'; cameraElement.style.MozTransformStyle = 'preserve-3d'; cameraElement.style.transformStyle = 'preserve-3d'; domElement.appendChild(cameraElement); var isIE = /Trident/i.test(navigator.userAgent); this.setClearColor = function () {}; this.getSize = function () { return { width: _width, height: _height }; }; this.setSize = function (width, height) { _width = width; _height = height; _widthHalf = _width / 2; _heightHalf = _height / 2; domElement.style.width = width + 'px'; domElement.style.height = height + 'px'; cameraElement.style.width = width + 'px'; cameraElement.style.height = height + 'px'; }; function epsilon(value) { return Math.abs(value) < 1e-10 ? 0 : value; } function getCameraCSSMatrix(matrix) { var elements = matrix.elements; return 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(-elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(elements[6]) + ',' + epsilon(elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(-elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(-elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')'; } function getObjectCSSMatrix(matrix, cameraCSSMatrix) { var elements = matrix.elements; var matrix3d = 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(-elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(-elements[6]) + ',' + epsilon(-elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')'; if (isIE) { return 'translate(-50%,-50%)' + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)' + cameraCSSMatrix + matrix3d; } return 'translate(-50%,-50%)' + matrix3d; } function renderObject(object, camera, cameraCSSMatrix) { if (object instanceof _libs.THREE.CSS3DObject) { var style; if (object instanceof _libs.THREE.CSS3DSprite) { matrix.copy(camera.matrixWorldInverse); matrix.transpose(); matrix.copyPosition(object.matrixWorld); matrix.scale(object.scale); matrix.elements[3] = 0; matrix.elements[7] = 0; matrix.elements[11] = 0; matrix.elements[15] = 1; style = getObjectCSSMatrix(matrix, cameraCSSMatrix); } else { style = getObjectCSSMatrix(object.matrixWorld, cameraCSSMatrix); } var element = object.element; var cachedStyle = cache.objects[object.id] && cache.objects[object.id].style; if (cachedStyle === undefined || cachedStyle !== style) { element.style.WebkitTransform = style; element.style.MozTransform = style; element.style.transform = style; cache.objects[object.id] = { style: style }; if (isIE) { cache.objects[object.id].distanceToCameraSquared = getDistanceToSquared(camera, object); } } if (element.parentNode !== cameraElement) { cameraElement.appendChild(element); } } for (var i = 0, l = object.children.length; i < l; i++) { renderObject(object.children[i], camera, cameraCSSMatrix); } } var getDistanceToSquared = function () { var a = new _libs.THREE.Vector3(); var b = new _libs.THREE.Vector3(); return function (object1, object2) { a.setFromMatrixPosition(object1.matrixWorld); b.setFromMatrixPosition(object2.matrixWorld); return a.distanceToSquared(b); }; }(); function zOrder(scene) { var order = Object.keys(cache.objects).sort(function (a, b) { return cache.objects[a].distanceToCameraSquared - cache.objects[b].distanceToCameraSquared; }); var zMax = order.length; scene.traverse(function (object) { var index = order.indexOf(object.id + ''); if (index !== -1) { object.element.style.zIndex = zMax - index; } }); } this.render = function (scene, camera) { var fov = camera.projectionMatrix.elements[5] * _heightHalf; if (cache.camera.fov !== fov) { domElement.style.WebkitPerspective = fov + 'px'; domElement.style.MozPerspective = fov + 'px'; domElement.style.perspective = fov + 'px'; cache.camera.fov = fov; } scene.updateMatrixWorld(); if (camera.parent === null) camera.updateMatrixWorld(); var cameraCSSMatrix = 'translateZ(' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse); var style = cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)'; if (cache.camera.style !== style && !isIE) { cameraElement.style.WebkitTransform = style; cameraElement.style.MozTransform = style; cameraElement.style.transform = style; cache.camera.style = style; } renderObject(scene, camera, cameraCSSMatrix); if (isIE) { // IE10 and 11 does not support 'preserve-3d'. // Thus, z-order in 3D will not work. // We have to calc z-order manually and set CSS z-index for IE. // FYI: z-index can't handle object intersection zOrder(scene); } }; }; exports.default = _libs.THREE.CSS3DRenderer; var _CSS3DObject = _libs.THREE.CSS3DObject, _CSS3DSprite = _libs.THREE.CSS3DSprite; exports.CSS3DObject = _CSS3DObject; exports.CSS3DSprite = _CSS3DSprite; /***/ }, /* 13 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _CSS3DRenderer = __webpack_require__(12); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var CSSLayer = function (_CSS3DObject) { _inherits(CSSLayer, _CSS3DObject); CSSLayer.init = function init(doc) { var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 150; CSSLayer.delay = delay; CSSLayer.style = (0, _libs.$)('').appendTo(doc.head); }; CSSLayer.dispose = function dispose() { CSSLayer.style.remove(); }; function CSSLayer(width, height, props) { _classCallCheck(this, CSSLayer); var _this = _possibleConstructorReturn(this, _CSS3DObject.call(this)); _this.props = props; _this.jContainer = (0, _libs.$)(''); var widthPxs = props.width, heightPxs = height / width * widthPxs; _this.jContainer.width(widthPxs).height(heightPxs); _this.scale.x /= widthPxs / width; _this.scale.y /= widthPxs / width; _this.setData(); _this.set(_this.jContainer[0]); return _this; } CSSLayer.prototype.callInternal = function callInternal(name) { if (this.object && this.object[name]) { try { this.object[name](); } catch (e) { console.error(e); } } }; CSSLayer.prototype.dispose = function dispose() { this.clearInternals(); }; CSSLayer.prototype.clearInternals = function clearInternals() { this.callInternal('dispose'); !this.css || this.css.remove(); !this.html || this.html.remove(); }; CSSLayer.prototype.setData = function setData() { var css = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var html = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var js = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; this.clearInternals(); this.css = (0, _libs.$)('').appendTo(this.jContainer); this.html = (0, _libs.$)(html).appendTo(this.jContainer); var init = eval(js); if (init) { this.object = init(this.jContainer, this.props) || {}; } }; CSSLayer.prototype.pendedCall = function pendedCall(clb) { var _this2 = this; var timestamp = this.timestamp = Date.now(); setTimeout(function () { if (timestamp === _this2.timestamp) { clb(); } }, CSSLayer.delay); }; CSSLayer.prototype.isHidden = function isHidden() { return this.jContainer.hasClass('hidden'); }; CSSLayer.prototype.hide = function hide() { var _this3 = this; var res = void 0; if (!this.isHidden()) { this.jContainer.addClass('hidden'); this.callInternal('hide'); res = new Promise(function (resolve) { _this3.pendedCall(function () { _this3.callInternal('hidden'); resolve(); }); }); } else { res = Promise.resolve(); } return res; }; CSSLayer.prototype.show = function show() { var _this4 = this; var res = void 0; if (this.isHidden()) { this.jContainer.removeClass('hidden'); this.callInternal('show'); res = new Promise(function (resolve) { _this4.pendedCall(function () { _this4.callInternal('shown'); resolve(); }); }); } else { res = Promise.resolve(); } return res; }; return CSSLayer; }(_CSS3DRenderer.CSS3DObject); exports.default = CSSLayer; /***/ }, /* 14 */ /***/function (module, exports) { "use strict"; "use strict"; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Cache = function () { function Cache() { var maxSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity; var sizeof = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Cache.countSizeof; _classCallCheck(this, Cache); this.os = new Map(); this.sizeof = sizeof; this.maxSize = maxSize; this.size = 0; } Cache.prototype.forEach = function forEach(clb) { this.os.forEach(function (v, k) { return clb([k, v]); }); }; Cache.countSizeof = function countSizeof(value) { return 1; }; Cache.prototype.remove = function remove(k) { var res = false; var v = this.os.get(k); if (!v.locked || !v.locked(k)) { this.size -= this.sizeof(v); if (v.dispose) { v.dispose(); } this.os.delete(k); res = true; } return res; }; Cache.prototype.freeSpace = function freeSpace() { var arr = []; for (var _iterator = this.os, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var p = _ref; arr.push({ timestamp: p[1].timestamp, key: p[0] }); } arr.sort(function (a, b) { return a.timestamp - b.timestamp; }); for (var i = 0; i < arr.length && this.size > 3 * this.maxSize / 4; ++i) { this.remove(arr[i].key); } }; Cache.prototype.dispose = function dispose() { var arr = []; for (var _iterator2 = this.os, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var p = _ref2; arr.push({ v: p[1], k: p[0] }); } for (var _iterator3 = arr, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var o = _ref3; if (o.v.dispose) { o.v.dispose(); } this.os.delete(o.k); } }; Cache.recursionSizeof = function recursionSizeof(value) { var size = 0; if (value) { ++size; var len = value.length; if (len === undefined) { for (var p in value) { if (value.hasOwnProperty(p)) { size += Cache.recursionSizeof(value[p]); } } } else { size += len; } } return size; }; Cache.prototype.getTimestamp = function getTimestamp() { return Date.now(); }; Cache.prototype.get = function get(key) { var value = this.os.get(key); if (value) { value.timestamp = this.getTimestamp(); } return value; }; Cache.prototype.put = function put(key, value) { value.timestamp = this.getTimestamp(); this.os.set(key, value); this.size += this.sizeof(value); if (this.size > this.maxSize) { this.freeSpace(); } return value; }; return Cache; }(); exports.default = Cache; /***/ }, /* 15 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Controller = function (_THREE$EventDispatche) { _inherits(Controller, _THREE$EventDispatche); function Controller() { _classCallCheck(this, Controller); return _possibleConstructorReturn(this, _THREE$EventDispatche.apply(this, arguments)); } Controller.prototype.handleDefault = function handleDefault(id, e, data) { //console.log(id+'-'+e.type+'-'+data); }; Controller.prototype.dispatchAsync = function dispatchAsync(e) { var _this2 = this; Promise.resolve().then(function () { return _this2.dispatchEvent(e); }); }; Controller.prototype.dispose = function dispose() {}; return Controller; }(_libs.THREE.EventDispatcher); exports.default = Controller; /***/ }, /* 16 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _EventConverter2 = __webpack_require__(6); var _EventConverter3 = _interopRequireDefault(_EventConverter2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var CustomEventConverter = function (_EventConverter) { _inherits(CustomEventConverter, _EventConverter); // custom // testIntersection(e, data); // custom.object // test(object); function CustomEventConverter(wnd, doc) { var customTest = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () { return false; }; var eDoc = arguments[3]; _classCallCheck(this, CustomEventConverter); var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); _this.eDoc = eDoc; _this.customTest = customTest; _this.customs = []; return _this; } CustomEventConverter.prototype.test = function test(object1, object2) { return object1 && object2 ? this.customTest(object1, object2) : false; }; CustomEventConverter.prototype.getCallback = function getCallback(object) { return object.target.callback; }; CustomEventConverter.prototype.addCustom = function addCustom(custom) { this.customs.push(custom); }; CustomEventConverter.prototype.getObject = function getObject(e, data) { var object = void 0; if (data.doc === this.eDoc) { for (var _iterator = this.customs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var custom = _ref; object = custom.testIntersection(e, data); if (object) { break; } } } return object; }; return CustomEventConverter; }(_EventConverter3.default); exports.default = CustomEventConverter; /***/ }, /* 17 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Finder = function () { Finder.isDelimetr = function isDelimetr(s) { return s === Finder.DELIMITER; }; Finder.prototype.merge = function merge() { var as = [], map = [], strs = this.strs; var p = 0; for (var i = 0; i < strs.length; ++i) { if (strs[i].length) { map.push({ base: i, offset: p }); as.push(strs[i]); p += strs[i].length; if (i < strs.length - 1 && !Finder.isDelimetr(strs[i].charAt(strs[i].length - 1)) && !Finder.isDelimetr(strs[i + 1].charAt(0))) { as.push(Finder.DELIMITER); ++p; } } } this.map = map; this.str = as.join(''); }; Finder.prototype.addHits = function addHits(p) { var info = this.map[_Utils2.default.lowerBound(this.map, { offset: p }, function (a, b) { return a.offset - b.offset; })]; var chars = this.pattern.length, i = info.base; p -= info.offset; while (chars) { if (this.strs[i].length) { var delimeter = i < this.strs.length - 1 && !Finder.isDelimetr(this.strs[i].charAt(this.strs[i].length - 1)) && !Finder.isDelimetr(this.strs[i + 1].charAt(0)), length = Math.min(this.strs[i].length + (delimeter ? 1 : 0) - p, chars); if (p < this.strs[i].length) { this.hits.push({ index: i, offset: p, length: Math.min(length, this.strs[i].length - p) }); } chars -= length; ++i; p = 0; } } }; Finder.prototype.addContext = function addContext(p) { var f = p, l = p + this.pattern.length - 1, dels = this.props.contextLength, prevDels = dels + 1; while (dels && prevDels - dels) { prevDels = dels; if (dels % 2) { for (var i = f - 2; i >= 0; --i) { if (Finder.isDelimetr(this.str[i]) || i === 0) { f = i === 0 ? 0 : i + 1; --dels; break; } } } else { for (var _i = l + 2; _i < this.str.length; ++_i) { if (Finder.isDelimetr(this.str[_i]) || _i === this.str.length - 1) { l = _i === this.str.length - 1 ? _i === this.str.length - 1 : _i - 1; --dels; break; } } } } this.contexts.push(this.str.substr(f, l - f + 1)); }; Finder.prototype.getHits = function getHits() { return this.hits; }; Finder.prototype.getContexts = function getContexts() { return this.contexts; }; function Finder(strs, pattern, props) { _classCallCheck(this, Finder); this.props = _extends({}, Finder.defaults, props); this.strs = strs; var data = this.merge(strs); this.hits = []; this.contexts = []; this.pattern = pattern.toLowerCase(); this.lstr = this.str.toLowerCase(); var p = 0; while (true) { p = this.lstr.indexOf(this.pattern, p); if (p === -1) { break; } else { this.addHits(p); this.addContext(p); p += this.pattern.length; } } } return Finder; }(); Finder.DELIMITER = ' '; Finder.defaults = { contextLength: 7, hits: true, contexts: true }; exports.default = Finder; /***/ }, /* 18 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } _libs.PDFJS.workerSrc = (window.PDFJS_LOCALE ? PDFJS_LOCALE : { "pdfJsWorker": "js/pdf.worker.js", "pdfJsCMapUrl": "cmaps/" }).pdfJsWorker; _libs.PDFJS.cMapUrl = (window.PDFJS_LOCALE ? PDFJS_LOCALE : { "pdfJsWorker": "js/pdf.worker.js", "pdfJsCMapUrl": "cmaps/" }).pdfJsCMapUrl; _libs.PDFJS.cMapPacked = true; var Pdf = function () { function Pdf(src, loadingProgress) { var _this = this; _classCallCheck(this, Pdf); this.src = _Utils2.default.normalizeUrl(src); this.handlerQueue = []; this.progresData = { loaded: -1, total: 1 }; this.loadingProgress = loadingProgress; _libs.PDFJS.getDocument({ url: this.src, rangeChunkSize: 512 * 1024 }, null, null, function (data) { if (_this.loadingProgress) { var cur = Math.floor(100 * data.loaded / data.total), old = Math.floor(100 * _this.progresData.loaded / _this.progresData.total); if (cur !== old) { cur = isNaN(cur) ? 0 : cur; cur = cur > 100 ? 100 : cur; _this.loadingProgress(cur); } } _this.progresData = data; }).then(function (handler) { if (handler.numPages > 1) { Promise.all([handler.getPage(1), handler.getPage(2)]).then(function (pages) { _this.init(handler, pages); }); } else { _this.init(handler); } }); } Pdf.prototype.init = function init(handler, pages) { this.handler = handler; this.doubledPages = pages ? Math.abs(2 * Pdf.getPageSize(pages[0]).width - Pdf.getPageSize(pages[1]).width) / Pdf.getPageSize(pages[0]).width < 1e-4 : false; var done = Promise.resolve(handler); var _loop = function _loop() { if (_isArray) { if (_i >= _iterator.length) return 'break'; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) return 'break'; _ref = _i.value; } var clb = _ref; done = done.then(function (handler) { clb(handler); return handler; }); }; for (var _iterator = this.handlerQueue.reverse(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; var _ret = _loop(); if (_ret === 'break') break; } }; Pdf.prototype.getPageType = function getPageType(n) { return !this.doubledPages || n === 0 || n === this.getPagesNum() - 1 ? 'full' : n & 1 ? 'left' : 'right'; }; Pdf.prototype.getPage = function getPage(n) { return this.handler.getPage(this.doubledPages ? Math.ceil(n / 2) + 1 : n + 1); }; Pdf.prototype.dispose = function dispose() { this.handlerQueue.splice(0, this.handlerQueue.length); delete this.handler; }; Pdf.prototype.setLoadingProgressClb = function setLoadingProgressClb(clb) { this.loadingProgress = clb; }; Pdf.prototype.getPagesNum = function getPagesNum() { return this.handler ? this.doubledPages ? 2 * (this.handler.numPages - 1) : this.handler.numPages : undefined; }; Pdf.getPageSize = function getPageSize(page) { return { width: page.view[2] - page.view[0], height: page.view[3] - page.view[1] }; }; // if(pages>1) { // handler.getPage(2). // then((page)=> { // const size1 = Pdf.getPageSize(page); // this.props.doubledPages = 2*size0.width===size1.width; // this.ready(); // }). // catch(()=> this.ready()); // } // else { Pdf.prototype.getHandler = function getHandler(clb) { if (this.handler) { clb(this.handler); } else { this.handlerQueue.push(clb); } }; return Pdf; }(); exports.default = Pdf; /***/ }, /* 19 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ThreeEventConverterFs = function () { ThreeEventConverterFs.objectsTest = function objectsTest(object1, object2) { return object1 && object2 ? object1.object === object2.object : false; }; ThreeEventConverterFs.objectsAndFacesTest = function objectsAndFacesTest(object1, object2) { return object1 && object2 ? object1.object === object2.object && object1.face.materialIndex === object2.face.materialIndex : false; }; function ThreeEventConverterFs(visualWorld) { var test = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ThreeEventConverterFs.objectsAndFacesTest; _classCallCheck(this, ThreeEventConverterFs); this.visual = visualWorld; this.coords = new _libs.THREE.Vector2(); this.raycaster = this.visual.raycaster; this.camera = this.visual.camera; this.threes = []; this.test = test; } ThreeEventConverterFs.prototype.addThree = function addThree(three) { this.threes.push(three); }; ThreeEventConverterFs.prototype.removeThree = function removeThree(three) { var i = this.threes.indexOf(three); if (~i) { this.threes.splice(i, 1); } }; ThreeEventConverterFs.prototype.getObject = function getObject(e) { this.setCoordsFromEvent(e); this.raycaster.setFromCamera(this.coords, this.camera); var intersects = this.raycaster.intersectObjects(this.threes); return intersects[0]; }; return ThreeEventConverterFs; }(); exports.default = ThreeEventConverterFs; /***/ }, /* 20 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ThreeUtils = function () { function ThreeUtils() { _classCallCheck(this, ThreeUtils); } ThreeUtils.vertices2UVs = function vertices2UVs(vertices, indeces, first, last, converClb) { var r = []; for (var i = first; i < last; ++i) { var vis = [indeces[i].a, indeces[i].b, indeces[i].c]; for (var j = 0; j < vis.length; ++j) { if (!r[vis[j]]) { r[vis[j]] = converClb(vertices[vis[j]]); } } } return r; }; ThreeUtils.computeFaceVertexUvs = function computeFaceVertexUvs(geometry, faces) { var uvs = [ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, 0, faces[0], function (p) { return new THREE.Vector2(p.x, 1 - p.z); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[0], faces[1], function (p) { return new THREE.Vector2(1 - p.x, 1 - p.z); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[1], faces[2], function (p) { return new THREE.Vector2(p.x, p.y); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[2], faces[3], function (p) { return new THREE.Vector2(1 - p.x, p.y); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[3], faces[4], function (p) { return new THREE.Vector2(p.z, p.y); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[4], geometry.faces.length, function (p) { return new THREE.Vector2(1 - p.z, p.y); })]; var uvsi = 0; for (var i = 0; i < geometry.faces.length; ++i) { uvsi += faces[uvsi] === i; var f = geometry.faces[i]; f.materialIndex = uvsi; geometry.faceVertexUvs[0][i] = [uvs[uvsi][f.a], uvs[uvsi][f.b], uvs[uvsi][f.c]]; } }; ThreeUtils.createMarker = function createMarker(p, c, size) { var marker = new THREE.Mesh(new THREE.SphereGeometry(size), new THREE.MeshPhongMaterial({ color: c })); marker.position.set(p.x, p.y, p.z); return marker; }; ThreeUtils.findUvTris = function findUvTris(geometry, ps, first, last) { var res = []; for (var _iterator = ps, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var p = _ref; var found = false; for (var i = first; i < last && !found; ++i) { var tri = geometry.faceVertexUvs[0][i]; if (_BaseMathUtils2.default.isInsideConvPoly(tri, p)) { res.push({ coefs: _BaseMathUtils2.default.computeInterpCoefs(tri, p), i: i }); found = true; } } if (!found) { console.error('Bad point'); res.push(undefined); } } return res; }; ThreeUtils.findInternalVertices = function findInternalVertices(geometry, ps, first, last) { var res = {}; for (var i = first; i < last; ++i) { var tri = geometry.faceVertexUvs[0][i], f = geometry.faces[i], vs = [f.a, f.b, f.c]; for (var j = 0; j < tri.length; ++j) { if (res[vs[j]] === undefined && _BaseMathUtils2.default.isInsidePoly(ps, tri[j])) { res[vs[j]] = { p: tri[j], i: vs[j], n: f.vertexNormals[j] }; } } } return Object.values(res); }; return ThreeUtils; }(); exports.default = ThreeUtils; /***/ }, /* 21 */ /***/function (module, exports) { "use strict"; "use strict"; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Target = function () { function Target() { _classCallCheck(this, Target); } Target.test = function test(object1, object2) { return object1.target === object2.target; }; return Target; }(); exports.default = Target; /***/ }, /* 22 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(1); var _Detector = __webpack_require__(45); var _Detector2 = _interopRequireDefault(_Detector); var _VisualWorld = __webpack_require__(66); var _VisualWorld2 = _interopRequireDefault(_VisualWorld); var _PdfLinksHandler = __webpack_require__(35); var _PdfLinksHandler2 = _interopRequireDefault(_PdfLinksHandler); var _Book = __webpack_require__(26); var _Book2 = _interopRequireDefault(_Book); var _BookView = __webpack_require__(29); var _BookView2 = _interopRequireDefault(_BookView); var _BookController = __webpack_require__(27); var _BookController2 = _interopRequireDefault(_BookController); var _PdfBookPropsBuilder = __webpack_require__(34); var _PdfBookPropsBuilder2 = _interopRequireDefault(_PdfBookPropsBuilder); var _ClbBookPropsBuilder = __webpack_require__(30); var _ClbBookPropsBuilder2 = _interopRequireDefault(_ClbBookPropsBuilder); var _LoadingController = __webpack_require__(53); var _LoadingController2 = _interopRequireDefault(_LoadingController); var _Search = __webpack_require__(58); var _Search2 = _interopRequireDefault(_Search); var _Bookmarks = __webpack_require__(44); var _Bookmarks2 = _interopRequireDefault(_Bookmarks); var _Thumbnails = __webpack_require__(63); var _Thumbnails2 = _interopRequireDefault(_Thumbnails); var _TocController = __webpack_require__(40); var _TocController2 = _interopRequireDefault(_TocController); var _BookPrinter = __webpack_require__(28); var _BookPrinter2 = _interopRequireDefault(_BookPrinter); var _AutoNavigator = __webpack_require__(24); var _AutoNavigator2 = _interopRequireDefault(_AutoNavigator); var _SoundsEnviroment = __webpack_require__(39); var _SoundsEnviroment2 = _interopRequireDefault(_SoundsEnviroment); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } _libs.$.fn.FlipBook = function (options) { var scene = { dispose: function dispose() { if (this.ready) { !scene.pdfLinksHandler || scene.pdfLinksHandler.dispose(); delete scene.pdfLinksHandler; scene.sounds.dispose(); delete scene.sounds; scene.tocCtrl.dispose(); delete scene.tocCtrl; scene.thumbnails.dispose(); delete scene.thumbnails; !scene.bookmarks || scene.bookmarks.dispose(); delete scene.bookmarks; scene.ctrl.dispose(); delete scene.ctrl; scene.bookPrinter.dispose(); delete scene.bookPrinter; scene.book.dispose(); delete scene.book; scene.propsBuilder.dispose(); delete scene.propsBuilder; delete scene.bookBuilder; scene.visual.dispose(); delete scene.visual; scene.view.dispose(); delete scene.view; delete scene.dispose; } else { this.pendingDispose = true; } } }; options = _extends({}, options); scene.view = new _BookView2.default(this.length ? this[0] : (0, _libs.$)('
').appendTo('body'), function () { if (!_Detector2.default.webgl) { _Detector2.default.addGetWebGLMessage({ parent: scene.view.getView() }); } else { scene.loadingCtrl = new _LoadingController2.default(scene.view, true, function (progress) { return progress === 0 ? (0, _libs.tr)('Please wait... the Application is Loading') : (0, _libs.tr)('PDF is Loading:') + ' ' + progress + '%'; }); scene.visual = new _VisualWorld2.default(scene.view.getContainer().ownerDocument.defaultView, scene.view.getContainer().ownerDocument, scene.view.getView()); scene.bookBuilder = function (props, sheets, pageCallback) { props.cssLayerProps = _extends({}, props.cssLayerProps, { scene: scene }); if (options.propertiesCallback) { props = options.propertiesCallback(props); } scene.book = new _Book2.default(scene.visual, sheets, pageCallback, props); scene.bookPrinter = new _BookPrinter2.default(scene.visual, scene.book, (options.template || {}).printStyle); scene.loadingCtrl.dispose(); delete scene.loadingCtrl; scene.ctrl = new _BookController2.default(scene.book, scene.view, options.controlsProps); scene.book.setInjector(function (w) { w.jQuery = w.$ = _libs.$; w.book = scene.book; w.bookCtrl = scene.ctrl; if (props.injector) { props.injector(w); } }); scene.view.addHandler(scene.ctrl); scene.ctrl.setPrinter(scene.bookPrinter); var test = pageCallback(0); scene.search = new _Search2.default(scene.view.getSearchView(), scene.book.getPages()); scene.search.onQuery = scene.book.setQuery.bind(scene.book); scene.book.addEventListener('searchResults', function (e) { scene.search.setResults(e.results, e.lastPage); }); scene.thumbnails = new _Thumbnails2.default(scene.visual, scene.view.getThumbnailsView(), pageCallback, 2 * (sheets + 2), { kWtoH: props.width / props.height }); scene.tocCtrl = new _TocController2.default(scene.view, scene.ctrl); scene.tocCtrl.setThumbnails(scene.thumbnails); scene.tocCtrl.setSearch(scene.search); scene.ctrl.setTocCtrl(scene.tocCtrl); scene.view.addHandler(scene.tocCtrl); if (test.type === 'pdf') { scene.pdfLinksHandler = new _PdfLinksHandler2.default(test.src, scene.ctrl, scene.visual.element); scene.book.addEventListener('pdfAnnotation', scene.pdfLinksHandler.handleEvent.bind(scene.pdfLinksHandler)); test.src.getHandler(function (handler) { handler.getOutline().then(function (outline) { scene.bookmarks = new _Bookmarks2.default(scene.view.getBookmarksView(), outline); scene.tocCtrl.setBookmarks(scene.bookmarks, test.src); }); }); if (options.pdfLinks && options.pdfLinks.handler) { scene.pdfLinksHandler.setHandler(options.pdfLinks.handler); } } scene.sounds = new _SoundsEnviroment2.default(options.template); scene.ctrl.setSounds(scene.sounds); scene.sounds.subscribeFlips(scene.ctrl); scene.ready = true; new _AutoNavigator2.default(scene.visual, scene.ctrl, options.autoNavigation).dispose(); if (options.ready) { options.ready(scene); } if (scene.pendingDispose) { scene.dispose(); } }; if (options.pdf) { scene.propsBuilder = new _PdfBookPropsBuilder2.default(options.pdf, scene.bookBuilder); scene.propsBuilder.pdf.setLoadingProgressClb(scene.loadingCtrl.setProgress.bind(scene.loadingCtrl)); } else if (options.pageCallback) { scene.propsBuilder = new _ClbBookPropsBuilder2.default(scene.visual, options.pageCallback, options.pages, scene.bookBuilder); } else { scene.propsBuilder = new _ClbBookPropsBuilder2.default(scene.visual, _Book2.default.pageCallback, 6, scene.bookBuilder); } } }, options.template); return scene; }; (0, _libs.$)(function () { var containers = (0, _libs.$)('.flip-book-container'); for (var i = 0; i < containers.length; ++i) { var jContainer = (0, _libs.$)(containers[i]), src = jContainer.attr('src'); if (!!src) { jContainer.FlipBook({ pdf: src }); } } }); window.jQuery = window.$ = _libs.$; /***/ }, /* 23 */ /***/function (module, exports) { "use strict"; 'use strict'; if (!Array.prototype.fill) { Array.prototype.fill = function (value) { // Шаги 1-2. if (this == null) { throw new TypeError('this is null or not defined'); } var O = Object(this); // Шаги 3-5. var len = O.length >>> 0; // Шаги 6-7. var start = arguments[1]; var relativeStart = start >> 0; // Шаг 8. var k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); // Шаги 9-10. var end = arguments[2]; var relativeEnd = end === undefined ? len : end >> 0; // Шаг 11. var final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); // Шаг 12. while (k < final) { O[k] = value; k++; } // Шаг 13. return O; }; } if (!Array.prototype.find) { Object.defineProperty(Array.prototype, 'find', { value: function value(predicate) { 'use strict'; if (this == null) { throw new TypeError('Array.prototype.find called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } return undefined; } }); } if (!Array.prototype.findIndex) { Array.prototype.findIndex = function (predicate) { if (this == null) { throw new TypeError('Array.prototype.findIndex called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return i; } } return -1; }; } if (!Object.values) { Object.values = function values(O) { return Object.keys(O).map(function (name) { return O[name]; }) || []; }; } /***/ }, /* 24 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var AutoNavigator = function () { function AutoNavigator(context, bookCtrl) { var props = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; _classCallCheck(this, AutoNavigator); props = _extends({}, props, { urlParam: props.urlParam || 'fb3d-page', navigates: props.navigates === undefined ? 1 : props.navigates }); this.props = props; this.context = context; this.bookCtrl = bookCtrl; this.urlParam = props.urlParam; this.wnd = context.wnd; this.wnd.fb3d = _extends({}, this.wnd.fb3d); this.wnd.fb3d.navigator = _extends({}, this.wnd.fb3d.navigator); this.navigator = this.wnd.fb3d.navigator[this.urlParam] = _extends({}, this.wnd.fb3d.navigator[this.urlParam]); this.navigator.instances = (this.navigator.instances || 0) + 1; if (this.navigator.instances <= this.props.navigates) { this.bookCtrl.goToPage(this.getPageNumber()); } } AutoNavigator.prototype.dispose = function dispose() {}; AutoNavigator.prototype.getParameterByName = function getParameterByName(name, url) { if (!url) { url = window.location.href; } name = name.replace(/[\[\]]/g, '\\$&'); var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)'), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, ' ')); }; AutoNavigator.prototype.getPageNumber = function getPageNumber() { var number = this.getParameterByName(this.urlParam); number = parseInt(number); if (isNaN(number)) { number = 1; } return number - 1; }; return AutoNavigator; }(); exports.default = AutoNavigator; /***/ }, /* 25 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(1); var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Binder = function () { function Binder(visual, p) { var _this = this; _classCallCheck(this, Binder); this.visual = visual; this.p = _extends({}, p, { backSize: 2 * p.cover.depth + p.sheets * p.page.depth }); this.OZ = new _libs.THREE.Vector3(0, 0, 1); this.backG = new _libs.THREE.BoxGeometry(p.cover.depth, this.p.backSize, p.cover.height); this.materials = [new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color })]; var backM = new _libs.THREE.Mesh(this.backG, new _libs.THREE.MeshFaceMaterial(this.materials)); if (p.cover.binderTexture !== '') { this.visual.textureLoader.load(p.cover.binderTexture, function (texture) { _this.materials[1].color.setHex(0xFFFFFF); _this.materials[1].map = texture; texture.minFilter = _libs.THREE.LinearFilter; texture.needsUpdate = true; _this.materials[1].needsUpdate = true; }); } this.three = new _libs.THREE.Object3D(); this.back = new _libs.THREE.Object3D(); this.backRT = new _libs.THREE.Object3D(); this.backRR = new _libs.THREE.Object3D(); this.backLT = new _libs.THREE.Object3D(); this.backLR = new _libs.THREE.Object3D(); this.leftPivot = new _libs.THREE.Object3D(); this.rightPivot = new _libs.THREE.Object3D(); this.back.add(backM); this.back.add(this.leftPivot); this.back.add(this.rightPivot); this.backRT.add(this.back); this.backRR.add(this.backRT); this.backLT.add(this.backRR); this.backLR.add(this.backLT); this.three.add(this.backLR); } Binder.prototype.dispose = function dispose() { for (var _iterator = this.materials, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var m = _ref; if (m.map) { m.map = null; m.needsUpdate = true; } m.dispose(); } delete this.materials; this.backG.dispose(); }; Binder.prototype.set = function set(angle) { var right = void 0, left = void 0; if (angle > Math.PI / 2) { right = Math.PI / 2; left = angle - Math.PI / 2; } else { right = angle; left = 0; } var p = this.p, tr1 = { x: -0.5 * p.cover.depth, y: 0.5 * p.backSize - p.cover.depth }; this.backRT.position.set(tr1.x, tr1.y, 0); this.backRR.position.set(-tr1.x, -tr1.y, 0); this.backRR.quaternion.setFromAxisAngle(this.OZ, right); var tr2 = { x: p.backSize - 2 * p.cover.depth - 0.5 * p.cover.depth, y: 0.5 * p.backSize - p.cover.depth }; this.backLT.position.set(tr2.x, tr2.y, 0); this.backLR.position.set(-tr2.x, -tr2.y, 0); this.backLR.quaternion.setFromAxisAngle(this.OZ, left); }; Binder.prototype.setLeft = function setLeft(angle) { var PI = Math.PI; this.leftPivot.position.set(_MathUtils2.default.interpolateLinear([-PI, -PI / 2], [0, this.p.cover.depth], angle), 0.5 * this.p.backSize - 0.5 * this.p.cover.depth, 0); this.leftPivot.quaternion.setFromAxisAngle(this.OZ, angle); }; Binder.prototype.setRight = function setRight(angle) { var PI = Math.PI; this.rightPivot.position.set(_MathUtils2.default.interpolateLinear([-PI / 2, 0], [this.p.cover.depth, 0], angle), -0.5 * this.p.backSize + 0.5 * this.p.cover.depth, 0); this.rightPivot.quaternion.setFromAxisAngle(this.OZ, angle); }; Binder.prototype.joinLeftCover = function joinLeftCover(cover) { cover.three.position.set(0, -0.5 * this.p.cover.depth, 0); this.leftPivot.add(cover.three); }; Binder.prototype.disconnectLeftCover = function disconnectLeftCover(cover) { this.leftPivot.remove(cover.three); }; Binder.prototype.joinRightCover = function joinRightCover(cover) { cover.three.position.set(0, -0.5 * this.p.cover.depth, 0); this.rightPivot.add(cover.three); }; Binder.prototype.disconnectRightCover = function disconnectRightCover(cover) { this.rightPivot.remove(cover.three); }; return Binder; }(); exports.default = Binder; /***/ }, /* 26 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(1); var _book = __webpack_require__(11); var _GraphUtils = __webpack_require__(7); var _GraphUtils2 = _interopRequireDefault(_GraphUtils); var _Binder = __webpack_require__(25); var _Binder2 = _interopRequireDefault(_Binder); var _Cover = __webpack_require__(31); var _Cover2 = _interopRequireDefault(_Cover); var _SheetBlock = __webpack_require__(10); var _SheetBlock2 = _interopRequireDefault(_SheetBlock); var _SheetPhysics = __webpack_require__(38); var _SheetPhysics2 = _interopRequireDefault(_SheetPhysics); var _PageManager = __webpack_require__(33); var _PageManager2 = _interopRequireDefault(_PageManager); var _CSSLayer = __webpack_require__(13); var _CSSLayer2 = _interopRequireDefault(_CSSLayer); var _CssLayersManager = __webpack_require__(32); var _CssLayersManager2 = _interopRequireDefault(_CssLayersManager); var _SearchEngine = __webpack_require__(36); var _SearchEngine2 = _interopRequireDefault(_SearchEngine); var _CustomEventConverter = __webpack_require__(16); var _CustomEventConverter2 = _interopRequireDefault(_CustomEventConverter); var _CircleTarget = __webpack_require__(68); var _CircleTarget2 = _interopRequireDefault(_CircleTarget); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Book = function (_THREE$EventDispatche) { _inherits(Book, _THREE$EventDispatche); // pageCallback samples // (n)=> ({ // type: 'image', // src: 'sample.png', // interactive: false // }); // // (n)=> ({ // type: 'html', // src: 'sample.html', // interactive: true // }); // // const pdf = new Pdf('sample.pdf'); // (n)=> ({ // type: 'pdf', // src: pdf, // interactive: false // }); function Book(visual, sheets, pageCallback, props) { _classCallCheck(this, Book); var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); sheets = Math.min(3, sheets); visual.jContainer.append('\n \n
\n This is the demo version, only 10 pages are available. Use the full version.\n
\n '); _this.visual = visual; _this.mouseController = true; _this.p = _extends({}, Book.prepareProps(props), { sheets: sheets, pageCallback: pageCallback, zoom: 1, singlePage: false, autoResolution: { enable: false, k: 1.5 } }); _this.pageManager = new _PageManager2.default(visual, _this, _this.p); _CSSLayer2.default.init(visual.doc); _this.layerManager = new _CssLayersManager2.default(_this); _this.searchEngine = new _SearchEngine2.default(pageCallback, 2 * (sheets + 2)); _this.searchEngine.onPageHitsChanged = function (page, query) { _this.pageManager.refreshPageQuery(page, query); _this.dispatchEvent({ type: 'searchResults', results: _this.searchEngine.results, lastPage: page, query: query }); }; _this.three = new _libs.THREE.Object3D(); _this.binder = new _Binder2.default(visual, _this.p); _this.three.add(_this.binder.three); _this.leftCover = new _Cover2.default(visual, _extends({}, _this.p, { setTexture: _this.setLeftCoverTexture.bind(_this) }), Math.PI / 2, 'opened'); _this.binder.joinLeftCover(_this.leftCover); _this.subscribeSheetBlock(_this.leftCover, 0); _this.rightCover = new _Cover2.default(visual, _extends({}, _this.p, { setTexture: _this.setRightCoverTexture.bind(_this) }), 0, 'closed'); _this.binder.joinRightCover(_this.rightCover); _this.subscribeSheetBlock(_this.rightCover, 2 * (_this.p.sheets + 1)); _this.threeSheetBlocks = new _libs.THREE.Object3D(); _this.three.add(_this.threeSheetBlocks); _this.threeSheetBlocks.position.set(0.5 * _this.p.cover.depth - 0.5 * sheets * _this.p.page.depth, -0.5 * sheets * _this.p.page.depth, 0); _this.sheetBlocks = []; if (sheets > 0) { _this.addSheetBlock(0, new _SheetBlock2.default(visual, _extends({}, _this.p, { setTexture: _this.setPageTexture.bind(_this) }), 0, sheets, 0, 'closed')); } _this.angle = _this.p.rtl ? Math.PI : 0; _this.closedAngle = 0; _this.set(_this.angle, 0); _this.lastMousePos = { t: 0 }; _this.three.position.set(-0.5 * _this.p.cover.depth + 0.5 * sheets * _this.p.page.depth, 0, 0); _this.sheetPhysics = new _SheetPhysics2.default(_this.p.page.width / _this.p.scale, _this.p.gravity, _this.p.page.cornerDeviation); _this.binds = { update: _this.update.bind(_this), lastMousePos: function lastMousePos(e) { _this.lastMousePos = _extends({}, _this.lastMousePos, { pageX: e.pageX, pageY: e.pageY }); } }; _this.visual.addRenderCallback(_this.binds.update); (0, _libs.$)(_this.visual.element).on('mousemove', _this.binds.lastMousePos); _this.binds.onPickCallback = _this.onPickCallback.bind(_this); _this.visual.drag.onPickCallback = _this.binds.onPickCallback; _this.binds.onDragCallback = _this.onDragCallback.bind(_this); _this.visual.drag.onDragCallback = _this.binds.onDragCallback; _this.binds.onReleaseCallback = _this.onReleaseCallback.bind(_this); _this.visual.drag.onReleaseCallback = _this.binds.onReleaseCallback; _this.dragAngle = 0.05; _this.tmp = { boxs: [new _libs.THREE.Box3(), new _libs.THREE.Box3()] }; _this.visual.addObject(_this.three); _this.visual.addEventListener('resize', _this.pageManager.refreshZoom.bind(_this.pageManager)); setTimeout(function () { _this.notifyBeforeAnimation(); _this.notifyAfterAnimation(); }, 100); return _this; } Book.prototype.dispose = function dispose() { this.visual.removeObject(this.three); this.sheetPhysics.dispose(); delete this.visual.drag.onPickCallback; delete this.visual.drag.onDragCallback; delete this.visual.drag.onReleaseCallback; (0, _libs.$)(this.visual.element).off('mousemove', this.binds.lastMousePos); this.visual.removeRenderCallback(this.binds.update); this.removeSheetBlocks(0, this.sheetBlocks.length); this.binder.disconnectLeftCover(this.leftCover); this.removeSheetBlock(this.leftCover); this.binder.disconnectRightCover(this.rightCover); this.removeSheetBlock(this.rightCover); this.binder.dispose(); this.layerManager.dispose(); _CSSLayer2.default.dispose(); this.pageManager.dispose(); }; // publics { Book.prototype.setAutoResolution = function setAutoResolution(enable) { var k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.5; this.p.autoResolution = _extends({}, this.p.autoResolution, { enable: enable, k: k }); }; Book.prototype.setZoom = function setZoom(zoom, singlePage) { if (Math.abs(this.p.zoom - zoom) > 1e-3 || singlePage !== this.p.singlePage) { this.p.zoom = zoom; this.p.singlePage = singlePage; this.pageManager.refreshZoom(); } }; Book.prototype.getPageCallback = function getPageCallback() { return this.p.pageCallback; }; Book.prototype.setQuery = function setQuery(query) { this.searchEngine.setQuery(query); }; Book.prototype.isProcessing = function isProcessing() { return this.sheetPhysics.getSize() !== 0; }; Book.prototype.getPages = function getPages() { return 4 + 2 * this.p.sheets; }; Book.prototype.setFlipProgressClb = function setFlipProgressClb(clb) { this.p.flipProgressClb = clb; }; Book.prototype.setInjector = function setInjector(injector) { this.p.injector = injector; }; Book.prototype.isActivePage = function isActivePage(n) { var res = true; if (n > 1 && n < this.getPages() - 2) { for (var _iterator = this.sheetBlocks, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var b = _ref; if (n - 2 > 2 * b.p.first && n - 2 < 2 * b.p.last - 1) { res = false; break; } } } return res; }; Book.prototype.getBlockByPage = function getBlockByPage(n) { var block = void 0; if (n < 2) { block = this.leftCover; } else if (n < 2 * (this.p.sheets + 1)) { for (var _iterator2 = this.sheetBlocks, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var b = _ref2; if (n - 2 >= 2 * b.p.first && n - 2 < 2 * b.p.last) { block = b; break; } } } else { block = this.rightCover; } return block; }; Book.prototype.getBlockPages = function getBlockPages(block) { var range = void 0; switch (block) { case this.leftCover: { range = [0, 1]; break; } case this.rightCover: { range = [2 * (this.p.sheets + 1), 2 * (this.p.sheets + 1) + 1]; break; } default: { range = block ? [2 * (block.p.first + 1), 2 * (block.p.last + 1) - 1] : undefined; } } return range; }; Book.prototype.getPage = function getPage() { var PI = Math.PI; var p = void 0; if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { for (var _iterator3 = this.sheetBlocks, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var block = _ref3; if (block.angle <= PI / 2) { p = this.getBlockPages(block)[0] - 1; break; } } if (!p) { p = this.getPages() - 3; } } else if (this.angle < PI / 2) { p = 0; } else if (this.angle > 3 * PI / 2) { p = 1; } else if (this.angle < PI) { p = this.getPages() - 3; } else if (this.angle >= PI) { p = this.getPages() - 1; } return p; }; Book.prototype.getTopPages = function getTopPages() { var p = this.getPage(); return p === 0 || p === this.getPages() - 1 ? [p] : [p, p + 1]; }; Book.prototype.getPageState = function getPageState(n) { return this.pageManager.getPageState(n); }; Book.prototype.enableLoadingAnimation = function enableLoadingAnimation(enable) { this.pageManager.enableLoadingAnimation(enable); }; Book.prototype.getLeftFlipping = function getLeftFlipping() { var block = void 0; var left = this.sheetBlocks[0], PI = Math.PI; if (this.angle === PI) { block = this.rightCover; } else { if (left && left.state === 'closed' && left.angle > PI / 2) { block = left; } else if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { block = this.leftCover; } } return block; }; Book.prototype.getRightFlipping = function getRightFlipping() { var block = void 0; var right = this.sheetBlocks[this.sheetBlocks.length - 1], PI = Math.PI; if (this.angle === 0) { block = this.leftCover; } else { if (right && right.state === 'closed' && right.angle <= PI / 2) { block = right; } else if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { block = this.rightCover; } } return block; }; Book.prototype.getClosedBlockAngle = function getClosedBlockAngle(angle) { var closedAngle = void 0, PI = Math.PI; if (this.leftCover.physicId) { var test = void 0; try { test = Math.abs(this.sheetPhysics.getParametr(this.leftCover.physicId, 'angle') - angle); } catch (e) { test = 0; } closedAngle = angle > PI / 2 || test > PI / 6 ? PI / 2 : this.closedAngle; } else if (this.rightCover.physicId) { var _test = void 0; try { _test = Math.abs(this.sheetPhysics.getParametr(this.rightCover.physicId, 'angle') - angle); } catch (e) { _test = 0; } closedAngle = angle < PI / 2 || _test > PI / 6 ? PI / 2 + 1e-7 : this.closedAngle; } else { closedAngle = PI / 2 + (angle !== 0) * 1e-7; } return { openedAngle: angle, closedAngle: closedAngle, binderTurn: this.closedAngle }; }; Book.prototype.flipLeft = function flipLeft() { var _this2 = this; var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var progressClb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.p.flipProgressClb; var block = void 0, res = void 0; if (this.sheetPhysics.getSize() < 25) { (function () { var left = _this2.sheetBlocks[0], PI = Math.PI; if (_this2.angle === PI) { res = _this2.connectPhysics(block = _this2.rightCover, _this2.p.cover.mass, PI, -_this2.p.cover.startVelocity, _this2.p.cover.flexibility, 0, function (angle, height) { return _this2.set(3 * PI / 2 - angle / 2, height); }, function (angle, height) { _this2.set(3 * PI / 2 - angle / 2, 0); _this2.setSheetBlocks(angle ? PI : PI / 2 + 1e-7, 'closed'); }, progressClb); } else { if (left && left.state === 'closed' && left.angle > PI / 2) { block = size < left.getSize() ? _this2.splitSheetBlock(0, left.getSize() - size)[1] : left; res = _this2.connectPhysics(block, _this2.p.page.mass * block.getSize(), PI, -_this2.p.page.startVelocity, _this2.p.page.flexibility, 0, function (angle, height) { return block.set(_this2.getClosedBlockAngle(angle), 'opened', height); }, Book.finishAnimationClb.bind({ book: _this2, block: block }), progressClb); } else if (_this2.angle === PI / 2 || _this2.angle === 3 * PI / 2) { res = _this2.connectPhysics(block = _this2.leftCover, _this2.p.cover.mass, PI, -_this2.p.cover.startVelocity, _this2.p.cover.flexibility, 0, function (angle, height) { _this2.set(2 * PI - angle / 2, height); if (angle > PI / 2) { _this2.setSheetBlocks(angle ? PI / 2 : 0, 'closed'); } }, function (angle, height) { return _this2.set(angle === 0 ? 0 : 2 * PI - angle / 2, 0); }, progressClb); } } })(); } return res; }; Book.prototype.flipRight = function flipRight() { var _this3 = this; var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var progressClb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.p.flipProgressClb; var block = void 0, res = void 0; if (this.sheetPhysics.getSize() < 25) { (function () { var right = _this3.sheetBlocks[_this3.sheetBlocks.length - 1], PI = Math.PI; if (_this3.angle === 0) { res = _this3.connectPhysics(block = _this3.leftCover, _this3.p.cover.mass, 0, _this3.p.cover.startVelocity, _this3.p.cover.flexibility, 0, function (angle, height) { return _this3.set(angle / 2, height); }, function (angle, height) { _this3.set(angle / 2, 0); _this3.setSheetBlocks(angle ? PI / 2 : 0, 'closed'); }, progressClb); } else { if (right && right.state === 'closed' && right.angle <= PI / 2) { block = size < right.getSize() ? _this3.splitSheetBlock(_this3.sheetBlocks.length - 1, size)[0] : right; res = _this3.connectPhysics(block, _this3.p.page.mass * block.getSize(), 0, _this3.p.page.startVelocity, _this3.p.page.flexibility, 0, function (angle, height) { return block.set(_this3.getClosedBlockAngle(angle), 'opened', height); }, Book.finishAnimationClb.bind({ book: _this3, block: block }), progressClb); } else if (_this3.angle === PI / 2 || _this3.angle === 3 * PI / 2) { res = _this3.connectPhysics(block = _this3.rightCover, _this3.p.cover.mass, 0, _this3.p.cover.startVelocity, _this3.p.cover.flexibility, 0, function (angle, height) { _this3.set(PI / 2 + angle / 2, height); if (angle < PI / 2) { _this3.setSheetBlocks(PI / 2 + 1e-7, 'closed'); } }, function (angle, height) { return _this3.set(PI / 2 + angle / 2, 0); }, progressClb); } } })(); } return res; }; // } Book.prototype.clearHoverInfo = function clearHoverInfo() { this.pageManager.turnOnEvents(); delete this.hoverInfo.block.force; delete this.hoverInfo.block.cornerForce; delete this.hoverInfo; }; Book.prototype.xSegment = function xSegment() { var boxs = this.tmp.boxs, res = {}; if (this.leftCover.physicId) { boxs[0].setFromObject(this.rightCover.three); res.min = -(res.max = boxs[0].max.x); } else if (this.rightCover.physicId) { boxs[0].setFromObject(this.leftCover.three); res.max = -(res.min = boxs[0].min.x); } else { boxs[0].setFromObject(this.leftCover.three); boxs[1].setFromObject(this.rightCover.three); boxs[0].union(boxs[1]); res.min = boxs[0].min.x; res.max = boxs[0].max.x; } return res; }; Book.prototype.computeTarget = function computeTarget(point) { var x = point.x, y = point.y, seg = this.xSegment(), angle = void 0; angle = (seg.max - x) / (seg.max - seg.min) * Math.PI; // angle = Math.acos(x/Math.sqrt(x*x+y*y)); return Math.max(this.dragAngle, Math.min(Math.PI - this.dragAngle, angle)); }; Book.prototype.onPickCallback = function onPickCallback(object) { var res = false; var block = object.object.userData.self, p = _extends({}, object.uv), i = object.face.materialIndex; if (i < 2) { p.x = i === 0 ? p.x : 1 - p.x; if (block.cornerTarget.testIntersection(null, p) && block.physicId) { if (this.hoverInfo) { this.clearHoverInfo(); } block.force = _SheetPhysics2.default.dragForceClb; block.cornerForce = _SheetPhysics2.default.getDragCornerForceClb(this.computeTarget(object.point)); this.dragInfo = { object: object, block: block }; res = true; this.pageManager.turnOffEvents(); } } return res; }; Book.prototype.onDragCallback = function onDragCallback(point) { var block = this.dragInfo.block, p = block.getProps(); block.force = _SheetPhysics2.default.dragForceClb; block.cornerForce = _SheetPhysics2.default.getDragCornerForceClb(this.computeTarget(point)); return true; }; Book.prototype.onReleaseCallback = function onReleaseCallback() { delete this.dragInfo.block.force; delete this.dragInfo.block.cornerForce; delete this.dragInfo; this.pageManager.turnOnEvents(); }; Book.prototype.getFlipping = function getFlipping(i) { return i ? this.getLeftFlipping() : this.getRightFlipping(); }; Book.prototype.flip = function flip(i) { var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; return i ? this.flipLeft(size) : this.flipRight(size); }; Book.prototype.enableMouse = function enableMouse(enable) { this.mouseController = enable; }; Book.prototype.cornerCallback = function cornerCallback(e, data) { var _this4 = this; if (this.mouseController) { (function () { var _data$data = data.data, i = _data$data.i, n = _data$data.n; if (e.type === 'mouseover') { if (_this4.hoverInfo && _this4.hoverInfo.pendings !== undefined) { ++_this4.hoverInfo.pendings; } else { if (_this4.hoverInfo) { console.warn('Wrong state: element is already hover'); if (_this4.hoverInfo.n !== n) { _this4.clearHoverInfo(); } } if (!_this4.hoverInfo && !_this4.dragInfo) { (function () { var res = Promise.resolve(undefined); var hoverAngle = 0.02, hover = _this4.getBlockByPage(n), possible = _this4.getFlipping(i); if (n > 1 && n < 2 * (_this4.p.sheets + 1) && hover.physicId && (hover.angle < hoverAngle || hover.angle > Math.PI - hoverAngle)) { res = Promise.resolve(hover); } else if (hover === possible) { var sheetBlocks = [_this4.leftCover].concat(_this4.sheetBlocks, [_this4.rightCover]); var j = sheetBlocks.indexOf(hover), nextBlock = ~j ? sheetBlocks[j + 2 * i - 1] : undefined; if (!nextBlock || !nextBlock.physicId || nextBlock.angle > hoverAngle && nextBlock.angle < Math.PI - hoverAngle) { res = _this4.flip(i, 1).then(function (block) { if (!block) { delete _this4.hoverInfo; } else { _this4.sheetPhysics.setParametr(block.physicId, 'velocity', 0); } return block; }); _this4.hoverInfo = { pendings: 1 }; } } res.then(function (block) { if (_this4.hoverInfo && _this4.hoverInfo.pendings < 1) { block = undefined; delete _this4.hoverInfo; } if (block) { _this4.pageManager.turnOffEvents(); var p = block.getProps(); block.force = _this4.sheetPhysics.getTargetForceClb(p.mass * block.getSize(), i ? Math.PI - hoverAngle : hoverAngle); block.cornerForce = function () { return (i ? -1 : 1) * _SheetPhysics2.default.hoverCornerForceClb(); }; _this4.sheetPhysics.setParametr(block.physicId, 'angle', i ? Math.PI - 0.5 * hoverAngle : 0.5 * hoverAngle); _this4.hoverInfo = { n: n, block: block }; _this4.update(1 / 30); } }); })(); } } } else if (_this4.hoverInfo && e.type === 'mouseout') { if (_this4.hoverInfo.pendings !== undefined) { --_this4.hoverInfo.pendings; } else if (n === _this4.hoverInfo.n) { _this4.clearHoverInfo(); } } else if (e.type === 'mousedown') { _this4.cornerClickData = { x: e.pageX, y: e.pageY }; } else if (e.type === 'click') { if (Math.sqrt(Math.pow(_this4.cornerClickData.x - e.pageX, 2) + Math.pow(_this4.cornerClickData.y - e.pageY, 2)) < 5) { var hover = _this4.getBlockByPage(n); if (hover.physicId) { var id = hover.physicId, props = hover.getProps(); _this4.sheetPhysics.setParametr(id, 'velocity', (i ? -1 : 1) * props.startVelocity); } } delete _this4.cornerClickData; } })(); } }; Book.prototype.addSheetBlock = function addSheetBlock(p, block) { this.sheetBlocks.splice(p, 0, block); this.subscribeSheetBlock(block, 2); this.threeSheetBlocks.add(block.three); }; Book.prototype.subscribeSheetBlock = function subscribeSheetBlock(block, offset) { var _this5 = this; var eventConverter = new _CustomEventConverter2.default(this.visual.wnd, this.visual.doc, _CircleTarget2.default.test), r = 0.15, target = new _CircleTarget2.default(1 - 0.5 * r, 0.5 * r, r); target.block = block; target.callback = this.cornerCallback.bind(this); eventConverter.addCustom(target); block.cornerTarget = target; block.three.userData.mouseCallback = function (e, data) { var i = data.face.materialIndex; if (i < 2) { var n = i === 0 ? offset + 2 * block.p.first : offset + 2 * block.p.last - 1; eventConverter.convert(e, { x: i === 0 ? data.uv.x : 1 - data.uv.x, y: data.uv.y, i: i, n: n }); _this5.pageManager.transferEventToTexture(n, e, data); } }; block.three.userData.touchCallback = function (e, data) { var i = data.face.materialIndex; if (i < 2) { var n = i === 0 ? offset + 2 * block.p.first : offset + 2 * block.p.last - 1; _this5.pageManager.transferEventToTexture(n, e, data); } }; this.visual.drag.addThree(block.three); this.visual.mouseEvents.addThree(block.three); this.visual.touchEvents.addThree(block.three); }; Book.prototype.removeSheetBlock = function removeSheetBlock(block) { this.visual.mouseEvents.removeThree(block.three); this.visual.touchEvents.removeThree(block.three); this.visual.drag.removeThree(block.three); this.threeSheetBlocks.remove(block.three); block.dispose(); }; Book.prototype.removeSheetBlocks = function removeSheetBlocks(first, size) { var blocks = this.sheetBlocks.splice(first, size); for (var _iterator4 = blocks, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var block = _ref4; this.removeSheetBlock(block); } }; Book.prototype.setTexture = function setTexture(material, n) { this.pageManager.setTexture(material, n); }; Book.prototype.setPageTexture = function setPageTexture(material, n) { this.setTexture(material, n + 2); }; Book.prototype.setLeftCoverTexture = function setLeftCoverTexture(material, n) { this.setTexture(material, n); }; Book.prototype.setRightCoverTexture = function setRightCoverTexture(material, n) { this.setTexture(material, n + 2 * (this.p.sheets + 1)); }; Book.finishAnimationClb = function finishAnimationClb(angle) { this.block.set(this.book.getClosedBlockAngle(angle).closedAngle, 'closed', 0); var i = this.book.sheetBlocks.indexOf(this.block); if (~i) { if (angle === 0) { this.book.mergeSheetBlocks(i, this.book.sheetBlocks.length - i); } else { this.book.mergeSheetBlocks(0, i + 1); } } }; Book.prototype.calcBlockForce = function calcBlockForce(block, object, angle, velocity, cornerHeight) { return block.force ? block.force(object, angle, velocity, cornerHeight) : 0; }; Book.prototype.calcBlockCornerForce = function calcBlockCornerForce(block, object, angle, velocity, cornerHeight) { return block.cornerForce ? block.cornerForce(object, angle, velocity, cornerHeight) : 0; }; Book.prototype.notifyBeforeAnimation = function notifyBeforeAnimation() { var res = void 0; if (this.animationNotification) { res = Promise.reject(); } else { this.animationNotification = true; this.dispatchEvent({ type: 'beforeAnimation' }); res = this.layerManager.hide(); } return res; }; Book.prototype.notifyAfterAnimation = function notifyAfterAnimation() { if (this.animationNotification) { delete this.animationNotification; this.layerManager.show(); this.dispatchEvent({ type: 'afterAnimation' }); } }; Book.prototype.connectPhysics = function connectPhysics(block, mass, angle, velocity, flexibility, coverHeight, simulateClb, removeClb, progressClb) { var _this6 = this; var type = function type() { return _this6.hoverInfo ? 'hover' : _this6.dragInfo ? 'drag' : 'free'; }, res = this.sheetPhysics.getSize() ? Promise.resolve() : this.notifyBeforeAnimation(); return res.then(function () { block.physicId = _this6.sheetPhysics.addObject(mass, angle, velocity, flexibility, coverHeight, function (angl, ch) { simulateClb(angl, ch); progressClb(block, Math.abs(angle - angl) / Math.PI, 'process', type()); }, function (angl, ch) { removeClb(angl, ch); delete block.physicId; progressClb(block, Math.abs(angle - angl) / Math.PI, 'finish', type()); Promise.resolve().then(function () { if (!_this6.sheetPhysics.getSize()) { _this6.notifyAfterAnimation(); } }); }, function (object, angle, velocity, cornerHeight) { return _this6.calcBlockForce(block, object, angle, velocity, cornerHeight); }, function (object, angle, velocity, cornerHeight) { return _this6.calcBlockCornerForce(block, object, angle, velocity, cornerHeight); }); progressClb(block, 0, 'init', type()); return block; }).catch(function () { return undefined; }); }; Book.prototype.update = function update(dt) { var _this7 = this; this.lastMousePos.t += dt; if (this.isProcessing() && this.lastMousePos.pageX !== undefined && this.lastMousePos.t - (this.lastMousePos.lastT || 0) > 0.25 && !this.hoverInfo && !this.dragInfo) { this.lastMousePos.lastT = this.lastMousePos.t; Promise.resolve().then(function () { (0, _libs.$)(_this7.visual.element).trigger(_libs.$.Event('mousemove', _this7.lastMousePos)); }); } this.sheetPhysics.simulate(dt); }; Book.prototype.splitSheetBlock = function splitSheetBlock(i, leftSize) { var block = this.sheetBlocks[i]; if (block && leftSize < block.getSize()) { var newBlock = new _SheetBlock2.default(this.visual, _extends({}, this.p, { setTexture: this.setPageTexture.bind(this) }), block.p.first, block.p.first + leftSize, block.angle, block.state); block.set(block.angle, block.state, block.corner.height, block.p.first + leftSize, block.p.last); this.addSheetBlock(i, newBlock); return [newBlock, block]; } }; Book.prototype.mergeSheetBlocks = function mergeSheetBlocks(first, size) { if (first < this.sheetBlocks.length) { size = Math.min(this.sheetBlocks.length - first, size); var firstBlock = this.sheetBlocks[first], lastBlock = this.sheetBlocks[first + size - 1]; firstBlock.set(firstBlock.angle, firstBlock.state, firstBlock.corner.height, firstBlock.p.first, lastBlock.p.last); this.removeSheetBlocks(first + 1, size - 1); } }; Book.prototype.setSheetBlocks = function setSheetBlocks(angle, state) { if (state === 'closed') { this.closedAngle = angle; } this.sheetBlocks.forEach(function (s) { if (!s.physicId) { s.set(angle, state); } }); }; Book.prototype.set = function set(angle) { var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; this.angle = angle; var PI = Math.PI; if (angle < PI / 4) { this.binder.set(0); this.binder.setLeft(-PI / 2 + 2 * angle); this.leftCover.set(PI / 2, 'opened', height); this.setSheetBlocks(0, 'closed'); this.binder.setRight(0); this.rightCover.set(0, 'closed', 0); } else if (angle < 2 * PI / 4) { var a = 2 * (angle - PI / 4); this.binder.set(a); this.binder.setLeft(-a); this.leftCover.set(PI / 2 + a, 'opened', height); this.setSheetBlocks(a, 'closed'); this.binder.setRight(-a); this.rightCover.set(a, 'closed', 0); } else if (angle < 3 * PI / 4) { var _a = 2 * (angle - PI / 2); this.binder.set(PI / 2); this.binder.setLeft(-PI / 2); this.leftCover.set(PI, 'opened', 0); this.binder.setRight(-PI / 2); this.rightCover.set(_a, 'opened', height); } else if (angle < 4 * PI / 4) { var _a2 = 2 * (angle - 3 * PI / 4) + PI / 2; this.binder.set(_a2); this.binder.setLeft(-_a2); this.leftCover.set(_a2, 'closed', 0); this.setSheetBlocks(_a2, 'closed'); this.binder.setRight(-PI / 2); this.rightCover.set(PI / 2, 'opened', height); } else if (angle < 5 * PI / 4) { this.binder.set(PI); this.binder.setLeft(-PI); this.leftCover.set(PI, 'closed', 0); this.setSheetBlocks(PI, 'closed'); this.binder.setRight(-PI / 2 - 2 * (angle - PI)); this.rightCover.set(PI / 2, 'opened', height); } else if (angle < 6 * PI / 4) { var _a3 = 2 * (angle - 5 * PI / 4); this.binder.set(PI - _a3); this.binder.setLeft(-PI + _a3); this.leftCover.set(PI - _a3, 'closed', 0); this.setSheetBlocks(PI - _a3, 'closed'); this.binder.setRight(-PI + _a3); this.rightCover.set(PI / 2 - _a3, 'opened', height); } else if (angle < 7 * PI / 4) { var _a4 = 2 * (angle - 6 * PI / 4); this.binder.set(PI / 2); this.binder.setLeft(-PI / 2); this.leftCover.set(PI - _a4, 'opened', height); this.binder.setRight(-PI / 2); this.rightCover.set(0, 'opened', 0); } else if (angle < 8 * PI / 4) { var _a5 = 2 * (angle - 7 * PI / 4); this.binder.set(PI / 2 - _a5); this.binder.setLeft(-PI / 2); this.leftCover.set(PI / 2, 'opened', height); this.setSheetBlocks(PI / 2 - _a5, 'closed'); this.binder.setRight(-PI / 2 + _a5); this.rightCover.set(PI / 2 - _a5, 'closed', 0); } }; Book.createSideTexture = function createSideTexture(color) { var jC = (0, _libs.$)(''); var ctx = jC[0].getContext('2d'); ctx.beginPath(); ctx.fillStyle = _GraphUtils2.default.color2Rgba(color, 1); ctx.rect(0, 0, 8, 7); ctx.fill(); ctx.beginPath(); ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(color, 0.5), 1); ctx.rect(0, 7, 8, 1); ctx.fill(); return jC[0]; }; Book.prepareProps = function prepareProps(props) { return Book.calcProps(Book.mergeProps((0, _book.props)(), props)); }; Book.mergeProps = function mergeProps(first, second) { second = second || {}; return _extends({}, first, second, { sheet: _extends({}, first.sheet, second.sheet), cover: _extends({}, first.cover, second.cover), page: _extends({}, first.page, second.page), cssLayerProps: _extends({}, first.cssLayerProps, second.cssLayerProps) }); }; Book.calcProps = function calcProps(props) { var p = _extends({}, props, { sheet: _extends({}, props.sheet), cover: _extends({}, props.sheet, props.cover), page: _extends({}, props.sheet, props.page), cssLayerProps: _extends({}, props.cssLayerProps, { $: _libs.$ }) }), scale = 10, height = scale * p.height, width = scale * p.width, flipProgressClb = function flipProgressClb() { return undefined; }, sheet = { sideTexture: p.sheet.sideTexture || Book.createSideTexture(p.sheet.color) }, cover = _extends({}, sheet, p.cover, { depth: scale * p.cover.depth, width: width, height: height, padding: scale * p.cover.padding }), page = _extends({}, sheet, p.page, { depth: scale * p.page.depth, width: cover.width - cover.padding, height: cover.height - 2 * cover.padding }), marker = { use: false, color: 0XFF0000, size: scale * 0.001 }; if (cover.color !== sheet.color && !p.cover.sideTexture) { cover.sideTexture = Book.createSideTexture(cover.color); } if (page.color !== sheet.color && !p.page.sideTexture) { page.sideTexture = Book.createSideTexture(page.color); } return _extends({}, p, { scale: scale, height: height, width: width, flipProgressClb: flipProgressClb, cover: cover, page: page, marker: marker }); }; return Book; }(_libs.THREE.EventDispatcher); exports.default = Book; /***/ }, /* 27 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); }; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(1); var _Controller2 = __webpack_require__(15); var _Controller3 = _interopRequireDefault(_Controller2); var _bookController = __webpack_require__(42); var _EventsToActions = __webpack_require__(49); var _EventsToActions2 = _interopRequireDefault(_EventsToActions); var _stats = __webpack_require__(70); var _stats2 = _interopRequireDefault(_stats); var _Object3DWatcher = __webpack_require__(55); var _Object3DWatcher2 = _interopRequireDefault(_Object3DWatcher); var _FullScreen = __webpack_require__(50); var _FullScreen2 = _interopRequireDefault(_FullScreen); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var BookController = function (_Controller) { _inherits(BookController, _Controller); function BookController(book, view, props) { _classCallCheck(this, BookController); var _this = _possibleConstructorReturn(this, _Controller.call(this)); _this.navigationControls = true; _this.book = book; _this.visual = book.visual; _this.p = BookController.prepareProps(props); _this.p.rtl = book.p.rtl; _this.devicePixelRatio = _this.visual.wnd.devicePixelRatio || 1; _this.orbit = book.visual.getOrbit(); book.setFlipProgressClb(_this.updateViewIfState.bind(_this)); _this.view = view; _this.bindActions(); _this.state = { smartPan: !_this.actions['cmdSmartPan'].active, singlePage: _this.actions['cmdSinglePage'].active || _this.actions['cmdSinglePage'].activeForMobile && _this.devicePixelRatio > 1, stats: _this.actions['cmdStats'].active, lighting: _this.p.lighting.default, activeSide: 1 }; _this.boxs = [new _libs.THREE.Box3(), new _libs.THREE.Box3()]; _this.bookWatcher = new _Object3DWatcher2.default(_this.visual, function () { if (_this.state.singlePage) { if (_this.state.activeSide) { _this.boxs[0].setFromObject(book.rightCover.three); } else { _this.boxs[0].setFromObject(book.leftCover.three); } } else { _this.boxs[0].setFromObject(book.leftCover.three); _this.boxs[1].setFromObject(book.rightCover.three); _this.boxs[0].union(_this.boxs[1]); } return _this.boxs[0]; }); _this.bookWatcher.scale = _this.p.scale.default; _this.book.setZoom(_this.bookWatcher.scale, _this.state.singlePage); _this.Stats = new _stats2.default(); _this.Stats.domElement.style.position = 'absolute'; _this.Stats.domElement.style.top = '0px'; _this.visual.setExtraLighting(_this.state.lighting); _this.binds = { onScreenModeChanged: _this.onScreenModeChanged.bind(_this), stats: _this.Stats.update.bind(_this.Stats), onUpdateView: _this.updateView.bind(_this) }; _FullScreen2.default.addEventListener(_this.view.getParentContainer().ownerDocument, _this.binds.onScreenModeChanged); _this.cmdSmartPan(); if (_this.view.templateObject.appLoaded) { Promise.resolve().then(_this.view.templateObject.appLoaded); } _this.book.enableLoadingAnimation(_this.p.loadingAnimation.book); if (_this.p.loadingAnimation.skin) { _this.initLoadingAnimation(); } _this.book.enableLoadingAnimation(_this.p.loadingAnimation.book); _this.book.setAutoResolution(_this.p.autoResolution.enabled, _this.p.autoResolution.coefficient); return _this; } BookController.prototype.dispose = function dispose() { _FullScreen2.default.removeEventListener(this.view.getParentContainer().ownerDocument, this.binds.onScreenModeChanged); delete this.book; delete this.view; delete this.visual; }; BookController.prototype.initLoadingAnimation = function initLoadingAnimation() { var _this2 = this; var handler = function handler() { var pages = _this2.book.getTopPages(); var visible = false; for (var _iterator = pages, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var n = _ref; var state = _this2.book.getPageState(n); visible = state === undefined || state === 'loading'; if (visible) { break; } } _this2.view.setState('widLoading', { visible: visible }); }; this.book.addEventListener('beforeAnimation', handler); this.book.addEventListener('afterAnimation', handler); this.book.addEventListener('loadPage', handler); this.book.addEventListener('loadedPage', handler); }; BookController.prototype.enableNavigation = function enableNavigation(enable) { this.navigationControls = enable; }; BookController.prototype.setTocCtrl = function setTocCtrl(tocCtrl) { this.tocCtrl = tocCtrl; this.tocCtrl.onChange = this.updateView.bind(this); this.updateView(); }; BookController.prototype.setPrinter = function setPrinter(printer) { this.printer = printer; this.updateView(); }; BookController.prototype.setSounds = function setSounds(sounds) { this.sounds = sounds; sounds.setEnabled(this.actions['cmdSounds'].active); this.updateView(); }; BookController.prototype.onScreenModeChanged = function onScreenModeChanged(e) { this.updateView(); }; BookController.prototype.canZoomIn = function canZoomIn() { return !this.state.smartPan || Math.abs(this.bookWatcher.scale - this.p.scale.max) > this.p.eps; }; BookController.prototype.canZoomOut = function canZoomOut() { return !this.state.smartPan || Math.abs(this.bookWatcher.scale - this.p.scale.min) > this.p.eps; }; BookController.prototype.canDefaultZoom = function canDefaultZoom() { return this.state.smartPan; }; BookController.prototype.setBookZoom = function setBookZoom(scale) { var _this3 = this; setTimeout(function () { if (_this3.bookWatcher.scale === scale) { _this3.book.setZoom(scale, _this3.state.singlePage); } }, 1000); }; BookController.prototype.cmdZoomIn = function cmdZoomIn() { if (this.state.smartPan) { this.bookWatcher.scale = Math.min(this.p.scale.max, this.bookWatcher.scale + this.p.scale.delta); this.setBookZoom(this.bookWatcher.scale); } else { this.orbit.zoomIn(6.6 * this.p.scale.delta / 0.32); } this.updateView(); }; BookController.prototype.cmdZoomOut = function cmdZoomOut() { if (this.state.smartPan) { this.bookWatcher.scale = Math.max(this.p.scale.min, this.bookWatcher.scale - this.p.scale.delta); this.setBookZoom(this.bookWatcher.scale); } else { this.orbit.zoomOut(6.6 * this.p.scale.delta / 0.32); } this.updateView(); }; BookController.prototype.cmdDefaultZoom = function cmdDefaultZoom() { if (this.state.smartPan) { this.bookWatcher.scale = this.p.scale.default; this.setBookZoom(this.bookWatcher.scale); this.updateView(); } }; BookController.prototype.cmdToc = function cmdToc() { if (this.tocCtrl) { this.tocCtrl.togle(); } }; BookController.prototype.cmdFastBackward = function cmdFastBackward() { this.startFlip(this.book.flipLeft(5)); }; BookController.prototype.cmdBackward = function cmdBackward() { var _this4 = this; if (this.state.singlePage) { this.state.activeSide = (this.getPage() + 1) % 2; if (this.state.activeSide) { this.state.activeSide = 0; this.updateView(); } else { this.startFlip(this.book.flipLeft(1)).then(function (block) { if (block) { _this4.state.activeSide = 1; } }); } } else { this.startFlip(this.book.flipLeft(1)); } }; BookController.prototype.cmdForward = function cmdForward() { var _this5 = this; if (this.state.singlePage) { this.state.activeSide = (this.getPage() + 1) % 2; if (!this.state.activeSide) { this.state.activeSide = 1; this.updateView(); } else { this.startFlip(this.book.flipRight(1)).then(function (block) { if (block) { _this5.state.activeSide = 0; } }); } } else { this.startFlip(this.book.flipRight(1)); } }; BookController.prototype.cmdFastForward = function cmdFastForward() { this.startFlip(this.book.flipRight(5)); }; BookController.prototype.cmdSave = function cmdSave() { window.open(this.p.downloadURL, '_blank'); }; BookController.prototype.cmdPrint = function cmdPrint() { this.printer.print(); }; BookController.prototype.cmdFullScreen = function cmdFullScreen() { if (!_FullScreen2.default.activated()) { _FullScreen2.default.request(this.view.getParentContainer()); } else { _FullScreen2.default.cancel(); } }; BookController.prototype.cmdSmartPan = function cmdSmartPan() { this.state.smartPan = !this.state.smartPan; if (this.state.smartPan) { this.orbit.minAzimuthAngle = 0; this.orbit.maxAzimuthAngle = 0; this.orbit.minPolarAngle = 0; this.orbit.maxPolarAngle = Math.PI / 4; this.bookWatcher.enabled = true; } else { this.orbit.minAzimuthAngle = -Infinity; this.orbit.maxAzimuthAngle = Infinity; this.orbit.minPolarAngle = 0; this.orbit.maxPolarAngle = Math.PI; this.bookWatcher.enabled = false; } this.updateView(); }; BookController.prototype.cmdSinglePage = function cmdSinglePage() { this.state.singlePage = !this.state.singlePage; this.setBookZoom(this.bookWatcher.scale); this.updateView(); }; BookController.prototype.cmdSounds = function cmdSounds() { if (this.sounds) { this.sounds.togle(); } this.updateView(); }; BookController.prototype.cmdStats = function cmdStats() { this.state.stats = !this.state.stats; if (this.state.stats) { (0, _libs.$)(this.view.getContainer()).append(this.Stats.domElement); this.visual.addRenderCallback(this.binds.stats); } else { (0, _libs.$)(this.view.getContainer()).find(this.Stats.domElement).remove(); this.visual.removeRenderCallback(this.binds.stats); } this.updateView(); }; BookController.prototype.cmdLightingUp = function cmdLightingUp() { this.state.lighting = Math.min(this.state.lighting + this.p.lighting.delta, this.p.lighting.max); this.visual.setExtraLighting(this.state.lighting); this.updateView(); }; BookController.prototype.cmdLightingDown = function cmdLightingDown() { this.state.lighting = Math.max(this.state.lighting - this.p.lighting.delta, this.p.lighting.min); this.visual.setExtraLighting(this.state.lighting); this.updateView(); }; BookController.prototype.goToPage = function goToPage(page) { var _this6 = this; if (this.p.rtl) { page = this.book.getPages() - 1 - page; } var pageNum = Math.max(Math.min(page, this.book.getPages() - 1), 0); this.state.activeSide = (pageNum + 1) % 2; var target = Math.max(Math.min(page - 1 + page % 2, this.book.getPages() - 1), 0), current = this.book.getPage(), flips = [], covs = 0;; if (target != current) { if (current === 0) { flips.push(1); current += 1; ++covs; } else if (current === this.book.getPages() - 1) { flips.push(-1); current -= 2; ++covs; } var cv = 0; if (target === 0) { cv = -1; target += 1; ++covs; } else if (target === this.book.getPages() - 1) { cv = 1; target -= 2; ++covs; } if (target - current) { flips.push(Math.ceil((target - current) / 2)); } if (cv) { flips.push(cv); } } var setClb = function setClb(fl, time, clb) { setTimeout(function () { if (fl < 0) { _this6.startFlip(_this6.book.flipLeft(-fl, clb)); } else { _this6.startFlip(_this6.book.flipRight(fl, clb)); } }, time); }; if (covs === 2) { setClb(flips[0], 0, function (block, progress, state) { if (state == 'finish' && progress == 1) { setClb(flips[flips.length - 1], 0); } }); setClb(flips[1], 500); } else { var time = 0; for (var _iterator2 = flips, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var fl = _ref2; setClb(fl, time); time += 250; } } }; BookController.prototype.startFlip = function startFlip(flipRes) { var _this7 = this; return flipRes ? flipRes.then(function (block) { if (block) { _this7.dispatchAsync({ type: 'startFlip' }); } return block; }) : Promise.resolve(undefined); }; BookController.prototype.endFlip = function endFlip(block) { this.dispatchAsync({ type: 'endFlip' }); return block; }; BookController.prototype.getPage = function getPage() { var page = this.book.getPage(); return page ? Math.min(this.book.getPage() + this.state.activeSide, this.book.getPages() - 1) : 0; }; BookController.prototype.getPageForGUI = function getPageForGUI() { var n = (this.state.singlePage ? this.getPage() : this.book.getPage()) + 1; if (this.p.rtl) { n = this.book.getPages() - n + 1; } return n; }; BookController.prototype.inpPage = function inpPage(e, data) { this.goToPage(data - 1); }; BookController.prototype.updateViewIfState = function updateViewIfState(block, progress, state, type) { if (state === 'init' || state === 'finish') { setTimeout(this.updateView.bind(this), 100); } if (state === 'finish') { this.endFlip(block); } }; BookController.prototype.updateViewState = function updateViewState() { this.viewState = { 'cmdZoomIn': { enable: this.canZoomIn(), visible: this.actions['cmdZoomIn'].enabled, active: false }, 'cmdZoomOut': { enable: this.canZoomOut(), visible: this.actions['cmdZoomOut'].enabled, active: false }, 'cmdDefaultZoom': { enable: this.canDefaultZoom(), visible: this.actions['cmdDefaultZoom'].enabled, active: this.canDefaultZoom() && Math.abs(this.bookWatcher.scale - this.p.scale.default) < this.p.eps }, 'cmdToc': { enable: !!this.tocCtrl, visible: this.actions['cmdToc'].enabled && this.tocCtrl, active: this.tocCtrl && this.tocCtrl.visible }, 'inpPages': { visible: true, value: this.book.getPages() }, 'inpPage': { visible: true, enable: !this.book.isProcessing() && this.navigationControls, value: this.getPageForGUI() }, 'cmdSave': { enable: true, visible: this.actions['cmdSave'].enabled && !!this.p.downloadURL, active: false }, 'cmdPrint': { enable: true, visible: this.actions['cmdPrint'].enabled && !!this.printer, active: false }, 'cmdFullScreen': { enable: _FullScreen2.default.available(), visible: this.actions['cmdFullScreen'].enabled, active: _FullScreen2.default.available() && _FullScreen2.default.activated() }, 'widSettings': { enable: true, visible: this.actions['widSettings'].enabled, active: false }, 'cmdSmartPan': { enable: true, visible: this.actions['cmdSmartPan'].enabled, active: this.state.smartPan }, 'cmdSinglePage': { enable: true, visible: this.actions['cmdSinglePage'].enabled, active: this.state.singlePage }, 'cmdSounds': { enable: true, visible: this.actions['cmdSounds'].enabled && !!this.sounds, active: !!this.sounds && this.sounds.enabled }, 'cmdStats': { enable: true, visible: this.actions['cmdStats'].enabled, active: this.state.stats }, 'cmdLightingUp': { enable: Math.abs(this.state.lighting - this.p.lighting.max) > this.p.eps, visible: this.actions['cmdLightingUp'].enabled, active: false }, 'cmdLightingDown': { enable: Math.abs(this.state.lighting - this.p.lighting.min) > this.p.eps, visible: this.actions['cmdLightingDown'].enabled, active: false } }; var left = this.book.getLeftFlipping(), right = this.book.getRightFlipping(); var flippersEnable = { cmdFastBackward: !!left && this.navigationControls, cmdBackward: !!left && this.navigationControls, cmdForward: !!right && this.navigationControls, cmdFastForward: !!right && this.navigationControls }; for (var _iterator3 = Object.keys(flippersEnable), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var name = _ref3; this.viewState[name] = { enable: flippersEnable[name], visible: this.actions[name].enabled, active: false }; }; }; BookController.prototype.updateView = function updateView() { if (this.view) { this.updateViewState(); for (var _iterator4 = Object.keys(this.viewState), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var name = _ref4; this.view.setState(name, this.viewState[name]); } } }; BookController.prototype.getActions = function getActions() { var _this8 = this; var isSwipping = function isSwipping(name) { return _this8.actions.touchCmdSwipe.enabled && _this8.actions.touchCmdSwipe.code === _this8.actions[name].code && _this8.state.smartPan && _this8.bookWatcher.scale <= 1; }, cmds = {}; var _loop = function _loop(name) { if (name.indexOf('cmd') === 0) { cmds[name] = { activate: function activate() { if (_this8.viewState && _this8.viewState[name].enable) { _this8[name].apply(_this8, arguments); } } }; } }; for (var name in this) { _loop(name); } return _extends({}, cmds, { cmdPanLeft: { activate: function activate(e) { return _this8.orbit.actions.pan(e, { state: 'move', dx: -_this8.p.pan.speed, dy: 0 }); } }, cmdPanRight: { activate: function activate(e) { return _this8.orbit.actions.pan(e, { state: 'move', dx: _this8.p.pan.speed, dy: 0 }); } }, cmdPanUp: { activate: function activate(e) { return _this8.orbit.actions.pan(e, { state: 'move', dx: 0, dy: -_this8.p.pan.speed }); } }, cmdPanDown: { activate: function activate(e) { return _this8.orbit.actions.pan(e, { state: 'move', dx: 0, dy: _this8.p.pan.speed }); } }, mouseCmdRotate: { activate: this.orbit.actions.rotate }, mouseCmdDragZoom: { activate: function activate(e, data) { if (data.dy > 0) { _this8.cmdZoomOut(); } else if (data.dy < 0) { _this8.cmdZoomIn(); } } }, mouseCmdPan: { activate: this.orbit.actions.pan }, mouseCmdWheelZoom: { activate: function activate(e) { e.preventDefault(); if (e.deltaY < 0) { _this8.cmdZoomOut(); } else if (e.deltaY > 0) { _this8.cmdZoomIn(); } } }, touchCmdRotate: { activate: function activate(e, data) { if (!isSwipping('touchCmdRotate')) { e.preventDefault(); _this8.orbit.actions.rotate(e, data); } } }, touchCmdZoom: { activate: function activate(e, data) { if (!isSwipping('touchCmdZoom')) { e.preventDefault(); if (data.dy > 0) { _this8.cmdZoomOut(); } else if (data.dy < 0) { _this8.cmdZoomIn(); } } } }, touchCmdPan: { activate: function activate(e, data) { if (!isSwipping('touchCmdPan')) { e.preventDefault(); _this8.orbit.actions.pan(e, data); } } }, touchCmdSwipe: { activate: function activate(e, data) { if (isSwipping('touchCmdSwipe')) { e.preventDefault(); if (data.state === 'start') { var touch = (e.touches || e.originalEvent.touches)[_this8.actions.touchCmdSwipe.code - 1]; _this8.swipeData = { handled: false, x0: touch.pageX, y0: touch.pageY, x: touch.pageX, y: touch.pageY }; } else if (data.state === 'move') { if (!_this8.swipeData.handled) { _this8.swipeData = _extends({}, _this8.swipeData, { x: _this8.swipeData.x + data.dx, y: _this8.swipeData.y + data.dy }); if (Math.abs(_this8.swipeData.x0 - _this8.swipeData.x) > 100) { _this8.swipeData.x0 > _this8.swipeData.x ? _this8.cmdForward() : _this8.cmdBackward(); _this8.swipeData.handled = true; } } } else { delete _this8.swipeData; } } } }, widSettings: { activate: function activate() { return undefined; } } }); }; BookController.prototype.bindActions = function bindActions() { this.eToA = new _EventsToActions2.default((0, _libs.$)(this.visual.element)); this.eToA.addAction(function (e) { return e.preventDefault(); }, 'contextmenu', _EventsToActions2.default.mouseButtons.Right, 0); this.actions = this.getActions(); for (var _iterator5 = Object.keys(this.actions), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } var name = _ref5; var action = _extends({}, this.actions[name], this.p.actions[name]); this.actions[name] = action; if (action.enabled) { var flags = action.flags || 0; if (action.type) { this.eToA.addAction(action.activate, action.type, action.code, flags); } else if (action.code !== undefined) { this.eToA.addAction(action.activate, 'keydown', action.code, flags); } } } }; BookController.prepareProps = function prepareProps(props) { return BookController.calcProps(BookController.mergeProps((0, _bookController.props)(), props)); }; BookController.setActions = function setActions(props, actions) { for (var _iterator6 = Object.keys(actions || {}), _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref6 = _i6.value; } var name = _ref6; props.actions[name] = _extends({}, props.actions[name], actions[name]); } }; BookController.mergeProps = function mergeProps(first, second) { second = second || {}; function merge(first, second) { second = second || {}; var props = _extends({}, first, second); for (var _iterator7 = Object.keys(first), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref7; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref7 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref7 = _i7.value; } var name = _ref7; if (_typeof(first[name]) === 'object') { props[name] = merge(first[name], second[name]); } } return props; } var props = merge(first, second); BookController.setActions(props, first.actions); BookController.setActions(props, second.actions); return props; }; BookController.calcProps = function calcProps(props) { props.scale.delta = (props.scale.max - props.scale.min) / props.scale.levels; props.lighting.delta = (props.lighting.max - props.lighting.min) / props.lighting.levels; return props; }; return BookController; }(_Controller3.default); exports.default = BookController; /***/ }, /* 28 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(1); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var BookPrinter = function () { function BookPrinter(context, book, styleSheet) { _classCallCheck(this, BookPrinter); this.book = book; this.styleSheet = styleSheet; this.wnd = context.wnd; this.doc = context.doc; this.pageCallback = book.getPageCallback(); var test = this.pageCallback(0); this.type = test.type; if (this.type === 'pdf') { this.pdfSrc = test.src.src; } } BookPrinter.prototype.cancel = function cancel() { this.canceled = true; }; BookPrinter.prototype.dispose = function dispose() { if (this.frame) { this.frame.remove(); delete this.frame; } }; BookPrinter.prototype.print = function print() { var _this = this; delete this.canceled; if (this.type === 'pdf') { (function () { var printWnd = void 0, callManually = false; if (_this.useIFrame()) { callManually = !!_this.frame; if (!_this.frame) { _this.frame = (0, _libs.$)('').appendTo(_this.doc.body); } printWnd = _this.frame[0].contentWindow; } else { printWnd = _this.wnd.open(_this.pdfSrc); } if (callManually) { printWnd.print(); } else { (0, _libs.$)(printWnd).on('load', function () { try { printWnd.print(); } catch (e) { console.error(e); } }); } })(); } else { this.renderContent().then(function (content) { var printWnd = _this.wnd.open(), printDoc = printWnd.document, html = '\n \n \n \n \n 3D FlipBook - Printing\n ' + content.head + '\n \n \n \n ' + content.body + '\n \n \n '; printDoc.open(); printDoc.write(html); printDoc.close(); }).catch(function (e) { return console.warn('3D FlipBook - Printing was canceled'); }); } }; BookPrinter.prototype.progress = function progress(v) { if (this.canceled) { throw 'Cancel Printing'; } if (this.onProgress) { this.onProgress(Math.floor(v * 100)); } }; BookPrinter.prototype.renderContent = function renderContent() { var _this2 = this; var pages = this.book.getPages(), head = new Set(), body = []; var done = Promise.resolve(); var _loop = function _loop(page) { var info = _this2.pageCallback(page); if (info.type === 'image') { done = done.then(function () { _this2.progress(page / pages); return _this2.renderImage(head, body, info.src); }); } else if (info.type === 'html') { done = done.then(function () { _this2.progress(page / pages); return _this2.renderHtml(head, body, info.src); }); } }; for (var page = 0; page < pages; ++page) { _loop(page); } return done.then(function () { _this2.progress(1); return { head: _this2.renderHead(head), body: body.join('\n') }; }); }; BookPrinter.wrap = function wrap(content) { return '
' + content + '
'; }; BookPrinter.prototype.renderImage = function renderImage(head, body, src) { body.push(BookPrinter.wrap('')); }; BookPrinter.prototype.renderHtml = function renderHtml(head, body, src) { return new Promise(function (resolve, reject) { _libs.$.get(src, function (html) { var links = html.match(//ig) || []; for (var _iterator = links, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var link = _ref; if (link.match(/stylesheet/i)) { var href = link.match(/href\s*=\s*['"](.*)['"]/i); if (href) { head.add(href[1]); } } } var content = html.match(/([\S\s]*)<\/body>/i); if (content) { body.push(BookPrinter.wrap(content[1])); } resolve(); }).fail(function (e) { console.error(e.responseText); reject(); }); }); }; BookPrinter.prototype.renderHead = function renderHead(head) { var content = []; head.forEach(function (k) { return content.push(''); }); content.push(this.styleSheet ? '' : BookPrinter.defaultStyleSheet()); return content.join('\n'); }; BookPrinter.prototype.useIFrame = function useIFrame() { var isChromium = this.wnd.chrome, winNav = this.wnd.navigator, vendorName = winNav.vendor, isIEedge = winNav.userAgent.indexOf("Edge") > -1, isIOSChrome = winNav.userAgent.match("CriOS"); var use = void 0; if (isIOSChrome) { use = true; } else if (isChromium && vendorName === 'Google Inc.' && !isIEedge) { use = true; } else { use = false; } return use; }; BookPrinter.defaultStyleSheet = function defaultStyleSheet() { return '\n \n '; }; return BookPrinter; }(); exports.default = BookPrinter; /***/ }, /* 29 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(1); var _View2 = __webpack_require__(65); var _View3 = _interopRequireDefault(_View2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var BookView = function (_View) { _inherits(BookView, _View); function BookView(container, onLoad, template, handler) { _classCallCheck(this, BookView); return _possibleConstructorReturn(this, _View.call(this, container, onLoad, template, handler)); } BookView.prototype.initView = function initView() { this.view = this.container.find('.view'); this.bookmarksView = this.container.find('.widBookmarks'); this.thumbnailsView = this.container.find('.widThumbnails'); this.searchView = this.container.find('.widSearch'); }; BookView.prototype.getHandlers = function getHandlers(id) { var _this2 = this; var handlers = void 0; if (id === 'inpPage') { handlers = [{ inpPage: function inpPage(e, data) { return _this2.callLater(_View.prototype.getHandlers.call(_this2, id), id, e, data, BookView.PAGE_HANDLER_DELAY); } }]; } else { handlers = _View.prototype.getHandlers.call(this, id); } return handlers; }; BookView.prototype.onItemStateChanged = function onItemStateChanged(id, state) { if (id === 'cmdFullScreen') { if (state.active) { this.parentContainer.addClass('fullscreen'); } else { this.parentContainer.removeClass('fullscreen'); } } }; BookView.prototype.getView = function getView() { return this.view; }; BookView.prototype.getBookmarksView = function getBookmarksView() { return this.bookmarksView; }; BookView.prototype.getThumbnailsView = function getThumbnailsView() { return this.thumbnailsView; }; BookView.prototype.getSearchView = function getSearchView() { return this.searchView; }; BookView.prototype.getForms = function getForms() { return []; }; BookView.prototype.getLinks = function getLinks() { return ['cmdZoomIn', 'cmdZoomOut', 'cmdDefaultZoom', 'cmdToc', 'cmdFastBackward', 'cmdBackward', 'cmdForward', 'cmdFastForward', 'cmdSave', 'cmdPrint', 'cmdFullScreen', 'cmdSmartPan', 'cmdSinglePage', 'cmdSounds', 'cmdStats', 'cmdLightingUp', 'cmdLightingDown', 'cmdCloseToc', 'cmdBookmarks', 'cmdSearch', 'cmdThumbnails']; }; BookView.prototype.getWidgets = function getWidgets() { return ['widLoadingProgress', 'widFloatWnd', 'widTocMenu', 'widBookmarks', 'widThumbnails', 'widSearch', 'widSettings', 'widLoading']; }; BookView.prototype.getInputs = function getInputs() { return ['inpPage', 'inpPages']; }; BookView.prototype.getTexts = function getTexts() { return ['txtLoadingProgress']; }; BookView.prototype.getTemplate = function getTemplate() { return { html: 'templates/default-book-view.html', styles: ['css/black-book-view.css'], links: [{ rel: 'stylesheet', href: 'css/font-awesome.min.css' }], script: 'js/default-book-view.js' }; }; return BookView; }(_View3.default); BookView.PAGE_HANDLER_DELAY = 1000; exports.default = BookView; /***/ }, /* 30 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _BookPropsBuilder2 = __webpack_require__(9); var _BookPropsBuilder3 = _interopRequireDefault(_BookPropsBuilder2); var _ImageFactory = __webpack_require__(8); var _ImageFactory2 = _interopRequireDefault(_ImageFactory); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ClbBookPropsBuilder = function (_BookPropsBuilder) { _inherits(ClbBookPropsBuilder, _BookPropsBuilder); function ClbBookPropsBuilder(context, pageCallback, pages, onReady) { _classCallCheck(this, ClbBookPropsBuilder); var _this = _possibleConstructorReturn(this, _BookPropsBuilder.call(this, onReady)); _this.calcSheets(pages); _this.pageCallback = pageCallback; _this.binds = { pageCallback: pageCallback.bind(_this) }; _this.imageFactory = new _ImageFactory2.default(context); if (pages > 0) { (function () { var test = _this.imageFactory.build(pageCallback(0), 0, _this.defaults.sheet.widthTexels, _this.defaults.sheet.heightTexels, _this.defaults.sheet.color); test.onLoad = function () { _this.calcProps(test.width, test.height); test.dispose(); _this.ready(); }; })(); } else { _this.props = _this.defaults; _this.ready(); } return _this; } return ClbBookPropsBuilder; }(_BookPropsBuilder3.default); exports.default = ClbBookPropsBuilder; /***/ }, /* 31 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _SheetBlock2 = __webpack_require__(10); var _SheetBlock3 = _interopRequireDefault(_SheetBlock2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Cover = function (_SheetBlock) { _inherits(Cover, _SheetBlock); function Cover(visual, p, angle, state) { _classCallCheck(this, Cover); return _possibleConstructorReturn(this, _SheetBlock.call(this, visual, p, 0, 1, angle, state)); } Cover.prototype.getProps = function getProps() { return _extends({}, this.p.cover, { sheets: 1 }); }; Cover.prototype.loadPoints = function loadPoints() { var openedInterpolationIndeces = [[2, 3, 4], [2, 3, 4, 5, 6]], closedInterpolationIndeces = [[0, 1, 2], [0, 1, 2]], interpolationPoints = [{ x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0, 0.2831, 0.6256, 0.8082, 0.9909], [0, 0.2603, 0.5936, 0.7763, 0.9589], [0, 0.1370, 0.3881, 0.5342, 0.6758], [0, 0, 0, 0, 0]], y: [[0, 0, 0, 0, 0], [0, 0.02, 0.005, -0.001, -0.0025], [0, 0.04, 0.01, -0.002, -0.005], [0, 0.2466, 0.4795, 0.5708, 0.6758], [0, 0.2877, 0.6347, 0.8174, 1.0000]] }, { x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0, 0.2831, 0.6256, 0.8082, 0.9909], [0, 0.2603, 0.5936, 0.7763, 0.9589], [0.000, 0.233, 0.563, 0.746, 0.927], [0.000, 0.144, 0.433, 0.613, 0.796], [0.000, 0.070, 0.288, 0.455, 0.626], [0, 0, 0, 0, 0]], y: [[0, 0, 0, 0, 0], [0, 0.02, 0.005, -0.001, -0.0025], [0, 0.04, 0.01, -0.002, -0.005], [0.000, 0.168, 0.269, 0.270, 0.255], [0.000, 0.245, 0.435, 0.458, 0.460], [0.000, 0.278, 0.544, 0.614, 0.673], [0, 0.2877, 0.6347, 0.8174, 1.0000]] }]; return { interpolationPoints: interpolationPoints, openedInterpolationIndeces: openedInterpolationIndeces, closedInterpolationIndeces: closedInterpolationIndeces }; }; return Cover; }(_SheetBlock3.default); exports.default = Cover; /***/ }, /* 32 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _SheetCssLayer = __webpack_require__(37); var _SheetCssLayer2 = _interopRequireDefault(_SheetCssLayer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var CssLayersManager = function () { function CssLayersManager(book) { _classCallCheck(this, CssLayersManager); this.book = book; this.props = book.p.cssLayerProps; this.visual = book.visual; this.pageManager = book.pageManager; this.wrappers = {}; } CssLayersManager.prototype.getActives = function getActives() { var page = this.book.getPage(), pages = this.book.getPages(); return page === 0 || page === pages - 1 ? [page] : [page, page + 1]; }; CssLayersManager.prototype.dispose = function dispose() { for (var _iterator = Object.values(this.wrappers), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var w = _ref; w.layers.forEach(function (l) { return l.dispose(); }); } delete this.wrappers; }; CssLayersManager.prototype.show = function show() { var _this = this; this.hidden = false; var _loop = function _loop() { if (_isArray2) { if (_i2 >= _iterator2.length) return 'break'; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) return 'break'; _ref2 = _i2.value; } var n = _ref2; var w = _this.wrappers[n]; if (w) { if (w.state === 'ready' && w.layers.length) { (function () { var block = _this.book.getBlockByPage(n); w.layers.forEach(function (l) { if (l.isHidden()) { l.update(block); l.show(); } }); })(); } } else { (function () { var w = _this.wrappers[n] = { state: 'loading', layers: [] }; Promise.resolve().then(function () { _this.pageManager.getLayers(n, function (layers) { if (layers.length && _this.wrappers) { var block = _this.book.getBlockByPage(n); for (var _iterator3 = layers, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var l = _ref3; var sl = new _SheetCssLayer2.default(_this.visual, block, _this.props); w.layers.push(sl); sl.set(l.css, l.html, l.js); } setTimeout(function () { if (!_this.hidden && ~_this.getActives().indexOf(n)) { w.layers.forEach(function (l) { return l.show(); }); } }, 10); } w.state = 'ready'; }); }); })(); } }; for (var _iterator2 = this.getActives(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; var _ret = _loop(); if (_ret === 'break') break; } }; CssLayersManager.prototype.hide = function hide() { this.hidden = true; var wait = []; for (var _iterator4 = Object.values(this.wrappers), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var _w = _ref4; _w.layers.forEach(function (l) { return wait.push(l.hide()); }); } return Promise.all(wait); }; return CssLayersManager; }(); exports.default = CssLayersManager; /***/ }, /* 33 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(1); var _Cache = __webpack_require__(14); var _Cache2 = _interopRequireDefault(_Cache); var _LoadingAnimation = __webpack_require__(52); var _LoadingAnimation2 = _interopRequireDefault(_LoadingAnimation); var _ImageFactory = __webpack_require__(8); var _ImageFactory2 = _interopRequireDefault(_ImageFactory); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); var _TextureAnimator = __webpack_require__(60); var _TextureAnimator2 = _interopRequireDefault(_TextureAnimator); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var PageManager = function () { function PageManager(visual, book, p) { _classCallCheck(this, PageManager); this.visual = visual; this.book = book; this.pageQuery = ''; this.p = p; this.pageCache = new _Cache2.default(p.cachedPages); this.resourcesCache = new _Cache2.default(); this.canvas = (0, _libs.$)('')[0]; this.imageFactory = new _ImageFactory2.default(_extends({}, visual, { dispatchEvent: book.dispatchEvent.bind(book), renderCanvas: this.canvas, renderCanvasCtx: this.canvas.getContext('2d') }), this.resourcesCache); this.loadings = []; this.renderQueue = []; this.pageRequests = []; this.predictedRequests = []; this.tmpMaterial = new _libs.THREE.MeshBasicMaterial(); visual.addObject(new _libs.THREE.Mesh(new _libs.THREE.PlaneGeometry(0, 0), this.tmpMaterial)); this.loadingAnimation = true; this.loading = {}; this.loading[p.cover.color] = this.createLoadingTexture(p.cover); if (p.page.color !== p.cover.color) { this.loading[p.page.color] = this.createLoadingTexture(p.page); } this.turnOnEvents(); visual.addRenderCallback(this.update.bind(this)); setTimeout(this.updateRenderQueue.bind(this), 250); } PageManager.prototype.createLoadingTexture = function createLoadingTexture(p) { var spriteTiles = 6, scale = Math.sqrt(4.5 * 210 * 4.5 * 297 / (p.widthTexels * p.heightTexels)), animation = new _LoadingAnimation2.default(scale * p.widthTexels, scale * p.heightTexels, p.color), animator = new _TextureAnimator2.default(animation.createSprite(spriteTiles), spriteTiles, 1, spriteTiles, 0.2); animation.dispose(); return animator; }; PageManager.prototype.dispose = function dispose() { this.turnOffEvents(); for (var _iterator = Object.keys(this.loading), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var color = _ref; this.loading[color].dispose(); } delete this.loading; this.resourcesCache.dispose(); this.pageCache.dispose(); this.canvas.height = this.canvas.width = 0; delete this.canvas; }; PageManager.prototype.isCover = function isCover(n) { return n < 2 || n >= 2 * (this.p.sheets + 1); }; PageManager.prototype.isMobile = function isMobile() { return (this.visual.wnd.devicePixelRatio || 1) > 1; }; PageManager.prototype.getPageState = function getPageState(n) { var object = this.pageCache.get(n); return object ? object.state : undefined; }; PageManager.prototype.enableLoadingAnimation = function enableLoadingAnimation(enable) { this.loadingAnimation = enable; for (var _iterator2 = this.loadings, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var o = _ref2; this.setupMaterial(o); } }; PageManager.prototype.update = function update(dt) { if (this.loadingAnimation) { var loading = {}; for (var _iterator3 = this.loadings, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var o = _ref3; if (o.isActive()) { loading[o.color] = true;; } } for (var _iterator4 = Object.keys(loading), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var color = _ref4; this.loading[color].update(dt); } } }; PageManager.prototype.removeFromLoadings = function removeFromLoadings(o) { var i = this.loadings.indexOf(o); if (~i) { this.loadings.splice(i, 1); } }; PageManager.prototype.removeFromRenderQueue = function removeFromRenderQueue(o) { var i = this.renderQueue.indexOf(o); if (~i) { this.renderQueue.splice(i, 1); } }; PageManager.prototype.refreshPageQuery = function refreshPageQuery(n) { var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; this.pageQuery = query; var object = this.pageCache.get(n); if (object && object.wrapper && object.wrapper.setQuery) { if (!this.pageCache.remove(n)) { object.wrapper.setQuery(query); this.pushInRenderQueue(object); } } }; PageManager.prototype.refreshZoom = function refreshZoom() { var _this = this; if (this.p.autoResolution.enable) { (function () { var es = []; _this.pageCache.forEach(function (e) { es.push(e); }); es.forEach(function (e) { var object = e[1]; if (object && object.wrapper) { if (!_this.pageCache.remove(e[0])) { _this.pushInRenderQueue(object); } } }); })(); } }; PageManager.prototype.getLayers = function getLayers(n, clb) { var _this2 = this; if (this.p.cssLayersLoader) { this.p.cssLayersLoader(n, function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var object = _this2.pageCache.get(n); if (object) { if (object.state !== 'active') { object.pendings.push({ clb: clb, args: args }); } else { clb.apply(undefined, args); } } }); } else { clb([]); } }; PageManager.prototype.resolvePendings = function resolvePendings(pendings) { for (var _iterator5 = pendings, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } var p = _ref5; try { p.clb.apply(p, p.args); } catch (e) { console.error(e); } } pendings.splice(0, pendings.length); }; PageManager.prototype.rtlPageN = function rtlPageN(n) { return this.p.rtl ? 2 * (this.p.sheets + 2) - 1 - n : n; }; PageManager.prototype.load = function load(material, n) { var _this3 = this; var pi = this.p.pageCallback(this.rtlPageN(n)), p = this.isCover(n) ? this.p.cover : this.p.page; var o = { n: n, texture: new _libs.THREE.Texture(), wrapper: null, state: 'loading', locked: function locked(n) { return o.state === 'loading' || o.state === 'rendering' || _this3.book.isActivePage(n); }, color: p.color, isActive: function isActive() { return _this3.book.isActivePage(n); }, isTop: function isTop() { return ~_this3.book.getTopPages().indexOf(n); }, dispose: function dispose() { _this3.removeFromLoadings(o); _this3.removeFromRenderQueue(o); if (o.wrapper && o.wrapper.dispose) { o.wrapper.dispose(); } o.texture.dispose(); delete o.texture; delete o.wrapper; }, pendings: [] }; o.texture.minFilter = _libs.THREE.LinearFilter; this.loadings.push(o); this.setMaterial(o, material); Promise.resolve().then(function () { if (o.texture) { o.widthTexels = pi.widthTexels || p.widthTexels; o.heightTexels = pi.heightTexels || p.heightTexels; var res = _this3.calcResolution(o); o.wrapper = _this3.imageFactory.build(pi, pi.number === undefined ? n : pi.number, res.width, res.height, p.color, _this3.p.injector); if (o.wrapper.setQuery) { o.wrapper.setQuery(_this3.pageQuery); } o.simulate = pi.interactive ? (o.wrapper.simulate || function () { return undefined; }).bind(o.wrapper) : undefined; o.wrapper.onLoad = function () { _this3.pushInRenderQueue(o); _this3.book.dispatchEvent({ type: 'loadedPage', page: n }); }; o.wrapper.onChange = function (image) { if (o.texture) { _this3.removeFromLoadings(o); if (o.material) { o.material.map = o.texture; o.material.color = new _libs.THREE.Color(0xFFFFFF); o.material.needsUpdate = true; } o.texture.image = image; o.texture.needsUpdate = true; o.texture.onUpdate = function () { if (o.state !== 'queuedForRender') { o.state = 'active'; _this3.resolvePendings(o.pendings); } delete _this3.rendering; //this.updateRenderQueue(); }; _this3.tmpMaterial.map = o.texture; _this3.tmpMaterial.needsUpdate = true; } }; } }); this.book.dispatchEvent({ type: 'loadPage', page: n }); return this.pageCache.put(n, o); }; PageManager.prototype.isSinglePage = function isSinglePage(o) { return this.p.singlePage || !o.n || o.n === this.book.getPages() - 1; }; PageManager.prototype.calcResolution = function calcResolution(o) { var res = void 0; if (this.p.autoResolution.enable) { var k = Math.min((this.isSinglePage(o) ? 1 : 0.5) * this.visual.width() / o.widthTexels, this.visual.height() / o.heightTexels); res = { width: this.p.autoResolution.k * this.p.zoom * k * o.widthTexels, height: this.p.autoResolution.k * this.p.zoom * k * o.heightTexels }; } else { res = { width: o.widthTexels, height: o.heightTexels }; } return res; }; PageManager.prototype.pushInRenderQueue = function pushInRenderQueue(o) { if (o.state !== 'queuedForRender') { o.state = 'queuedForRender'; this.renderQueue.push(o); // this.updateRenderQueue(); } }; PageManager.prototype.updateRenderQueue = function updateRenderQueue() { if (this.canvas) { var p = this.p; if (!this.rendering && (p.renderWhileFlipping || !this.book.isProcessing())) { var active = void 0, top = void 0; for (var _iterator6 = this.renderQueue, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref6 = _i6.value; } var o = _ref6; if (!active && o.isActive()) { active = o; } if (o.isTop()) { top = o; break; } } this.rendering = top || active; if (this.isMobile() && p.renderInactivePagesOnMobile || !this.isMobile() && p.renderInactivePages) { this.rendering = this.rendering || this.renderQueue[0]; } if (this.rendering) { if (this.rendering.wrapper.startRender) { this.removeFromRenderQueue(this.rendering); this.rendering.state = 'rendering'; this.rendering.wrapper.setResolution(this.calcResolution(this.rendering)); this.rendering.wrapper.startRender(); } else { delete this.rendering; } } } setTimeout(this.updateRenderQueue.bind(this), 250); } }; PageManager.prototype.turnOnEvents = function turnOnEvents() { this.transferEvents = true; }; PageManager.prototype.turnOffEvents = function turnOffEvents() { var mouseup = _libs.$.Event('mouseup'), mouseout = _libs.$.Event('mouseout'); this.pageCache.forEach(function (ent) { var object = ent[1]; if (object.simulate) { object.simulate(mouseup, undefined, 0, 0); object.simulate(mouseout, undefined, 0, 0); } }); this.transferEvents = false; }; PageManager.prototype.transferEventToTexture = function transferEventToTexture(n, e, data) { var _this4 = this; if (this.transferEvents) { var toObject = this.getOrLoadTextureObject(undefined, n); if (toObject.wrapper) { (function () { var uv = data.uv, toDoc = toObject.wrapper.getSimulatedDoc(); _this4.pageCache.forEach(function (ent) { var object = ent[1]; if (object.simulate) { object.simulate(e, toDoc, uv.x, uv.y); } }); })(); } } }; PageManager.prototype.loadPredictedPages = function loadPredictedPages() { this.predictedRequests = _BaseMathUtils2.default.predict(this.pageRequests, this.p.preloadPages); for (var _iterator7 = this.predictedRequests, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref7; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref7 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref7 = _i7.value; } var p = _ref7; if (p < this.book.getPages() && !this.pageCache.get(p)) { this.load(undefined, p); } } }; PageManager.prototype.addPageRequest = function addPageRequest(n) { this.pageRequests.push(n); if (this.pageRequests.length > this.p.pagesForPredicting) { this.pageRequests.shift(); } Promise.resolve().then(this.loadPredictedPages.bind(this)); }; PageManager.prototype.setMaterial = function setMaterial(o, material) { this.pageCache.forEach(function (e) { var ob = e[1]; if (o !== ob && ob.material === material) { delete ob.material; } }); if (material && material !== o.material) { o.material = material; this.setupMaterial(o); } }; PageManager.prototype.setupMaterial = function setupMaterial(o) { o.material.map = o.texture.image ? o.texture : this.loadingAnimation ? this.loading[o.color].texture : null; if (!o.material.map) { o.material.color = new _libs.THREE.Color(o.color); } o.material.needsUpdate = true; }; PageManager.prototype.getOrLoadTextureObject = function getOrLoadTextureObject(material, n) { var object = this.pageCache.get(n); if (!object) { object = this.load(material, n); this.addPageRequest(n); } else { this.setMaterial(object, material); } return object; }; PageManager.prototype.setTexture = function setTexture(material, n) { if (~this.predictedRequests.indexOf(n)) { this.addPageRequest(n); } this.getOrLoadTextureObject(material, n); }; return PageManager; }(); exports.default = PageManager; /***/ }, /* 34 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _BookPropsBuilder2 = __webpack_require__(9); var _BookPropsBuilder3 = _interopRequireDefault(_BookPropsBuilder2); var _Pdf = __webpack_require__(18); var _Pdf2 = _interopRequireDefault(_Pdf); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PdfBookPropsBuilder = function (_BookPropsBuilder) { _inherits(PdfBookPropsBuilder, _BookPropsBuilder); function PdfBookPropsBuilder(src, onReady) { _classCallCheck(this, PdfBookPropsBuilder); var _this = _possibleConstructorReturn(this, _BookPropsBuilder.call(this, onReady)); _this.pdf = new _Pdf2.default(src); _this.pageDescription = { type: 'pdf', src: _this.pdf, interactive: true }; _this.binds = { pageCallback: _this.pageCallback.bind(_this) }; _this.pdf.getHandler(_this.init.bind(_this)); return _this; } PdfBookPropsBuilder.prototype.dispose = function dispose() { this.pdf.dispose(); _BookPropsBuilder.prototype.dispose.call(this); }; PdfBookPropsBuilder.prototype.init = function init(handler) { var _this2 = this; var pages = this.pdf.getPagesNum(); this.calcSheets(pages); if (pages > 0) { handler.getPage(1).then(function (page) { var size = _Pdf2.default.getPageSize(page); _this2.calcProps(size.width, size.height); _this2.ready(); }).catch(function (e) { console.error(e); }); } else { this.props = this.defaults; this.ready(); } }; PdfBookPropsBuilder.prototype.pageCallback = function pageCallback(n) { return this.pageDescription; }; return PdfBookPropsBuilder; }(_BookPropsBuilder3.default); exports.default = PdfBookPropsBuilder; /***/ }, /* 35 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(1); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var PdfLinksHandler = function () { function PdfLinksHandler(pdf, ctrl, element) { _classCallCheck(this, PdfLinksHandler); this.pdf = pdf; this.ctrl = ctrl; this.element = (0, _libs.$)(element); this.cursors = []; } PdfLinksHandler.prototype.dispose = function dispose() {}; PdfLinksHandler.prototype.setHandler = function setHandler(handler) { this.handler = handler; }; PdfLinksHandler.prototype.defaultHandler = function defaultHandler(type, destination) { if (type === 'internal') { this.ctrl.goToPage(destination); } else if (type === 'external') { window.open(destination, '_blank'); } }; PdfLinksHandler.prototype.callHandlers = function callHandlers(type, destination) { if (!this.handler || !this.handler(type, destination)) { this.defaultHandler(type, destination); } }; PdfLinksHandler.prototype.handleEvent = function handleEvent(data) { var _this = this; var e = data.event, anno = data.annotation; switch (e.type) { case 'mouseover': { this.cursors.push(this.element.css('cursor')); this.element.css('cursor', 'pointer'); break; } case 'mouseout': { this.element.css('cursor', this.cursors.pop() || ''); break; } case 'touchtap': case 'click': { if (anno.url) { this.callHandlers('external', anno.url); } else if (anno.dest) { var destPromise = void 0; if (typeof anno.dest === 'string') { destPromise = this.pdf.handler.getDestination(anno.dest); } else { destPromise = Promise.resolve(anno.dest); } destPromise.then(function (dest) { return typeof dest[0] === 'number' ? dest[0] : _this.pdf.handler.getPageIndex(dest[0]); }).then(function (number) { return _this.callHandlers('internal', number); }).catch(function () { return console.error('Bad link'); }); } break; } } }; return PdfLinksHandler; }(); exports.default = PdfLinksHandler; /***/ }, /* 36 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Finder = __webpack_require__(17); var _Finder2 = _interopRequireDefault(_Finder); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SearchEngine = function () { function SearchEngine(pageCallback, pages) { _classCallCheck(this, SearchEngine); this.pageCallback = pageCallback; this.pages = pages; this.results = []; } SearchEngine.prototype.setQuery = function setQuery(query) { this.query = query; this.update = true; this.process(); }; SearchEngine.prototype.process = function process() { var _this = this; if (this.update) { var results = this.results; this.results = []; if (this.onPageHitsChanged) { for (var _iterator = results, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var res = _ref; this.onPageHitsChanged(undefined, ''); } } this.update = false; this.page = 0; this.stamp = Date.now(); if (this.query.length > 1) { this.process(); } } else { if (this.page < this.pages) { (function () { var stamp = _this.stamp; _this.find(_this.pageCallback(_this.page)).then(function (contexts) { if (stamp === _this.stamp) { if (contexts.length) { _this.results.push({ page: _this.page, contexts: contexts }); } ++_this.page; if (_this.onPageHitsChanged) { _this.onPageHitsChanged(_this.page, _this.query); } _this.process(); } }); })(); } } }; SearchEngine.prototype.find = function find(pi) { var _this2 = this; var next = void 0; if (pi.type === 'pdf') { next = new Promise(function (resolve) { pi.src.getHandler(function () { var n = pi.number === undefined ? _this2.page : pi.number; if (pi.src.getPageType(n) === 'right') { resolve([]); } else { pi.src.getPage(n).then(function (page) { page.getTextContent().then(function (textContent) { resolve(new _Finder2.default(textContent.items.map(function (item) { return item.str; }), _this2.query, { hits: false }).getContexts()); }); }).catch(function () { return resolve([]); }); } }); }); } else { next = Promise.resolve([]); } return next; }; return SearchEngine; }(); exports.default = SearchEngine; /***/ }, /* 37 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _CSSLayer = __webpack_require__(13); var _CSSLayer2 = _interopRequireDefault(_CSSLayer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SheetCssLayer = function () { function SheetCssLayer(visual, block, props) { _classCallCheck(this, SheetCssLayer); this.visual = visual; var size = block.getTopSize(); this.layer = new _CSSLayer2.default(size.width, size.height, props); this.update(block); this.visual.addCssObject(this.layer); } SheetCssLayer.prototype.dispose = function dispose() { this.layer.dispose(); this.visual.removeCssObject(this.layer); }; SheetCssLayer.prototype.isHidden = function isHidden() { return this.layer.isHidden(); }; SheetCssLayer.prototype.hide = function hide() { return this.layer.hide(); }; SheetCssLayer.prototype.show = function show() { return this.layer.show(); }; SheetCssLayer.prototype.set = function set(css, html, js) { this.layer.setData(css, html, js); }; SheetCssLayer.prototype.update = function update(block) { this.block = block; this.block.getTopWorldRotation(this.layer.rotation); this.block.getTopWorldPosition(this.layer.position); }; return SheetCssLayer; }(); exports.default = SheetCssLayer; /***/ }, /* 38 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SheetPhysics = function () { SheetPhysics.targetForceClb = function targetForceClb(o, a, v, ch) { var l = a * this.r; return 100 * this.m * this.g * (2 / (1 + Math.exp(10 * (l - this.tl))) - 1) - this.m * 40 * v; }; SheetPhysics.hoverCornerForceClb = function hoverCornerForceClb(o, v, l, ch) { return 5; }; SheetPhysics.prototype.getTargetForceClb = function getTargetForceClb(mass, targetAngle) { return SheetPhysics.targetForceClb.bind({ g: this.p.gravity, m: mass, tl: targetAngle * this.p.r, r: this.p.r }); }; SheetPhysics.dragForceClb = function dragForceClb(o, a, v, ch) { return o.flbt * o.m * (10 * o.g * ch - 50 * v / (1 + Math.exp(3.5 * Math.abs(ch)))); }; SheetPhysics.dragCornerForceClb = function dragCornerForceClb(o, a, v, ch) { return 15 * (2 / (1 + Math.exp(10 * (a - this.ta) * o.r)) - 1); }; SheetPhysics.getDragCornerForceClb = function getDragCornerForceClb(targetAngle) { return SheetPhysics.dragCornerForceClb.bind({ ta: targetAngle }); }; function SheetPhysics() { var r = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var gravity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var cornerDeviation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15; var fps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 240; _classCallCheck(this, SheetPhysics); this.p = { r: r, cornerDeviation: cornerDeviation, l: Math.PI * r, startDt: 1 / fps, gravity: gravity, margin: 0.002 * r, infM: 1e4, attempts: 16, maxIterations: 100 }; this.os = []; } SheetPhysics.prototype.dispose = function dispose() { this.os = []; }; SheetPhysics.prototype.getSize = function getSize() { return this.os.length; }; SheetPhysics.prototype.addObject = function addObject(mass, angle, velocity, flexibility, cornerHeight, simulateClb, removeClb) { var forceClb = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : function () { return 0; }; var cornerForceClb = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : function () { return 0; }; var no = { id: _MathUtils2.default.getUnique(), m: mass, v: velocity, l: angle * this.p.r, f: forceClb, cf: cornerForceClb, ch: cornerHeight, flbt: flexibility, simulateClb: simulateClb, removeClb: removeClb }; var i = this.os.findIndex(function (o) { return no.l <= o.l; }); i = ~i ? i : this.os.length; this.os.splice(i, 0, no); return no.id; }; SheetPhysics.prototype.getParametrMap = function getParametrMap(name) { var map = { mass: 'm', velocity: 'v', flexibility: 'flbt', cornerHeight: 'ch', simulateClb: 'simulateClb', removeClb: 'removeClb', forceClb: 'f', cornerForceClb: 'cf' }; return map[name]; }; SheetPhysics.prototype.setParametr = function setParametr(id, name, value) { var o = this.os.find(function (o) { return o.id === id; }); if (name === 'angle') { o.l = value * this.p.r; } else { o[this.getParametrMap(name)] = value; } }; SheetPhysics.prototype.getParametr = function getParametr(id, name) { var o = this.os.find(function (o) { return o.id === id; }); var value = void 0; if (name === 'angle') { value = o.l / this.p.r; } else { value = o[this.getParametrMap(name)]; } return value; }; SheetPhysics.prototype.simulate = function simulate(T) { var t = 0, dt = this.p.startDt, attempt = 0, it = 0; while (t < T && it < this.p.maxIterations) { if (dt > T - t) { dt = T - t; } var nos = this.integrate(this.os, dt), ci = this.findCollisions(nos); if (ci.num > 1 && attempt < this.p.attempts) { dt /= 2; ++attempt; } else { if (ci.num === 1) { var scos = this.solveCollision(nos[ci.last - 1], nos[ci.last]); nos[ci.last - 1] = scos[0]; nos[ci.last] = scos[1]; } else if (ci.num > 1) { var gs = []; var last = -2; for (var _iterator = ci.all, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var i = _ref; if (i - last > 1) { gs.push([]); } gs[gs.length - 1].push(i); last = i; } for (var _iterator2 = gs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var g = _ref2; var sg = void 0, i0 = void 0; if (nos[g[0]].l > Math.PI / 2 * this.p.r) { sg = -1; i0 = g[g.length - 1]; } else { sg = 1; i0 = g[0]; } for (var _i3 = i0; _i3 < nos.length && _i3 > -1; _i3 += sg) { var o = nos[_i3 + sg]; if (o && sg * (o.l - nos[_i3].l) <= this.p.margin) { o.l = nos[_i3].l + sg * 2 * this.p.margin; if (o.l > this.p.l || o.l < 0) { o.l = o.l > this.p.l ? this.p.l : 0; o.ch = 0; o.v = 0; console.error('Bad collision'); } } else { break; } } } } this.os = nos; this.findAndSolveCornerCollisions(); t += dt; dt = this.p.startDt; attempt = 0; } ++it; } this.removeStatics(); }; SheetPhysics.prototype.removeStatics = function removeStatics() { var nos = [], notify = [[], []]; for (var _iterator3 = this.os, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i4 >= _iterator3.length) break; _ref3 = _iterator3[_i4++]; } else { _i4 = _iterator3.next(); if (_i4.done) break; _ref3 = _i4.value; } var o = _ref3; if (o.simulateClb) { o.simulateClb(o.l / this.p.r, o.ch); } if ((o.l === this.p.l || o.l === 0) && o.v === 0) { if (o.removeClb !== undefined) { notify[(o.l !== this.p.l) + 0].push(o); } } else { nos.push(o); } } this.os = nos; for (var _iterator4 = notify[0].reverse(), _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i5 >= _iterator4.length) break; _ref4 = _iterator4[_i5++]; } else { _i5 = _iterator4.next(); if (_i5.done) break; _ref4 = _i5.value; } var _o = _ref4; _o.removeClb(Math.PI, _o.ch); } for (var _iterator5 = notify[1], _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i6 >= _iterator5.length) break; _ref5 = _iterator5[_i6++]; } else { _i6 = _iterator5.next(); if (_i6.done) break; _ref5 = _i6.value; } var _o2 = _ref5; _o2.removeClb(0, _o2.ch); } }; SheetPhysics.prototype.findAndSolveCornerCollisions = function findAndSolveCornerCollisions() { if (this.os.length) { var os = [_extends({}, this.os[0], { l: 0, m: this.p.infM, ch: 0 })].concat(this.os, [_extends({}, this.os[0], { l: 1.05 * this.p.l, m: this.p.infM, ch: 0 })]); for (var i = 1; i < os.length; ++i) { var a = os[i - 1], b = os[i], al = a.l + this.p.cornerDeviation * a.ch * this.p.r, bl = b.l + this.p.cornerDeviation * b.ch * this.p.r; if (1.05 * al > bl && a.ch > b.ch) { var dCh = a.ch - b.ch, dv = a.m / a.flbt + b.m / b.flbt, ka = a.m / a.flbt / dv, kb = b.m / b.flbt / dv; a.ch = a.ch - kb * dCh; b.ch = b.ch + ka * dCh; } } } }; SheetPhysics.prototype.solveCollision = function solveCollision(a, b) { var mm = b.m + a.m, av = (-a.v * b.m + a.m * a.v + 2 * b.m * b.v) / mm, bv = (b.m * b.v - b.v * a.m + 2 * a.m * a.v) / mm; return [_extends({}, a, { v: av }), _extends({}, b, { v: bv })]; }; SheetPhysics.prototype.findCollisions = function findCollisions(os) { var ci = { num: 0, last: 0, all: [] }; for (var i = 1; i < os.length && ci.num < 2; ++i) { if (os[i - 1].l > os[i].l || this.isCollision(os[i - 1], os[i])) { if (os[i - 1].l > os[i].l) { ++ci.num; } ++ci.num; ci.last = i; if (ci.all.indexOf(i - 1) === -1) { ci.all.push(i - 1); } if (ci.all.indexOf(i) === -1) { ci.all.push(i); } } } return ci; }; SheetPhysics.prototype.isCollision = function isCollision(a, b) { return Math.abs(a.l - b.l) < this.p.margin && a.v > b.v; }; SheetPhysics.prototype.integrate = function integrate(os, dt) { var nos = []; for (var _iterator6 = os, _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i7 >= _iterator6.length) break; _ref6 = _iterator6[_i7++]; } else { _i7 = _iterator6.next(); if (_i7.done) break; _ref6 = _i7.value; } var o = _ref6; var vl = _MathUtils2.default.rk4(this.dy.bind({ g: this.p.gravity, r: this.p.r, m: o.m, f: o.f, cf: o.cf, ch: o.ch, flbt: o.flbt }), 0, dt, [o.v, o.l, o.ch]); var no = _extends({}, o, { v: vl[0], l: vl[1], ch: vl[2] }); if (no.l <= 0 || no.l >= this.p.l) { no.l = no.l <= 0 ? 0 : this.p.l; no.v = 0; no.ch = 0; } nos.push(no); } return nos; }; SheetPhysics.prototype.dy = function dy(t, y) { var v = y[0], l = y[1], ch = y[2], f = this.f(this, l / this.r, v, ch), cf = this.cf(this, l / this.r, v, ch); return [(-this.g * Math.cos(l / this.r) * this.m + f) / this.m, v + 0.01 * (Math.random() - 0.5), this.flbt * ((2 / (1 + Math.exp(-0.2 * cf)) - 1) * (1 - 2 / (1 + Math.exp(-5 * (Math.abs(ch) - 2)))) - ch)]; }; return SheetPhysics; }(); exports.default = SheetPhysics; /***/ }, /* 39 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SoundsEnviroment = function () { function SoundsEnviroment() { var template = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, SoundsEnviroment); this.sounds = template.sounds || {}; this.audio = {}; if (this.sounds.startFlip) { this.audio.startFlip = new Audio(this.sounds.startFlip); } if (this.sounds.endFlip) { this.audio.endFlip = new Audio(this.sounds.endFlip); } } SoundsEnviroment.prototype.setEnabled = function setEnabled(enabled) { this.enabled = enabled; }; SoundsEnviroment.prototype.togle = function togle() { this.enabled = !this.enabled; }; SoundsEnviroment.prototype.dispose = function dispose() { delete this.audio.startFlip; delete this.audio.endFlip; }; SoundsEnviroment.prototype.startFlip = function startFlip() { if (this.enabled && this.audio.startFlip) { this.audio.startFlip.play(); } }; SoundsEnviroment.prototype.endFlip = function endFlip() { if (this.enabled && this.audio.startFlip) { this.audio.startFlip.pause(); this.audio.startFlip.currentTime = 0; } if (this.enabled && this.audio.endFlip) { this.audio.endFlip.play(); } }; SoundsEnviroment.prototype.subscribeFlips = function subscribeFlips(emitter) { emitter.addEventListener('startFlip', this.startFlip.bind(this)); emitter.addEventListener('endFlip', this.endFlip.bind(this)); }; return SoundsEnviroment; }(); exports.default = SoundsEnviroment; /***/ }, /* 40 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _WidgetController2 = __webpack_require__(67); var _WidgetController3 = _interopRequireDefault(_WidgetController2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var TocController = function (_WidgetController) { _inherits(TocController, _WidgetController); function TocController(view, bookCtrl) { _classCallCheck(this, TocController); var _this = _possibleConstructorReturn(this, _WidgetController.call(this, view)); _this.bookCtrl = bookCtrl; _this.tab = 'none'; return _this; } TocController.prototype.setThumbnails = function setThumbnails(thumbnails) { this.thumbnails = thumbnails; thumbnails.onNavigate = this.navigateThumbnails.bind(this); if (this.tab === 'none') { this.tab = 'thumbnails'; } this.fireChange(); }; TocController.prototype.setSearch = function setSearch(search) { this.search = search; search.onNavigate = this.navigateSearch.bind(this); this.fireChange(); }; TocController.prototype.setBookmarks = function setBookmarks(bookmarks, pdf) { this.bookmarks = bookmarks; this.pdf = pdf; bookmarks.onNavigate = this.navigateBookmarks.bind(this); if (bookmarks.getSize()) { this.tab = 'bookmarks'; this.isBookmarks = true; } this.fireChange(); }; TocController.prototype.cmdBookmarks = function cmdBookmarks() { this.tab = 'bookmarks'; this.fireChange(); }; TocController.prototype.cmdThumbnails = function cmdThumbnails() { this.tab = 'thumbnails'; this.fireChange(); }; TocController.prototype.cmdSearch = function cmdSearch() { this.tab = 'search'; this.fireChange(); }; TocController.prototype.cmdCloseToc = function cmdCloseToc() { this.hide(); }; TocController.prototype.navigateThumbnails = function navigateThumbnails(number) { this.bookCtrl.goToPage(number); }; TocController.prototype.navigateSearch = function navigateSearch(number) { this.bookCtrl.goToPage(number); }; TocController.prototype.navigateBookmarks = function navigateBookmarks(item) { var _this2 = this; if (item.url) { window.open(item.url, '_blank'); } else if (item.dest) { var destPromise = void 0; if (typeof item.dest === 'string') { destPromise = this.pdf.handler.getDestination(item.dest); } else { destPromise = Promise.resolve(item.dest); } destPromise.then(function (dest) { return _this2.pdf.handler.getPageIndex(dest[0]); }).then(function (number) { return _this2.bookCtrl.goToPage(number); }).catch(function () { return console.error('Bad bookmark'); }); } }; TocController.prototype.updateView = function updateView() { var _this3 = this; if (this.view) { this.view.setState('widTocMenu', { enable: true, visible: true, active: false }); this.view.setState('widThumbnails', { enable: true, visible: this.tab === 'thumbnails', active: false }); this.view.setState('widSearch', { enable: true, visible: this.tab === 'search', active: false }); this.view.setState('widBookmarks', { enable: true, visible: this.tab === 'bookmarks', active: false }); this.view.setState('cmdBookmarks', { enable: true, visible: true, active: this.tab === 'bookmarks' }); this.view.setState('cmdCloseToc', { enable: true, visible: true, active: false }); this.view.setState('cmdThumbnails', { enable: true, visible: true, active: this.tab === 'thumbnails' }); this.view.setState('cmdSearch', { enable: true, visible: true, active: this.tab === 'search' }); Promise.resolve().then(function () { return _this3.thumbnails.setEnable(_this3.visible && _this3.tab === 'thumbnails'); }); _WidgetController.prototype.updateView.call(this); } }; return TocController; }(_WidgetController3.default); exports.default = TocController; /***/ }, /* 41 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(1); var _ThreeUtils = __webpack_require__(20); var _ThreeUtils2 = _interopRequireDefault(_ThreeUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var resX = 11, resY = 2, resZ = 15, scale = 1, faces = []; var frontGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resY - 1); frontGeometry.translate(0.5 * scale, 0.5 * scale, scale); var backGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resY - 1); backGeometry.rotateY(Math.PI); backGeometry.translate(0.5 * scale, 0.5 * scale, 0); var leftGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resZ - 1, resY - 1); leftGeometry.rotateY(-Math.PI / 2); leftGeometry.translate(0, 0.5 * scale, 0.5 * scale); var rightGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resZ - 1, resY - 1); rightGeometry.rotateY(Math.PI / 2); rightGeometry.translate(scale, 0.5 * scale, 0.5 * scale); var topGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resZ - 1); topGeometry.rotateX(-Math.PI / 2); topGeometry.translate(0.5 * scale, scale, 0.5 * scale); var bottomGeometry = topGeometry.clone(); bottomGeometry.translate(0, -scale, 0); for (var _iterator = bottomGeometry.faces, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var f = _ref; var _ref3 = [f.b, f.a]; f.a = _ref3[0]; f.b = _ref3[1]; } var geometry = new _libs.THREE.Geometry(); geometry.vertices = [].concat(bottomGeometry.vertices, topGeometry.vertices); var addFaces = function addFaces(fs, map) { for (var _iterator2 = fs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var f = _ref2; geometry.faces.push(new _libs.THREE.Face3(map(f.a), map(f.b), map(f.c))); } faces.push(geometry.faces.length); }; var mapVertices = function mapVertices(src, dst) { var map = []; var eq = function eq(a, b) { return Math.abs(a.x - b.x) + Math.abs(a.y - b.y) + Math.abs(a.z - b.z) < 1e-4; }; for (var i = 0; i < src.length; ++i) { for (var j = 0; j < dst.length; ++j) { if (eq(src[i], dst[j])) { map[i] = j; break; } } } return map; }; var frontMap = mapVertices(frontGeometry.vertices, geometry.vertices); var backMap = mapVertices(backGeometry.vertices, geometry.vertices); var leftMap = mapVertices(leftGeometry.vertices, geometry.vertices); var rightMap = mapVertices(rightGeometry.vertices, geometry.vertices); addFaces(topGeometry.faces, function (i) { return i + bottomGeometry.vertices.length; }); addFaces(bottomGeometry.faces, function (i) { return i; }); addFaces(frontGeometry.faces, function (i) { return frontMap[i]; }); addFaces(backGeometry.faces, function (i) { return backMap[i]; }); addFaces(leftGeometry.faces, function (i) { return leftMap[i]; }); addFaces(rightGeometry.faces, function (i) { return rightMap[i]; }); faces.pop(); _ThreeUtils2.default.computeFaceVertexUvs(geometry, faces); geometry.computeVertexNormals(); //geometry.computeFaceNormals(); geometry.computeBoundingSphere(); //geometry.computeBoundingBox(); geometry.verticesNeedUpdate = true; exports.default = { resX: resX, resY: resY, resZ: resZ, faces: faces, geometry: geometry }; /***/ }, /* 42 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; exports.props = props; var mouseButtons = { Left: 0, Middle: 1, Right: 2 }; function props() { return { eps: 1e-4, skin: { default: 'short-white-book-view' }, scale: { default: 0.9, min: 0.9, max: 2.5, levels: 7 }, lighting: { default: 0.7, min: 0, max: 1, levels: 7 }, pan: { speed: 50 }, loadingAnimation: { skin: false, book: true }, autoResolution: { enabled: true, coefficient: 1.5 }, actions: { cmdZoomIn: { enabled: true }, cmdZoomOut: { enabled: true }, cmdDefaultZoom: { enabled: true, type: 'dblclick', code: 0 }, cmdToc: { enabled: true }, cmdFastBackward: { enabled: false }, cmdBackward: { enabled: true }, cmdForward: { enabled: true }, cmdFastForward: { enabled: false }, cmdSave: { enabled: true }, cmdPrint: { enabled: true }, cmdFullScreen: { enabled: true }, widSettings: { enabled: true }, cmdSmartPan: { enabled: true, active: true }, cmdSinglePage: { enabled: true, active: false, activeForMobile: false }, cmdSounds: { enabled: true, active: true }, cmdStats: { enabled: true, active: false }, cmdLightingUp: { enabled: true }, cmdLightingDown: { enabled: true }, cmdPanLeft: { enabled: false }, cmdPanRight: { enabled: false }, cmdPanUp: { enabled: false }, cmdPanDown: { enabled: false }, mouseCmdRotate: { enabled: true, type: 'mousedrag', code: mouseButtons.Right }, mouseCmdDragZoom: { enabled: true, type: 'mousedrag', code: mouseButtons.Middle }, mouseCmdPan: { enabled: true, type: 'mousedrag', code: mouseButtons.Left }, mouseCmdWheelZoom: { enabled: true, type: 'mousewheel', code: 0 }, touchCmdRotate: { enabled: true, type: 'touchdrag', code: 3 }, touchCmdZoom: { enabled: true, type: 'touchdrag', code: 2 }, touchCmdPan: { enabled: true, type: 'touchdrag', code: 1 }, touchCmdSwipe: { enabled: true, type: 'touchdrag', code: 1 } } }; }; /***/ }, /* 43 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _ImageBase2 = __webpack_require__(5); var _ImageBase3 = _interopRequireDefault(_ImageBase2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var BlankImage = function (_ImageBase) { _inherits(BlankImage, _ImageBase); function BlankImage(context, width, height, color) { _classCallCheck(this, BlankImage); var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); Promise.resolve().then(function () { _this.startRender = function () { _this.renderBlankPage(); _this.finishRender(); }; _this.finishLoad(); }); return _this; } return BlankImage; }(_ImageBase3.default); exports.default = BlankImage; /***/ }, /* 44 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Bookmarks = function () { function Bookmarks(container, items) { var _this = this; var getTitle = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (i) { return i.title; }; var getItems = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function (i) { return i.items; }; _classCallCheck(this, Bookmarks); this.container = container; this.map = []; this.getTitle = getTitle; this.getItems = getItems; this.nodes = this.mapNodes(items, this.map); this.binds = { togle: function togle(e) { e.preventDefault(); var li = (0, _libs.$)(e.target); while (li[0] && li[0] !== container[0] && !li.hasClass('item')) { li = (0, _libs.$)(li[0].parentNode); } if (li.hasClass('item')) { var cmd = (0, _libs.$)(e.target); while (cmd[0] && cmd[0] !== li[0] && !cmd.hasClass('cmd')) { cmd = (0, _libs.$)(cmd[0].parentNode); } if (cmd.hasClass('cmd')) { var node = _this.map[li.attr('data-id')]; if (cmd.hasClass('togle')) { node.minimized = !node.minimized; if (node.minimized) { li.find('ul').remove(); li.find('.togle').addClass('minimized'); } else { li.find('.togle').removeClass('minimized'); li.append((_this.renderNode(node).match(//) || [''])[0]); } } else { if (_this.onNavigate) { _this.onNavigate(node.item); } } } } } }; container.on('click', this.binds.togle); this.update(); } Bookmarks.prototype.getSize = function getSize() { return this.map.length; }; Bookmarks.prototype.dispose = function dispose() { this.container.off('click', this.binds.togle); this.container.html(''); }; Bookmarks.prototype.update = function update() { this.container.html(this.renderNodes(this.nodes)); }; Bookmarks.prototype.forEach = function forEach(f) { var nodes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.nodes; for (var _iterator = nodes || [], _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var node = _ref; f(node); this.forEach(f, node.children); } }; Bookmarks.prototype.expand = function expand() { this.forEach(function (n) { return n.minimized = false; }); this.update(); }; Bookmarks.prototype.minimize = function minimize() { this.forEach(function (n) { return n.minimized = true; }); this.update(); }; Bookmarks.prototype.renderNode = function renderNode(node) { return ['
', node.children ? ' ' : ' ', '', node.title, '
', node.minimized ? '' : this.renderNodes(node.children)].join(''); }; Bookmarks.prototype.renderNodes = function renderNodes(nodes) { var res = ['
']; if (nodes && nodes.length) { res.push('
    '); for (var _iterator2 = nodes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var node = _ref2; res.push(['
  • ', this.renderNode(node), '
  • '].join('')); } res.push('
'); } res.push('
'); return res.join(''); }; Bookmarks.prototype.mapNodes = function mapNodes(items) { var map = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var nodes = null; if (items && items.length) { nodes = []; for (var _iterator3 = items, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var item = _ref3; var id = map.length; map.push(undefined); var node = { id: id, title: this.getTitle(item), level: level, item: item, minimized: true, children: this.mapNodes(this.getItems(item), map, level + 1) }; nodes.push(node); map[id] = node; } } return nodes; }; return Bookmarks; }(); exports.default = Bookmarks; /***/ }, /* 45 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Detector = function () { function Detector() { _classCallCheck(this, Detector); } Detector.getWebGLErrorMessage = function getWebGLErrorMessage() { var element = document.createElement('div'); element.id = 'webgl-error-message'; element.style.fontFamily = 'monospace'; element.style.fontSize = '13px'; element.style.fontWeight = 'normal'; element.style.textAlign = 'center'; element.style.background = '#fff'; element.style.color = '#000'; element.style.padding = '1.5em'; element.style.width = '400px'; element.style.margin = '5em auto 0'; if (!Detector.webgl) { element.innerHTML = window.WebGLRenderingContext ? ['Your graphics card does not seem to support WebGL.
', 'Find out how to get it here.'].join('\n') : ['Your browser does not seem to support WebGL.
', 'Find out how to get it here.'].join('\n'); } return element; }; Detector.addGetWebGLMessage = function addGetWebGLMessage(parameters) { var parent = void 0, id = void 0, element = void 0; parameters = parameters || {}; parent = parameters.parent || (0, _libs.$)(document.body); id = parameters.id || 'oldie'; element = Detector.getWebGLErrorMessage(); //element.id = id; parent.append(element); }; return Detector; }(); Detector.canvas = !!window.CanvasRenderingContext2D; Detector.webgl = function () { try { var canvas = document.createElement('canvas'); return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))); } catch (e) { return false; } }(); Detector.workers = !!window.Worker; Detector.fileapi = window.File && window.FileReader && window.FileList && window.Blob; exports.default = Detector; /***/ }, /* 46 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var DocMouseSimulator = function () { function DocMouseSimulator(jFrame, element) { var bElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document.body; _classCallCheck(this, DocMouseSimulator); this.jFrame = jFrame; this.wnd = jFrame[0].contentWindow; this.doc = jFrame[0].contentDocument; this.element = element || doc.body; this.bElement = bElement; this.resendProperties = this.getDefaultResendProperties(); this.undefinedProperties = this.getDefaultUndefinedProperties(); this.cursors = []; this.onDocChangeClbs = []; var terms = [{ find: ':hover', replace: '.' + DocMouseSimulator.HOVER }, { find: ':active', replace: '.' + DocMouseSimulator.ACTIVE }]; var style = [''); (0, _libs.$)(this.doc.head).append((0, _libs.$)(style.join(''))); } DocMouseSimulator.prototype.convertCoords = function convertCoords(x, y) { var jElement = (0, _libs.$)(this.element); var offset = jElement.offset(); return { x: offset.left + jElement.width() * x, y: offset.top + jElement.height() * (1 - y) }; }; DocMouseSimulator.prototype.triggerEvent = function triggerEvent(element, e, p, type, advancedProps) { var props = {}; for (var _iterator2 = this.resendProperties, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var _n = _ref2; props[_n] = e[_n]; } for (var _iterator3 = this.undefinedProperties, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var _n2 = _ref3; props[_n2] = undefined; } for (var n in advancedProps) { if (advancedProps.hasOwnProperty(n)) { props[n] = advancedProps[n]; } } props.view = this.wnd; props.pageX = p.x; props.pageY = p.y; var jE = _libs.$.Event(type, props); jE.timeStamp = e.timeStamp; (0, _libs.$)(element).trigger(jE); }; DocMouseSimulator.prototype.addClass = function addClass(element, name) { (0, _libs.$)(element).addClass(name); var style = this.wnd.getComputedStyle(element); this.cursors.push((0, _libs.$)(this.bElement).css('cursor')); (0, _libs.$)(this.bElement).css('cursor', style.getPropertyValue('cursor')); }; DocMouseSimulator.prototype.removeClass = function removeClass(element, name) { (0, _libs.$)(element).removeClass(name); (0, _libs.$)(this.bElement).css('cursor', this.cursors.pop()); }; DocMouseSimulator.prototype.enterElement = function enterElement(element) { this.addClass(element, DocMouseSimulator.HOVER); }; DocMouseSimulator.prototype.leaveElement = function leaveElement(element) { this.removeClass(element, DocMouseSimulator.HOVER); }; DocMouseSimulator.prototype.activateElement = function activateElement(element) { this.addClass(element, DocMouseSimulator.ACTIVE); }; DocMouseSimulator.prototype.deactivateElement = function deactivateElement(element) { this.removeClass(element, DocMouseSimulator.ACTIVE); }; DocMouseSimulator.prototype.addDocChangeClb = function addDocChangeClb(clb) { this.onDocChangeClbs.push(clb); }; DocMouseSimulator.prototype.notify = function notify() { for (var _iterator4 = this.onDocChangeClbs, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var clb = _ref4; clb(this.wnd, this.doc); } }; DocMouseSimulator.prototype.elementFromPoint = function elementFromPoint(p) { var node = this.doc.body, next = true; while (next) { next = false; for (var i = 0; i < node.childNodes.length; ++i) { var child = node.childNodes[i]; if (child instanceof this.wnd.Element) { var jC = (0, _libs.$)(child), offset = jC.offset(), height = jC.height(), width = jC.width(); if (p.x > offset.left && p.x < offset.left + width && p.y > offset.top && p.y < offset.top + height) { node = child; next = true; break; } } } } return node; }; DocMouseSimulator.prototype.getElement = function getElement(p) { var off0 = this.jFrame.offset(); this.jFrame.offset({ left: 0.5 * window.innerWidth - p.x, top: 0.5 * window.innerHeight - p.y }); var element = this.doc.elementFromPoint(p.x, p.y); if (!element) { // it isn't a joke it's IE element = this.doc.elementFromPoint(p.x, p.y); } this.jFrame.offset(off0); return element ? element : this.elementFromPoint(p); }; DocMouseSimulator.prototype.simulate = function simulate(e, doc, x, y) { var p = this.convertCoords(x, y), element = doc === this.doc ? this.getElement(p) : undefined; var trigger = element !== undefined, notify = false; switch (e.type) { case 'mousedown': { if (this.capElement) { this.deactivateElement(this.capElement); notify = true; } this.capElement = element; if (this.capElement) { this.activateElement(this.capElement); notify = true; } break; } case 'mouseup': { if (this.capElement) { this.deactivateElement(this.capElement); notify = true; } this.timeStamp = e.timeStamp; break; } case 'click': { trigger = element && this.capElement === element && e.timeStamp === this.timeStamp; this.capElement = undefined; break; } case 'mouseenter': case 'mouseover': case 'mousemove': { var leaved = null; if (this.hovElement !== element && this.hovElement) { this.triggerEvent(this.hovElement, e, p, 'mouseout', { relatedTarget: element ? element : null }); this.leaveElement(this.hovElement); leaved = this.hovElement; this.hovElement = undefined; notify = true; } if (!this.hovElement && element) { this.triggerEvent(element, e, p, 'mouseover', { relatedTarget: leaved }); this.enterElement(element); this.hovElement = element; notify = true; } trigger = element && e.type === 'mousemove'; break; } case 'mouseleave': case 'mouseout': { if (this.hovElement) { this.triggerEvent(this.hovElement, e, p, 'mouseout', { relatedTarget: e.relatedTarget }); this.leaveElement(this.hovElement); this.hovElement = undefined; notify = true; } trigger = false; break; } } if (trigger) { this.triggerEvent(element, e, p, e.type); } if (notify) { this.notify(); } }; DocMouseSimulator.prototype.getDefaultUndefinedProperties = function getDefaultUndefinedProperties() { return ['clientX', 'clientY', 'offsetX', 'offsetY', 'screenX', 'screenY']; }; DocMouseSimulator.prototype.getDefaultResendProperties = function getDefaultResendProperties() { return ['altKey', 'bubbles', 'button', 'buttons', 'cancelable', 'changedTouches', 'char', 'charCode', 'ctrlKey', 'data', 'detail', 'eventPhase', 'isDefaultPrevented', 'key', 'keyCode', 'metaKey', 'pointerId', 'pointerType', 'shiftKey', 'targetTouches', 'touches', 'which']; }; return DocMouseSimulator; }(); /* altKey, bubbles, button, buttons, cancelable, changedTouches, char, charCode, clientX, clientY, ctrlKey, currentTarget, data, delegateTarget, detail, eventPhase, handleObj, isDefaultPrevented, key, keyCode, metaKey, offsetX, offsetY, originalEvent, pageX, pageY, pointerId, pointerType, relatedTarget, screenX, screenY, shiftKey, target, targetTouches, timeStamp, toElement, touches, type, view, which */ DocMouseSimulator.HOVER = 'SIMULATED-HOVER'; DocMouseSimulator.ACTIVE = 'SIMULATED-ACTIVE'; exports.default = DocMouseSimulator; /***/ }, /* 47 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Dom2Image = function Dom2Image(wnd, doc, cache) { _classCallCheck(this, Dom2Image); var self = this; this.window = wnd; this.document = doc; this.cache = cache; var util = newUtil(); var inliner = newInliner(); var fontFaces = newFontFaces(); var images = newImages(); this.toSvg = toSvg; this.toPng = toPng; this.toJpeg = toJpeg; this.toBlob = toBlob; this.toPixelData = toPixelData; this.impl = { fontFaces: fontFaces, images: images, util: util, inliner: inliner }; /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options * @param {Function} options.filter - Should return true if passed node should be included in the output * (excluding node means excluding it's children as well). Not called on the root node. * @param {String} options.bgcolor - color for the background, any valid CSS color value. * @param {Number} options.width - width to be applied to node before rendering. * @param {Number} options.height - height to be applied to node before rendering. * @param {Object} options.style - an object whose properties to be copied to node's style before rendering. * @param {Number} options.quality - a Number between 0 and 1 indicating image quality (applicable to JPEG only), defaults to 1.0. * @return {Promise} - A promise that is fulfilled with a SVG image data URL * */ function toSvg(node, options) { options = options || {}; return Promise.resolve(node).then(function (node) { return cloneNode(node, options.filter, true); }).then(embedFonts).then(inlineImages).then(applyOptions).then(function (clone) { return makeSvgDataUri(clone, options.width || util.width(node), options.height || util.height(node)); }); function applyOptions(clone) { if (options.bgcolor) clone.style.backgroundColor = options.bgcolor; if (options.width) clone.style.width = options.width + 'px'; if (options.height) clone.style.height = options.height + 'px'; if (options.style) self.window.Object.keys(options.style).forEach(function (property) { clone.style[property] = options.style[property]; }); return clone; } } /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options, @see {@link toSvg} * @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data. * */ function toPixelData(node, options) { return draw(node, options || {}).then(function (canvas) { return canvas.getContext('2d').getImageData(0, 0, util.width(node), util.height(node)).data; }); } /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options, @see {@link toSvg} * @return {Promise} - A promise that is fulfilled with a PNG image data URL * */ function toPng(node, options) { return draw(node, options || {}).then(function (canvas) { return canvas.toDataURL(); }); } /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options, @see {@link toSvg} * @return {Promise} - A promise that is fulfilled with a JPEG image data URL * */ function toJpeg(node, options) { options = options || {}; return draw(node, options).then(function (canvas) { return canvas.toDataURL('image/jpeg', options.quality || 1.0); }); } /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options, @see {@link toSvg} * @return {Promise} - A promise that is fulfilled with a PNG image blob * */ function toBlob(node, options) { return draw(node, options || {}).then(util.canvasToBlob); } function draw(domNode, options) { return toSvg(domNode, options).then(util.makeImage).then(util.delay(100)).then(function (image) { var canvas = newCanvas(domNode); canvas.getContext('2d').drawImage(image, 0, 0); return canvas; }); function newCanvas(domNode) { var canvas = self.document.createElement('canvas'); canvas.width = options.width || util.width(domNode); canvas.height = options.height || util.height(domNode); if (options.bgcolor) { var ctx = canvas.getContext('2d'); ctx.fillStyle = options.bgcolor; ctx.fillRect(0, 0, canvas.width, canvas.height); } return canvas; } } function cloneNode(node, filter, root) { if (!root && filter && !filter(node)) return Promise.resolve(); return Promise.resolve(node).then(makeNodeCopy).then(function (clone) { return cloneChildren(node, clone, filter); }).then(function (clone) { return processClone(node, clone); }); function makeNodeCopy(node) { if (util.isCanvas(node)) return util.makeImage(node.toDataURL()); return node.cloneNode(false); } function cloneChildren(original, clone, filter) { var children = original.childNodes; if (children.length === 0) return Promise.resolve(clone); return cloneChildrenInOrder(clone, util.asArray(children), filter).then(function () { return clone; }); function cloneChildrenInOrder(parent, children, filter) { var done = Promise.resolve(); children.forEach(function (child) { done = done.then(function () { return cloneNode(child, filter); }).then(function (childClone) { if (childClone) parent.appendChild(childClone); }); }); return done; } } function processClone(original, clone) { if (!util.isElement(clone)) return clone; return Promise.resolve().then(cloneStyle).then(clonePseudoElements).then(copyUserInput).then(fixSvg).then(function () { return clone; }); function cloneStyle() { copyStyle(self.window.getComputedStyle(original), clone.style); function copyStyle(source, target) { if (source.cssText) target.cssText = source.cssText;else copyProperties(source, target); function copyProperties(source, target) { util.asArray(source).forEach(function (name) { target.setProperty(name, source.getPropertyValue(name), source.getPropertyPriority(name)); }); } } } function clonePseudoElements() { [':before', ':after'].forEach(function (element) { clonePseudoElement(element); }); function clonePseudoElement(element) { var style = self.window.getComputedStyle(original, element); var content = style.getPropertyValue('content'); if (content === '' || content === 'none') return; var className = util.uid(); clone.className = clone.className + ' ' + className; var styleElement = self.document.createElement('style'); styleElement.appendChild(formatPseudoElementStyle(className, element, style)); clone.appendChild(styleElement); function formatPseudoElementStyle(className, element, style) { var selector = '.' + className + ':' + element; var cssText = style.cssText ? formatCssText(style) : formatCssProperties(style); return self.document.createTextNode(selector + '{' + cssText + '}'); function formatCssText(style) { var content = style.getPropertyValue('content'); return style.cssText + ' content: ' + content + ';'; } function formatCssProperties(style) { return util.asArray(style).map(formatProperty).join('; ') + ';'; function formatProperty(name) { return name + ': ' + style.getPropertyValue(name) + (style.getPropertyPriority(name) ? ' !important' : ''); } } } } } function copyUserInput() { if (util.isTextArea(original)) clone.innerHTML = original.value; if (util.isInput(original)) clone.setAttribute("value", original.value); } function fixSvg() { if (!util.isSVG(clone)) return; clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); if (!util.isSVGRect(clone)) return; ['width', 'height'].forEach(function (attribute) { var value = clone.getAttribute(attribute); if (!value) return; clone.style.setProperty(attribute, value); }); } } } function embedFonts(node) { return fontFaces.resolveAll().then(function (cssText) { var styleNode = self.document.createElement('style'); node.appendChild(styleNode); styleNode.appendChild(self.document.createTextNode(cssText)); return node; }); } function inlineImages(node) { return images.inlineAll(node).then(function () { return node; }); } function makeSvgDataUri(node, width, height) { return Promise.resolve(node).then(function (node) { node.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); return new self.window.XMLSerializer().serializeToString(node); }).then(util.escapeXhtml).then(function (xhtml) { return ['data:image/svg+xml;charset=utf-8,', '', '', xhtml, '', ''].join(''); }); } function newUtil() { return { escape: escape, parseExtension: parseExtension, mimeType: mimeType, dataAsUrl: dataAsUrl, isDataUrl: isDataUrl, canvasToBlob: canvasToBlob, resolveUrl: resolveUrl, getAndEncode: getAndEncode, uid: uid(), delay: delay, asArray: asArray, escapeXhtml: escapeXhtml, makeImage: makeImage, width: width, height: height, isElement: isElement, isCanvas: isCanvas, isTextArea: isTextArea, isInput: isInput, isSVG: isSVG, isSVGRect: isSVGRect, isImage: isImage }; function mimes() { /* * Only WOFF and EOT mime types for fonts are 'real' * see http://www.iana.org/assignments/media-types/media-types.xhtml */ var WOFF = 'application/font-woff'; var JPEG = 'image/jpeg'; return { 'woff': WOFF, 'woff2': WOFF, 'ttf': 'application/font-truetype', 'eot': 'application/vnd.ms-fontobject', 'png': 'image/png', 'jpg': JPEG, 'jpeg': JPEG, 'gif': 'image/gif', 'tiff': 'image/tiff', 'svg': 'image/svg+xml' }; } function parseExtension(url) { var match = /\.([^\.\/]*?)$/g.exec(url); if (match) return match[1];else return ''; } function mimeType(url) { var extension = parseExtension(url).toLowerCase(); return mimes()[extension] || ''; } function isDataUrl(url) { return url.search(/^(data:)/) !== -1; } function toBlob(canvas) { return new Promise(function (resolve) { var binaryString = self.window.atob(canvas.toDataURL().split(',')[1]); var length = binaryString.length; var binaryArray = new self.window.Uint8Array(length); for (var i = 0; i < length; i++) { binaryArray[i] = binaryString.charCodeAt(i); }resolve(new self.window.Blob([binaryArray], { type: 'image/png' })); }); } function canvasToBlob(canvas) { if (canvas.toBlob) return new Promise(function (resolve) { canvas.toBlob(resolve); }); return toBlob(canvas); } function resolveUrl(url, baseUrl) { var doc = self.document.implementation.createHTMLDocument(); var base = doc.createElement('base'); doc.head.appendChild(base); var a = doc.createElement('a'); doc.body.appendChild(a); base.href = baseUrl; a.href = url; return a.href; } function uid() { var index = 0; return function () { return 'u' + fourRandomChars() + index++; function fourRandomChars() { /* see http://stackoverflow.com/a/6248722/2519373 */ return ('0000' + (self.window.Math.random() * self.window.Math.pow(36, 4) << 0).toString(36)).slice(-4); } }; } function makeImage(uri) { return new Promise(function (resolve, reject) { var image = new self.window.Image(); image.onload = function () { resolve(image); }; image.onerror = reject; image.src = uri; }); } function getAndEncode(url) { var data = self.cache.get(url); if (data) { if (data.content) { return data.content; } else { return new Promise(function (resolve) { if (data.content) { resolve(data.content); } else { data.pendings.push(resolve); } }); } } else { data = self.cache.put(url, { pendings: [] }); var TIMEOUT = 30000; return new Promise(function (resolve) { var request = new self.window.XMLHttpRequest(); request.onreadystatechange = done; request.ontimeout = timeout; request.responseType = 'blob'; request.timeout = TIMEOUT; request.open('GET', url, true); request.send(); function done() { if (request.readyState !== 4) return; if (request.status !== 200) { fail('cannot fetch resource: ' + url + ', status: ' + request.status); return; } var encoder = new self.window.FileReader(); encoder.onloadend = function () { data.content = encoder.result.split(/,/)[1]; for (var _iterator = data.pendings, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var _resolve = _ref; _resolve(data.content); } data.pendings = []; resolve(data.content); }; encoder.readAsDataURL(request.response); } function timeout() { fail('timeout of ' + TIMEOUT + 'ms occured while fetching resource: ' + url); } function fail(message) { console.error(message); resolve(''); } }); } } function dataAsUrl(content, type) { return ['data:', type, ';base64,', content].join(''); } function escape(string) { return string.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1'); } function delay(ms) { return function (arg) { return new Promise(function (resolve) { setTimeout(function () { resolve(arg); }, ms); }); }; } function asArray(arrayLike) { var array = []; var length = arrayLike.length; for (var i = 0; i < length; i++) { array.push(arrayLike[i]); }return array; } function escapeXhtml(string) { return string.replace(/(#|\n)/g, function (c) { return c === '#' ? '%23' : '%0A'; }); } function width(node) { var leftBorder = px(node, 'border-left-width'); var rightBorder = px(node, 'border-right-width'); return node.scrollWidth + leftBorder + rightBorder; } function height(node) { var topBorder = px(node, 'border-top-width'); var bottomBorder = px(node, 'border-bottom-width'); return node.scrollHeight + topBorder + bottomBorder; } function px(node, styleProperty) { var value = self.window.getComputedStyle(node).getPropertyValue(styleProperty); return parseFloat(value.replace('px', '')); } function isElement(node) { return node instanceof self.window.Element; } function isCanvas(node) { return node instanceof self.window.HTMLCanvasElement; } function isTextArea(node) { return node instanceof self.window.HTMLTextAreaElement; } function isInput(node) { return node instanceof self.window.HTMLInputElement; } function isSVG(node) { return node instanceof self.window.SVGElement; } function isSVGRect(node) { return node instanceof self.window.SVGRectElement; } function isImage(node) { return node instanceof self.window.HTMLImageElement; } } function newInliner() { var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g; return { inlineAll: inlineAll, shouldProcess: shouldProcess, impl: { readUrls: readUrls, inline: inline } }; function shouldProcess(string) { return string.search(URL_REGEX) !== -1; } function readUrls(string) { var result = []; var match = void 0; while ((match = URL_REGEX.exec(string)) !== null) { result.push(match[1]); } return result.filter(function (url) { return !util.isDataUrl(url); }); } function inline(string, url, baseUrl, get) { return Promise.resolve(url).then(function (url) { return baseUrl ? util.resolveUrl(url, baseUrl) : url; }).then(get || util.getAndEncode).then(function (data) { return util.dataAsUrl(data, util.mimeType(url)); }).then(function (dataUrl) { return string.replace(urlAsRegex(url), ['$1', dataUrl, '$3'].join('')); }); function urlAsRegex(url) { return new self.window.RegExp(['(url\\([\'"]?)(', util.escape(url), ')([\'"]?\\))'].join(''), 'g'); } } function inlineAll(string, baseUrl, get) { if (nothingToInline()) return Promise.resolve(string); return Promise.resolve(string).then(readUrls).then(function (urls) { var done = Promise.resolve(string); urls.forEach(function (url) { done = done.then(function (string) { return inline(string, url, baseUrl, get); }); }); return done; }); function nothingToInline() { return !shouldProcess(string); } } } function newFontFaces() { return { resolveAll: resolveAll, impl: { readAll: readAll } }; function resolveAll() { return readAll(self.document).then(function (webFonts) { return Promise.all(webFonts.map(function (webFont) { return webFont.resolve(); })); }).then(function (cssStrings) { return cssStrings.join('\n'); }); } function readAll() { return Promise.resolve(util.asArray(self.document.styleSheets)).then(getCssRules).then(selectWebFontRules).then(function (rules) { return rules.map(newWebFont); }); function selectWebFontRules(cssRules) { return cssRules.filter(function (rule) { return rule.type === CSSRule.FONT_FACE_RULE; }).filter(function (rule) { return inliner.shouldProcess(rule.style.getPropertyValue('src')); }); } function getCssRules(styleSheets) { var cssRules = []; styleSheets.forEach(function (sheet) { try { util.asArray(sheet.cssRules || []).forEach(cssRules.push.bind(cssRules)); } catch (e) { console.log('Error while reading CSS rules from ' + sheet.href, e.toString()); } }); return cssRules; } function newWebFont(webFontRule) { return { resolve: function resolve() { var baseUrl = (webFontRule.parentStyleSheet || {}).href; return inliner.inlineAll(webFontRule.cssText, baseUrl); }, src: function src() { return webFontRule.style.getPropertyValue('src'); } }; } } } function newImages() { return { inlineAll: inlineAll, impl: { newImage: newImage } }; function newImage(element) { return { inline: inline }; function inline(get) { if (util.isDataUrl(element.src)) return Promise.resolve(); return Promise.resolve(element.src).then(get || util.getAndEncode).then(function (data) { return util.dataAsUrl(data, util.mimeType(element.src)); }).then(function (dataUrl) { return new Promise(function (resolve, reject) { element.onload = resolve; element.onerror = reject; element.src = dataUrl; }); }); } } function inlineAll(node) { if (!util.isElement(node)) return Promise.resolve(node); return inlineBackground(node).then(function () { if (util.isImage(node)) return newImage(node).inline();else return Promise.all(util.asArray(node.childNodes).map(function (child) { return inlineAll(child); })); }); function inlineBackground(node) { var background = node.style.getPropertyValue('background'); if (!background) return Promise.resolve(node); return inliner.inlineAll(background).then(function (inlined) { node.style.setProperty('background', inlined, node.style.getPropertyPriority('background')); }).then(function () { return node; }); } } } }; exports.default = Dom2Image; /***/ }, /* 48 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Drag = function () { function Drag(wnd, doc, visualWorld) { _classCallCheck(this, Drag); this.wnd = wnd; this.doc = doc; this.visual = visualWorld; this.coords = new _libs.THREE.Vector2(); this.intersection = new _libs.THREE.Vector3(); this.raycaster = this.visual.raycaster; this.camera = this.visual.camera; this.plane = new _libs.THREE.Plane(); this.threes = []; this.selected = null; this.enabled = true; this.controlsState = this.visual.getControlsState(); this.element = this.visual.element; this.binds = { onMouseMove: this.onMouseMove.bind(this), onMouseDown: this.onMouseDown.bind(this), onMouseUp: this.onMouseUp.bind(this) }; (0, _libs.$)(this.element).on('mousemove', this.binds.onMouseMove); (0, _libs.$)(this.element).on('mousedown', this.binds.onMouseDown); (0, _libs.$)(this.doc).on('mouseup', this.binds.onMouseUp); } Drag.prototype.addThree = function addThree(three) { this.threes.push(three); }; Drag.prototype.removeThree = function removeThree(three) { var i = this.threes.indexOf(three); if (~i) { this.threes.splice(i, 1); } }; Drag.prototype.onPickCallback = function onPickCallback() { return true; }; Drag.prototype.onDragCallback = function onDragCallback() { return true; }; Drag.prototype.onReleaseCallback = function onReleaseCallback() {}; Drag.prototype.dispose = function dispose() { (0, _libs.$)(this.element).off('mousemove', this.binds.onMouseMove); (0, _libs.$)(this.element).off('mousedown', this.binds.onMouseDown); (0, _libs.$)(this.doc).off('mouseup', this.binds.onMouseUp); }; Drag.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { var jElement = (0, _libs.$)(this.element); var offset = jElement.offset(); this.coords.x = (e.pageX - offset.left) / jElement.width() * 2 - 1; this.coords.y = -((e.pageY - offset.top) / jElement.height()) * 2 + 1; return this.coords; }; Drag.prototype.onMouseDown = function onMouseDown(e) { if (!this.enabled) return; if (this.selected) this.onMouseUp(e); this.setCoordsFromEvent(e); this.raycaster.setFromCamera(this.coords, this.camera); var intersects = this.raycaster.intersectObjects(this.threes); if (intersects.length > 0) { var selected = intersects[0].object; if (!this.onPickCallback(intersects[0])) return; var v = intersects[0].point.clone(); this.distance = v.sub(this.raycaster.ray.origin).length();; this.controlsState = this.visual.getControlsState(); this.visual.setControlsState(false); this.plane.setFromNormalAndCoplanarPoint(this.visual.camera.getWorldDirection(this.plane.normal), intersects[0].point); //this.plane.setFromNormalAndCoplanarPoint(this.plane.normal.set(0,0,1), new THREE.Vector3(0,0,0)); this.selected = selected; } }; Drag.prototype.onMouseMove = function onMouseMove(e) { if (!this.enabled) return; e.preventDefault(); if (this.selected) { this.setCoordsFromEvent(e); this.raycaster.setFromCamera(this.coords, this.camera); if (this.raycaster.ray.intersectPlane(this.plane, this.intersection)) { if (!this.onDragCallback(this.intersection)) this.onMouseUp(e); } /**/ //this.intersection.copy(this.raycaster.ray.direction).normalize().multiplyScalar(this.distance).add(this.raycaster.ray.origin);/**/ //if(!this.onDragCallback(this.selected, this.intersection)) this.onMouseUp(e); } }; Drag.prototype.onMouseUp = function onMouseUp(e) { if (this.selected) { this.onReleaseCallback(); this.selected = null; this.visual.setControlsState(this.controlsState); } if (!this.enabled) return; e.preventDefault(); }; return Drag; }(); exports.default = Drag; /***/ }, /* 49 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } __webpack_require__(71)(_libs.$); var EventsToActions = function () { EventsToActions.getEventFlags = function getEventFlags(e) { return e.ctrlKey << 0 | e.shiftKey << 1 | e.altKey << 2; }; EventsToActions.getPosition = function getPosition(touches) { var x = void 0, y = void 0; if (touches.length === 2) { x = touches[1].pageX - touches[0].pageX; y = touches[1].pageY - touches[0].pageY; y = -Math.sqrt(x * x + y * y); x = 0; } else { x = touches[0].pageX; y = touches[0].pageY; } return { x: x, y: y }; }; function EventsToActions(element, actions) { _classCallCheck(this, EventsToActions); this.actions = actions || {}; this.element = element; this.doc = element[0].ownerDocument; this.wnd = this.doc.defaultView; this.enabled = true; this.binds = { contextMenu: this.contextMenu.bind(this), mouseDown: this.mouseDown.bind(this), mouseMove: this.mouseMove.bind(this), mouseUp: this.mouseUp.bind(this), mouseWheel: this.mouseWheel.bind(this), mouseMoveDoc: this.mouseMoveDoc.bind(this), mouseUpDoc: this.mouseUpDoc.bind(this), click: this.click.bind(this), dblclick: this.dblclick.bind(this), touchStart: this.touchStart.bind(this), touchMove: this.touchMove.bind(this), touchEnd: this.touchEnd.bind(this), keyDown: this.keyDown.bind(this), keyPress: this.keyPress.bind(this), keyUp: this.keyUp.bind(this) }; this.element.on('contextmenu', this.binds.contextMenu); this.element.on('mousedown', this.binds.mouseDown); this.element.on('mousemove', this.binds.mouseMove); this.element.on('mouseup', this.binds.mouseUp); this.element.on('mousewheel', this.binds.mouseWheel); (0, _libs.$)(this.doc).on('mousemove', this.binds.mouseMoveDoc); (0, _libs.$)(this.doc).on('mouseup', this.binds.mouseUpDoc); this.element.on('click', this.binds.click); this.element.on('dblclick', this.binds.dblclick); this.element.on('touchstart', this.binds.touchStart); this.element.on('touchmove', this.binds.touchMove); this.element.on('touchend', this.binds.touchEnd); (0, _libs.$)(this.wnd).on('keydown', this.binds.keyDown); (0, _libs.$)(this.wnd).on('keypress', this.binds.keyPress); (0, _libs.$)(this.wnd).on('keyup', this.binds.keyUp); } EventsToActions.prototype.addAction = function addAction(action, type, code, flags) { type = type.toLowerCase(); if (!this.actions[type]) { this.actions[type] = {}; } if (!this.actions[type][code]) { this.actions[type][code] = {}; } if (!this.actions[type][code][flags]) { this.actions[type][code][flags] = []; } this.actions[type][code][flags].push(action); }; EventsToActions.prototype.getActions = function getActions(type, code, flags) { return ((this.actions[type] || {})[code] || {})[flags] || []; }; EventsToActions.prototype.fireActions = function fireActions(actions, e, data) { for (var _iterator = actions, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var action = _ref; action(e, data); } }; EventsToActions.prototype.contextMenu = function contextMenu(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('contextmenu', e.button, flags), e); } }; EventsToActions.prototype.mouseDown = function mouseDown(e) { if (this.picked) { this.mouseUpDoc(); } if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('mousedown', e.button, flags), e); this.picked = { x: e.pageX, y: e.pageY, actions: this.getActions('mousedrag', e.button, flags) }; this.fireActions(this.picked.actions, e, { state: 'start' }); } }; EventsToActions.prototype.mouseMove = function mouseMove(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('mousemove', e.button, flags), e); } }; EventsToActions.prototype.mouseMoveDoc = function mouseMoveDoc(e) { if (this.enabled && this.picked) { this.fireActions(this.picked.actions, e, { state: 'move', dx: e.pageX - this.picked.x, dy: e.pageY - this.picked.y }); this.picked = { x: e.pageX, y: e.pageY, actions: this.picked.actions }; } }; EventsToActions.prototype.mouseUp = function mouseUp(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('mouseup', e.button, flags), e); } }; EventsToActions.prototype.mouseUpDoc = function mouseUpDoc(e) { if (this.picked) { this.fireActions(this.picked.actions, e, { state: 'end' }); delete this.picked; } }; EventsToActions.prototype.mouseWheel = function mouseWheel(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('mousewheel', 0, flags), e); } }; EventsToActions.prototype.clicks = function clicks(e, type) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions(type, e.button, flags), e); } }; EventsToActions.prototype.click = function click(e) { this.clicks(e, 'click'); }; EventsToActions.prototype.dblclick = function dblclick(e) { this.clicks(e, 'dblclick'); }; EventsToActions.prototype.touchPick = function touchPick(e, flags, touches) { this.touchPicked = _extends({}, EventsToActions.getPosition(touches), { actions: this.getActions('touchdrag', touches.length, flags), code: touches.length, flags: flags }); this.fireActions(this.touchPicked.actions, e, { state: 'start' }); }; EventsToActions.prototype.touchStart = function touchStart(e) { if (this.touchPicked) { this.touchEnd(e); } if (this.enabled) { var flags = EventsToActions.getEventFlags(e), touches = e.touches || e.originalEvent.touches; this.fireActions(this.getActions('touchstart', touches.length, flags), e); this.touchPick(e, flags, touches); } }; EventsToActions.prototype.touchMove = function touchMove(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e), touches = e.touches || e.originalEvent.touches; this.fireActions(this.getActions('touchmove', touches.length, flags), e); if (this.touchPicked) { if (this.touchPicked.code === touches.length && this.touchPicked.flags === flags) { var pos = EventsToActions.getPosition(touches); this.fireActions(this.touchPicked.actions, e, { state: 'move', dx: pos.x - this.touchPicked.x, dy: pos.y - this.touchPicked.y }); this.touchPicked = _extends({}, this.touchPicked, pos); } else { this.touchEnd(e); this.touchPick(e, flags, touches); } } } }; EventsToActions.prototype.touchEnd = function touchEnd(e) { if (this.touchPicked) { this.fireActions(this.touchPicked.actions, e, { state: 'end' }); delete this.touchPicked; } }; EventsToActions.prototype.key = function key(e, type) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions(type, e.keyCode, flags), e); } }; EventsToActions.prototype.keyDown = function keyDown(e) { this.key(e, 'keydown'); }; EventsToActions.prototype.keyPress = function keyPress(e) { this.key(e, 'keypress'); }; EventsToActions.prototype.keyUp = function keyUp(e) { this.key(e, 'keyup'); }; EventsToActions.prototype.dispose = function dispose() { this.element.off('contextmenu', this.binds.contextMenu); this.element.off('mousedown', this.binds.mouseDown); this.element.off('mousemove', this.binds.mouseMove); this.element.off('mouseup', this.binds.mouseUp); this.element.off('mousewheel', this.binds.mouseWheel); (0, _libs.$)(this.doc).off('mousemove', this.binds.mouseMoveDoc); (0, _libs.$)(this.doc).off('mouseup', this.binds.mouseUpDoc); this.element.off('click', this.binds.click); this.element.off('dblclick', this.binds.dblclick); this.element.off('touchstart', this.binds.touchStart); this.element.off('touchmove', this.binds.touchMove); this.element.off('touchend', this.binds.touchEnd); (0, _libs.$)(this.wnd).off('keydown', this.binds.keyDown); (0, _libs.$)(this.wnd).off('keypress', this.binds.keyPress); (0, _libs.$)(this.wnd).off('keyup', this.binds.keyUp); }; return EventsToActions; }(); EventsToActions.modKeys = { Ctrl: 1, Shift: 2, Alt: 4 }; EventsToActions.mouseButtons = { Left: 0, Middle: 1, Right: 2 }; exports.default = EventsToActions; /***/ }, /* 50 */ /***/function (module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var FullScreen = function () { function FullScreen() { _classCallCheck(this, FullScreen); } FullScreen.available = function available() { return FullScreen._hasWebkitFullScreen || FullScreen._hasMozFullScreen || FullScreen._hasMsFullscreen; }; FullScreen.activated = function activated() { if (FullScreen._hasWebkitFullScreen) { return document.webkitIsFullScreen; } else if (FullScreen._hasMozFullScreen) { return document.mozFullScreen; } else if (FullScreen._hasMsFullscreen) { return !!document.msFullscreenElement; } else { console.assert(false); } }; FullScreen.addEventListener = function addEventListener(element, handler) { if (element.addEventListener) { element.addEventListener('webkitfullscreenchange', handler, false); element.addEventListener('mozfullscreenchange', handler, false); element.addEventListener('fullscreenchange', handler, false); element.addEventListener('MSFullscreenChange', handler, false); } }; FullScreen.removeEventListener = function removeEventListener(element, handler) { if (element.removeEventListener) { element.removeEventListener('webkitfullscreenchange', handler, false); element.removeEventListener('mozfullscreenchange', handler, false); element.removeEventListener('fullscreenchange', handler, false); element.removeEventListener('MSFullscreenChange', handler, false); } }; FullScreen.request = function request(element) { element = element || document.body; if (FullScreen._hasWebkitFullScreen) { element.webkitRequestFullScreen(); } else if (FullScreen._hasMozFullScreen) { element.mozRequestFullScreen(); } else if (FullScreen._hasMsFullscreen) { element.msRequestFullscreen(); } else { console.assert(false); } }; FullScreen.cancel = function cancel() { if (FullScreen._hasWebkitFullScreen) { document.webkitCancelFullScreen(); } else if (FullScreen._hasMozFullScreen) { document.mozCancelFullScreen(); } else if (FullScreen._hasMsFullscreen) { document.msExitFullscreen(); } else { console.assert(false); } }; return FullScreen; }(); FullScreen._hasWebkitFullScreen = !!document.webkitCancelFullScreen; FullScreen._hasMozFullScreen = !!document.mozCancelFullScreen; FullScreen._hasMsFullscreen = !!document.documentElement.msRequestFullscreen; exports.default = FullScreen; /***/ }, /* 51 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _ImageBase2 = __webpack_require__(5); var _ImageBase3 = _interopRequireDefault(_ImageBase2); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); var _Dom2Image = __webpack_require__(47); var _Dom2Image2 = _interopRequireDefault(_Dom2Image); var _DocMouseSimulator = __webpack_require__(46); var _DocMouseSimulator2 = _interopRequireDefault(_DocMouseSimulator); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var InteractiveImage = function (_ImageBase) { _inherits(InteractiveImage, _ImageBase); function InteractiveImage(context, width, height, color, src, cache, injector) { _classCallCheck(this, InteractiveImage); var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); _this.iId = 'i' + _BaseMathUtils2.default.getUnique(); var jFrame = (0, _libs.$)(''); (0, _libs.$)(_this.doc.body).append(jFrame); _this.frame = jFrame[0]; _this.binds = {}; if (injector) { injector(_this.frame.contentWindow); } if (_this.doc.implementation.hasFeature('www.http://w3.org/TR/SVG11/feature#Extensibility', '1.1')) { // svg foreignObject renderer _this.image = new Image(); _this.binds.imageLoad = function () { _this.renderImage(_this.image); _this.finishRender(); }; (0, _libs.$)(_this.image).on('load', _this.binds.imageLoad); _this.svgRender = new _Dom2Image2.default(_this.frame.contentWindow, _this.frame.contentDocument, cache); } // otherwise - html2canvas _this.binds.frameLoad = function () { if (~_this.frame.contentDocument.title.indexOf('404')) { _this.startRender = function () { _this.renderNotFoundPage(); _this.finishRender(); }; _this.finishLoad(); } else { setTimeout(function () { if (_this.frame) { _this.width = (0, _libs.$)(_this.frame.contentDocument.body).width(); _this.height = (0, _libs.$)(_this.frame.contentDocument.body).height(); jFrame.css('width', _this.width + 'px').css('height', _this.height + 'px'); jFrame.offset({ left: -_this.width - 100, top: 0 }); if (_this.svgRender) { _this.simulator = new _DocMouseSimulator2.default(jFrame, _this.frame.contentDocument.body, _this.element); _this.simulator.addDocChangeClb(_this.finishLoad.bind(_this)); } _this.startRender = function () { _this.render(); }; _this.finishLoad(); } }, 500); } }; (0, _libs.$)(_this.frame.contentWindow).on('load', _this.binds.frameLoad); return _this; } InteractiveImage.prototype.getSimulatedDoc = function getSimulatedDoc() { return this.frame.contentDocument; }; InteractiveImage.prototype.render = function render() { var _this2 = this; if (this.svgRender) { this.svgRender.toSvg(this.simulator.element, { height: this.height + 'px', width: this.width + 'px' }).then(function (dataUrl) { _this2.image.src = dataUrl; }).catch(function (error) { console.error('Dom2Image: ', error); _this2.renderBlankPage(); _this2.finishRender(); }); } else { (0, _libs.html2canvas)(this.frame.contentDocument.body, { timeout: 30000 }).then(function (canvas) { _this2.renderImage(canvas); _this2.finishRender(); }); } }; InteractiveImage.prototype.dispose = function dispose() { (0, _libs.$)(this.image).off('load', this.binds.imageLoad); (0, _libs.$)(this.frame.contentWindow).off('load', this.binds.frameLoad); (0, _libs.$)(this.doc.body).find('#' + this.iId).remove(); if (this.image) { this.image.src = ''; delete this.image; } this.frame.src = ''; delete this.frame; _ImageBase.prototype.dispose.call(this); }; InteractiveImage.prototype.simulate = function simulate(e, doc, x, y) { if (this.simulator) { this.simulator.simulate(e, doc, x, y); } }; return InteractiveImage; }(_ImageBase3.default); exports.default = InteractiveImage; /***/ }, /* 52 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _GraphUtils = __webpack_require__(7); var _GraphUtils2 = _interopRequireDefault(_GraphUtils); var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var LoadingAnimation = function () { LoadingAnimation.prototype.dy = function dy(t, y) { var w = y[0], a = y[1]; return [-this.g * Math.cos(a), w]; }; LoadingAnimation.prototype.integrate = function integrate(T) { var t = 0, dt = this.p.dt, os = this.os; while (t < T) { if (t + dt > T) { dt = T - t; } os = _MathUtils2.default.rk4(this.dy.bind({ g: this.p.g }), 0, dt, os); t += dt; } return os; }; LoadingAnimation.prototype.calcTimeTo = function calcTimeTo(target) { var t = 0, dt = this.p.dt, os = this.os; while (Math.abs(os[1] - target) > 1e-4) { var nos = _MathUtils2.default.rk4(this.dy.bind({ g: this.p.g }), 0, dt, os); if (nos[0] < 0 && nos[1] < target || nos[0] > 0 && nos[1] > target) { dt /= 2; } else { os = nos; t += dt; } } return t; }; LoadingAnimation.prototype.update = function update(T) { this.os = this.integrate(T); this.t += T; if (this.t >= this.p.updateInterval) { this.t = 0; var r = 0.06 * Math.min(this.c.width, this.c.height), a = this.os[1], x0 = 0.5 * this.c.width, y0 = 0.5 * this.c.height, ctx = this.ctx; ctx.clearRect(0, 0, this.c.width, this.c.height); ctx.beginPath(); ctx.fillStyle = _GraphUtils2.default.color2Rgba(this.p.color, 1); ctx.rect(0, 0, this.c.width, this.c.height); ctx.fill(); ctx.beginPath(); ctx.shadowBlur = 50; ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 0.9), Math.abs(this.os[0] / 6.36)); ctx.shadowColor = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 1), 0.9); ctx.shadowOffsetX = 0; ctx.shadowOffsetY = 0; ctx.font = 'bold ' + Math.round(0.25 * r) + 'px Arial'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillText((0, _libs.tr)('Loading...'), x0, y0); var ps = 10, da = 2 * Math.PI / ps; //2.5*_r/r ctx.shadowColor = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 1), 0.7); for (var i = 0, _a = a, _r = 0.2 * r; i < ps; ++i, _r *= 0.9, _a += da) { ctx.beginPath(); ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, (ps - i) / ps), 0.7 * (ps - i) / ps); var cx = x0 + r * Math.cos(_a), cy = y0 - r * Math.sin(_a), nx = x0 + r * Math.cos(_a + da), ny = y0 - r * Math.sin(_a + da); ctx.shadowOffsetX = 0.2 * (nx - cx); ctx.shadowOffsetY = 0.2 * (ny - cy); ctx.arc(cx, cy, _r, 0, Math.PI * 2, 1); ctx.fill(); } if (this.onChange) { this.onChange(this.c, this.p.color); } } }; LoadingAnimation.prototype.getImage = function getImage() { return this.c; }; LoadingAnimation.prototype.dispose = function dispose() { this.c.width = 0; this.c.height = 0; delete this.ctx; delete this.c; }; LoadingAnimation.prototype.createSprite = function createSprite(n) { var c = (0, _libs.$)('')[0], ctx = c.getContext('2d'), t = this.calcTimeTo(this.os[1] + Math.sign(this.os[0]) * 2 * Math.PI), dt = t / (n + 1); var updateInterval = this.p.updateInterval; this.p.updateInterval = 0; for (var i = 0; i < n; ++i) { this.update(dt); ctx.drawImage(this.c, i * this.c.width, 0); } this.p.updateInterval = updateInterval; return c; }; function LoadingAnimation(width, height, color) { _classCallCheck(this, LoadingAnimation); var jC = (0, _libs.$)(''); this.c = jC[0]; this.p = { g: 9.8, dt: 1 / 60, color: color, updateInterval: 0.25 }; this.ctx = this.c.getContext('2d'); this.os = [-2, Math.PI / 2]; this.t = this.p.updateInterval; } return LoadingAnimation; }(); exports.default = LoadingAnimation; /***/ }, /* 53 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var LoadingController = function () { function LoadingController(view) { var showProgress = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var loadingMsg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; _classCallCheck(this, LoadingController); this.view = view; this.progress = 0; this.showProgress = showProgress; this.getLoadingMsg = loadingMsg || LoadingController.defaultLoadingMsg; this.updateView(); } LoadingController.defaultLoadingMsg = function defaultLoadingMsg(progress) { return ['Please wait... the Application is Loading: ', progress, '%'].join(''); }; LoadingController.prototype.dispose = function dispose() { this.showProgress = false; this.updateView(); delete this.view; }; LoadingController.prototype.setProgress = function setProgress(v) { this.progress = v; this.updateView(); }; LoadingController.prototype.updateView = function updateView() { if (this.view) { this.view.setState('widLoadingProgress', { enable: true, visible: this.showProgress, active: false }); this.view.setState('txtLoadingProgress', { value: this.getLoadingMsg(this.progress), visible: true }); for (var _iterator = this.view.getLinks(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var name = _ref; this.view.setState(name, { enable: false, visible: true, active: false }); } this.view.setState('inpPages', { visible: true, value: '' }); this.view.setState('inpPage', { visible: true, enable: false, value: '' }); } }; return LoadingController; }(); exports.default = LoadingController; /***/ }, /* 54 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _EventConverter2 = __webpack_require__(6); var _EventConverter3 = _interopRequireDefault(_EventConverter2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var MouseEventConverter = function (_EventConverter) { _inherits(MouseEventConverter, _EventConverter); function MouseEventConverter(wnd, doc, element) { _classCallCheck(this, MouseEventConverter); var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); _this.element = element; _this.binds = { convert: _this.convert.bind(_this) }; (0, _libs.$)(_this.element).on('mousemove mousedown mouseover mouseout click', _this.binds.convert); (0, _libs.$)(_this.doc).on('mouseup', _this.binds.convert); return _this; } MouseEventConverter.prototype.dispose = function dispose() { (0, _libs.$)(this.element).off('mousemove mousedown mouseover mouseout click', this.binds.convert); (0, _libs.$)(this.doc).off('mouseup', this.binds.convert); }; return MouseEventConverter; }(_EventConverter3.default); exports.default = MouseEventConverter; /***/ }, /* 55 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(0); var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Object3DWatcher = function () { function Object3DWatcher(visual, boundBoxClb) { var testScale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.testScale; _classCallCheck(this, Object3DWatcher); this.visual = visual; this.boundBoxClb = boundBoxClb; this.testScale = testScale; this.camera = visual.camera; this.element = this.visual.element; this.elementSize = { w: 1, h: 1 }; this.devicePixelRatio = this.visual.wnd.devicePixelRatio || 1; this.orbit = visual.getOrbit(); this.scale = 1; this.eps = 1e-4; this.v = new _libs.THREE.Vector3(); this.dv = new _libs.THREE.Vector2(); this.enabled = false; visual.addRenderCallback(this.update.bind(this)); this.os = { vx: 0, vy: 0, x: 0, y: 0 }; this.orbit.update(); this.camera.updateMatrixWorld(); var box = this.computeClientBoundBox(), k = 1.11; this.movePan({ x: -k * box.mid.x, y: -k * box.mid.y }); } Object3DWatcher.prototype.movePan = function movePan(dv) { this.orbit.pan(dv.x * this.visual.width(), -dv.y * this.visual.height()); }; Object3DWatcher.prototype.vToCamera = function vToCamera(v) { v.project(this.camera); return { x: 0.5 * v.x, y: 0.5 * v.y }; }; Object3DWatcher.prototype.computeClientBoundBox = function computeClientBoundBox() { var box = this.boundBoxClb(), xs = [box.min.x, box.max.x], ys = [0, 0], zs = [box.min.z, box.max.z]; var ps = [], res = { max: {}, min: {} }; for (var _iterator = xs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var x = _ref; for (var _iterator2 = ys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var y = _ref2; for (var _iterator3 = zs, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var z = _ref3; ps.push(this.vToCamera(this.v.set(x, y, z))); } } } ps.sort(function (p1, p2) { return p1.x - p2.x; }); res.min.x = ps[0].x; res.max.x = ps[ps.length - 1].x; ps.sort(function (p1, p2) { return p1.y - p2.y; }); res.min.y = ps[0].y; res.max.y = ps[ps.length - 1].y; res.width = res.max.x - res.min.x; res.height = res.max.y - res.min.y; res.mid = { x: 0.5 * (res.max.x + res.min.x), y: 0.5 * (res.max.y + res.min.y) }; return res; }; Object3DWatcher.prototype.setObject = function setObject(boundBoxClb) { this.boundBoxClb = boundBoxClb; }; Object3DWatcher.prototype.testScale = function testScale() { return true; }; Object3DWatcher.prototype.computeCorr = function computeCorr(K, min, max) { var corr = 0; if (K < 1) { if (min > -0.5) { corr = -0.5 - min; } else if (max < 0.5) { corr = 0.5 - max; } } else { if (min < -0.5) { corr = -0.5 - min; } else if (max > 0.5) { corr = 0.5 - max; } } return corr; }; Object3DWatcher.prototype.getScale = function getScale() { var box = this.computeClientBoundBox(), Kx = this.elementSize.w / box.width, Ky = this.elementSize.h / box.height; return 1 / Math.min(Kx, Ky); }; Object3DWatcher.prototype.centerView = function centerView(T) { var _this = this; var box = this.computeClientBoundBox(), Kx = this.elementSize.w / box.width, Ky = this.elementSize.h / box.height, K = Math.min(Kx, Ky); if (this.testScale() && Math.abs(1 / K - this.scale) > this.eps) { var scale = 1 / K + 0.2 * (this.scale - 1 / K); this.orbit.setScale(this.orbit.getScale() / (K * scale)); this.orbit.update(); this.camera.updateMatrixWorld(); box = this.computeClientBoundBox(); Kx = this.elementSize.w / box.width; Ky = this.elementSize.h / box.height; K = Math.min(Kx, Ky); } var dv = this.dv; if (K > 1 - this.eps) { dv.set(-box.mid.x, -box.mid.y); } else { dv.set(this.computeCorr(Kx, box.min.x, box.max.x), this.computeCorr(Ky, box.min.y, box.max.y)); } if (Math.sqrt(this.os.vx * this.os.vx + this.os.vy * this.os.vy) > 0.003 || dv.length() > 0.003) { var dt = 1 / 60, t = 0, os = _extends({}, this.os, { x: 0, y: 0 }); os.tf = function (vx, vy, x, y) { return { x: 75 * (dv.x - x) / Math.pow(_this.devicePixelRatio, 1.0), y: 75 * (dv.y - y) / Math.pow(_this.devicePixelRatio, 1.0) }; }; while (t < T) { if (t + dt > T) { dt = T - t; } os = this.integrate(os, dt); t += dt; } this.movePan(os); this.os = os; } }; Object3DWatcher.prototype.integrate = function integrate(os, dt) { var _MathUtils$rk = _MathUtils2.default.rk4(this.dy.bind(os), 0, dt, [os.vx, os.vy, os.x, os.y]), vx = _MathUtils$rk[0], vy = _MathUtils$rk[1], x = _MathUtils$rk[2], y = _MathUtils$rk[3]; return _extends({}, os, { vx: vx, vy: vy, x: x, y: y }); }; Object3DWatcher.prototype.dy = function dy(t, Y) { var vx = Y[0], vy = Y[1], x = Y[2], y = Y[3], vd = 15, tf = this.tf(vx, vy, x, y); return [tf.x - vd * vx, tf.y - vd * vy, vx, vy]; }; Object3DWatcher.prototype.update = function update(dt) { if (this.enabled && this.boundBoxClb) { this.centerView(dt); } }; return Object3DWatcher; }(); exports.default = Object3DWatcher; /***/ }, /* 56 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Orbit = function (_THREE$EventDispatche) { _inherits(Orbit, _THREE$EventDispatche); function Orbit(object, domElement) { _classCallCheck(this, Orbit); var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); _this.object = object; _this.domElement = domElement || document.body; // Set to false to disable this control _this.enabled = true; // "target" sets the location of focus, where the object orbits around _this.target = new _libs.THREE.Vector3(); // How far you can dolly in and out(PerspectiveCamera only) _this.minDistance = 0; _this.maxDistance = Infinity; // How far you can zoom in and out(OrthographicCamera only) _this.minZoom = 0; _this.maxZoom = Infinity; // How far you can orbit vertically, upper and lower limits. // Range is 0 to Math.PI radians. _this.minPolarAngle = 0; // radians _this.maxPolarAngle = Math.PI; // radians // How far you can orbit horizontally, upper and lower limits. // If set, must be a sub-interval of the interval [-Math.PI, Math.PI ]. _this.minAzimuthAngle = -Infinity; // radians _this.maxAzimuthAngle = Infinity; // radians // Set to true to enable damping (inertia) // If damping is enabled, you must call controls.update() in your animation loop _this.enableDamping = false; _this.dampingFactor = 0.25; // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. // Set to false to disable zooming _this.enableZoom = true; _this.zoomSpeed = 1.0; // Set to false to disable rotating _this.enableRotate = true; _this.rotateSpeed = 1.0; // Set to false to disable panning _this.enablePan = true; // Set to true to automatically rotate around the target // If auto-rotate is enabled, you must call controls.update() in your animation loop _this.autoRotate = false; _this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 // for reset _this.target0 = _this.target.clone(); _this.position0 = _this.object.position.clone(); _this.zoom0 = _this.object.zoom; // // public methods // _this.getPolarAngle = function () { return spherical.phi; }; _this.getAzimuthalAngle = function () { return spherical.theta; }; _this.reset = function () { scope.target.copy(scope.target0); scope.object.position.copy(scope.position0); scope.object.zoom = scope.zoom0; scope.object.updateProjectionMatrix(); scope.dispatchEvent(changeEvent); scope.update(); }; _this.zoomOut = function () { var speed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.zoomSpeed; var _speed = this.zoomSpeed; this.zoomSpeed = speed; dollyIn(getZoomScale()); this.zoomSpeed = _speed; }; _this.zoomIn = function () { var speed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.zoomSpeed; var _speed = this.zoomSpeed; this.zoomSpeed = speed; dollyOut(getZoomScale()); this.zoomSpeed = _speed; }; _this.getScale = function () { return scale; }; _this.setScale = function (newScale) { scale = newScale; }; // this method is exposed, but perhaps it would be better if we can make it private... _this.update = function () { var offset = new _libs.THREE.Vector3(); // so camera.up is the orbit axis var quat = new _libs.THREE.Quaternion().setFromUnitVectors(object.up, new _libs.THREE.Vector3(0, 1, 0)); var quatInverse = quat.clone().inverse(); var lastPosition = new _libs.THREE.Vector3(); var lastQuaternion = new _libs.THREE.Quaternion(); return function update() { var position = scope.object.position; offset.copy(position).sub(scope.target); // rotate offset to "y-axis-is-up" space offset.applyQuaternion(quat); // angle from z-axis around y-axis spherical.setFromVector3(offset); if (scope.autoRotate) { rotateLeft(getAutoRotationAngle()); } spherical.theta += sphericalDelta.theta; spherical.phi += sphericalDelta.phi; // restrict theta to be between desired limits spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta)); // restrict phi to be between desired limits spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); spherical.makeSafe(); spherical.radius *= scale; // restrict radius to be between desired limits spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius)); // move target to panned location scope.target.add(panOffset); offset.setFromSpherical(spherical); // rotate offset back to "camera-up-vector-is-up" space offset.applyQuaternion(quatInverse); position.copy(scope.target).add(offset); scope.object.lookAt(scope.target); if (scope.enableDamping === true) { sphericalDelta.theta *= 1 - scope.dampingFactor; sphericalDelta.phi *= 1 - scope.dampingFactor; } else { sphericalDelta.set(0, 0, 0); } scale = 1; panOffset.set(0, 0, 0); // update condition is: // min(camera displacement, camera rotation in radians)^2 > EPS // using small-angle approximation cos(x/2) = 1-x^2 / 8 if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { scope.dispatchEvent(changeEvent); lastPosition.copy(scope.object.position); lastQuaternion.copy(scope.object.quaternion); zoomChanged = false; return true; } return false; }; }(); _this.dispose = function () {}; // // internals // var scope = _this; var changeEvent = { type: 'change' }; var EPS = 1e-6; // current position in spherical coordinates var spherical = new _libs.THREE.Spherical(); var sphericalDelta = new _libs.THREE.Spherical(); var scale = 1; var panOffset = new _libs.THREE.Vector3(); var zoomChanged = false; function getAutoRotationAngle() { return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; } function getZoomScale() { return Math.pow(0.95, scope.zoomSpeed); } function rotateLeft(angle) { sphericalDelta.theta -= angle; } function rotateUp(angle) { sphericalDelta.phi -= angle; } var panLeft = function () { var v = new _libs.THREE.Vector3(); return function panLeft(distance, objectMatrix) { v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix v.multiplyScalar(-distance); panOffset.add(v); }; }(); var panUp = function () { var v = new _libs.THREE.Vector3(); return function panUp(distance, objectMatrix) { v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix v.multiplyScalar(distance); panOffset.add(v); }; }(); // deltaX and deltaY are in pixels; right and down are positive scope.pan = function () { var offset = new _libs.THREE.Vector3(); return function pan(deltaX, deltaY) { var element = scope.domElement; if (scope.object instanceof _libs.THREE.PerspectiveCamera) { // perspective var position = scope.object.position; offset.copy(position).sub(scope.target); var targetDistance = offset.length(); // half of the fov is center to top of screen targetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0); // we actually don't use screenWidth, since perspective camera is fixed to screen height panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); } else if (scope.object instanceof _libs.THREE.OrthographicCamera) { // orthographic panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix); panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix); } else { // camera neither orthographic nor perspective console.warn('WARNING: OrbitControls.js encountered an unknown camera type-pan disabled.'); scope.enablePan = false; } }; }(); function dollyIn(dollyScale) { if (scope.object instanceof _libs.THREE.PerspectiveCamera) { scale /= dollyScale; } else if (scope.object instanceof _libs.THREE.OrthographicCamera) { scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); scope.object.updateProjectionMatrix(); zoomChanged = true; } else { console.warn('WARNING: OrbitControls.js encountered an unknown camera type-dolly/zoom disabled.'); scope.enableZoom = false; } } function dollyOut(dollyScale) { if (scope.object instanceof _libs.THREE.PerspectiveCamera) { scale *= dollyScale; } else if (scope.object instanceof _libs.THREE.OrthographicCamera) { scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); scope.object.updateProjectionMatrix(); zoomChanged = true; } else { console.warn('WARNING: OrbitControls.js encountered an unknown camera type-dolly/zoom disabled.'); scope.enableZoom = false; } } /* Actions */ function rotate(event, data) { if (scope.enabled && scope.enableRotate && data.state === 'move') { var element = scope.domElement; // rotating across whole screen goes 360 degrees around rotateLeft(2 * Math.PI * data.dx / element.clientWidth * scope.rotateSpeed); // rotating up and down along whole screen attempts to go 360, but limited to 180 rotateUp(2 * Math.PI * data.dy / element.clientHeight * scope.rotateSpeed); scope.update(); } } function pan(event, data) { if (scope.enabled && scope.enablePan && data.state === 'move') { scope.pan(data.dx, data.dy); scope.update(); } } function offsetDolly(event, data) { if (scope.enabled && scope.enableZoom && data.state === 'move') { if (data.dy > 0) { dollyIn(getZoomScale()); } else if (data.dy < 0) { dollyOut(getZoomScale()); } scope.update(); } } function wheelDolly(event) { if (scope.enabled && scope.enableZoom) { if (event.deltaY > 0) { dollyOut(getZoomScale()); } else if (event.deltaY < 0) { dollyIn(getZoomScale()); } scope.update(); } } _this.actions = { rotate: rotate, pan: pan, offsetDolly: offsetDolly, wheelDolly: wheelDolly }; // force an update at start _this.update(); return _this; } return Orbit; }(_libs.THREE.EventDispatcher); exports.default = Orbit; /***/ }, /* 57 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _ImageBase2 = __webpack_require__(5); var _ImageBase3 = _interopRequireDefault(_ImageBase2); var _Pdf = __webpack_require__(18); var _Pdf2 = _interopRequireDefault(_Pdf); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); var _CustomEventConverter = __webpack_require__(16); var _CustomEventConverter2 = _interopRequireDefault(_CustomEventConverter); var _PolyTarget = __webpack_require__(69); var _PolyTarget2 = _interopRequireDefault(_PolyTarget); var _Finder = __webpack_require__(17); var _Finder2 = _interopRequireDefault(_Finder); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PdfImage = function (_ImageBase) { _inherits(PdfImage, _ImageBase); function PdfImage(context, width, height, color, pdf, n) { _classCallCheck(this, PdfImage); var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); _this.query = ''; _this.n = n; _this.pdf = pdf; _this.v = { x: 0, y: 0, z: 0, set: function set(x, y, z) { this.x = x;this.y = y;this.z = z; return this; }, transform: function transform(m) { var x = m.m[0][0] * this.x + m.m[1][0] * this.y + m.m[2][0] * this.z, y = m.m[0][1] * this.x + m.m[1][1] * this.y + m.m[2][1] * this.z, z = m.m[0][2] * this.x + m.m[0][2] * this.y + m.m[2][0] * this.z; this.x = x; this.y = y; this.z = z; return this; } }; _this.m = { m: [[1, 0, 0], [0, 1, 0], [0, 0, 1]], set: function set(m00, m01, m02, m10, m11, m12, m20, m21, m22) { this.m = [[m00, m01, m02], [m10, m11, m12], [m20, m21, m22]]; return this; } }; _this.startRender = function () { _this.pdf.getHandler(_this.render.bind(_this)); }; Promise.resolve().then(function () { return _this.pdf.getHandler(_this.init.bind(_this)); }); return _this; } PdfImage.prototype.setQuery = function setQuery(query) { this.query = query.trim(); if (this.textContent) { this.setHits(this.textContent); // this.finishLoad(); } }; PdfImage.prototype.rectSize = function rectSize(r) { return { width: r[2] - r[0], height: r[3] - r[1] }; }; PdfImage.prototype.createPoly = function createPoly(m, p, s) { var poly = [], v = this.v; v.set(p.x, p.y, 1).transform(m); poly.push({ x: v.x, y: v.y }); v.set(p.x, p.y + s.height, 1).transform(m); poly.push({ x: v.x, y: v.y }); v.set(p.x + s.width, p.y + s.height, 1).transform(m); poly.push({ x: v.x, y: v.y }); v.set(p.x + s.width, p.y, 1).transform(m); poly.push({ x: v.x, y: v.y }); return poly; }; PdfImage.prototype.getSimulatedDoc = function getSimulatedDoc() { return this.page; }; PdfImage.prototype.simulate = function simulate(e, doc, x, y) { if (this.eventConverter) { this.eventConverter.convert(e, { doc: doc, x: x, y: y }); } }; PdfImage.prototype.setAnnotations = function setAnnotations(annos) { var _this2 = this; var t = this.viewport.transform, targets = []; this.m.set(t[0], t[1], 0, t[2], t[3], 0, t[4], t[5], 1); for (var _iterator = annos, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var anno = _ref; if (anno.subtype === 'Link') { var rect = anno.rect, aPos = { x: rect[0], y: rect[1] }, aSz = this.rectSize(rect); var _target = new _PolyTarget2.default(this.createPoly(this.m, aPos, aSz).map(function (p) { return { x: p.x / _this2.viewport.width, y: 1 - p.y / _this2.viewport.height }; })); _target.anno = anno; _target.callback = this.annoClb.bind(this); targets.push(_target); } } if (targets.length) { this.eventConverter = new _CustomEventConverter2.default(this.wnd, this.doc, _PolyTarget2.default.test, this.page); for (var _iterator2 = targets, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var target = _ref2; this.eventConverter.addCustom(target); } } }; PdfImage.prototype.setHits = function setHits(textContent) { this.textContent = textContent; if (this.query !== '') { this.finder = new _Finder2.default(textContent.items.map(function (item) { return item.str; }), this.query, { contexts: false }); } }; PdfImage.prototype.renderHits = function renderHits() { var _this3 = this; if (this.finder) { var view = this.page.view, testSz = (0, _libs.$)('
').appendTo('body'), textDiv = testSz[0], baseOffset = testSz.offset().left; for (var _iterator3 = this.finder.getHits(), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var hit = _ref3; var item = this.textContent.items[hit.index], t = PDFJS.Util.transform(this.viewport.transform, item.transform), style = this.textContent.styles[item.fontName], angle = Math.atan2(t[1], t[0]) + (style.vertical ? Math.PI / 2 : 0), fontHeight = Math.sqrt(t[2] * t[2] + t[3] * t[3]), fontAscent = style.ascent ? style.ascent * fontHeight : style.descent ? (1 + style.descent) * fontHeight : fontHeight; testSz.html(item.str.substr(0, hit.offset) + '' + item.str.substr(hit.offset, hit.length) + '' + item.str.substr(hit.offset + hit.length)); textDiv.style.fontSize = fontHeight + 'px'; textDiv.style.fontFamily = style.fontFamily; var testSpan = testSz.find('span'), iwidth = style.vertical ? item.height * this.viewport.scale : item.width * this.viewport.scale, width = testSz.width(), relativeOffset = (testSpan.offset().left - baseOffset) / width; this.m.set(1, 0, 0, 0, 1, 0, t[4] + fontAscent * Math.sin(angle), t[5] - fontAscent * Math.cos(angle), 1); var poly = this.createPoly(this.m, { x: relativeOffset * iwidth, y: 0 }, { width: iwidth * testSpan.width() / width, height: testSpan.height() }); poly = poly.map(function (p) { return { x: p.x / _this3.viewport.width, y: 1 - p.y / _this3.viewport.height }; }); this.renderHit(poly); } testSz.remove(); } }; PdfImage.prototype.annoClb = function annoClb(e, data) { if (this.context.dispatchEvent) { this.context.dispatchEvent({ type: 'pdfAnnotation', event: e, annotation: data.target.anno }); } }; PdfImage.prototype.calcViewport = function calcViewport() { var scale = _BaseMathUtils2.default.calcScale(this.size.width, this.size.height, this.resW, this.resH); if (!this.viewport || Math.abs(this.viewport.scale - scale) > 1e-4) { this.viewport = this.page.getViewport(scale); if (this.type !== 'full') { if (this.type === 'right') { this.viewport.offsetX += 0.5 * this.viewport.width; this.viewport.transform[4] -= 0.5 * this.viewport.width; } this.viewport.width /= 2; } this.resW = this.width = this.viewport.width; this.resH = this.height = this.viewport.height; } }; PdfImage.prototype.init = function init() { var _this4 = this; this.type = this.pdf.getPageType(this.n); this.pdf.getPage(this.n).then(function (page) { _this4.page = page; _this4.size = _Pdf2.default.getPageSize(page); if (_this4.type !== 'full') { _this4.size.width /= 2; } page.getAnnotations().then(_this4.setAnnotations.bind(_this4)); page.getTextContent().then(_this4.setHits.bind(_this4)); _this4.calcViewport(); _this4.finishLoad(); }).catch(function (e) { console.error('Cannot load PDF page: ' + (_this4.n + 1)); _this4.finishLoad(); }); }; PdfImage.prototype.setResolution = function setResolution(res) { _ImageBase.prototype.setResolution.call(this, res); if (this.page) { this.calcViewport(); } }; PdfImage.prototype.render = function render(handler) { var _this5 = this; if (this.page) { this.page.render({ canvasContext: this.pushCtx(), viewport: this.viewport }).then(function () { _this5.renderHits(); _this5.popCtx(); _this5.finishRender(); }); } else { this.renderBlankPage(); this.finishRender(); } }; return PdfImage; }(_ImageBase3.default); exports.default = PdfImage; /***/ }, /* 58 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Search = function () { function Search(container, pages) { _classCallCheck(this, Search); this.container = container; this.pages = pages; this.prevResults = []; container.html('\n \n '); this.query = container.find('.query input'); this.results = container.find('.results'); this.status = container.find('.status'); this.binds = { navigate: this.navigate.bind(this), doQuery: this.doQuery.bind(this) }; this.query.on('keydown', this.binds.doQuery); this.results.on('click', this.binds.navigate); } Search.prototype.dispose = function dispose() { this.results.off('click', this.binds.navigate); this.query.off('keydown', this.binds.doQuery); }; Search.prototype.navigate = function navigate(e) { e.preventDefault(); if (this.onNavigate !== undefined) { var target = (0, _libs.$)(e.target); if (!target.hasClass('result')) { var t = target.find('.result'); if (t.length) { target = t; } else { while (target.length && !target.hasClass('result')) { target = (0, _libs.$)(target[0].parentNode); } } } var page = target.attr('data'); if (page !== undefined) { this.onNavigate(parseInt(page)); } } }; Search.prototype.doQuery = function doQuery() { var _this = this; if (this.onQuery) { var queryStamp = this.queryStamp = Date.now(); setTimeout(function () { if (queryStamp === _this.queryStamp) { _this.onQuery(_this.query[0].value.trim()); } }, 1000); } }; Search.prototype.setResults = function setResults(results, lastPage) { if (this.prevResults.length && results[0] !== this.prevResults[0]) { this.prevResults = []; this.results.html(''); } var htmls = []; for (var i = this.prevResults.length; i < results.length; ++i) { var result = results[i]; htmls.push(''); } (0, _libs.$)(htmls.join('')).appendTo(this.results); this.prevResults = [].concat(results); if (lastPage === undefined) { this.status.html(''); } else { this.status.html(lastPage + ' of ' + this.pages); } }; return Search; }(); exports.default = Search; /***/ }, /* 59 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _ImageBase2 = __webpack_require__(5); var _ImageBase3 = _interopRequireDefault(_ImageBase2); var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var StaticImage = function (_ImageBase) { _inherits(StaticImage, _ImageBase); function StaticImage(context, width, height, color, src) { _classCallCheck(this, StaticImage); var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); _this.binds = {}; _this.image = new Image(); _this.image.crossOrigin = 'Anonymous'; _this.binds.imageLoad = function () { _this.width = _this.image.width; _this.height = _this.image.height; _this.startRender = function () { _this.renderImage(_this.image); _this.finishRender(); }; _this.finishLoad(); }; _this.binds.imageError = function () { _this.startRender = function () { _this.renderNotFoundPage(); _this.finishRender(); }; _this.finishLoad(); }; (0, _libs.$)(_this.image).on('load', _this.binds.imageLoad).on('error', _this.binds.imageError); _this.image.src = _Utils2.default.normalizeUrl(src); return _this; } StaticImage.prototype.dispose = function dispose() { (0, _libs.$)(this.image).off('load', this.binds.imageLoad).off('error', this.binds.imageError); this.image.src = ''; delete this.image; _ImageBase.prototype.dispose.call(this); }; return StaticImage; }(_ImageBase3.default); exports.default = StaticImage; /***/ }, /* 60 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var TextureAnimator = function () { function TextureAnimator(img, tilesHoriz, tilesVert, numTiles, tileDispDuration) { _classCallCheck(this, TextureAnimator); var texture = new _libs.THREE.Texture(); texture.minFilter = _libs.THREE.LinearFilter; texture.image = img; texture.needsUpdate = true; // note: texture passed by reference, will be updated by the update function. this.texture = texture; this.tilesHorizontal = tilesHoriz; this.tilesVertical = tilesVert; // how many images does this spritesheet contain? // usually equals tilesHoriz * tilesVert, but not necessarily, // if there at blank tiles at the bottom of the spritesheet. this.numberOfTiles = numTiles; texture.repeat.set(1 / this.tilesHorizontal, 1 / this.tilesVertical); // how long should each image be displayed? this.tileDisplayDuration = tileDispDuration; // how long has the current image been displayed? this.currentDisplayTime = 0; // which image is currently being displayed? this.currentTile = 0; } TextureAnimator.prototype.update = function update(milliSec) { this.currentDisplayTime += milliSec; while (this.currentDisplayTime > this.tileDisplayDuration) { this.currentDisplayTime -= this.tileDisplayDuration; ++this.currentTile; if (this.currentTile == this.numberOfTiles) this.currentTile = 0; var currentColumn = this.currentTile % this.tilesHorizontal; this.texture.offset.x = currentColumn / this.tilesHorizontal; var currentRow = Math.floor(this.currentTile / this.tilesHorizontal); this.texture.offset.y = currentRow / this.tilesVertical; } }; TextureAnimator.prototype.dispose = function dispose() { var img = this.texture.image; img.height = img.width = 0; this.texture.dispose(); }; return TextureAnimator; }(); exports.default = TextureAnimator; /***/ }, /* 61 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); var _MouseEventConverter2 = __webpack_require__(54); var _MouseEventConverter3 = _interopRequireDefault(_MouseEventConverter2); var _ThreeEventConverter = __webpack_require__(19); var _ThreeEventConverter2 = _interopRequireDefault(_ThreeEventConverter); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ThreeMouseEventConverter = function (_MouseEventConverter) { _inherits(ThreeMouseEventConverter, _MouseEventConverter); function ThreeMouseEventConverter(wnd, doc, visualWorld, test) { _classCallCheck(this, ThreeMouseEventConverter); var _this = _possibleConstructorReturn(this, _MouseEventConverter.call(this, wnd, doc, visualWorld.element)); _Utils2.default.extends(_this, new _ThreeEventConverter2.default(visualWorld, test)); return _this; } ThreeMouseEventConverter.prototype.getCallback = function getCallback(object) { return object.object.userData.mouseCallback; }; ThreeMouseEventConverter.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { var jElement = (0, _libs.$)(this.element); var offset = jElement.offset(); this.coords.x = (e.pageX - offset.left) / jElement.width() * 2 - 1; this.coords.y = -((e.pageY - offset.top) / jElement.height()) * 2 + 1; return this.coords; }; return ThreeMouseEventConverter; }(_MouseEventConverter3.default); exports.default = ThreeMouseEventConverter; /***/ }, /* 62 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); var _TouchEventConverter2 = __webpack_require__(64); var _TouchEventConverter3 = _interopRequireDefault(_TouchEventConverter2); var _ThreeEventConverter = __webpack_require__(19); var _ThreeEventConverter2 = _interopRequireDefault(_ThreeEventConverter); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ThreeTouchEventConverter = function (_TouchEventConverter) { _inherits(ThreeTouchEventConverter, _TouchEventConverter); function ThreeTouchEventConverter(wnd, doc, visualWorld, test) { _classCallCheck(this, ThreeTouchEventConverter); var _this = _possibleConstructorReturn(this, _TouchEventConverter.call(this, wnd, doc, visualWorld.element)); _Utils2.default.extends(_this, new _ThreeEventConverter2.default(visualWorld, test)); return _this; } ThreeTouchEventConverter.prototype.getCallback = function getCallback(object) { return object.object.userData.touchCallback; }; ThreeTouchEventConverter.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { var jElement = (0, _libs.$)(this.element), offset = jElement.offset(), touches = e.touches || e.originalEvent.touches, touch = touches.length ? touches[0] : (this.lastTouches || [{ pageX: 0, pageY: 0 }])[0], pageX = touch.pageX, pageY = touch.pageY; this.lastTouches = touches.length ? touches : this.lastTouches; this.coords.x = (pageX - offset.left) / jElement.width() * 2 - 1; this.coords.y = -((pageY - offset.top) / jElement.height()) * 2 + 1; return this.coords; }; return ThreeTouchEventConverter; }(_TouchEventConverter3.default); exports.default = ThreeTouchEventConverter; /***/ }, /* 63 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(0); var _ImageFactory = __webpack_require__(8); var _ImageFactory2 = _interopRequireDefault(_ImageFactory); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Thumbnails = function () { function Thumbnails(context, container, thumbnailsClb, size) { var _this = this; var props = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { kWtoH: 210 / 297 }; _classCallCheck(this, Thumbnails); this.container = container; this.p = props; this.thumbnailsClb = thumbnailsClb; this.size = size; this.canvas = (0, _libs.$)('')[0]; this.imageFactory = new _ImageFactory2.default(_extends({}, context, { renderCanvas: this.canvas, renderCanvasCtx: this.canvas.getContext('2d') })); this.thumbnails = []; for (var i = 0; i < size; ++i) { var info = this.thumbnailsClb(i); this.thumbnails.push(_extends({}, info, { index: i, loaded: info.type === 'thumbnail-image', heading: null, thumbnail: null, title: info.title || i })); } this.binds = { update: this.update.bind(this), navigate: function navigate(e) { e.preventDefault(); if (_this.onNavigate) { var node = e.target; while (node && !node.dataThumbnail) { node = node.parentNode; } _this.onNavigate(node.dataThumbnail.index); } } }; this.container.on('scroll', this.binds.update); } Thumbnails.prototype.getSize = function getSize() { return this.size; }; Thumbnails.prototype.setEnable = function setEnable(enable) { this.enable = enable; this.update(); }; Thumbnails.prototype.dispose = function dispose() { this.container.find('a').off('click', this.binds.navigate); this.container.off('scroll', this.binds.update); this.container.html(''); this.canvas.height = this.canvas.width = 0; delete this.canvas; }; Thumbnails.prototype.load = function load(thumbnail) { var _this2 = this; this.loading = true; var wrapper = this.imageFactory.build(thumbnail, thumbnail.number === undefined ? thumbnail.index : thumbnail.number, this.p.kWtoH * 300, 300); wrapper.onChange = function (canvas) { _this2.setImage(thumbnail, canvas.toDataURL('image/png')); thumbnail.loaded = true; wrapper.dispose(); _this2.loading = false; Promise.resolve().then(function () { return _this2.update(); }); }; }; Thumbnails.prototype.getActive = function getActive() { var first = this.container.scrollTop(), last = first + this.container.height(), res = []; for (var _iterator = this.thumbnails, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var thumbnail = _ref; if (Math.max(thumbnail.first, first) < Math.min(thumbnail.last, last)) { res.push(thumbnail); } } return res; }; Thumbnails.prototype.update = function update() { if (!this.loading && this.canvas && this.enable) { if (!this.built) { this.render(); } var active = this.getActive(); for (var _iterator2 = active, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var thumbnail = _ref2; if (!thumbnail.loaded) { this.load(thumbnail); break; } } } }; Thumbnails.prototype.setImage = function setImage(thumbnail, img) { thumbnail.img = img; thumbnail.thumbnail.css('background-image', ['url(\'', img, '\')'].join('')); thumbnail.thumbnail.removeClass('loading'); }; Thumbnails.prototype.render = function render() { var elements = ['
']; for (var i = 0; i < this.size; ++i) { elements.push([''].join('')); } elements.push('
'); this.container.append(elements.join('')); var items = this.container.find('.item'), base = this.container.find('.thumbnails').offset().top; for (var _i3 = 0; _i3 < items.length; ++_i3) { var item = (0, _libs.$)(items[_i3]); this.thumbnails[_i3].heading = item.find('.heading'); this.thumbnails[_i3].thumbnail = item.find('.thumbnail'); this.thumbnails[_i3].first = item.offset().top - base; this.thumbnails[_i3].last = this.thumbnails[_i3].first + item.height(); if (this.thumbnails[_i3].loaded) { this.setImage(this.thumbnails[_i3], this.thumbnails[_i3].src); } var as = item.find('a'); for (var j = 0; j < as.length; ++j) { var a = as[j]; a.dataThumbnail = this.thumbnails[_i3]; } } this.container.find('a').on('click', this.binds.navigate); this.built = true; }; return Thumbnails; }(); exports.default = Thumbnails; /***/ }, /* 64 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _EventConverter2 = __webpack_require__(6); var _EventConverter3 = _interopRequireDefault(_EventConverter2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var TouchConverter = function (_EventConverter) { _inherits(TouchConverter, _EventConverter); function TouchConverter(wnd, doc, element) { _classCallCheck(this, TouchConverter); var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); _this.element = element; _this.binds = { convert: _this.convert.bind(_this) }; (0, _libs.$)(_this.element).on('touchstart touchmove', _this.binds.convert); (0, _libs.$)(_this.doc).on('touchend', _this.binds.convert); return _this; } TouchConverter.prototype.dispose = function dispose() { (0, _libs.$)(this.element).off('touchstart touchmove', this.binds.convert); (0, _libs.$)(this.doc).off('touchend', this.binds.convert); }; return TouchConverter; }(_EventConverter3.default); exports.default = TouchConverter; /***/ }, /* 65 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var View = function () { View.classProperty = function classProperty(ctrl, className, value) { if (value) { ctrl.addClass(className); } else { ctrl.removeClass(className); } }; View.attributeProperty = function attributeProperty(ctrl, attributeName, value) { if (value) { ctrl.attr(attributeName, value); } else { ctrl.removeAttr(attributeName); } }; View.callHandlers = function callHandlers(handlers, id, e, data) { for (var _iterator = handlers, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var handler = _ref; if (handler[id]) { handler[id](e, data); } else if (handler.handleDefault) { handler.handleDefault(id, e, data); } } }; View.handleEvent = function handleEvent(id, getHandlers, e, data) { View.callHandlers(getHandlers(id), id, e, data); }; View.handleLinkEvent = function handleLinkEvent(e) { e.preventDefault(); if (!this.ctrl.hasClass('disabled')) { View.handleEvent(this.id, this.getHandlers, e); } }; View.handleInputEvent = function handleInputEvent(e) { View.handleEvent(this.id, this.getHandlers, e, e.target.value); }; View.handleFormEvent = function handleFormEvent(e) { e.preventDefault(); View.handleEvent(this.id, this.getHandlers, e); }; // virtual functions { View.prototype.getLinks = function getLinks() { return null; }; View.prototype.getWidgets = function getWidgets() { return null; }; View.prototype.getInputs = function getInputs() { return null; }; View.prototype.getTexts = function getTexts() { return null; }; View.prototype.getTemplate = function getTemplate() { return {}; }; View.prototype.getHandlers = function getHandlers(id) { return this.handlers; }; // } View.prototype.callLater = function callLater(handlers, id, e, data, ms) { var _this = this; this.pendings[id] = { timestamp: new Date().getTime() }; setTimeout(function () { var timestamp = new Date().getTime(), pending = _this.pendings[id]; if (pending && timestamp - pending.timestamp >= ms) { View.callHandlers(handlers, id, e, data); delete _this.pendings[id]; } }, ms); }; // loadFiles(urls, ready, failure) { // let done = Promise.resolve(); // for(let url of urls) { // done = done.then(()=> { // return new Promise((resolve, reject)=> { // $.get(url, (res)=> { // ready(res, url); // resolve(); // }).fail((res)=> { // if(failure && failure(res, url)) { // resolve(); // } // else { // reject(res); // } // }); // }); // }); // } // return done; // } View.prototype.loadFiles = function loadFiles(urls, files) { var tasks = []; var _loop = function _loop() { if (_isArray2) { if (_i2 >= _iterator2.length) return 'break'; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) return 'break'; _ref2 = _i2.value; } var name = _ref2; files[name] = []; var _loop2 = function _loop2() { if (_isArray3) { if (_i3 >= _iterator3.length) return 'break'; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) return 'break'; _ref3 = _i3.value; } var url = _ref3; tasks.push(new Promise(function (resolve, reject) { _libs.$.get(url, function (data) { files[name].push({ url: url, data: data }); resolve(); }).fail(function (res) { reject(res); }); })); }; for (var _iterator3 = urls[name], _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; var _ret2 = _loop2(); if (_ret2 === 'break') break; } }; for (var _iterator2 = Object.keys(urls), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; var _ret = _loop(); if (_ret === 'break') break; } return Promise.all(tasks); }; View.prototype.urlResolver = function urlResolver(baseUrl, url) { url = url.replace(/\\/g, '/'); if (url.charAt(0) !== '/') { baseUrl = baseUrl.replace(/\\/g, '/'); var p = baseUrl.lastIndexOf('/'); url = (~p ? baseUrl.substr(0, p + 1) : '') + url; var parts = url.split('/'); url = []; for (var _iterator4 = parts, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var part = _ref4; if (part === '.') {} else if (part === '..') { if (url.length && !(url.length === 1 && url[0] === '')) { url.pop(); } } else { url.push(part); } } url = url.join('/'); } return url; }; View.prototype.objToAttrsStr = function objToAttrsStr(o) { var res = []; for (var _iterator5 = Object.keys(o), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } var _name = _ref5; res.push([_name, '="', o[_name], '"'].join('')); } return res.join(' '); }; View.prototype.checkIframeSize = function checkIframeSize() { if (this.frame) { if (Math.abs(this.frame.width - this.parentContainer.width()) > 1 || Math.abs(this.frame.height - this.parentContainer.height()) > 1) { this.onResize(); } setTimeout(this.checkIframeSize.bind(this), 250); } }; View.prototype.onResize = function onResize() { this.frame.width = this.parentContainer.width(); this.frame.height = this.parentContainer.height(); }; View.prototype.translate = function translate(html) { return html.replace(/<\$tr>(.*)<\/\$tr>/gi, function (s0, s1) { return (0, _libs.tr)(s1); }); }; View.prototype.fireLinksOnLoadEvent = function fireLinksOnLoadEvent() { var _this2 = this; if (this.templateObject && this.templateObject.linkLoaded) { var loaded = true; var _loop3 = function _loop3() { if (_isArray6) { if (_i6 >= _iterator6.length) return 'break'; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) return 'break'; _ref6 = _i6.value; } var jLink = _ref6; var link = jLink[0]; var img = new Image(); img.onerror = function () { return _this2.templateObject.linkLoaded(link); }; img.src = link.href; }; for (var _iterator6 = this.jLinks, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; var _ret3 = _loop3(); if (_ret3 === 'break') break; } } }; function View(parentContainer, onLoad) { var _this3 = this; var template = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; _classCallCheck(this, View); this.pendings = {}; this.binds = { onResize: this.onResize.bind(this) }; this.parentContainer = (0, _libs.$)(parentContainer); this.isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; this.parentContainer.html(''); this.frame = this.parentContainer.find('iframe')[0]; if (this.frame.contentWindow.stop) { this.frame.contentWindow.stop(); } if (this.isIOS) { (0, _libs.$)(this.parentContainer[0].ownerDocument.defaultView).on('resize', this.binds.onResize); this.onResize(); setTimeout(this.checkIframeSize.bind(this), 250); } this.container = (0, _libs.$)(this.frame.contentDocument.body); this.container.css('margin', '0'); this.head = (0, _libs.$)(this.frame.contentDocument.head); this.onLoad = onLoad; this.handlers = []; var script = template.html ? template.script : this.getTemplate().script; var urls = { styles: template.styles || this.getTemplate().styles, html: [template.html || this.getTemplate().html], script: script ? [script] : [] }, files = {}, links = template.links || this.getTemplate().links; this.loadFiles(urls, files).then(function () { var _loop4 = function _loop4() { if (_isArray7) { if (_i7 >= _iterator7.length) return 'break'; _ref7 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) return 'break'; _ref7 = _i7.value; } var style = _ref7; var textCss = style.data, url = style.url; textCss = textCss.replace(/url\(['"](.*?)["']\)/g, function (r, r1) { return ['url(', _this3.urlResolver(url, r1), ')'].join(''); }); (0, _libs.$)('').appendTo(_this3.head); }; for (var _iterator7 = files.styles, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref7; var _ret4 = _loop4(); if (_ret4 === 'break') break; } _this3.container.html(_this3.translate(files.html[0].data)); _this3.jLinks = []; for (var _iterator8 = links, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { var _ref8; if (_isArray8) { if (_i8 >= _iterator8.length) break; _ref8 = _iterator8[_i8++]; } else { _i8 = _iterator8.next(); if (_i8.done) break; _ref8 = _i8.value; } var _link = _ref8; _this3.jLinks.push((0, _libs.$)([''].join('')).appendTo(_this3.head)); } if (files.script[0]) { var init = eval(files.script[0].data); _this3.templateObject = init(_this3.container); } else { _this3.templateObject = {}; } _this3.linkControls = {}; for (var _iterator9 = _this3.getLinks(), _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { var _ref9; if (_isArray9) { if (_i9 >= _iterator9.length) break; _ref9 = _iterator9[_i9++]; } else { _i9 = _iterator9.next(); if (_i9.done) break; _ref9 = _i9.value; } var id = _ref9; _this3.linkControls[id] = _this3.container.find('.' + id); _this3.binds[id] = View.handleLinkEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: id, ctrl: _this3.linkControls[id] }); _this3.linkControls[id].on('click', _this3.binds[id]); } _this3.widgetControls = {}; for (var _iterator10 = _this3.getWidgets(), _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { var _ref10; if (_isArray10) { if (_i10 >= _iterator10.length) break; _ref10 = _iterator10[_i10++]; } else { _i10 = _iterator10.next(); if (_i10.done) break; _ref10 = _i10.value; } var _id = _ref10; _this3.widgetControls[_id] = _this3.container.find('.' + _id); } _this3.inputControls = {}; for (var _iterator11 = _this3.getInputs(), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { var _ref11; if (_isArray11) { if (_i11 >= _iterator11.length) break; _ref11 = _iterator11[_i11++]; } else { _i11 = _iterator11.next(); if (_i11.done) break; _ref11 = _i11.value; } var _id2 = _ref11; _this3.inputControls[_id2] = _this3.container.find('.' + _id2); _this3.binds[_id2] = View.handleInputEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: _id2, ctrl: _this3.inputControls[_id2] }); _this3.inputControls[_id2].on('keyup', _this3.binds[_id2]); } _this3.formControls = {}; for (var _iterator12 = _this3.getForms(), _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { var _ref12; if (_isArray12) { if (_i12 >= _iterator12.length) break; _ref12 = _iterator12[_i12++]; } else { _i12 = _iterator12.next(); if (_i12.done) break; _ref12 = _i12.value; } var _id3 = _ref12; _this3.formControls[_id3] = _this3.container.find('.' + _id3); _this3.binds[_id3] = View.handleFormEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: _id3, ctrl: _this3.formControls[_id3] }); _this3.formControls[_id3].on('submit', _this3.binds[_id3]); } _this3.textControls = {}; for (var _iterator13 = _this3.getTexts(), _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { var _ref13; if (_isArray13) { if (_i13 >= _iterator13.length) break; _ref13 = _iterator13[_i13++]; } else { _i13 = _iterator13.next(); if (_i13.done) break; _ref13 = _i13.value; } var _id4 = _ref13; _this3.textControls[_id4] = _this3.container.find('.' + _id4); } _this3.stateSetters = [{ map: _this3.linkControls, setter: _this3.setLinkControlState.bind(_this3) }, { map: _this3.widgetControls, setter: _this3.setWidgetControlState.bind(_this3) }, { map: _this3.inputControls, setter: _this3.setInputControlState.bind(_this3) }, { map: _this3.textControls, setter: _this3.setTextControlState.bind(_this3) }]; _this3.initView(); if (_this3.onLoad) { _this3.onLoad(); } _this3.fireLinksOnLoadEvent(); }).catch(function (res) { return console.error(res); }); } View.prototype.dispose = function dispose() { delete this.textControls; for (var _iterator14 = this.getLinks(), _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { var _ref14; if (_isArray14) { if (_i14 >= _iterator14.length) break; _ref14 = _iterator14[_i14++]; } else { _i14 = _iterator14.next(); if (_i14.done) break; _ref14 = _i14.value; } var id = _ref14; this.linkControls[id].off('click', this.binds[id]); } delete this.linkControls; delete this.widgetControls; for (var _iterator15 = this.getInputs(), _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { var _ref15; if (_isArray15) { if (_i15 >= _iterator15.length) break; _ref15 = _iterator15[_i15++]; } else { _i15 = _iterator15.next(); if (_i15.done) break; _ref15 = _i15.value; } var _id5 = _ref15; this.inputControls[_id5].off('keyup', this.binds[_id5]); } delete this.inputControls; for (var _iterator16 = this.getForms(), _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) { var _ref16; if (_isArray16) { if (_i16 >= _iterator16.length) break; _ref16 = _iterator16[_i16++]; } else { _i16 = _iterator16.next(); if (_i16.done) break; _ref16 = _i16.value; } var _id6 = _ref16; this.formControls[_id6].off('submit', this.binds[_id6]); } delete this.formControls; !this.templateObject.dispose || this.templateObject.dispose(); delete this.templateObject; if (this.isIOS) { (0, _libs.$)(this.parentContainer[0].ownerDocument.defaultView).off('resize', this.binds.onResize); } this.parentContainer.html(''); delete this.frame; }; View.prototype.getContainer = function getContainer() { return this.container[0]; }; View.prototype.getParentContainer = function getParentContainer() { return this.parentContainer[0]; }; View.prototype.addHandler = function addHandler(handler) { this.handlers.push(handler); }; View.prototype.initView = function initView() {}; View.setControlState = function setControlState(ctrl, defaults, state, stateHandlers) { if (ctrl) { var st = _extends({}, defaults, state); for (var _name2 in st) { if (st.hasOwnProperty(_name2) && stateHandlers[_name2]) { stateHandlers[_name2](ctrl, st[_name2]); } } } }; View.prototype.setLinkControlState = function setLinkControlState(id, state) { View.setControlState(this.linkControls[id], { visible: true, active: false, enable: true }, state, View.linkStateHandlers); }; View.prototype.setWidgetControlState = function setWidgetControlState(id, state) { View.setControlState(this.widgetControls[id], { visible: true, active: false, enable: true }, state, View.widgetStateHandlers); }; View.prototype.setInputControlState = function setInputControlState(id, state) { View.setControlState(this.inputControls[id], { visible: true, enable: true, value: '' }, state, View.inputStateHandlers); }; View.prototype.setTextControlState = function setTextControlState(id, state) { View.setControlState(this.textControls[id], { visible: true, value: '' }, state, View.textStateHandlers); }; View.prototype.onItemStateChanged = function onItemStateChanged() {}; View.prototype.setState = function setState(id, state) { for (var _iterator17 = this.stateSetters, _isArray17 = Array.isArray(_iterator17), _i17 = 0, _iterator17 = _isArray17 ? _iterator17 : _iterator17[Symbol.iterator]();;) { var _ref17; if (_isArray17) { if (_i17 >= _iterator17.length) break; _ref17 = _iterator17[_i17++]; } else { _i17 = _iterator17.next(); if (_i17.done) break; _ref17 = _i17.value; } var item = _ref17; if (item.map[id]) { item.setter(id, state); this.onItemStateChanged(id, state); break; } } }; return View; }(); View.linkStateHandlers = { visible: function visible(ctrl, value) { return View.classProperty(ctrl, 'hidden', !value); }, active: function active(ctrl, value) { return View.classProperty(ctrl, 'active', value); }, enable: function enable(ctrl, value) { return View.classProperty(ctrl, 'disabled', !value); } }; View.widgetStateHandlers = { visible: function visible(ctrl, value) { return View.classProperty(ctrl, 'hidden', !value); }, active: function active(ctrl, value) { return View.classProperty(ctrl, 'active', value); }, enable: function enable(ctrl, value) { return View.classProperty(ctrl, 'disabled', !value); } }; View.inputStateHandlers = { visible: function visible(ctrl, value) { return View.classProperty(ctrl, 'hidden', !value); }, value: function value(ctrl, _value) { return ctrl[0].value = _value; }, enable: function enable(ctrl, value) { return View.attributeProperty(ctrl, 'disabled', !value); } }; View.textStateHandlers = { visible: function visible(ctrl, value) { return View.classProperty(ctrl, 'hidden', !value); }, value: function value(ctrl, _value2) { return ctrl.text(_value2); } }; exports.default = View; /***/ }, /* 66 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i];for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } }return target; }; var _libs = __webpack_require__(0); var _Orbit = __webpack_require__(56); var _Orbit2 = _interopRequireDefault(_Orbit); var _ThreeMouseEventConverter = __webpack_require__(61); var _ThreeMouseEventConverter2 = _interopRequireDefault(_ThreeMouseEventConverter); var _ThreeTouchEventConverter = __webpack_require__(62); var _ThreeTouchEventConverter2 = _interopRequireDefault(_ThreeTouchEventConverter); var _Drag = __webpack_require__(48); var _Drag2 = _interopRequireDefault(_Drag); var _CSS3DRenderer = __webpack_require__(12); var _CSS3DRenderer2 = _interopRequireDefault(_CSS3DRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var VisualWorld = function (_THREE$EventDispatche) { _inherits(VisualWorld, _THREE$EventDispatche); function VisualWorld(wnd, doc, container) { var useHelpers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; _classCallCheck(this, VisualWorld); var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); _this.wnd = wnd; _this.doc = doc; _this.jContainer = container; _this.renderCallbacks = []; _this.clock = new _libs.THREE.Clock(); _this.raycaster = new _libs.THREE.Raycaster(); _this.scene = new _libs.THREE.Scene(); _this.cssScene = new _libs.THREE.Scene(); _this.camera = new _libs.THREE.PerspectiveCamera(30, _this.width() / _this.height(), 0.2, 2000); var scale = 1; _this.camera.position.x = 0; _this.camera.position.y = 5.5 * scale; _this.camera.position.z = 0; _this.renderer = new _libs.THREE.WebGLRenderer({ alpha: true, antialias: true }); _this.renderer.setClearColor(0x000000, 0); _this.renderer.setPixelRatio(_this.wnd.devicePixelRatio); _this.renderer.setSize(_this.width(), _this.height()); _this.jContainer.append(_this.renderer.domElement); _this.cssRenderer = new _CSS3DRenderer2.default(); _this.cssRenderer.setSize(_this.width(), _this.height()); (0, _libs.$)(_this.cssRenderer.domElement).css({ position: 'absolute', top: 0, margin: 0, padding: 0 }); _this.jContainer.append(_this.cssRenderer.domElement); _this.element = _this.cssRenderer.domElement; _this.controls = new _Orbit2.default(_this.camera, _this.element); _this.controls.target.y = 0.5; var cssScene = (0, _libs.$)(_this.cssRenderer.domElement).find('div'), tmpVector = new _libs.THREE.Vector3(); _this.controls.addEventListener('change', function () { _this.camera.getWorldDirection(tmpVector); cssScene.css('display', tmpVector.y - _this.camera.position.y > 0 ? 'none' : 'block'); }); _this.textureLoader = new _libs.THREE.TextureLoader(); _this.scene.add(new _libs.THREE.AmbientLight(0xD0D0D0)); //0xC0C0C0 _this.light = new _libs.THREE.DirectionalLight(0x404040, 1); _this.light.position.set(0, 6 * scale, 0); _this.light.castShadow = false; // const d = 20*scale; // this.light.shadow.camera.left = -d; // this.light.shadow.camera.right = d; // this.light.shadow.camera.top = d; // this.light.shadow.camera.bottom = -d; // this.light.shadow.camera.near = 1*scale; // this.light.shadow.camera.far = 25*scale; // this.light.shadow.mapSize.x = 1024; // this.light.shadow.mapSize.y = 1024; _this.scene.add(_this.light); if (useHelpers) { _this.scene.add(new _libs.THREE.AxisHelper(5)); } _this.binds = { onWindowResize: _this.onWindowResize.bind(_this), animate: _this.animate.bind(_this) }; (0, _libs.$)(_this.wnd).on('resize', _this.binds.onWindowResize); _this.mouseEvents = new _ThreeMouseEventConverter2.default(_this.wnd, _this.doc, _this); _this.touchEvents = new _ThreeTouchEventConverter2.default(_this.wnd, _this.doc, _this); var filterData = { type: 'mousemove' }; _this.mouseEvents.filter = function (element, e) { var types = ['mouseenter', 'mouseover', 'mouseleave', 'mouseout'], contains = function contains(p, c) { return p === c || _libs.$.contains(p, c); }; if (e.type === 'mousemove') { filterData.pageX = e.pageX; filterData.pageY = e.pageY; } return e.relatedTarget && ~types.indexOf(e.type) && contains(element, e.target) && contains(element, e.relatedTarget) ? _extends({}, e, filterData) : e; }; _this.drag = new _Drag2.default(_this.wnd, _this.doc, _this); _this.animate(); return _this; } VisualWorld.prototype.dispose = function dispose() { delete this.binds.animate; (0, _libs.$)(this.wnd).off('resize', this.binds.onWindowResize); this.mouseEvents.dispose(); this.touchEvents.dispose(); this.drag.dispose(); this.controls.dispose(); }; VisualWorld.prototype.width = function width() { return this.jContainer.width(); }; VisualWorld.prototype.height = function height() { return this.jContainer.height(); }; VisualWorld.prototype.setExtraLighting = function setExtraLighting(v) { this.light.intensity = v; }; VisualWorld.prototype.getOrbit = function getOrbit() { return this.controls; }; VisualWorld.prototype.setControlsState = function setControlsState(state) { this.controls.enabled = state; }; VisualWorld.prototype.getControlsState = function getControlsState() { return this.controls.enabled; }; VisualWorld.prototype.onWindowResize = function onWindowResize() { var _this2 = this; var updateCamera = function updateCamera(camera) { camera.aspect = _this2.width() / _this2.height(); camera.updateProjectionMatrix(); }, updateRenderer = function updateRenderer(renderer) { renderer.setSize(_this2.width(), _this2.height()); }; updateCamera(this.camera); updateRenderer(this.renderer); updateRenderer(this.cssRenderer); this.dispatchEvent({ type: 'resize' }); }; VisualWorld.prototype.addObject = function addObject(object) { this.scene.add(object); }; VisualWorld.prototype.addCssObject = function addCssObject(object) { this.cssScene.add(object); }; VisualWorld.prototype.removeCssObject = function removeCssObject(object) { this.cssScene.remove(object); }; VisualWorld.prototype.removeObject = function removeObject(object) { this.scene.remove(object); }; VisualWorld.prototype.animate = function animate() { if (this.binds.animate) { requestAnimationFrame(this.binds.animate); } this.render(); }; VisualWorld.prototype.addRenderCallback = function addRenderCallback(clb) { this.renderCallbacks.push(clb); }; VisualWorld.prototype.removeRenderCallback = function removeRenderCallback(clb) { var i = this.renderCallbacks.indexOf(clb); if (~i) { this.renderCallbacks.splice(i, 1); } }; VisualWorld.prototype.render = function render() { var deltaTime = this.clock.getDelta(); this.controls.update(deltaTime); for (var _iterator = this.renderCallbacks, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var clb = _ref; clb(deltaTime); } this.cssRenderer.render(this.cssScene, this.camera); this.renderer.render(this.scene, this.camera); }; VisualWorld.prototype.processGeometry = function processGeometry(bufGeometry, mesh) { mesh.geometry = bufGeometry; // Obtain a Geometry var geometry = new _libs.THREE.Geometry().fromBufferGeometry(bufGeometry); // Merge the vertices so the triangle soup is converted to indexed triangles geometry.mergeVertices(); // Convert again to BufferGeometry, indexed var indexedBufferGeom = this.createIndexedBufferGeometryFromGeometry(geometry); // Create index arrays mapping the indexed vertices to bufGeometry vertices return this.mapIndices(bufGeometry, indexedBufferGeom); }; VisualWorld.prototype.createIndexedBufferGeometryFromGeometry = function createIndexedBufferGeometryFromGeometry(geometry) { var numVertices = geometry.vertices.length; var numFaces = geometry.faces.length; var bufferGeom = new _libs.THREE.BufferGeometry(); var vertices = new Float32Array(numVertices * 3); var indices = new (numFaces * 3 > 65535 ? Uint32Array : Uint16Array)(numFaces * 3); for (var i = 0; i < numVertices; i++) { var p = geometry.vertices[i]; var i3 = i * 3; vertices[i3] = p.x; vertices[i3 + 1] = p.y; vertices[i3 + 2] = p.z; } for (var _i2 = 0; _i2 < numFaces; _i2++) { var f = geometry.faces[_i2]; var _i3 = _i2 * 3; indices[_i3] = f.a; indices[_i3 + 1] = f.b; indices[_i3 + 2] = f.c; } bufferGeom.setIndex(new _libs.THREE.BufferAttribute(indices, 1)); bufferGeom.addAttribute('position', new _libs.THREE.BufferAttribute(vertices, 3)); return bufferGeom; }; VisualWorld.prototype.isEqual = function isEqual(x1, y1, z1, x2, y2, z2) { var delta = 0.000001; return Math.abs(x2 - x1) < delta && Math.abs(y2 - y1) < delta && Math.abs(z2 - z1) < delta; }; VisualWorld.prototype.mapIndices = function mapIndices(bufGeometry, indexedBufferGeom) { // Creates mappedVertices, mappedIndices and mappedAssociation in bufGeometry var vertices = bufGeometry.attributes.position.array; var idxVertices = indexedBufferGeom.attributes.position.array; var indices = indexedBufferGeom.index.array; var numIdxVertices = idxVertices.length / 3; var numVertices = vertices.length / 3; bufGeometry.mappedVertices = idxVertices; bufGeometry.mappedIndices = indices; bufGeometry.mappedAssociation = []; for (var i = 0; i < numIdxVertices; i++) { var association = []; bufGeometry.mappedAssociation.push(association); var i3 = i * 3; for (var j = 0; j < numVertices; j++) { var j3 = j * 3; if (this.isEqual(idxVertices[i3], idxVertices[i3 + 1], idxVertices[i3 + 2], vertices[j3], vertices[j3 + 1], vertices[j3 + 2])) { association.push(j3); } } } return { vertices: bufGeometry.mappedVertices, indices: bufGeometry.mappedIndices }; }; VisualWorld.prototype.oneNodePositionCallback = function oneNodePositionCallback(p, q) { this.position.set(p.x, p.y, p.z); this.quaternion.set(q.x, q.y, q.z, q.w); }; VisualWorld.prototype.multyNodePositionCallback = function multyNodePositionCallback(node, p, n) { var geometry = this.geometry; var volumePositions = geometry.attributes.position.array; var volumeNormals = geometry.attributes.normal.array; var assocVertex = geometry.mappedAssociation[node]; for (var k = 0; k < assocVertex.length; k++) { var indexVertex = assocVertex[k]; volumePositions[indexVertex] = p.x; volumeNormals[indexVertex] = n.x; ++indexVertex; volumePositions[indexVertex] = p.y; volumeNormals[indexVertex] = n.y; ++indexVertex; volumePositions[indexVertex] = p.z; volumeNormals[indexVertex] = n.z; } }; VisualWorld.prototype.multyNodePositionPostCallback = function multyNodePositionPostCallback() { var geometry = this.geometry; geometry.attributes.position.needsUpdate = true; geometry.attributes.normal.needsUpdate = true; }; VisualWorld.prototype.pathPositionCallback = function pathPositionCallback(node, p) { var positions = this.geometry.attributes.position.array; var i = 3 * node; positions[i++] = p.x; positions[i++] = p.y; positions[i] = p.z; }; VisualWorld.prototype.pathPositionPostCallback = function pathPositionPostCallback() { var geometry = this.geometry; geometry.computeVertexNormals(); geometry.attributes.position.needsUpdate = true; geometry.attributes.normal.needsUpdate = true; }; return VisualWorld; }(_libs.THREE.EventDispatcher); exports.default = VisualWorld; /***/ }, /* 67 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Controller2 = __webpack_require__(15); var _Controller3 = _interopRequireDefault(_Controller2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var WidgetController = function (_Controller) { _inherits(WidgetController, _Controller); function WidgetController(view) { _classCallCheck(this, WidgetController); var _this = _possibleConstructorReturn(this, _Controller.call(this)); _this.view = view; _this.visible = false; return _this; } WidgetController.prototype.togle = function togle() { this.visible = !this.visible; this.fireChange(); }; WidgetController.prototype.hide = function hide() { this.visible = false; this.fireChange(); }; WidgetController.prototype.fireChange = function fireChange() { if (this.onChange) { this.onChange(); } this.updateView(); }; WidgetController.prototype.updateView = function updateView() { if (this.view) { this.view.setState('widFloatWnd', { enable: true, visible: this.visible, active: false }); } }; return WidgetController; }(_Controller3.default); exports.default = WidgetController; /***/ }, /* 68 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Target2 = __webpack_require__(21); var _Target3 = _interopRequireDefault(_Target2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var CircleTarget = function (_Target) { _inherits(CircleTarget, _Target); function CircleTarget(x, y, r) { _classCallCheck(this, CircleTarget); var _this = _possibleConstructorReturn(this, _Target.call(this)); _this.p = { x: x, y: y, r: r }; return _this; } CircleTarget.prototype.testIntersection = function testIntersection(e, data) { var res = void 0; var x = data.x, y = data.y, p = this.p; if ((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y) <= p.r * p.r) { res = { target: this, data: data }; } return res; }; return CircleTarget; }(_Target3.default); exports.default = CircleTarget; /***/ }, /* 69 */ /***/function (module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Target2 = __webpack_require__(21); var _Target3 = _interopRequireDefault(_Target2); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PolyTarget = function (_Target) { _inherits(PolyTarget, _Target); function PolyTarget(poly) { _classCallCheck(this, PolyTarget); var _this = _possibleConstructorReturn(this, _Target.call(this)); _this.poly = poly; return _this; } PolyTarget.prototype.testIntersection = function testIntersection(e, p) { return _BaseMathUtils2.default.isInsidePoly(this.poly, p) ? { target: this, data: p } : undefined; }; return PolyTarget; }(_Target3.default); exports.default = PolyTarget; /***/ }, /* 70 */ /***/function (module, exports, __webpack_require__) { // stats.js - http://github.com/mrdoob/stats.js (function (f, e) { true ? module.exports = e() : "function" === typeof define && define.amd ? define(e) : f.Stats = e(); })(this, function () { var f = function f() { function e(a) { c.appendChild(a.dom);return a; }function u(a) { for (var d = 0; d < c.children.length; d++) { c.children[d].style.display = d === a ? "block" : "none"; }l = a; }var l = 0, c = document.createElement("div");c.style.cssText = "position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";c.addEventListener("click", function (a) { a.preventDefault(); u(++l % c.children.length); }, !1);var k = (performance || Date).now(), g = k, a = 0, r = e(new f.Panel("FPS", "#0ff", "#002")), h = e(new f.Panel("MS", "#0f0", "#020"));if (self.performance && self.performance.memory) var t = e(new f.Panel("MB", "#f08", "#201"));u(0);return { REVISION: 16, dom: c, addPanel: e, showPanel: u, begin: function begin() { k = (performance || Date).now(); }, end: function end() { a++;var c = (performance || Date).now();h.update(c - k, 200);if (c > g + 1E3 && (r.update(1E3 * a / (c - g), 100), g = c, a = 0, t)) { var d = performance.memory;t.update(d.usedJSHeapSize / 1048576, d.jsHeapSizeLimit / 1048576); }return c; }, update: function update() { k = this.end(); }, domElement: c, setMode: u }; };f.Panel = function (e, f, l) { var c = Infinity, k = 0, g = Math.round, a = g(window.devicePixelRatio || 1), r = 80 * a, h = 48 * a, t = 3 * a, v = 2 * a, d = 3 * a, m = 15 * a, n = 74 * a, p = 30 * a, q = document.createElement("canvas");q.width = r;q.height = h;q.style.cssText = "width:80px;height:48px";var b = q.getContext("2d");b.font = "bold " + 9 * a + "px Helvetica,Arial,sans-serif";b.textBaseline = "top";b.fillStyle = l;b.fillRect(0, 0, r, h);b.fillStyle = f;b.fillText(e, t, v); b.fillRect(d, m, n, p);b.fillStyle = l;b.globalAlpha = .9;b.fillRect(d, m, n, p);return { dom: q, update: function update(h, w) { c = Math.min(c, h);k = Math.max(k, h);b.fillStyle = l;b.globalAlpha = 1;b.fillRect(0, 0, r, m);b.fillStyle = f;b.fillText(g(h) + " " + e + " (" + g(c) + "-" + g(k) + ")", t, v);b.drawImage(q, d + a, m, n - a, p, d, m, n - a, p);b.fillRect(d + n - a, m, a, p);b.fillStyle = l;b.globalAlpha = .9;b.fillRect(d + n - a, m, a, g((1 - h / w) * p)); } }; };return f; }); /***/ }, /* 71 */ /***/function (module, exports, __webpack_require__) { /*** IMPORTS FROM imports-loader ***/ var define = false; /*! * jQuery Mousewheel 3.1.13 * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (true) { // Node/CommonJS style for Browserify module.exports = factory; } else { // Browser globals factory(jQuery); } })(function ($) { var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], slice = Array.prototype.slice, nullLowestDeltaTimeout, lowestDelta; if ($.event.fixHooks) { for (var i = toFix.length; i;) { $.event.fixHooks[toFix[--i]] = $.event.mouseHooks; } } var special = $.event.special.mousewheel = { version: '3.1.12', setup: function setup() { if (this.addEventListener) { for (var i = toBind.length; i;) { this.addEventListener(toBind[--i], handler, false); } } else { this.onmousewheel = handler; } // Store the line height and page height for this particular element $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); }, teardown: function teardown() { if (this.removeEventListener) { for (var i = toBind.length; i;) { this.removeEventListener(toBind[--i], handler, false); } } else { this.onmousewheel = null; } // Clean up the data we added to the element $.removeData(this, 'mousewheel-line-height'); $.removeData(this, 'mousewheel-page-height'); }, getLineHeight: function getLineHeight(elem) { var $elem = $(elem), $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); if (!$parent.length) { $parent = $('body'); } return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; }, getPageHeight: function getPageHeight(elem) { return $(elem).height(); }, settings: { adjustOldDeltas: true, // see shouldAdjustOldDeltas() below normalizeOffset: true // calls getBoundingClientRect for each event } }; $.fn.extend({ mousewheel: function mousewheel(fn) { return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); }, unmousewheel: function unmousewheel(fn) { return this.unbind('mousewheel', fn); } }); function handler(event) { var orgEvent = event || window.event, args = slice.call(arguments, 1), delta = 0, deltaX = 0, deltaY = 0, absDelta = 0, offsetX = 0, offsetY = 0; event = $.event.fix(orgEvent); event.type = 'mousewheel'; // Old school scrollwheel delta if ('detail' in orgEvent) { deltaY = orgEvent.detail * -1; } if ('wheelDelta' in orgEvent) { deltaY = orgEvent.wheelDelta; } if ('wheelDeltaY' in orgEvent) { deltaY = orgEvent.wheelDeltaY; } if ('wheelDeltaX' in orgEvent) { deltaX = orgEvent.wheelDeltaX * -1; } // Firefox < 17 horizontal scrolling related to DOMMouseScroll event if ('axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS) { deltaX = deltaY * -1; deltaY = 0; } // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy delta = deltaY === 0 ? deltaX : deltaY; // New school wheel delta (wheel event) if ('deltaY' in orgEvent) { deltaY = orgEvent.deltaY * -1; delta = deltaY; } if ('deltaX' in orgEvent) { deltaX = orgEvent.deltaX; if (deltaY === 0) { delta = deltaX * -1; } } // No change actually happened, no reason to go any further if (deltaY === 0 && deltaX === 0) { return; } // Need to convert lines and pages to pixels if we aren't already in pixels // There are three delta modes: // * deltaMode 0 is by pixels, nothing to do // * deltaMode 1 is by lines // * deltaMode 2 is by pages if (orgEvent.deltaMode === 1) { var lineHeight = $.data(this, 'mousewheel-line-height'); delta *= lineHeight; deltaY *= lineHeight; deltaX *= lineHeight; } else if (orgEvent.deltaMode === 2) { var pageHeight = $.data(this, 'mousewheel-page-height'); delta *= pageHeight; deltaY *= pageHeight; deltaX *= pageHeight; } // Store lowest absolute delta to normalize the delta values absDelta = Math.max(Math.abs(deltaY), Math.abs(deltaX)); if (!lowestDelta || absDelta < lowestDelta) { lowestDelta = absDelta; // Adjust older deltas if necessary if (shouldAdjustOldDeltas(orgEvent, absDelta)) { lowestDelta /= 40; } } // Adjust older deltas if necessary if (shouldAdjustOldDeltas(orgEvent, absDelta)) { // Divide all the things by 40! delta /= 40; deltaX /= 40; deltaY /= 40; } // Get a whole, normalized value for the deltas delta = Math[delta >= 1 ? 'floor' : 'ceil'](delta / lowestDelta); deltaX = Math[deltaX >= 1 ? 'floor' : 'ceil'](deltaX / lowestDelta); deltaY = Math[deltaY >= 1 ? 'floor' : 'ceil'](deltaY / lowestDelta); // Normalise offsetX and offsetY properties if (special.settings.normalizeOffset && this.getBoundingClientRect) { var boundingRect = this.getBoundingClientRect(); offsetX = event.clientX - boundingRect.left; offsetY = event.clientY - boundingRect.top; } // Add information to the event object event.deltaX = deltaX; event.deltaY = deltaY; event.deltaFactor = lowestDelta; event.offsetX = offsetX; event.offsetY = offsetY; // Go ahead and set deltaMode to 0 since we converted to pixels // Although this is a little odd since we overwrite the deltaX/Y // properties with normalized deltas. event.deltaMode = 0; // Add event and delta to the front of the arguments args.unshift(event, delta, deltaX, deltaY); // Clearout lowestDelta after sometime to better // handle multiple device types that give different // a different lowestDelta // Ex: trackpad = 3 and mouse wheel = 120 if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); return ($.event.dispatch || $.event.handle).apply(this, args); } function nullLowestDelta() { lowestDelta = null; } function shouldAdjustOldDeltas(orgEvent, absDelta) { // If this is an older event and the delta is divisable by 120, // then we are assuming that the browser is treating this as an // older mouse wheel event and that we should divide the deltas // by 40 to try and get a more usable deltaFactor. // Side note, this actually impacts the reported scroll distance // in older browsers and can cause scrolling to be slower than native. // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; } }); /***/ }, /* 72 */ /***/function (module, exports, __webpack_require__) { __webpack_require__(23); module.exports = __webpack_require__(22); /***/ } /******/]); /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _$ = true ? window.jQuery : require('jquery'), _html2canvas = true ? window.html2canvas : require('html2canvas'), _THREE = true ? window.THREE : require('three'), _PDFJS = true ? window.PDFJS : require('pdfjs'); exports.$ = _$; exports.html2canvas = _html2canvas; exports.THREE = _THREE; exports.PDFJS = _PDFJS; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(0); /***/ }) /******/ ]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZTllZjBjNTdkNGM5OGI5ODgxODUiLCJ3ZWJwYWNrOi8vLy4vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6L3dlYnBhY2svYm9vdHN0cmFwIDcyNGU1OGRmNThjNjVjNDgwOGI0Iiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9saWJzLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2xpYnMuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvQmFzZU1hdGhVdGlscy5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9NYXRoVXRpbHMuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvVXRpbHMuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvSW1hZ2VCYXNlLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0V2ZW50Q29udmVydGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0dyYXBoVXRpbHMuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvSW1hZ2VGYWN0b3J5LmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQm9va1Byb3BzQnVpbGRlci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9qcy9jbGFzc2VzL1NoZWV0QmxvY2suanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vanMvcHJvcHMvYm9vay5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9DU1MzRFJlbmRlcmVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0NTU0xheWVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0NhY2hlLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0NvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvQ3VzdG9tRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvRmluZGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL1BkZi5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9UaHJlZUV2ZW50Q29udmVydGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL1RocmVlVXRpbHMuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvdGFyZ2V0cy9UYXJnZXQuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL3BvbHlmaWxsLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQXV0b05hdmlnYXRvci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9qcy9jbGFzc2VzL0JpbmRlci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9qcy9jbGFzc2VzL0Jvb2suanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vanMvY2xhc3Nlcy9Cb29rQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9qcy9jbGFzc2VzL0Jvb2tQcmludGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQm9va1ZpZXcuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vanMvY2xhc3Nlcy9DbGJCb29rUHJvcHNCdWlsZGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQ292ZXIuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vanMvY2xhc3Nlcy9Dc3NMYXllcnNNYW5hZ2VyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2NsYXNzZXMvUGFnZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vanMvY2xhc3Nlcy9QZGZCb29rUHJvcHNCdWlsZGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2NsYXNzZXMvUGRmTGlua3NIYW5kbGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2NsYXNzZXMvU2VhcmNoRW5naW5lLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL2NsYXNzZXMvU2hlZXRDc3NMYXllci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9qcy9jbGFzc2VzL1NoZWV0UGh5c2ljcy5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9qcy9jbGFzc2VzL1NvdW5kc0Vudmlyb21lbnQuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vanMvY2xhc3Nlcy9Ub2NDb250cm9sbGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL21vZGVscy9zaGVldEJsb2NrLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2pzL3Byb3BzL2Jvb2tDb250cm9sbGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0JsYW5rSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvQm9va21hcmtzLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0RldGVjdG9yLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0RvY01vdXNlU2ltdWxhdG9yLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0RvbTJJbWFnZS5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9EcmFnLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0V2ZW50c1RvQWN0aW9ucy5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9GdWxsU2NyZWVuLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0ludGVyYWN0aXZlSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvTG9hZGluZ0FuaW1hdGlvbi5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9Mb2FkaW5nQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9Nb3VzZUV2ZW50Q29udmVydGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL09iamVjdDNEV2F0Y2hlci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9PcmJpdC5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9QZGZJbWFnZS5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9TZWFyY2guanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvU3RhdGljSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvVGV4dHVyZUFuaW1hdG9yLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL1RocmVlTW91c2VFdmVudENvbnZlcnRlci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9UaHJlZVRvdWNoRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvVGh1bWJuYWlscy5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9Ub3VjaEV2ZW50Q29udmVydGVyLmpzIiwid2VicGFjazovLy93ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL1ZpZXcuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvVmlzdWFsV29ybGQuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvV2lkZ2V0Q29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy90YXJnZXRzL0NpcmNsZVRhcmdldC5qcyIsIndlYnBhY2s6Ly8vd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy90YXJnZXRzL1BvbHlUYXJnZXQuanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vfi9zdGF0cy5qcy9idWlsZC9zdGF0cy5taW4uanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2s6Ly8vfi9qcXVlcnktbW91c2V3aGVlbC9qcXVlcnkubW91c2V3aGVlbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbGlicy5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlIiwiXyQiLCJ3aW5kb3ciLCJfaHRtbDJjYW52YXMiLCJfVEhSRUUiLCJfUmVhY3QiLCJfUmVhY3RET00iLCJfUERGSlMiLCJfdHIiLCIkIiwiaHRtbDJjYW52YXMiLCJUSFJFRSIsIlJlYWN0IiwiUmVhY3RET00iLCJQREZKUyIsInRyIiwiRkIzRF9MT0NBTEUiLCJCYXNlTWF0aFV0aWxzIiwic3VtMSIsImthIiwiYSIsImtiIiwiYiIsInN1bTIiLCJzdW0zIiwic3VtNCIsInJrNCIsImR5IiwidCIsImR0IiwieSIsInN1bSIsImsxIiwiazIiLCJrMyIsIms0IiwiZXh0cmFwb2xhdGVMaW5lYXIiLCJ4IiwieGkiLCJpbnRlcnBvbGF0ZUxpbmVhciIsInlpIiwiY2FsY1NjYWxlIiwic3JjVyIsInNyY0giLCJkc3RXIiwiZHN0SCIsIk1hdGgiLCJtdWxNIiwiciIsImkiLCJqIiwiayIsInRyYW5zTSIsIm0iLCJtYXQiLCJkYXRhIiwicyIsImRpc3AiLCJNIiwicHJlZGljdCIsIm51bSIsImwiLCJEIiwiYW0iLCJibSIsInRhIiwiZCIsInAiLCJ2IiwiZ2V0VW5pcXVlIiwic2V0U3BsaW5lUG9pbnRzIiwic3BsaW5lIiwicHMiLCJjb25zb2xlIiwibWFwbDJMIiwibHMiLCJsZW4iLCJuIiwiZiIsImRMIiwiTCIsImRldDIiLCJjIiwic29sdmUyTGluIiwiYTEiLCJiMSIsImEyIiwiYjIiLCJyZXMiLCJkeCIsImlzSW5zaWRlUG9seSIsImRvbmUiLCJjdCIsIm5wIiwicm4iLCJwMCIsInAxIiwiaXAiLCJ0biIsImlzSW5zaWRlQ29udlBvbHkiLCJzZyIsInYybGVuIiwidjIiLCJ2MmRpc3QiLCJ2MjEiLCJ2MjIiLCJjb21wdXRlU3F1YXJlIiwiY29tcHV0ZUludGVycENvZWZzIiwidHJpIiwiY29lZnMiLCJlcHMiLCJNYXRoVXRpbHMiLCJzcGxpdFNwbGluZSIsIk4iLCJvIiwiZGwiLCJnZXRMaW5lYXJJbmRlY2VzIiwiZGVsIiwiZERlbCIsInJlZmluZVBvbHkiLCJwb2x5IiwibWF4RGwiLCJ2MSIsIlV0aWxzIiwibm9ybWFsaXplVXJsIiwidXJsIiwiYmFzZSIsInNwbGl0IiwiZXh0ZW5kcyIsImRlciIsImRlZmF1bHRDbXAiLCJsb3dlckJvdW5kIiwiY21wIiwiaCIsIm1pZCIsIkltYWdlQmFzZSIsImNvbnRleHQiLCJzZXRSZXNvbHV0aW9uIiwiZGlzcG9zZSIsInJlbmRlckJsYW5rUGFnZSIsInJlbmRlckltYWdlIiwiaW1hZ2UiLCJub3JtVG9Db252IiwiaGVpZ2h0IiwicmVuZGVySGl0IiwiY3R4IiwicHVzaEN0eCIsInBvcEN0eCIsInJlbmRlck5vdEZvdW5kUGFnZSIsImZpbmlzaFJlbmRlciIsImZpbmlzaExvYWQiLCJnZXRTaW11bGF0ZWREb2MiLCJyZW5kZXJDYW52YXMiLCJyZW5kZXJDYW52YXNDdHgiLCJFdmVudENvbnZlcnRlciIsInNldEVuYWJsZSIsInZsIiwiZ2V0Q2FsbGJhY2siLCJvYmplY3QiLCJub3RpZnkiLCJlIiwidHlwZSIsImNhbGxiYWNrIiwidmlldyIsInduZCIsImpFIiwiY29udmVydCIsImNvbnZlcnRUb3VjaCIsImNvbnZlcnRNb3VzZSIsIkdyYXBoVXRpbHMiLCJpbnRlcnBvbGF0ZTAxIiwieTEiLCJ5MiIsImdldENvbG9yQnl0ZXMiLCJjb2xvciIsImludmVyc2VDb2xvciIsImJzIiwiaWJzIiwibmJzIiwiY29sb3IyUmdiYSIsImJ5dGVzMlJnYmEiLCJieXRlczJDb2xvciIsIkltYWdlRmFjdG9yeSIsImNhY2hlIiwiYnVpbGQiLCJpbmZvIiwid2lkdGhUZXhlbHMiLCJoZWlnaHRUZXhlbHMiLCJpbmplY3RvciIsInVuZGVmaW5lZCIsIkJvb2tQcm9wc0J1aWxkZXIiLCJjYWxjU2l6ZSIsIndpZHRoIiwic2NhbGUiLCJjYWxjVGV4ZWxzIiwic2hlZXQiLCJjYWxjUHJvcHMiLCJjb3ZlciIsInBhZ2UiLCJjYWxjU2hlZXRzIiwicGFnZXMiLCJnZXRTaGVldHMiLCJnZXRQcm9wcyIsImdldFBhZ2VDYWxsYmFjayIsInJlYWR5IiwiU2hlZXRCbG9jayIsImFuZ2xlIiwic3RhdGUiLCJmaXJzdCIsImxhc3QiLCJwcm9wcyIsImxvYWRlZFBvaW50cyIsIk9iamVjdCIsIm1hcCIsImlzIiwiQXJyYXkiLCJtYXJrZXIiLCJ2ZXJ0ZXgiLCJ1c2UiLCJtYXhEaXN0YW5jZSIsInBvaW50cyIsIk9aIiwiYXhpcyIsImdldFNpemUiLCJzaGVldHMiLCJnZXRUb3BDZXJuZXJzIiwib2ZmIiwiZ2V0VG9wU2l6ZSIsInZzIiwiZ2V0VG9wV29ybGRSb3RhdGlvbiIsInEiLCJnZXRUb3BXb3JsZFBvc2l0aW9uIiwidmkiLCJnZXRJbnRlcnBvbGF0aW9uUG9pbnRzIiwiaW5kcyIsIm1vZCIsIksiLCJzZXQiLCJQSSIsImNsb3NlZEFuZ2xlIiwiYmluZGVyVHVybiIsImhsIiwiaHIiLCJvZmZzZXQiLCJpbkFuZ2xlIiwiaEFuZ2xlIiwic2V0UG9pbnRzIiwibGVmdCIsInJpZ2h0IiwieXMiLCJ6IiwicGxhbmUiLCJub3JtYWwiLCJwbGFuZU9mZnNldCIsInByb2oiLCJkaXN0YW5jZSIsImQyQW5nbGUiLCJwb2ludCIsImludmVyc2UiLCJnZXRQb2ludHNBdEhzIiwiaHMiLCJibCIsInAyIiwiZHAiLCJsbiIsInNwIiwibnBzIiwiZ2V0UG9pbnRzQXRBbmdsZUFuZEhzIiwiZ2V0UG9pbnRzQXRBbmdsZSIsImFuZ2xlcyIsInhwcyIsInlwcyIsImludGVycG9sYXRlIiwibG9hZFBvaW50cyIsIm9wZW5lZEludGVycG9sYXRpb25JbmRlY2VzIiwiY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMiLCJmbGF0SW50ZXJwb2xhdGlvbkluZGVjZXMiLCJpbnRlcnBvbGF0aW9uUG9pbnRzIiwiZ3Jhdml0eSIsImNhY2hlZFBhZ2VzIiwicmVuZGVySW5hY3RpdmVQYWdlcyIsInJlbmRlckluYWN0aXZlUGFnZXNPbk1vYmlsZSIsInJlbmRlcldoaWxlRmxpcHBpbmciLCJwYWdlc0ZvclByZWRpY3RpbmciLCJwcmVsb2FkUGFnZXMiLCJydGwiLCJzdGFydFZlbG9jaXR5IiwiY29ybmVyRGV2aWF0aW9uIiwiZmxleGliaWxpdHkiLCJmbGV4aWJsZUNvcm5lciIsImJlbmRpbmciLCJ3YXZlIiwic2hhcGUiLCJiaW5kZXJUZXh0dXJlIiwiZGVwdGgiLCJwYWRkaW5nIiwibWFzcyIsImNzc0xheWVyUHJvcHMiLCJlbGVtZW50IiwibWF0cml4IiwiY2FtZXJhIiwiZm92Iiwic3R5bGUiLCJvYmplY3RzIiwiZG9tRWxlbWVudCIsImRvY3VtZW50IiwiY2FtZXJhRWxlbWVudCIsImlzSUUiLCJuYXZpZ2F0b3IiLCJfaGVpZ2h0IiwiX3dpZHRoIiwiX3dpZHRoSGFsZiIsIl9oZWlnaHRIYWxmIiwiZWxlbWVudHMiLCJlcHNpbG9uIiwibWF0cml4M2QiLCJnZXRPYmplY3RDU1NNYXRyaXgiLCJjYWNoZWRTdHlsZSIsImdldERpc3RhbmNlVG9TcXVhcmVkIiwicmVuZGVyT2JqZWN0Iiwib2JqZWN0MSIsIm9iamVjdDIiLCJvcmRlciIsInpNYXgiLCJzY2VuZSIsImluZGV4IiwiY2FtZXJhQ1NTTWF0cml4IiwiZ2V0Q2FtZXJhQ1NTTWF0cml4Iiwiek9yZGVyIiwiQ1NTM0RSZW5kZXJlciIsIl9DU1MzRE9iamVjdCIsIl9DU1MzRFNwcml0ZSIsIkNTUzNET2JqZWN0IiwiQ1NTM0RTcHJpdGUiLCJDU1NMYXllciIsImluaXQiLCJkb2MiLCJkZWxheSIsIndpZHRoUHhzIiwiaGVpZ2h0UHhzIiwiY2FsbEludGVybmFsIiwibmFtZSIsImNsZWFySW50ZXJuYWxzIiwic2V0RGF0YSIsImNzcyIsImh0bWwiLCJqcyIsImV2YWwiLCJwZW5kZWRDYWxsIiwiY2xiIiwidGltZXN0YW1wIiwiRGF0ZSIsInNldFRpbWVvdXQiLCJpc0hpZGRlbiIsImhpZGUiLCJyZXNvbHZlIiwiUHJvbWlzZSIsInNob3ciLCJDYWNoZSIsIm1heFNpemUiLCJJbmZpbml0eSIsInNpemVvZiIsImNvdW50U2l6ZW9mIiwiZm9yRWFjaCIsInZhbHVlIiwicmVtb3ZlIiwiZnJlZVNwYWNlIiwiYXJyIiwia2V5IiwicmVjdXJzaW9uU2l6ZW9mIiwic2l6ZSIsImdldFRpbWVzdGFtcCIsImdldCIsInB1dCIsIkNvbnRyb2xsZXIiLCJoYW5kbGVEZWZhdWx0IiwiaWQiLCJkaXNwYXRjaEFzeW5jIiwiRXZlbnREaXNwYXRjaGVyIiwiQ3VzdG9tRXZlbnRDb252ZXJ0ZXIiLCJjdXN0b21UZXN0IiwiZURvYyIsInRlc3QiLCJhZGRDdXN0b20iLCJjdXN0b20iLCJnZXRPYmplY3QiLCJGaW5kZXIiLCJpc0RlbGltZXRyIiwibWVyZ2UiLCJhcyIsInN0cnMiLCJhZGRIaXRzIiwiY2hhcnMiLCJkZWxpbWV0ZXIiLCJsZW5ndGgiLCJhZGRDb250ZXh0IiwiZGVscyIsInByZXZEZWxzIiwiZ2V0SGl0cyIsImdldENvbnRleHRzIiwicGF0dGVybiIsIkRFTElNSVRFUiIsImRlZmF1bHRzIiwiY29udGV4dExlbmd0aCIsImhpdHMiLCJjb250ZXh0cyIsIlBkZiIsImxvYWRlZCIsInRvdGFsIiwicmFuZ2VDaHVua1NpemUiLCJjdXIiLCJvbGQiLCJpc05hTiIsImhhbmRsZXIiLCJnZXRQYWdlVHlwZSIsImdldFBhZ2UiLCJzZXRMb2FkaW5nUHJvZ3Jlc3NDbGIiLCJnZXRQYWdlc051bSIsImdldFBhZ2VTaXplIiwiZ2V0SGFuZGxlciIsIlRocmVlRXZlbnRDb252ZXJ0ZXJGcyIsIm9iamVjdHNUZXN0Iiwib2JqZWN0c0FuZEZhY2VzVGVzdCIsImFkZFRocmVlIiwidGhyZWUiLCJyZW1vdmVUaHJlZSIsImludGVyc2VjdHMiLCJUaHJlZVV0aWxzIiwidmVydGljZXMyVVZzIiwidmVydGljZXMiLCJpbmRlY2VzIiwiY29udmVyQ2xiIiwidmlzIiwiY29tcHV0ZUZhY2VWZXJ0ZXhVdnMiLCJnZW9tZXRyeSIsImZhY2VzIiwidXZzIiwidXZzaSIsImNyZWF0ZU1hcmtlciIsImZpbmRVdlRyaXMiLCJmb3VuZCIsImZpbmRJbnRlcm5hbFZlcnRpY2VzIiwiVGFyZ2V0Iiwib3B0aW9ucyIsInBhcmVudCIsInByb2dyZXNzIiwidyIsInBhZ2VDYWxsYmFjayIsImtXdG9IIiwiY29udGFpbmVycyIsImpDb250YWluZXIiLCJzcmMiLCJwZGYiLCJPIiwic3RhcnQiLCJhcmd1bWVudHMiLCJyZWxhdGl2ZVN0YXJ0IiwiZW5kIiwicmVsYXRpdmVFbmQiLCJmaW5hbCIsImxpc3QiLCJ0aGlzQXJnIiwicHJlZGljYXRlIiwiQXV0b05hdmlnYXRvciIsInVybFBhcmFtIiwibmF2aWdhdGVzIiwiZ2V0UGFyYW1ldGVyQnlOYW1lIiwicmVnZXgiLCJyZXN1bHRzIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZ2V0UGFnZU51bWJlciIsIm51bWJlciIsInBhcnNlSW50IiwiQmluZGVyIiwiYmFja1NpemUiLCJiYWNrTSIsInRleHR1cmUiLCJ0cjEiLCJ0cjIiLCJzZXRMZWZ0Iiwic2V0UmlnaHQiLCJqb2luTGVmdENvdmVyIiwiZGlzY29ubmVjdExlZnRDb3ZlciIsImpvaW5SaWdodENvdmVyIiwiZGlzY29ubmVjdFJpZ2h0Q292ZXIiLCJCb29rIiwidmlzdWFsIiwiem9vbSIsInNpbmdsZVBhZ2UiLCJhdXRvUmVzb2x1dGlvbiIsImVuYWJsZSIsImxhc3RQYWdlIiwicXVlcnkiLCJzZXRUZXh0dXJlIiwidXBkYXRlIiwibGFzdE1vdXNlUG9zIiwicGFnZVgiLCJwYWdlWSIsImJveHMiLCJzZXRBdXRvUmVzb2x1dGlvbiIsInNldFpvb20iLCJzZXRRdWVyeSIsImlzUHJvY2Vzc2luZyIsImdldFBhZ2VzIiwic2V0RmxpcFByb2dyZXNzQ2xiIiwic2V0SW5qZWN0b3IiLCJpc0FjdGl2ZVBhZ2UiLCJnZXRCbG9ja0J5UGFnZSIsImJsb2NrIiwiZ2V0QmxvY2tQYWdlcyIsInJhbmdlIiwiZ2V0VG9wUGFnZXMiLCJnZXRQYWdlU3RhdGUiLCJlbmFibGVMb2FkaW5nQW5pbWF0aW9uIiwiZ2V0TGVmdEZsaXBwaW5nIiwiZ2V0UmlnaHRGbGlwcGluZyIsImdldENsb3NlZEJsb2NrQW5nbGUiLCJvcGVuZWRBbmdsZSIsImZsaXBMZWZ0IiwicHJvZ3Jlc3NDbGIiLCJmbGlwUHJvZ3Jlc3NDbGIiLCJib29rIiwiZmxpcFJpZ2h0IiwiY2xlYXJIb3ZlckluZm8iLCJ4U2VnbWVudCIsImNvbXB1dGVUYXJnZXQiLCJzZWciLCJvblBpY2tDYWxsYmFjayIsIm9uRHJhZ0NhbGxiYWNrIiwib25SZWxlYXNlQ2FsbGJhY2siLCJnZXRGbGlwcGluZyIsImZsaXAiLCJlbmFibGVNb3VzZSIsImNvcm5lckNhbGxiYWNrIiwiaG92ZXJBbmdsZSIsImhvdmVyIiwicG9zc2libGUiLCJzaGVldEJsb2NrcyIsIm5leHRCbG9jayIsInBlbmRpbmdzIiwiYWRkU2hlZXRCbG9jayIsInN1YnNjcmliZVNoZWV0QmxvY2siLCJldmVudENvbnZlcnRlciIsInRhcmdldCIsInJlbW92ZVNoZWV0QmxvY2siLCJyZW1vdmVTaGVldEJsb2NrcyIsImJsb2NrcyIsIm1hdGVyaWFsIiwic2V0UGFnZVRleHR1cmUiLCJzZXRMZWZ0Q292ZXJUZXh0dXJlIiwic2V0UmlnaHRDb3ZlclRleHR1cmUiLCJmaW5pc2hBbmltYXRpb25DbGIiLCJjYWxjQmxvY2tGb3JjZSIsInZlbG9jaXR5IiwiY29ybmVySGVpZ2h0IiwiY2FsY0Jsb2NrQ29ybmVyRm9yY2UiLCJub3RpZnlCZWZvcmVBbmltYXRpb24iLCJub3RpZnlBZnRlckFuaW1hdGlvbiIsImNvbm5lY3RQaHlzaWNzIiwiY292ZXJIZWlnaHQiLCJzaW11bGF0ZUNsYiIsInJlbW92ZUNsYiIsInNwbGl0U2hlZXRCbG9jayIsImxlZnRTaXplIiwibmV3QmxvY2siLCJtZXJnZVNoZWV0QmxvY2tzIiwiZmlyc3RCbG9jayIsImxhc3RCbG9jayIsInNldFNoZWV0QmxvY2tzIiwiY3JlYXRlU2lkZVRleHR1cmUiLCJqQyIsInByZXBhcmVQcm9wcyIsIm1lcmdlUHJvcHMiLCJzZWNvbmQiLCJzaWRlVGV4dHVyZSIsIkJvb2tDb250cm9sbGVyIiwic21hcnRQYW4iLCJzdGF0cyIsImxpZ2h0aW5nIiwiYWN0aXZlU2lkZSIsIm9uU2NyZWVuTW9kZUNoYW5nZWQiLCJvblVwZGF0ZVZpZXciLCJpbml0TG9hZGluZ0FuaW1hdGlvbiIsInZpc2libGUiLCJlbmFibGVOYXZpZ2F0aW9uIiwic2V0VG9jQ3RybCIsInRvY0N0cmwiLCJzZXRQcmludGVyIiwicHJpbnRlciIsInNldFNvdW5kcyIsInNvdW5kcyIsImNhblpvb21JbiIsImNhblpvb21PdXQiLCJjYW5EZWZhdWx0Wm9vbSIsInNldEJvb2tab29tIiwiY21kWm9vbUluIiwiY21kWm9vbU91dCIsImNtZERlZmF1bHRab29tIiwiY21kVG9jIiwiY21kRmFzdEJhY2t3YXJkIiwiY21kQmFja3dhcmQiLCJjbWRGb3J3YXJkIiwiY21kRmFzdEZvcndhcmQiLCJjbWRTYXZlIiwiY21kUHJpbnQiLCJjbWRGdWxsU2NyZWVuIiwiY21kU21hcnRQYW4iLCJjbWRTaW5nbGVQYWdlIiwiY21kU291bmRzIiwiY21kU3RhdHMiLCJjbWRMaWdodGluZ1VwIiwiY21kTGlnaHRpbmdEb3duIiwiZ29Ub1BhZ2UiLCJwYWdlTnVtIiwiY3VycmVudCIsImZsaXBzIiwiY292cyIsImN2Iiwic2V0Q2xiIiwiZmwiLCJ0aW1lIiwic3RhcnRGbGlwIiwiZmxpcFJlcyIsImVuZEZsaXAiLCJnZXRQYWdlRm9yR1VJIiwiaW5wUGFnZSIsInVwZGF0ZVZpZXdJZlN0YXRlIiwidXBkYXRlVmlld1N0YXRlIiwiYWN0aXZlIiwiZW5hYmxlZCIsImZsaXBwZXJzRW5hYmxlIiwibmF2aWdhdGlvbkNvbnRyb2xzIiwidXBkYXRlVmlldyIsImdldEFjdGlvbnMiLCJpc1N3aXBwaW5nIiwiY21kcyIsImFjdGl2YXRlIiwiY21kUGFuTGVmdCIsImNtZFBhblJpZ2h0IiwiY21kUGFuVXAiLCJzcGVlZCIsImNtZFBhbkRvd24iLCJtb3VzZUNtZFJvdGF0ZSIsInJvdGF0ZSIsIm1vdXNlQ21kRHJhZ1pvb20iLCJtb3VzZUNtZFBhbiIsInBhbiIsIm1vdXNlQ21kV2hlZWxab29tIiwidG91Y2hDbWRSb3RhdGUiLCJ0b3VjaENtZFpvb20iLCJ0b3VjaENtZFBhbiIsInRvdWNoQ21kU3dpcGUiLCJ0b3VjaCIsImhhbmRsZWQiLCJ4MCIsInkwIiwid2lkU2V0dGluZ3MiLCJiaW5kQWN0aW9ucyIsImFjdGlvbiIsImZsYWdzIiwic2V0QWN0aW9ucyIsImFjdGlvbnMiLCJCb29rUHJpbnRlciIsImNhbmNlbCIsInByaW50IiwicHJpbnRXbmQiLCJjYWxsTWFudWFsbHkiLCJwcmludERvYyIsImNvbnRlbnQiLCJyZW5kZXJDb250ZW50IiwiaGVhZCIsImJvZHkiLCJ3cmFwIiwicmVuZGVySHRtbCIsImxpbmtzIiwibGluayIsImhyZWYiLCJyZWplY3QiLCJyZW5kZXJIZWFkIiwidXNlSUZyYW1lIiwiaXNDaHJvbWl1bSIsIndpbk5hdiIsInZlbmRvck5hbWUiLCJpc0lFZWRnZSIsImlzSU9TQ2hyb21lIiwiZGVmYXVsdFN0eWxlU2hlZXQiLCJCb29rVmlldyIsImluaXRWaWV3IiwiZ2V0SGFuZGxlcnMiLCJoYW5kbGVycyIsIm9uSXRlbVN0YXRlQ2hhbmdlZCIsImdldFZpZXciLCJnZXRCb29rbWFya3NWaWV3IiwiZ2V0VGh1bWJuYWlsc1ZpZXciLCJnZXRTZWFyY2hWaWV3IiwiZ2V0Rm9ybXMiLCJnZXRMaW5rcyIsImdldFdpZGdldHMiLCJnZXRJbnB1dHMiLCJnZXRUZXh0cyIsImdldFRlbXBsYXRlIiwic3R5bGVzIiwicmVsIiwic2NyaXB0IiwiUEFHRV9IQU5ETEVSX0RFTEFZIiwiQ2xiQm9va1Byb3BzQnVpbGRlciIsIkNvdmVyIiwiQ3NzTGF5ZXJzTWFuYWdlciIsImdldEFjdGl2ZXMiLCJsYXllcnMiLCJzbCIsIndhaXQiLCJQYWdlTWFuYWdlciIsImRpc3BhdGNoRXZlbnQiLCJjcmVhdGVMb2FkaW5nVGV4dHVyZSIsInNwcml0ZVRpbGVzIiwiYW5pbWF0aW9uIiwiYW5pbWF0b3IiLCJpc0NvdmVyIiwiaXNNb2JpbGUiLCJsb2FkaW5nIiwicmVtb3ZlRnJvbUxvYWRpbmdzIiwicmVtb3ZlRnJvbVJlbmRlclF1ZXVlIiwicmVmcmVzaFBhZ2VRdWVyeSIsInJlZnJlc2hab29tIiwiZXMiLCJnZXRMYXllcnMiLCJhcmdzIiwicmVzb2x2ZVBlbmRpbmdzIiwicnRsUGFnZU4iLCJsb2FkIiwicGkiLCJ3cmFwcGVyIiwibG9ja2VkIiwiaXNBY3RpdmUiLCJpc1RvcCIsImlzU2luZ2xlUGFnZSIsImNhbGNSZXNvbHV0aW9uIiwicHVzaEluUmVuZGVyUXVldWUiLCJ1cGRhdGVSZW5kZXJRdWV1ZSIsInRvcCIsInR1cm5PbkV2ZW50cyIsInR1cm5PZmZFdmVudHMiLCJtb3VzZXVwIiwibW91c2VvdXQiLCJlbnQiLCJ0cmFuc2ZlckV2ZW50VG9UZXh0dXJlIiwidG9PYmplY3QiLCJ1diIsImxvYWRQcmVkaWN0ZWRQYWdlcyIsImFkZFBhZ2VSZXF1ZXN0Iiwic2V0TWF0ZXJpYWwiLCJvYiIsInNldHVwTWF0ZXJpYWwiLCJnZXRPckxvYWRUZXh0dXJlT2JqZWN0IiwiUGRmQm9va1Byb3BzQnVpbGRlciIsImludGVyYWN0aXZlIiwiUGRmTGlua3NIYW5kbGVyIiwic2V0SGFuZGxlciIsImRlZmF1bHRIYW5kbGVyIiwiZGVzdGluYXRpb24iLCJjYWxsSGFuZGxlcnMiLCJoYW5kbGVFdmVudCIsImFubm8iLCJkZXN0UHJvbWlzZSIsImRlc3QiLCJTZWFyY2hFbmdpbmUiLCJwcm9jZXNzIiwic3RhbXAiLCJmaW5kIiwibmV4dCIsIml0ZW0iLCJTaGVldENzc0xheWVyIiwiU2hlZXRQaHlzaWNzIiwidGFyZ2V0Rm9yY2VDbGIiLCJjaCIsImhvdmVyQ29ybmVyRm9yY2VDbGIiLCJnZXRUYXJnZXRGb3JjZUNsYiIsInRhcmdldEFuZ2xlIiwiZyIsInRsIiwiZHJhZ0ZvcmNlQ2xiIiwiZHJhZ0Nvcm5lckZvcmNlQ2xiIiwiZ2V0RHJhZ0Nvcm5lckZvcmNlQ2xiIiwiZnBzIiwic3RhcnREdCIsIm1hcmdpbiIsImluZk0iLCJhdHRlbXB0cyIsIm1heEl0ZXJhdGlvbnMiLCJhZGRPYmplY3QiLCJmb3JjZUNsYiIsImNvcm5lckZvcmNlQ2xiIiwibm8iLCJjZiIsImZsYnQiLCJnZXRQYXJhbWV0ck1hcCIsInNldFBhcmFtZXRyIiwiZ2V0UGFyYW1ldHIiLCJzaW11bGF0ZSIsIlQiLCJhdHRlbXB0IiwiaXQiLCJub3MiLCJjaSIsInNjb3MiLCJncyIsImkwIiwicmVtb3ZlU3RhdGljcyIsImZpbmRBbmRTb2x2ZUNvcm5lckNvbGxpc2lvbnMiLCJvcyIsImFsIiwiZENoIiwiZHYiLCJzb2x2ZUNvbGxpc2lvbiIsIm1tIiwiYXYiLCJidiIsImZpbmRDb2xsaXNpb25zIiwiYWxsIiwiaXNDb2xsaXNpb24iLCJpbnRlZ3JhdGUiLCJTb3VuZHNFbnZpcm9tZW50IiwidGVtcGxhdGUiLCJzZXRFbmFibGVkIiwidG9nbGUiLCJzdWJzY3JpYmVGbGlwcyIsImVtaXR0ZXIiLCJUb2NDb250cm9sbGVyIiwic2V0VGh1bWJuYWlscyIsInRodW1ibmFpbHMiLCJzZXRTZWFyY2giLCJzZWFyY2giLCJzZXRCb29rbWFya3MiLCJib29rbWFya3MiLCJjbWRCb29rbWFya3MiLCJjbWRUaHVtYm5haWxzIiwiY21kU2VhcmNoIiwiY21kQ2xvc2VUb2MiLCJuYXZpZ2F0ZVRodW1ibmFpbHMiLCJuYXZpZ2F0ZVNlYXJjaCIsIm5hdmlnYXRlQm9va21hcmtzIiwicmVzWCIsInJlc1kiLCJyZXNaIiwiZnJvbnRHZW9tZXRyeSIsImJhY2tHZW9tZXRyeSIsImxlZnRHZW9tZXRyeSIsInJpZ2h0R2VvbWV0cnkiLCJ0b3BHZW9tZXRyeSIsImJvdHRvbUdlb21ldHJ5IiwiYWRkRmFjZXMiLCJtYXBWZXJ0aWNlcyIsImVxIiwiZHN0IiwiZnJvbnRNYXAiLCJiYWNrTWFwIiwibGVmdE1hcCIsInJpZ2h0TWFwIiwibW91c2VCdXR0b25zIiwiTGVmdCIsIk1pZGRsZSIsIlJpZ2h0Iiwic2tpbiIsImRlZmF1bHQiLCJtaW4iLCJtYXgiLCJsZXZlbHMiLCJsb2FkaW5nQW5pbWF0aW9uIiwiY29lZmZpY2llbnQiLCJjb2RlIiwiYWN0aXZlRm9yTW9iaWxlIiwiQmxhbmtJbWFnZSIsIkJvb2ttYXJrcyIsImdldFRpdGxlIiwiZ2V0SXRlbXMiLCJsaSIsImNvbnRhaW5lciIsImNtZCIsIm5vZGUiLCJub2RlcyIsImV4cGFuZCIsIm1pbmltaXplIiwicmVuZGVyTm9kZSIsInJlbmRlck5vZGVzIiwibWFwTm9kZXMiLCJpdGVtcyIsImxldmVsIiwidGl0bGUiLCJtaW5pbWl6ZWQiLCJjaGlsZHJlbiIsIkRldGVjdG9yIiwiZ2V0V2ViR0xFcnJvck1lc3NhZ2UiLCJhZGRHZXRXZWJHTE1lc3NhZ2UiLCJwYXJhbWV0ZXJzIiwiY2FudmFzIiwiQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIiwid2ViZ2wiLCJ3b3JrZXJzIiwiV29ya2VyIiwiZmlsZWFwaSIsIkJsb2IiLCJEb2NNb3VzZVNpbXVsYXRvciIsImJFbGVtZW50IiwiakZyYW1lIiwidGVybXMiLCJyZXBsYWNlIiwiSE9WRVIiLCJBQ1RJVkUiLCJzcyIsImNzc1RleHQiLCJ0ZXJtIiwiY29udmVydENvb3JkcyIsImpFbGVtZW50IiwidHJpZ2dlckV2ZW50IiwiYWR2YW5jZWRQcm9wcyIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJlbnRlckVsZW1lbnQiLCJsZWF2ZUVsZW1lbnQiLCJhY3RpdmF0ZUVsZW1lbnQiLCJkZWFjdGl2YXRlRWxlbWVudCIsImFkZERvY0NoYW5nZUNsYiIsImVsZW1lbnRGcm9tUG9pbnQiLCJjaGlsZCIsImdldEVsZW1lbnQiLCJvZmYwIiwidHJpZ2dlciIsImxlYXZlZCIsInJlbGF0ZWRUYXJnZXQiLCJnZXREZWZhdWx0VW5kZWZpbmVkUHJvcGVydGllcyIsImdldERlZmF1bHRSZXNlbmRQcm9wZXJ0aWVzIiwiRG9tMkltYWdlIiwic2VsZiIsInV0aWwiLCJpbmxpbmVyIiwiZm9udEZhY2VzIiwiaW1hZ2VzIiwiY2xvbmVOb2RlIiwibWFrZVN2Z0RhdGFVcmkiLCJjbG9uZSIsImRyYXciLCJuZXdDYW52YXMiLCJmaWx0ZXIiLCJjbG9uZUNoaWxkcmVuIiwicHJvY2Vzc0Nsb25lIiwib3JpZ2luYWwiLCJjb3B5U3R5bGUiLCJzb3VyY2UiLCJjb3B5UHJvcGVydGllcyIsImNsb25lUHNldWRvRWxlbWVudCIsImNsYXNzTmFtZSIsInN0eWxlRWxlbWVudCIsImZvcm1hdFBzZXVkb0VsZW1lbnRTdHlsZSIsInNlbGVjdG9yIiwiZm9ybWF0Q3NzVGV4dCIsImZvcm1hdENzc1Byb3BlcnRpZXMiLCJzdHlsZU5vZGUiLCJlc2NhcGUiLCJwYXJzZUV4dGVuc2lvbiIsIm1pbWVUeXBlIiwiZGF0YUFzVXJsIiwiaXNEYXRhVXJsIiwiY2FudmFzVG9CbG9iIiwicmVzb2x2ZVVybCIsImdldEFuZEVuY29kZSIsInVpZCIsImFzQXJyYXkiLCJlc2NhcGVYaHRtbCIsIm1ha2VJbWFnZSIsImlzRWxlbWVudCIsImlzQ2FudmFzIiwiaXNUZXh0QXJlYSIsImlzSW5wdXQiLCJpc1NWRyIsImlzU1ZHUmVjdCIsImlzSW1hZ2UiLCJXT0ZGIiwiSlBFRyIsIm1hdGNoIiwiZXh0ZW5zaW9uIiwibWltZXMiLCJiaW5hcnlTdHJpbmciLCJiaW5hcnlBcnJheSIsInRvQmxvYiIsIlRJTUVPVVQiLCJyZXF1ZXN0IiwiZmFpbCIsImVuY29kZXIiLCJzdHJpbmciLCJhcnJheSIsImFycmF5TGlrZSIsImxlZnRCb3JkZXIiLCJweCIsInJpZ2h0Qm9yZGVyIiwidG9wQm9yZGVyIiwiYm90dG9tQm9yZGVyIiwicGFyc2VGbG9hdCIsIlVSTF9SRUdFWCIsImlubGluZUFsbCIsInNob3VsZFByb2Nlc3MiLCJpbXBsIiwicmVhZFVybHMiLCJpbmxpbmUiLCJyZXN1bHQiLCJiYXNlVXJsIiwidXJsQXNSZWdleCIsInVybHMiLCJyZXNvbHZlQWxsIiwicmVhZEFsbCIsIndlYkZvbnQiLCJjc3NTdHJpbmdzIiwicnVsZXMiLCJydWxlIiwiQ1NTUnVsZSIsImNzc1J1bGVzIiwic3R5bGVTaGVldHMiLCJ3ZWJGb250UnVsZSIsIm5ld0ltYWdlIiwiYmFja2dyb3VuZCIsIkRyYWciLCJvbk1vdXNlTW92ZSIsIm9uTW91c2VEb3duIiwib25Nb3VzZVVwIiwic2V0Q29vcmRzRnJvbUV2ZW50Iiwic2VsZWN0ZWQiLCJFdmVudHNUb0FjdGlvbnMiLCJnZXRFdmVudEZsYWdzIiwiZ2V0UG9zaXRpb24iLCJ0b3VjaGVzIiwiY29udGV4dE1lbnUiLCJtb3VzZURvd24iLCJtb3VzZU1vdmUiLCJtb3VzZVVwIiwibW91c2VXaGVlbCIsIm1vdXNlTW92ZURvYyIsIm1vdXNlVXBEb2MiLCJjbGljayIsImRibGNsaWNrIiwidG91Y2hTdGFydCIsInRvdWNoTW92ZSIsInRvdWNoRW5kIiwia2V5RG93biIsImtleVByZXNzIiwia2V5VXAiLCJhZGRBY3Rpb24iLCJmaXJlQWN0aW9ucyIsImNsaWNrcyIsInRvdWNoUGljayIsInBvcyIsIm1vZEtleXMiLCJDdHJsIiwiU2hpZnQiLCJBbHQiLCJGdWxsU2NyZWVuIiwiYXZhaWxhYmxlIiwiYWN0aXZhdGVkIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJfaGFzV2Via2l0RnVsbFNjcmVlbiIsIndlYmtpdENhbmNlbEZ1bGxTY3JlZW4iLCJfaGFzTW96RnVsbFNjcmVlbiIsIm1vekNhbmNlbEZ1bGxTY3JlZW4iLCJfaGFzTXNGdWxsc2NyZWVuIiwibXNSZXF1ZXN0RnVsbHNjcmVlbiIsIkludGVyYWN0aXZlSW1hZ2UiLCJyZW5kZXIiLCJ0aW1lb3V0IiwiTG9hZGluZ0FuaW1hdGlvbiIsImNhbGNUaW1lVG8iLCJkYSIsIl9hIiwiX3IiLCJjeCIsImN5IiwibngiLCJueSIsImdldEltYWdlIiwiY3JlYXRlU3ByaXRlIiwidXBkYXRlSW50ZXJ2YWwiLCJMb2FkaW5nQ29udHJvbGxlciIsInNob3dQcm9ncmVzcyIsImxvYWRpbmdNc2ciLCJkZWZhdWx0TG9hZGluZ01zZyIsInNldFByb2dyZXNzIiwiTW91c2VFdmVudENvbnZlcnRlciIsIk9iamVjdDNEV2F0Y2hlciIsInRlc3RTY2FsZSIsInZ4IiwidnkiLCJib3giLCJtb3ZlUGFuIiwidlRvQ2FtZXJhIiwiY29tcHV0ZUNsaWVudEJvdW5kQm94IiwieHMiLCJ6cyIsInNldE9iamVjdCIsImJvdW5kQm94Q2xiIiwiY29tcHV0ZUNvcnIiLCJjb3JyIiwiZ2V0U2NhbGUiLCJLeCIsIkt5IiwiY2VudGVyVmlldyIsIlkiLCJ0ZiIsInZkIiwiT3JiaXQiLCJzcGhlcmljYWwiLCJzY29wZSIsInpvb21TcGVlZCIsIl9zcGVlZCIsImRvbGx5SW4iLCJkb2xseU91dCIsInF1YXQiLCJxdWF0SW52ZXJzZSIsImxhc3RQb3NpdGlvbiIsImxhc3RRdWF0ZXJuaW9uIiwicG9zaXRpb24iLCJyb3RhdGVMZWZ0Iiwic3BoZXJpY2FsRGVsdGEiLCJwYW5PZmZzZXQiLCJ6b29tQ2hhbmdlZCIsImNoYW5nZUV2ZW50IiwiRVBTIiwicGFuTGVmdCIsInBhblVwIiwidGFyZ2V0RGlzdGFuY2UiLCJkZWx0YVgiLCJkZWx0YVkiLCJyb3RhdGVVcCIsImV2ZW50Iiwib2Zmc2V0RG9sbHkiLCJ3aGVlbERvbGx5IiwiUGRmSW1hZ2UiLCJ0cmFuc2Zvcm0iLCJyZWN0U2l6ZSIsImNyZWF0ZVBvbHkiLCJzZXRBbm5vdGF0aW9ucyIsImFubm9zIiwidGFyZ2V0cyIsInJlY3QiLCJhUG9zIiwiYVN6Iiwic2V0SGl0cyIsInRleHRDb250ZW50IiwicmVuZGVySGl0cyIsInRlc3RTeiIsInRleHREaXYiLCJiYXNlT2Zmc2V0IiwiaGl0IiwiZm9udEhlaWdodCIsImZvbnRBc2NlbnQiLCJ0ZXN0U3BhbiIsIml3aWR0aCIsInJlbGF0aXZlT2Zmc2V0IiwiYW5ub0NsYiIsImFubm90YXRpb24iLCJjYWxjVmlld3BvcnQiLCJjYW52YXNDb250ZXh0Iiwidmlld3BvcnQiLCJTZWFyY2giLCJuYXZpZ2F0ZSIsImRvUXVlcnkiLCJxdWVyeVN0YW1wIiwic2V0UmVzdWx0cyIsImh0bWxzIiwiU3RhdGljSW1hZ2UiLCJUZXh0dXJlQW5pbWF0b3IiLCJtaWxsaVNlYyIsImN1cnJlbnRDb2x1bW4iLCJjdXJyZW50Um93IiwiaW1nIiwiVGhyZWVNb3VzZUV2ZW50Q29udmVydGVyIiwidmlzdWFsV29ybGQiLCJUaHJlZVRvdWNoRXZlbnRDb252ZXJ0ZXIiLCJUaHVtYm5haWxzIiwiaGVhZGluZyIsInRodW1ibmFpbCIsImdldEFjdGl2ZSIsInNldEltYWdlIiwiVG91Y2hDb252ZXJ0ZXIiLCJWaWV3IiwiY2xhc3NQcm9wZXJ0eSIsImN0cmwiLCJhdHRyaWJ1dGVQcm9wZXJ0eSIsImF0dHJpYnV0ZU5hbWUiLCJoYW5kbGVMaW5rRXZlbnQiLCJoYW5kbGVJbnB1dEV2ZW50IiwiaGFuZGxlRm9ybUV2ZW50IiwiY2FsbExhdGVyIiwibXMiLCJwZW5kaW5nIiwibG9hZEZpbGVzIiwiZmlsZXMiLCJ0YXNrcyIsInVybFJlc29sdmVyIiwicGFydHMiLCJwYXJ0Iiwib2JqVG9BdHRyc1N0ciIsImNoZWNrSWZyYW1lU2l6ZSIsIm9uUmVzaXplIiwidHJhbnNsYXRlIiwiZmlyZUxpbmtzT25Mb2FkRXZlbnQiLCJqTGluayIsInRleHRDc3MiLCJzZXR0ZXIiLCJnZXRDb250YWluZXIiLCJnZXRQYXJlbnRDb250YWluZXIiLCJhZGRIYW5kbGVyIiwic2V0Q29udHJvbFN0YXRlIiwic3RhdGVIYW5kbGVycyIsInN0Iiwic2V0TGlua0NvbnRyb2xTdGF0ZSIsInNldFdpZGdldENvbnRyb2xTdGF0ZSIsInNldElucHV0Q29udHJvbFN0YXRlIiwic2V0VGV4dENvbnRyb2xTdGF0ZSIsInNldFN0YXRlIiwibGlua1N0YXRlSGFuZGxlcnMiLCJ3aWRnZXRTdGF0ZUhhbmRsZXJzIiwiaW5wdXRTdGF0ZUhhbmRsZXJzIiwidGV4dFN0YXRlSGFuZGxlcnMiLCJWaXN1YWxXb3JsZCIsInVzZUhlbHBlcnMiLCJhbHBoYSIsImFudGlhbGlhcyIsImNzc1NjZW5lIiwidG1wVmVjdG9yIiwib25XaW5kb3dSZXNpemUiLCJhbmltYXRlIiwiZmlsdGVyRGF0YSIsInR5cGVzIiwiY29udGFpbnMiLCJzZXRFeHRyYUxpZ2h0aW5nIiwiZ2V0T3JiaXQiLCJzZXRDb250cm9sc1N0YXRlIiwiZ2V0Q29udHJvbHNTdGF0ZSIsInVwZGF0ZUNhbWVyYSIsInVwZGF0ZVJlbmRlcmVyIiwicmVuZGVyZXIiLCJhZGRDc3NPYmplY3QiLCJyZW1vdmVDc3NPYmplY3QiLCJyZW1vdmVPYmplY3QiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJhZGRSZW5kZXJDYWxsYmFjayIsInJlbW92ZVJlbmRlckNhbGxiYWNrIiwiZGVsdGFUaW1lIiwicHJvY2Vzc0dlb21ldHJ5IiwiYnVmR2VvbWV0cnkiLCJtZXNoIiwiaW5kZXhlZEJ1ZmZlckdlb20iLCJjcmVhdGVJbmRleGVkQnVmZmVyR2VvbWV0cnlGcm9tR2VvbWV0cnkiLCJudW1WZXJ0aWNlcyIsIm51bUZhY2VzIiwiYnVmZmVyR2VvbSIsImluZGljZXMiLCJpMyIsImlzRXF1YWwiLCJ4MSIsInoxIiwieDIiLCJ6MiIsImRlbHRhIiwibWFwSW5kaWNlcyIsImlkeFZlcnRpY2VzIiwibnVtSWR4VmVydGljZXMiLCJhc3NvY2lhdGlvbiIsImozIiwib25lTm9kZVBvc2l0aW9uQ2FsbGJhY2siLCJtdWx0eU5vZGVQb3NpdGlvbkNhbGxiYWNrIiwidm9sdW1lUG9zaXRpb25zIiwidm9sdW1lTm9ybWFscyIsImFzc29jVmVydGV4IiwiaW5kZXhWZXJ0ZXgiLCJtdWx0eU5vZGVQb3NpdGlvblBvc3RDYWxsYmFjayIsInBhdGhQb3NpdGlvbkNhbGxiYWNrIiwicG9zaXRpb25zIiwicGF0aFBvc2l0aW9uUG9zdENhbGxiYWNrIiwiV2lkZ2V0Q29udHJvbGxlciIsImZpcmVDaGFuZ2UiLCJDaXJjbGVUYXJnZXQiLCJ0ZXN0SW50ZXJzZWN0aW9uIiwiUG9seVRhcmdldCIsImpRdWVyeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtREFBMkMsY0FBYzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoRUE7O0FBQ0EsbUJBQUFBLENBQVEsQ0FBUjs7Ozs7Ozs7Ozs7Ozs7O0FDREEsVSxDQUFBO0FBQ0E7O0FBRUEsVSxDQUFBO0FBQ0E7O0FBRUEsWUFGQSxDQUVBO0FBQ0E7QUFDQTs7QUFFQSxZQU5BLENBTUE7QUFDQTtBQUNBLHlCQURBO0FBRUEsc0JBRkE7QUFHQTtBQUNBLGNBSkE7O0FBTUEsWUFiQSxDQWFBO0FBQ0E7O0FBRUEsWUFoQkEsQ0FnQkE7QUFDQTs7QUFFQSxZQW5CQSxDQW1CQTtBQUNBO0FBQ0E7QUFBQTs7O0FBR0EsVSxDQUFBO0FBQ0E7O0FBRUEsVSxDQUFBO0FBQ0E7O0FBRUEsVSxDQUFBO0FBQ0E7QUFBMkM7QUFBYyxHQUF6RDs7QUFFQSxVLENBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FEQTtBQUVBLGdDQUZBO0FBR0E7QUFDQSxnQkFKQTtBQUtBO0FBQUE7QUFDQTtBQUFBLEdBUkE7O0FBVUEsVSxDQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQTJCO0FBQTRCLEtBRHZEO0FBRUE7QUFBaUM7QUFBZSxLQUZoRDtBQUdBO0FBQ0E7QUFDQTtBQUFBLEdBTkE7O0FBUUEsVSxDQUFBO0FBQ0E7QUFBc0Q7QUFBK0QsR0FBckg7O0FBRUEsVSxDQUFBO0FBQ0E7O0FBRUEsVSxDQUFBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2hFQSxNQUFNQyxLQUFLLE9BQW9CQyxPQUFwQixTQUFtQ0YsUUFBOUMsUUFBOENBLENBQTlDO0FBQUEsTUFDTUcsZUFBZSxPQUF5QkQsT0FBekIsY0FBNkNGLFFBRGxFLGFBQ2tFQSxDQURsRTtBQUFBLE1BRU1JLFNBQVMsT0FBbUJGLE9BQW5CLFFBQWlDRixRQUZoRCxPQUVnREEsQ0FGaEQ7QUFBQSxNQUdNSyxTQUFTLE9BQW1CSCxPQUFuQixRQUFpQ0YsUUFIaEQsT0FHZ0RBLENBSGhEO0FBQUEsTUFJTU0sWUFBWSxPQUFtQkosT0FBbkIsV0FBb0NGLFFBSnRELFdBSXNEQSxDQUp0RDtBQUFBLE1BS01PLFNBQVMsT0FBbUJMLE9BQW5CLFFBQWlDRixRQUxoRCxPQUtnREEsQ0FMaEQ7QUFBQSxNQU1NUSxNQUFNLFNBQU5BLEdBQU07QUFBQSxXQUFNLENBQUNOLHNCQUFELFVBQWlDQSxzQkFBakMsQ0FBaUNBLENBQWpDLElBQU47QUFOWjs7VUFTUU8sQyxHQUFOUixFO1VBQ2dCUyxXLEdBQWhCUCxZO1VBQ1VRLEssR0FBVlAsTTtVQUNVUSxLLEdBQVZQLE07VUFDYVEsUSxHQUFiUCxTO1VBQ1VRLEssR0FBVlAsTTtVQUNPUSxFLEdBQVBQLEc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmRixNQUFNUCxLQUFLLE9BQW9CQyxPQUFwQixTQUFtQ0YsUUFBOUMsUUFBOENBLENBQTlDO0FBQUEsTUFDTUcsZUFBZSxPQUF5QkQsT0FBekIsY0FBNkNGLFFBRGxFLGFBQ2tFQSxDQURsRTtBQUFBLE1BRU1JLFNBQVMsT0FBbUJGLE9BQW5CLFFBQWlDRixRQUZoRCxPQUVnREEsQ0FGaEQ7QUFBQSxNQUdNTyxTQUFTLE9BQW1CTCxPQUFuQixRQUFpQ0YsUUFIaEQsT0FHZ0RBLENBSGhEO0FBQUEsTUFJTVEsTUFBTSxTQUFOQSxHQUFNO0FBQUEsV0FBTSxDQUFDTixzQkFBRCxVQUFpQ0Esc0JBQWpDLENBQWlDQSxDQUFqQyxJQUFOO0FBSlo7O0FBTUEsTUFBR0EsT0FBSCxhQUF1QjtBQUNyQkEsc0NBQ0tBLE9BRExBO0FBRUVhLFVBQUk7QUFBQSxlQUFNLENBQUNDLDBCQUFELFVBQU47QUFBQTtBQUZOZDtBQUlEOztVQUdPTyxDLEdBQU5SLEU7VUFDZ0JTLFcsR0FBaEJQLFk7VUFDVVEsSyxHQUFWUCxNO1VBQ1VVLEssR0FBVlAsTTtVQUNPUSxFLEdBQVBQLEc7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQ2xCbUJTLGdCOzs7OztrQkFJWkMsSSxpQkFBS0MsRSxFQUFHQyxDLEVBQUVDLEUsRUFBR0MsQyxFQUFHO0FBQ3JCLGFBQU8sQ0FDTEgsS0FBR0MsRUFBSEQsQ0FBR0MsQ0FBSEQsR0FBUUUsS0FBR0MsRUFEYixDQUNhQSxDQUROLENBQVA7OztrQkFLS0MsSSxpQkFBS0osRSxFQUFHQyxDLEVBQUVDLEUsRUFBR0MsQyxFQUFHO0FBQ3JCLGFBQU8sQ0FDTEgsS0FBR0MsRUFBSEQsQ0FBR0MsQ0FBSEQsR0FBUUUsS0FBR0MsRUFETixDQUNNQSxDQUROLEVBRUxILEtBQUdDLEVBQUhELENBQUdDLENBQUhELEdBQVFFLEtBQUdDLEVBRmIsQ0FFYUEsQ0FGTixDQUFQOzs7a0JBTUtFLEksaUJBQUtMLEUsRUFBR0MsQyxFQUFFQyxFLEVBQUdDLEMsRUFBRztBQUNyQixhQUFPLENBQ0xILEtBQUdDLEVBQUhELENBQUdDLENBQUhELEdBQVFFLEtBQUdDLEVBRE4sQ0FDTUEsQ0FETixFQUVMSCxLQUFHQyxFQUFIRCxDQUFHQyxDQUFIRCxHQUFRRSxLQUFHQyxFQUZOLENBRU1BLENBRk4sRUFHTEgsS0FBR0MsRUFBSEQsQ0FBR0MsQ0FBSEQsR0FBUUUsS0FBR0MsRUFIYixDQUdhQSxDQUhOLENBQVA7OztrQkFPS0csSSxpQkFBS04sRSxFQUFHQyxDLEVBQUVDLEUsRUFBR0MsQyxFQUFHO0FBQ3JCLGFBQU8sQ0FDTEgsS0FBR0MsRUFBSEQsQ0FBR0MsQ0FBSEQsR0FBUUUsS0FBR0MsRUFETixDQUNNQSxDQUROLEVBRUxILEtBQUdDLEVBQUhELENBQUdDLENBQUhELEdBQVFFLEtBQUdDLEVBRk4sQ0FFTUEsQ0FGTixFQUdMSCxLQUFHQyxFQUFIRCxDQUFHQyxDQUFIRCxHQUFRRSxLQUFHQyxFQUhOLENBR01BLENBSE4sRUFJTEgsS0FBR0MsRUFBSEQsQ0FBR0MsQ0FBSEQsR0FBUUUsS0FBR0MsRUFKYixDQUlhQSxDQUpOLENBQVA7OztrQkFRS0ksRyxnQkFBSUMsRSxFQUFJQyxDLEVBQUdDLEUsRUFBSUMsQyxFQUFzQztBQUFBLFVBQW5DQyxNQUFtQyxvRUFBL0JkLGtCQUFrQmEsV0FBbEJiLEVBQStCOztBQUMxRCxVQUFNZSxLQUFHTCxNQUFULENBQVNBLENBQVQ7QUFBQSxVQUNNTSxLQUFHTixHQUFHQyxJQUFFQyxLQUFMRixHQUFVSSxVQUFRRixLQUFSRSxHQURuQixFQUNtQkEsQ0FBVkosQ0FEVDtBQUFBLFVBRU1PLEtBQUdQLEdBQUdDLElBQUVDLEtBQUxGLEdBQVVJLFVBQVFGLEtBQVJFLEdBRm5CLEVBRW1CQSxDQUFWSixDQUZUO0FBQUEsVUFHTVEsS0FBR1IsR0FBR0MsSUFBSEQsSUFBUUksY0FIakIsRUFHaUJBLENBQVJKLENBSFQ7QUFJQSxhQUFPSSxVQUFRRixLQUFSRSxHQUFhQSxPQUFNQSxjQUFOQSxFQUFNQSxDQUFOQSxLQUF1QkEsY0FBM0MsRUFBMkNBLENBQXZCQSxDQUFiQSxDQUFQOzs7a0JBR0tLLGlCLDhCQUFrQkMsQyxFQUFFUCxDLEVBQUVRLEUsRUFBSTtBQUMvQixhQUFPUixPQUFLLENBQUNBLE9BQUtBLEVBQU4sQ0FBTUEsQ0FBTixLQUFhTyxPQUFLQSxFQUFsQixDQUFrQkEsQ0FBbEIsS0FBeUJDLEtBQUdELEVBQXhDLENBQXdDQSxDQUE1QixDQUFaOzs7a0JBR0tFLGlCLDhCQUFrQkYsQyxFQUFFUCxDLEVBQUVRLEUsRUFBSTtBQUMvQixVQUFJRSxVQUFKO0FBQ0EsVUFBR0gsT0FBS0EsRUFBUixDQUFRQSxDQUFSLEVBQWM7QUFDWkEsWUFBRUEsRUFBRkEsT0FBRUEsRUFBRkE7QUFDQVAsWUFBRUEsRUFBRkEsT0FBRUEsRUFBRkE7QUFDRDtBQUNELFVBQUdRLEtBQUdELEVBQU4sQ0FBTUEsQ0FBTixFQUFZO0FBQ1ZHLGFBQUdWLEVBQUhVLENBQUdWLENBQUhVO0FBREYsYUFHSyxJQUFHRixLQUFHRCxFQUFOLENBQU1BLENBQU4sRUFBWTtBQUNmRyxhQUFHVixFQUFIVSxDQUFHVixDQUFIVTtBQURHLGFBR0E7QUFDSEEsYUFBR3ZCLHNDQUFIdUIsRUFBR3ZCLENBQUh1QjtBQUNEO0FBQ0Q7OztrQkFHS0MsUyxzQkFBVUMsSSxFQUFNQyxJLEVBQU1DLEksRUFBTUMsSSxFQUFNO0FBQ3ZDLGFBQU9DLFNBQVNGLE9BQVRFLE1BQW9CRCxPQUEzQixJQUFPQyxDQUFQOzs7a0JBR0tDLEksaUJBQUszQixDLEVBQUdFLEMsRUFBRztBQUNoQixVQUFNMEIsSUFBTjtBQUNBLFdBQUksSUFBSUMsSUFBUixHQUFZQSxJQUFFN0IsRUFBZCxRQUF1QixFQUF2QixHQUE0QjtBQUMxQjRCO0FBQ0EsYUFBSSxJQUFJRSxJQUFSLEdBQVlBLElBQUU1QixLQUFkLFFBQTBCLEVBQTFCLEdBQStCO0FBQzdCMEI7QUFDQSxlQUFJLElBQUlHLElBQVIsR0FBWUEsSUFBRTdCLEVBQWQsUUFBdUIsRUFBdkIsR0FBNEI7QUFDMUIwQix1QkFBUzVCLFVBQVFFLEtBQWpCMEIsQ0FBaUIxQixDQUFqQjBCO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Q7OztrQkFHS0ksTSxtQkFBT0MsQyxFQUFHO0FBQ2YsVUFBTUwsSUFBTjtBQUNBLFdBQUksSUFBSUMsSUFBUixHQUFZQSxJQUFFSSxFQUFkLFFBQXVCLEVBQXZCLEdBQTRCO0FBQzFCLGFBQUksSUFBSUgsSUFBUixHQUFZQSxJQUFFRyxLQUFkLFFBQTBCLEVBQTFCLEdBQStCO0FBQzdCLGNBQUcsQ0FBQ0wsRUFBSixDQUFJQSxDQUFKLEVBQVU7QUFDUkE7QUFDRDtBQUNEQSxvQkFBUUssS0FBUkwsQ0FBUUssQ0FBUkw7QUFDRDtBQUNGO0FBQ0Q7OztrQkFHS00sRyxnQkFBSUMsSSxFQUFNO0FBQ2YsVUFBSUMsSUFBSjtBQUNBLGlKQUFtQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBWG5CLElBQVc7O0FBQ2pCbUI7QUFDRDtBQUNELGFBQU9BLElBQUVELEtBQVQ7OztrQkFHS0UsSSxpQkFBS0YsSSxFQUFNO0FBQ2hCLFVBQU1HLElBQUV6QyxrQkFBUixJQUFRQSxDQUFSO0FBQ0EsVUFBSXVDLElBQUo7QUFDQSx5SkFBbUI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQVhuQixJQUFXOztBQUNqQm1CLGFBQUcsQ0FBQ25CLElBQUQsTUFBT0EsSUFBVm1CLENBQUcsQ0FBSEE7QUFDRDtBQUNELGFBQU9BLElBQUVELEtBQVQ7OztrQkFHS0ksTyxvQkFBUUosSSxFQUFNSyxHLEVBQUs7QUFDeEIsVUFBTVosSUFBTjtBQUFBLFVBQVlhLElBQUVOLEtBQWQ7QUFBQSxVQUEyQk8sSUFBRTdDLG1CQUE3QixJQUE2QkEsQ0FBN0I7QUFDQSxVQUFHNkMsU0FBT0QsSUFBVixHQUFlO0FBQ2IsWUFBTUUsS0FBTjtBQUFBLFlBQWFDLEtBQWI7QUFDQSxhQUFJLElBQUlmLElBQVIsR0FBWUEsSUFBWixHQUFnQixFQUFoQixHQUFxQjtBQUNuQmMsa0JBQVEsSUFBUkEsQ0FBUSxDQUFSQTtBQUNBQyxrQkFBUSxDQUFDVCxLQUFUUyxDQUFTVCxDQUFELENBQVJTO0FBQ0Q7QUFDRCxZQUFNQyxLQUFHaEQscUJBQVQsRUFBU0EsQ0FBVDtBQUFBLFlBQW1DRyxJQUFFSCx1QkFBckMsRUFBcUNBLENBQXJDO0FBQUEsWUFBZ0VLLElBQUVMLHVCQUFsRSxFQUFrRUEsQ0FBbEU7QUFBQSxZQUNBaUQsSUFBRzlDLFVBQVFBLEtBQVJBLENBQVFBLENBQVJBLEdBQWdCQSxVQUFRQSxLQUQzQixDQUMyQkEsQ0FEM0I7QUFBQSxZQUVBK0MsSUFBRSxDQUNBLEVBQUUvQyxVQUFRRSxLQUFSRixDQUFRRSxDQUFSRixHQUFnQkUsVUFBUUYsS0FBMUIsQ0FBMEJBLENBQTFCLElBREEsR0FFQSxDQUFDQSxVQUFRRSxLQUFSRixDQUFRRSxDQUFSRixHQUFnQkEsVUFBUUUsS0FBekIsQ0FBeUJBLENBQXpCLElBSkYsQ0FFRSxDQUZGO0FBTUEsYUFBSSxJQUFJMkIsTUFBUixHQUFZQSxNQUFaLEtBQWtCLEVBQWxCLEtBQXVCO0FBQ3JCLGNBQU1tQixJQUFJdEIsV0FBV3FCLFFBQU1sQixNQUFOa0IsS0FBV0EsRUFBaEMsQ0FBZ0NBLENBQXRCckIsQ0FBVjtBQUNBLGNBQUdFLGlCQUFlLENBQWxCLEdBQXNCO0FBQ3BCQTtBQUNEO0FBQ0Y7QUFDRjtBQUNEOzs7a0JBR0txQixTLHdCQUFZO0FBQ2pCLGFBQU92QixVQUFVLE1BQUlBLEtBQXJCLE1BQXFCQSxFQUFkQSxDQUFQOzs7a0JBR0t3QixlLDRCQUFnQkMsTSxFQUFRQyxFLEVBQUk7QUFDakMsVUFBR0QseUJBQXVCQyxLQUExQixRQUF1QztBQUNyQ0M7QUFDRDtBQUNELFdBQUksSUFBSXhCLElBQVIsR0FBYUEsSUFBRXNCLGNBQWYsUUFBcUMsRUFBckMsR0FBMEM7QUFDeENBLDZCQUFxQkMsS0FBckJELENBQXFCQyxDQUFyQkQsRUFBOEJDLEtBQTlCRCxDQUE4QkMsQ0FBOUJELEVBQXVDQyxPQUFNQSxLQUFOQSxDQUFNQSxDQUFOQSxHQUF2Q0Q7QUFDRDs7O2tCQUdJRyxNLG1CQUFPQyxFLEVBQUlDLEcsRUFBS0MsQyxFQUFHQyxDLEVBQUc7QUFDM0IsVUFBTUMsS0FBS0gsT0FBS0MsSUFBaEIsQ0FBV0QsQ0FBWDtBQUNBLFVBQUlJLElBQUo7QUFDQSxXQUFJLElBQUkvQixJQUFKLEdBQVNpQixJQUFFUyxHQUFmLENBQWVBLENBQWYsRUFBc0IxQixJQUFFMEIsWUFBRjFCLEtBQWlCK0IsSUFBRUosTUFBSSxNQUE3QyxJQUFxRCxLQUFLVixLQUFHUyxHQUE3RCxDQUE2REEsQ0FBN0QsRUFBb0U7QUFDbEUsWUFBRzdCLFNBQVNrQyxJQUFUbEMsS0FBY0EsU0FBU2tDLFFBQUlMLEdBQUcxQixJQUFqQyxDQUE4QjBCLENBQWI3QixDQUFqQixFQUF3QztBQUN0Q2dDO0FBQ0FFO0FBQ0Q7QUFDRjtBQUNELFVBQUdBLElBQUVKLE1BQUksTUFBVCxJQUFpQjtBQUNmSDtBQUNEOzs7a0JBR0lRLEksaUJBQUs3RCxDLEVBQUVFLEMsRUFBRTRELEMsRUFBRWhCLEMsRUFBRztBQUNuQixhQUFPOUMsUUFBSUUsSUFBWDs7O2tCQUdLNkQsUyxzQkFBVUMsRSxFQUFHQyxFLEVBQUdDLEUsRUFBR0MsRSxFQUFJO0FBQzVCLFVBQUlDLFdBQUo7QUFDQSxVQUFNdEIsSUFBRWpELG1CQUFtQm1FLEdBQW5CbkUsQ0FBbUJtRSxDQUFuQm5FLEVBQXlCbUUsR0FBekJuRSxDQUF5Qm1FLENBQXpCbkUsRUFBK0JxRSxHQUEvQnJFLENBQStCcUUsQ0FBL0JyRSxFQUFxQ3FFLEdBQTdDLENBQTZDQSxDQUFyQ3JFLENBQVI7QUFDQSxVQUFHNkIsY0FBWTdCLGNBQWYsS0FBa0M7QUFDaEMsWUFBTXdFLEtBQUd4RSx1QkFBc0JtRSxHQUF0Qm5FLENBQXNCbUUsQ0FBdEJuRSxNQUErQnFFLEdBQXhDLENBQXdDQSxDQUEvQnJFLENBQVQ7QUFBQSxZQUFnRFUsS0FBR1YsbUJBQW1CbUUsR0FBbkJuRSxDQUFtQm1FLENBQW5CbkUsTUFBNEJxRSxHQUE1QnJFLENBQTRCcUUsQ0FBNUJyRSxFQUFuRCxFQUFtREEsQ0FBbkQ7QUFDQXVFLGNBQU07QUFDSm5ELGFBQUdvRCxLQURDO0FBRUozRCxhQUFHSCxLQUFHdUM7QUFGRixTQUFOc0I7QUFJRDtBQUNEOzs7a0JBR0tFLFkseUJBQWFsQixFLEVBQUlMLEMsRUFBRztBQUN6QixVQUFJd0IsT0FBSjtBQUFBLFVBQWtCQyxVQUFsQjtBQUNBLFdBQUksSUFBSTNDLElBQVIsR0FBYUEsSUFBRXVCLEdBQWYsUUFBMEIsRUFBMUIsR0FBK0I7QUFDN0IsWUFBR3ZELHdCQUF3QnVELEdBQXhCdkQsQ0FBd0J1RCxDQUF4QnZELElBQStCQSxjQUFsQyxLQUFxRDtBQUNuRDJFO0FBQ0FEO0FBQ0E7QUFDRDtBQUNGO0FBQ0QsYUFBTSxDQUFOLE1BQWE7QUFDWEE7QUFDQUM7QUFDQSxZQUFJQyxLQUFLLEVBQUN4RCxHQUFHOEIsTUFBSXJCLEtBQUpxQixNQUFJckIsRUFBSnFCLEdBQUosS0FBMkJyQyxHQUFHcUMsTUFBSXJCLEtBQUpxQixNQUFJckIsRUFBSnFCLEdBQXZDLEdBQVMsRUFBVDtBQUFBLFlBQStEMkIsS0FBSyxFQUFDekQsR0FBR3dELE9BQUsxQixFQUFULEdBQWNyQyxHQUFHK0QsT0FBSzFCLEVBQTFGLENBQW9FLEVBQXBFO0FBQUEsWUFBZ0dpQixLQUFHLENBQUNVLEdBQUQsR0FBTyxDQUFDQSxHQUEzRyxDQUFtRyxDQUFuRztBQUFBLFlBQWtIVCxLQUFHbEIsTUFBSTJCLEdBQUozQixJQUFTQSxNQUFJMkIsR0FBbEk7QUFDQSxhQUFJLElBQUk3QyxNQUFSLEdBQWFBLE1BQUV1QixHQUFmLFFBQTBCLEVBQTFCLEtBQStCO0FBQzdCLGNBQU11QixLQUFHdkIsR0FBVCxHQUFTQSxDQUFUO0FBQUEsY0FBZ0J3QixLQUFHeEIsR0FBRyxDQUFDdkIsTUFBRCxLQUFNdUIsR0FBNUIsTUFBbUJBLENBQW5CO0FBQUEsY0FBd0NLLElBQUksRUFBQ3hDLEdBQUcyRCxPQUFLRCxHQUFULEdBQWVqRSxHQUFHa0UsT0FBS0QsR0FBbkUsQ0FBNEMsRUFBNUM7QUFBQSxjQUEwRVQsS0FBRyxDQUFDVCxFQUFELEdBQU0sQ0FBQ0EsRUFBcEYsQ0FBNkUsQ0FBN0U7QUFBQSxjQUEwRlUsS0FBR1EsT0FBS2xCLEVBQUxrQixJQUFTQSxPQUFLbEIsRUFBM0c7QUFBQSxjQUNFb0IsS0FBS2hGLG9DQURQLEVBQ09BLENBRFA7QUFFQSxrQkFBTztBQUNMLGdCQUFHQSwrQkFBNkJBLGNBQTdCQSxPQUFrREEsK0JBQTZCQSxjQUFsRixLQUFxRztBQUNuRzBFO0FBQ0E7QUFGRixtQkFJSyxJQUFHTSxPQUFLbkQsU0FBU2lELEdBQVRqRCxHQUFja0QsR0FBZGxELEtBQW9CN0IsY0FBekJnRixPQUE0Q0EsT0FBS25ELFNBQVNpRCxHQUFUakQsR0FBY2tELEdBQWRsRCxLQUFvQjdCLGNBQXJFZ0YsT0FDQUEsT0FBS25ELFNBQVNpRCxHQUFUakQsR0FBY2tELEdBQWRsRCxLQUFvQjdCLGNBRHpCZ0YsT0FDNENBLE9BQUtuRCxTQUFTaUQsR0FBVGpELEdBQWNrRCxHQUFkbEQsS0FBb0I3QixjQUR4RSxLQUMyRjtBQUM5RixrQkFBR0EsOEJBQTRCQSxjQUEvQixLQUFrRDtBQUNoRDJFO0FBQ0E7QUFGRixxQkFJSztBQUNILG9CQUFNTSxLQUFHLEVBQUM3RCxHQUFHNEQsT0FBSzlCLEVBQVQsR0FBY3JDLEdBQUdtRSxPQUFLOUIsRUFBL0IsQ0FBUyxFQUFUO0FBQ0F5QixzQkFBTU0sT0FBS0osR0FBTEksSUFBVUEsT0FBS0osR0FBZkksSUFBTk47QUFDRDtBQUNGO0FBQ0Y7QUFDRjtBQUNGO0FBQ0QsYUFBT0EsS0FBUDs7O2tCQUdLTyxnQiw2QkFBaUIzQixFLEVBQUlMLEMsRUFBRztBQUM3QixVQUFJaUMsS0FBSyxJQUFULENBQVMsQ0FBVDtBQUNBLFdBQUksSUFBSW5ELElBQVIsR0FBYUEsSUFBRXVCLEdBQWYsUUFBMEIsRUFBMUIsR0FBK0I7QUFDN0IsWUFBTXVCLEtBQUd2QixHQUFULENBQVNBLENBQVQ7QUFBQSxZQUFnQndCLEtBQUd4QixHQUFHLENBQUN2QixJQUFELEtBQU11QixHQUE1QixNQUFtQkEsQ0FBbkI7QUFBQSxZQUF3Q3BELElBQUUsRUFBQ2lCLEdBQUcwRCxPQUFLNUIsRUFBVCxHQUFjckMsR0FBR2lFLE9BQUs1QixFQUFoRSxDQUEwQyxFQUExQztBQUFBLFlBQXNFN0MsSUFBRSxFQUFDZSxHQUFHMkQsT0FBSzdCLEVBQVQsR0FBY3JDLEdBQUdrRSxPQUFLN0IsRUFBOUYsQ0FBd0UsRUFBeEU7QUFDQSxVQUFFaUMsR0FBRyxDQUFDaEYsTUFBSUUsRUFBSkYsSUFBUUEsTUFBSUUsRUFBWkYsSUFBRCxLQUFMLENBQUVnRixDQUFGO0FBQ0Q7QUFDRCxhQUFPLENBQUNBLFdBQVc1QixHQUFuQixNQUFRNEIsQ0FBUjs7O2tCQUdLQyxLLGtCQUFNQyxFLEVBQUk7QUFDZixhQUFPeEQsVUFBVXdELE9BQUtBLEdBQUxBLElBQVVBLE9BQUtBLEdBQWhDLENBQU94RCxDQUFQOzs7a0JBR0t5RCxNLG1CQUFPQyxHLEVBQUtDLEcsRUFBSztBQUN0QixhQUFPLG9CQUFvQjtBQUN6QnBFLFdBQUdvRSxRQUFNRCxJQURnQjtBQUV6QjFFLFdBQUcyRSxRQUFNRCxJQUFJMUU7QUFGWSxPQUFwQixDQUFQOzs7a0JBTUs0RSxhLDBCQUFjbEMsRSxFQUFJO0FBQ3ZCLFVBQU1wRCxJQUFOO0FBQ0EsVUFBSStDLElBQUo7QUFDQSxXQUFJLElBQUlsQixJQUFSLEdBQWFBLElBQUV1QixHQUFmLFFBQTBCLEVBQTFCLEdBQStCO0FBQzdCcEQsZUFBT0gscUJBQXFCdUQsR0FBckJ2RCxDQUFxQnVELENBQXJCdkQsRUFBNEJ1RCxHQUFHLENBQUN2QixJQUFELEtBQU11QixHQUE1Q3BELE1BQW1Db0QsQ0FBNUJ2RCxDQUFQRztBQUNBK0MsYUFBSyxNQUFJL0MsRUFBVCtDLENBQVMvQyxDQUFUK0M7QUFDRDtBQUNELGFBQU9yQixVQUFVcUIsS0FBR0EsSUFBRS9DLEVBQUwrQyxDQUFLL0MsQ0FBTCtDLEtBQVlBLElBQUUvQyxFQUFkK0MsQ0FBYy9DLENBQWQrQyxLQUFxQkEsSUFBRS9DLEVBQXhDLENBQXdDQSxDQUF2QitDLENBQVZyQixDQUFQOzs7a0JBR0s2RCxrQiwrQkFBbUJDLEcsRUFBS3pDLEMsRUFBRztBQUNoQyxVQUFNWCxJQUFJdkMsNEJBQVYsR0FBVUEsQ0FBVjtBQUFBLFVBQTRDNEYsUUFBNUM7QUFBQSxVQUFzRGhELElBQUkrQyxJQUExRDtBQUNBLFdBQUksSUFBSTNELElBQVIsR0FBYUEsSUFBYixHQUFrQixFQUFsQixHQUF1QjtBQUNyQjRELG1CQUFXNUYsNEJBQTRCLElBQUkyRixJQUFJLENBQUMzRCxJQUFELEtBQVIsQ0FBSTJELENBQUosRUFBa0JBLElBQUksQ0FBQzNELElBQUQsS0FBbERoQyxDQUE4QzJGLENBQWxCLENBQTVCM0YsSUFBWDRGO0FBQ0Q7QUFDRDs7Ozs7O0FBN1BpQjVGLGdCQUNaYyxHQURZZCxHQUNOLENBQUNBLGNBQUQsTUFBcUJBLGNBQXJCLE1BQXlDQSxjQUF6QyxNQUE2REEsY0FBN0QsS0FETUE7QUFBQUEsZ0JBRVo2RixHQUZZN0YsR0FFTixJQUZNQTtvQkFBQUEsYTs7Ozs7Ozs7Ozs7O0FDQXJCOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQUVxQjhGLFk7Ozs7Ozs7OztjQUdaQyxXLHdCQUFZekMsTSxFQUFRMEMsQyxFQUFHO0FBQzVCLFVBQU1DLElBQUksRUFBQ3RDLEtBQUQsR0FBU0QsSUFBSSxDQUF2QixDQUF1QixDQUFiLEVBQVY7QUFBQSxVQUE2QndDLEtBQUcsSUFBaEM7QUFDQSxXQUFJLElBQUlsRSxJQUFSLEdBQWFBLEtBQWIsR0FBbUIsRUFBbkIsR0FBd0I7QUFDdEIsWUFBTWtCLElBQUlJLGdCQUFnQnRCLElBQTFCLEVBQVVzQixDQUFWO0FBQ0EsZUFBTTtBQUNKLGNBQU1MLElBQUk2Qyx3QkFBVixDQUFVQSxDQUFWO0FBQ0FHO0FBQ0FBO0FBQ0Q7QUFDREg7QUFDRDtBQUNEOzs7Y0FHS0ssZ0IsNkJBQWlCN0MsTSxFQUFRTSxDLEVBQUc7QUFDakMsVUFBTXdDLE1BQU47QUFBQSxVQUFrQkMsT0FBTyxJQUF6QjtBQUNBLFVBQU0zQyxLQUFHLENBQVQsQ0FBUyxDQUFUO0FBQ0EsVUFBSWQsSUFBSjtBQUNBLFdBQUksSUFBSVosSUFBUixHQUFhQSxLQUFiLEtBQXFCLEVBQXJCLEdBQTBCO0FBQ3hCLFlBQU1rQixJQUFJSSxnQkFBZ0J0QixJQUExQixJQUFVc0IsQ0FBVjtBQUNBLGVBQU07QUFDSixjQUFNTCxJQUFFNkMsd0JBQVIsQ0FBUUEsQ0FBUjtBQUNBbEQ7QUFDQWM7QUFDRDtBQUNEb0M7QUFDRDtBQUNEcEM7O0FBRUEsVUFBTWEsTUFBTjtBQUFBLFVBQWdCMkIsS0FBS3RELEtBQUdnQixJQUF4QixDQUFxQmhCLENBQXJCO0FBQ0EsV0FBSSxJQUFJWixLQUFKLEdBQVMrQixJQUFULEdBQWNkLEtBQUVTLEdBQXBCLENBQW9CQSxDQUFwQixFQUEyQjFCLEtBQUUwQixZQUE3QixHQUEwQyxNQUFLVCxNQUFHUyxHQUFsRCxFQUFrREEsQ0FBbEQsRUFBeUQ7QUFDdkQsWUFBRzdCLFNBQVNrQyxJQUFUbEMsTUFBY0EsU0FBU2tDLFNBQUlMLEdBQUcxQixLQUFqQyxDQUE4QjBCLENBQWI3QixDQUFqQixFQUF3QztBQUN0QzBDLG1CQUFTdkMsS0FBVHVDO0FBQ0FSO0FBQ0Q7QUFDRjs7QUFFRDs7O2NBR0t1QyxVLHVCQUFXQyxJLEVBQU1DLEssRUFBTztBQUM3QixVQUFNakMsTUFBTjtBQUNBLFdBQUksSUFBSXZDLElBQVIsR0FBYUEsSUFBRXVFLEtBQWYsUUFBNEIsRUFBNUIsR0FBaUM7QUFDL0IsWUFBTXpCLEtBQUt5QixLQUFYLENBQVdBLENBQVg7QUFBQSxZQUFvQnhCLEtBQUt3QixLQUFLLENBQUN2RSxJQUFELEtBQU11RSxLQUFwQyxNQUF5QkEsQ0FBekI7QUFBQSxZQUFrRDNELElBQUksbUNBQXRELEVBQXNELENBQXREO0FBQUEsWUFBb0ZnQixJQUFJL0IsVUFBVWUsSUFBbEcsS0FBd0ZmLENBQXhGO0FBQUEsWUFBNEdxRSxLQUFLdEQsSUFBakg7QUFDQTJCO0FBQ0EsYUFBSSxJQUFJdEMsSUFBUixHQUFhQSxJQUFiLEdBQWtCLEVBQWxCLEdBQXVCO0FBQ3JCc0MsbUJBQVMsSUFBSSxZQUFKLFFBQ1BPLE9BQUs3QyxVQUFNOEMsT0FBS0QsR0FBWDdDLEtBREUsR0FFUDZDLE9BQUs3QyxVQUFNOEMsT0FBS0QsR0FBWDdDLEtBRlBzQyxDQUFTLENBQVRBO0FBSUQ7QUFDRjtBQUNEOzs7Ozs7QUF2RGlCdUIsWUFDWlcsRUFEWVgsR0FDUCxJQUFJLFlBQUosU0FET0E7b0JBQUFBLFM7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQ0hBWSxROzs7OztVQUVaQyxZLHlCQUFhQyxHLEVBQUs7QUFDdkIsd0JBQWtCO0FBQ2hCLGVBQU9yRSw0QkFBUCxHQUFPQSxDQUFQO0FBQ0Q7QUFDRCxVQUFNc0UsT0FBT0MsTUFBTTdILGdCQUFuQixJQUFhNkgsQ0FBYjtBQUNBRixZQUFNRSxNQUFORixHQUFNRSxDQUFORjtBQUNBLFVBQUdDLFlBQVVELElBQWIsQ0FBYUEsQ0FBYixFQUFxQjtBQUNuQkEsaUJBQVNDLEtBQVRELENBQVNDLENBQVREO0FBQ0Q7QUFDRCxhQUFPQSxTQUFQLEdBQU9BLENBQVA7OztVQUdLRyxPLHFCQUFRQyxHLEVBQUtILEksRUFBTTtBQUN4QixXQUFJLElBQUosY0FBc0I7QUFDcEIsWUFBRyxDQUFDRyxtQkFBSixJQUFJQSxDQUFKLEVBQThCO0FBQzVCQSxzQkFBWUgsS0FBWkcsSUFBWUgsQ0FBWkc7QUFDRDtBQUNGOzs7VUFHSUMsVSx1QkFBVzlHLEMsRUFBR0UsQyxFQUFHO0FBQ3RCLGFBQU9GLElBQVA7OztVQUdLK0csVSx1QkFBVy9HLEMsRUFBR2lCLEMsRUFBRytGLEcsRUFBSztBQUMzQkEsWUFBTUEsT0FBT1QsTUFBYlM7QUFDQSxVQUFJdkUsSUFBSjtBQUFBLFVBQVd3RSxJQUFJakgsV0FBZjtBQUNBLGFBQU1pSCxRQUFOLEdBQWE7QUFDWCxZQUFJQyxNQUFNeEYsV0FBVyxDQUFDZSxJQUFELEtBQXJCLENBQVVmLENBQVY7QUFDQSxZQUFHc0YsT0FBT2hILEVBQVBnSCxHQUFPaEgsQ0FBUGdILElBQUgsR0FBcUI7QUFDbkJDO0FBREYsZUFHSztBQUNIeEU7QUFDRDtBQUNGO0FBQ0QsYUFBT3VFLE9BQU9oSCxFQUFQZ0gsQ0FBT2hILENBQVBnSCxhQUFQOzs7Ozs7b0JBdENpQlQsSzs7Ozs7Ozs7Ozs7O0FDQXJCOztBQUNBOzs7Ozs7Ozs7Ozs7OztNQUVxQlksWTtBQUtuQixzREFBMkM7QUFBQTs7QUFDekM7QUFDQSxpQkFBV0MsUUFBWDtBQUNBLGlCQUFXQSxRQUFYO0FBQ0EscUJBQWVBLG1CQUFtQkEsWUFBbEM7QUFDQSxlQUFTQSx3QkFBd0JELFVBQWpDO0FBQ0EsaUJBQVdDLDJCQUEyQkQsVUFBdEM7QUFDQSxrQkFBWSxhQUFaO0FBQ0Esa0JBQVksY0FBWjtBQUNBO0FBQ0Q7O3dCQUVERSxhLDBCQUFjakQsRyxFQUFLO0FBQ2pCLGtCQUFZQSxJQUFaO0FBQ0Esa0JBQVlBLElBQVo7Ozt3QkFHRmtELE8sc0JBQVUsQzs7d0JBSVZDLGUsOEJBQWtCO0FBQ2hCO0FBQ0EsMkJBQXFCLGdDQUFzQixLQUF0QixPQUFyQixDQUFxQixDQUFyQjtBQUNBLDBCQUFvQixPQUFwQixPQUFrQyxPQUFsQztBQUNBOzs7d0JBR0ZDLFcsd0JBQVlDLEssRUFBTztBQUNqQjtBQUNBO0FBQ0E7Ozt3QkFHRkMsVSx1QkFBVzNFLEMsRUFBRztBQUNaLGFBQU87QUFDTDlCLFdBQUc4QixNQUFJLE9BREY7QUFFTHJDLFdBQUcsQ0FBQyxJQUFFcUMsRUFBSCxLQUFRLE9BQU80RTtBQUZiLE9BQVA7Ozt3QkFNRkMsUyxzQkFBVXhCLEksRUFBTTtBQUNkLFVBQU15QixNQUFNLEtBQVo7QUFDQUE7QUFDQUE7QUFDQSxVQUFJOUUsSUFBSSxnQkFBZ0JxRCxLQUF4QixDQUF3QkEsQ0FBaEIsQ0FBUjtBQUNBeUIsaUJBQVc5RSxFQUFYOEUsR0FBZ0I5RSxFQUFoQjhFO0FBQ0EsV0FBSSxJQUFJaEcsSUFBUixHQUFhQSxJQUFFdUUsS0FBZixRQUE0QixFQUE1QixHQUFpQztBQUMvQnJELFlBQUksZ0JBQWdCcUQsS0FBcEJyRCxDQUFvQnFELENBQWhCLENBQUpyRDtBQUNBOEUsbUJBQVc5RSxFQUFYOEUsR0FBZ0I5RSxFQUFoQjhFO0FBQ0Q7QUFDREE7QUFDQUE7Ozt3QkFHRkMsTyxzQkFBVTtBQUNSLFVBQUcsYUFBVyxPQUFkLE9BQTRCO0FBQzFCLHVCQUFlLEtBQWY7QUFDRDtBQUNELFVBQUcsYUFBVyxPQUFkLFFBQTZCO0FBQzNCLHdCQUFnQixLQUFoQjtBQUNEO0FBQ0Q7QUFDQSxxQkFBZSxlQUFhLEtBQTVCLE9BQXdDLGdCQUFjLEtBQXREO0FBQ0EsYUFBTyxLQUFQOzs7d0JBR0ZDLE0scUJBQVM7QUFDUDs7O3dCQUdGQyxrQixpQ0FBcUI7QUFDbkI7Ozt3QkFHRkMsWSwyQkFBZTtBQUNiLFVBQUcsS0FBSCxVQUFrQjtBQUNoQixzQkFBYyxLQUFkO0FBQ0Q7Ozt3QkFHSEMsVSx5QkFBYTtBQUNYLFVBQUcsS0FBSCxRQUFnQjtBQUNkO0FBREYsYUFHSztBQUNIO0FBQ0Q7Ozt3QkFHSEMsZSw4QkFBa0I7QUFDaEI7Ozs7OztBQWhHaUJoQixZQUVaaUIsWUFGWWpCLEdBRUksMkJBRkpBO0FBQUFBLFlBR1prQixlQUhZbEIsR0FHTUEsdUNBSE5BO29CQUFBQSxTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSHJCOzs7Ozs7OztNQUVxQm1CLGlCOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0I7QUFBQTs7QUFDcEI7QUFDQTtBQUNBO0FBQ0Q7OzZCQUVEQyxTLHNCQUFVQyxFLEVBQUk7QUFDWixVQUFHLENBQUgsSUFBUTtBQUNOLFlBQUcsS0FBSCxZQUFvQjtBQUNsQixzQkFBWSxLQUFaLFlBQTZCLGNBQTdCLFNBQTZCLENBQTdCO0FBQ0E7QUFDRDtBQUNELFlBQUcsS0FBSCxZQUFvQjtBQUNsQixzQkFBWSxLQUFaLFlBQTZCLGNBQTdCLFVBQTZCLENBQTdCO0FBQ0E7QUFDRDtBQUNGO0FBQ0Q7Ozs2QkFHRkMsVyx3QkFBWUMsTSxFQUFRO0FBQ2xCOzs7NkJBR0ZDLE0sbUJBQU9ELE0sRUFBUUUsQyxFQUFHQyxJLEVBQU07QUFDdEIsVUFBTUMsV0FBVyxpQkFBakIsTUFBaUIsQ0FBakI7QUFDQSxvQkFBYTtBQUNYLFlBQU07QUFFSkQsZ0JBRkk7QUFHSkUsZ0JBQU0sS0FBS0M7QUFIUCxVQUFOO0FBS0EsWUFBTUMsS0FBSyxvQkFBWCxLQUFXLENBQVg7QUFDQUg7QUFDRDs7OzZCQUdISSxPLG9CQUFRTixDLEVBQUd6RyxJLEVBQU07QUFDZixVQUFHLENBQUMsS0FBSixTQUFrQjs7QUFFbEIsVUFBRyxLQUFILFFBQWdCO0FBQ2R5RyxZQUFJLFlBQVksS0FBWixTQUFKQSxDQUFJLENBQUpBO0FBQ0Q7O0FBRUQsVUFBTUYsU0FBUyxrQkFBZixJQUFlLENBQWY7QUFBQSxVQUNFQyxTQUFTLENBQUNDLGVBQUQsT0FBQ0EsQ0FBRCxHQUEwQiwyQkFBMUIsTUFBMEIsQ0FBMUIsR0FBOEQsMkJBRHpFLE1BQ3lFLENBRHpFO0FBRUEsVUFBR0QsVUFBSCxRQUFxQjtBQUNuQiwrQkFBdUJDLEVBQXZCO0FBQ0Q7Ozs2QkFHSE8sWSx5QkFBYVAsQyxFQUFHekcsSSxFQUFNdUcsTSxFQUFRO0FBQzVCLFVBQUlDLFNBQUo7QUFDQSxjQUFPQyxFQUFQO0FBQ0U7QUFBbUI7QUFDakIsZ0JBQUcsS0FBSCxZQUFvQjtBQUNsQiwwQkFBWSxLQUFaO0FBQ0Q7QUFDRDtBQUNBO0FBQ0Q7QUFDRDtBQUFpQjtBQUNmLGdCQUFHLG1CQUFtQixDQUFDLFVBQVUsS0FBVixZQUF2QixNQUF1QixDQUF2QixFQUEyRDtBQUN6RCwwQkFBWSxLQUFaO0FBQ0FEO0FBRkYsbUJBSUssSUFBR0QsVUFBVSxVQUFVLEtBQVYsWUFBYixNQUFhLENBQWIsRUFBaUQ7QUFDcEQ7QUFDRDtBQUNEO0FBQ0E7QUFDRDtBQUNEO0FBQWlCO0FBQ2ZDO0FBQ0E7QUFDRDtBQXRCSDtBQXdCQTs7OzZCQUdGUyxZLHlCQUFhUixDLEVBQUd6RyxJLEVBQU11RyxNLEVBQVE7QUFDNUIsVUFBSUMsU0FBSjtBQUNBLGNBQU9DLEVBQVA7QUFDRTtBQUFrQjtBQUNoQixnQkFBRyxLQUFILFlBQW9CO0FBQ2xCLDBCQUFZLEtBQVo7QUFDRDtBQUNEO0FBQ0E7QUFDRDtBQUNEO0FBQWdCO0FBQ2QsZ0JBQUcsbUJBQW1CLENBQUMsVUFBVSxLQUFWLFlBQXZCLE1BQXVCLENBQXZCLEVBQTJEO0FBQ3pELDBCQUFZLEtBQVo7QUFDQUQ7QUFDRDtBQUNEO0FBQ0Q7QUFDRDtBQUFjO0FBQ1pBLHFCQUFTLFVBQVUsS0FBVixZQUFUQSxNQUFTLENBQVRBO0FBQ0E7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQWtCO0FBQ2hCLGdCQUFHLENBQUMsVUFBVSxLQUFWLFlBQUQsTUFBQyxDQUFELElBQXVDLEtBQTFDLFlBQTJEO0FBQ3pELDBCQUFZLEtBQVo7QUFDQTtBQUNEO0FBQ0QsZ0JBQUcsQ0FBQyxLQUFELGNBQUgsUUFBK0I7QUFDN0I7QUFDQTtBQUNEO0FBQ0RBLHFCQUFTQyxXQUFURDtBQUNBO0FBQ0Q7QUFDRDtBQUNBO0FBQWlCO0FBQ2YsZ0JBQUcsS0FBSCxZQUFvQjtBQUNsQiwwQkFBWSxLQUFaO0FBQ0E7QUFDRDtBQUNEQTtBQUNBO0FBQ0Q7QUExQ0g7QUE0Q0E7Ozs7OztvQkFySWlCTCxjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUNGQWUsYTs7Ozs7ZUFFWnJJLGlCLDhCQUFrQkMsQyxFQUFFUCxDLEVBQUVRLEUsRUFBSTtBQUMvQixhQUFPUixPQUFLLENBQUNBLE9BQUtBLEVBQU4sQ0FBTUEsQ0FBTixLQUFhTyxPQUFLQSxFQUFsQixDQUFrQkEsQ0FBbEIsS0FBeUJDLEtBQUdELEVBQXhDLENBQXdDQSxDQUE1QixDQUFaOzs7ZUFHS3FJLGEsMEJBQWNDLEUsRUFBR0MsRSxFQUFHaEosQyxFQUFHO0FBQzVCLGFBQU82SSw2QkFBNkIsSUFBN0JBLENBQTZCLENBQTdCQSxFQUFtQyxLQUFuQ0EsRUFBbUMsQ0FBbkNBLEVBQVAsQ0FBT0EsQ0FBUDs7O2VBR0tJLGEsMEJBQWNDLEssRUFBTztBQUMxQixhQUFPLENBQUVBLFNBQUQsRUFBQ0EsR0FBRixNQUFvQkEsU0FBRCxDQUFDQSxHQUFwQixNQUFvQ0EsUUFBM0MsSUFBTyxDQUFQOzs7ZUFHS0MsWSx5QkFBYUQsSyxFQUFZO0FBQUEsVUFBTGxKLElBQUssb0VBQUgsQ0FBRzs7QUFDOUIsVUFBTW9KLEtBQUdQLHlCQUFULEtBQVNBLENBQVQ7QUFBQSxVQUNNUSxNQUFJLENBQUMsT0FBS0QsR0FBTixDQUFNQSxDQUFOLEVBQVksT0FBS0EsR0FBakIsQ0FBaUJBLENBQWpCLEVBQXVCLE9BQUtBLEdBRHRDLENBQ3NDQSxDQUE1QixDQURWO0FBQUEsVUFFTUUsTUFBSSxDQUFDcEksV0FBVzJILHlCQUF5Qk8sR0FBekJQLENBQXlCTyxDQUF6QlAsRUFBK0JRLElBQS9CUixDQUErQlEsQ0FBL0JSLEVBQVosQ0FBWUEsQ0FBWDNILENBQUQsRUFBc0RBLFdBQVcySCx5QkFBeUJPLEdBQXpCUCxDQUF5Qk8sQ0FBekJQLEVBQStCUSxJQUEvQlIsQ0FBK0JRLENBQS9CUixFQUFqRSxDQUFpRUEsQ0FBWDNILENBQXRELEVBQTJHQSxXQUFXMkgseUJBQXlCTyxHQUF6QlAsQ0FBeUJPLENBQXpCUCxFQUErQlEsSUFBL0JSLENBQStCUSxDQUEvQlIsRUFGaEksQ0FFZ0lBLENBQVgzSCxDQUEzRyxDQUZWO0FBR0EsYUFBTzJILHVCQUFQLEdBQU9BLENBQVA7OztlQUdLVSxVLHVCQUFXTCxLLEVBQU8xSixDLEVBQUc7QUFDMUIsYUFBT3FKLHNCQUFzQkEseUJBQXRCQSxLQUFzQkEsQ0FBdEJBLEVBQVAsQ0FBT0EsQ0FBUDs7O2VBR0tXLFUsdUJBQVdKLEUsRUFBSTVKLEMsRUFBRztBQUN2QixhQUFPLFVBQVE0SixRQUFSLEdBQVFBLENBQVIsYUFBUDs7O2VBR0tLLFcsd0JBQVlMLEUsRUFBSTtBQUNyQixhQUFPQSxRQUFPQSxTQUFQQSxJQUFrQkEsU0FBekI7Ozs7OztvQkE5QmlCUCxVOzs7Ozs7Ozs7Ozs7QUNBckI7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7TUFFcUJhLGU7QUFFbkIsMENBQTRCO0FBQUE7O0FBQzFCO0FBQ0EsbUJBQWFDLFNBQVMsWUFBdEIsT0FBc0IsRUFBdEI7QUFDRDs7MkJBRURDLEssa0JBQU1DLEksRUFBa0Y7QUFBQSxVQUE1RTVHLElBQTRFLG9FQUExRSxDQUEwRTtBQUFBLFVBQXZFNkcsY0FBdUUsb0VBQTNELEdBQTJEO0FBQUEsVUFBdERDLGVBQXNELG9FQUF6QyxHQUF5QztBQUFBLFVBQXBDYixRQUFvQyxvRUFBOUIsUUFBOEI7QUFBQSxVQUFwQmMsV0FBb0Isb0VBQVhDLFNBQVc7O0FBQ3RGLFVBQUloRCxhQUFKO0FBQ0EsY0FBTzRDLEtBQVA7QUFDRTtBQUFhO0FBQ1g1QyxvQkFBUSwrQkFBcUIsS0FBckIsMkNBQXFFNEMsS0FBckUsS0FBK0UsS0FBL0UsT0FBUjVDLFFBQVEsQ0FBUkE7QUFDQTtBQUNEO0FBQ0Q7QUFBYztBQUNaQSxvQkFBUSwwQkFBZ0IsS0FBaEIsMkNBQWdFNEMsS0FBeEU1QyxHQUFRLENBQVJBO0FBQ0E7QUFDRDtBQUNEO0FBQVk7QUFDVkEsb0JBQVEsdUJBQWEsS0FBYiwyQ0FBNkQ0QyxLQUE3RCxLQUFSNUMsQ0FBUSxDQUFSQTtBQUNBO0FBQ0Q7QUFDRDtBQUNBO0FBQVM7QUFDUEEsb0JBQVEseUJBQWUsS0FBZixvQ0FBUkEsS0FBUSxDQUFSQTtBQUNBO0FBQ0Q7QUFqQkg7QUFtQkE7Ozs7OztvQkE1QmlCeUMsWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ05yQjs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7TUFFcUJRLG1CO0FBQ25CLHVDQUFxQjtBQUFBOztBQUNuQjtBQUNBLHNCQUFnQixVQUFoQixLQUFnQixHQUFoQjtBQUNEOzsrQkFFRHBELE8sc0JBQVUsQzs7K0JBSVZxRCxRLHFCQUFTQyxLLEVBQU9qRCxNLEVBQVE7QUFDdEIsVUFBTWtELFFBQVEsaURBQXVDLGNBQXZDLE9BQTRELGNBQTFFLE1BQWMsQ0FBZDtBQUNBLGFBQU87QUFDTEQsZUFBT0MsUUFERjtBQUVMbEQsZ0JBQVFrRCxRQUFNbEQ7QUFGVCxPQUFQOzs7K0JBTUZtRCxVLHVCQUFXRixLLEVBQU9qRCxNLEVBQVE7QUFDeEIsVUFBTW9ELFFBQVEsY0FBZDtBQUFBLFVBQW1DRixRQUFRLGlEQUF1Q0UsTUFBdkMsYUFBMERBLE1BQXJHLFlBQTJDLENBQTNDO0FBQ0EsYUFBTztBQUNMVCxxQkFBYU8sUUFEUjtBQUVMTixzQkFBY00sUUFBTWxEO0FBRmYsT0FBUDs7OytCQU1GcUQsUyxzQkFBVUosSyxFQUFPakQsTSxFQUFRO0FBQ3ZCLGdDQUNLLEtBREwsVUFFSyxxQkFGTCxNQUVLLENBRkw7QUFHRW9ELDRCQUNLLGNBRExBLE9BRUssdUJBTFAsTUFLTyxDQUZMQSxDQUhGO0FBT0VFLDRCQUNLLGNBUlAsS0FPRUEsQ0FQRjtBQVVFQywyQkFDSyxjQURMQTtBQVZGOzs7K0JBZ0JGQyxVLHVCQUFXQyxLLEVBQU87QUFDaEIsYUFBTyxjQUFjMUosVUFBVUEsWUFBWTBKLFFBQVoxSixLQUEvQixDQUFxQkEsQ0FBckI7OzsrQkFHRjJKLFMsd0JBQVk7QUFDVixhQUFPLEtBQVA7OzsrQkFHRkMsUSx1QkFBVztBQUNULGFBQU8sS0FBUDs7OytCQUdGQyxlLDhCQUFrQjtBQUNoQixhQUFPLFdBQVA7OzsrQkFHRkMsSyxvQkFBUTtBQUNOLFVBQUcsS0FBSCxTQUFpQjtBQUNmLHFCQUFhLEtBQWIsUUFBYSxFQUFiLEVBQThCLEtBQTlCLFNBQThCLEVBQTlCLEVBQWdELEtBQWhELGVBQWdELEVBQWhEO0FBQ0Q7Ozs7OztvQkE5RGdCZCxnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hyQjs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBQ0E7O01BRXFCZSxhO0FBRW5CLGdEQUF1RTtBQUFBLFVBQW5DQyxRQUFtQyxvRUFBN0IsQ0FBNkI7O0FBQUE7O0FBQUEsVUFBMUJDLFFBQTBCLG9FQUFwQixRQUFvQjtBQUFBLFVBQVZoRSxTQUFVLG9FQUFILENBQUc7O0FBQUE7O0FBQ3JFO0FBQ0E7QUFFRWlFLGVBRkY7QUFHRUM7QUFIRjtBQUtBLFVBQU1DLFFBQVEsS0FBZCxRQUFjLEVBQWQ7O0FBRUEsVUFBTUMsZUFBZSxLQUFyQixVQUFxQixFQUFyQjtBQUNBQyxvQ0FBOEIsYUFBTTtBQUNsQyxtQkFBVUQsZ0JBQWdCRCxNQUFoQkMsVUFBZ0NBLGdCQUExQyxDQUEwQ0EsQ0FBMUM7QUFERkM7O0FBSUEscUJBQWUsSUFBSSxZQUFKLE9BQWYsRUFBZSxDQUFmO0FBQ0EsV0FBSSxJQUFJbkssSUFBUixHQUFhQSxJQUFFLDhCQUFmLFFBQXFELEVBQXJELEdBQTBEO0FBQ3pELGlDQUF5QixJQUFJLFlBQTdCLE9BQXlCLEVBQXpCO0FBQ0E7O0FBRUQscUJBQWUsSUFBSSxZQUFKLE9BQWYsRUFBZSxDQUFmO0FBQ0EsV0FBSSxJQUFJQSxLQUFSLEdBQWFBLEtBQUUscUJBQWYsTUFBZ0MsRUFBaEMsSUFBcUM7QUFDcEMsaUNBQXlCLElBQUksWUFBN0IsT0FBeUIsRUFBekI7QUFDQTs7QUFFRDs7QUFFQTs7QUFFQSxzQkFBZ0IsOEJBQWhCLEtBQWdCLEVBQWhCOztBQUVBLHlCQUFtQixDQUFDO0FBQ2hCK0osZUFEZ0I7QUFFaEJDLGNBQU07QUFGVSxPQUFELEVBR2Q7QUFDREQsZUFBTywyQkFETixDQUNNLENBRE47QUFFREMsY0FBTTtBQUZMLE9BSGMsQ0FBbkI7O0FBU0EseUJBQW1CLElBQUksWUFBdkIsT0FBbUIsRUFBbkI7QUFDQSwrQkFBeUIsWUFBekI7QUFDQSxxQ0FBK0JBLE9BQS9CO0FBQ0EsK0JBQXlCQyxNQUF6QjtBQUNBOztBQUVBLHVCQUFpQixDQUNELElBQUksWUFESCxpQkFDRCxFQURDLEVBRUQsSUFBSSxZQUZILGlCQUVELEVBRkMsRUFHRCxJQUFJLFlBQUosa0JBQTRCLEVBQUNHLEtBQUssS0FIakMsV0FHMkIsRUFBNUIsQ0FIQyxFQUlELElBQUksWUFBSixrQkFBNEIsRUFBQ0EsS0FBSyxLQUpqQyxXQUkyQixFQUE1QixDQUpDLEVBS0QsSUFBSSxZQUFKLGtCQUE0QixFQUFDQSxLQUFLLEtBTGpDLFdBSzJCLEVBQTVCLENBTEMsRUFNRCxJQUFJLFlBQUosa0JBQTRCLEVBQUNBLEtBQUssS0FObEQsV0FNNEMsRUFBNUIsQ0FOQyxDQUFqQjs7QUFTQSx3QkFBa0IsZUFBbEIsQ0FBa0IsQ0FBbEIsRUFBcUMsSUFBckM7QUFDQSx3QkFBa0IsZUFBbEIsQ0FBa0IsQ0FBbEIsRUFBcUMsV0FBckM7O0FBRUEsa0JBQVksSUFBSSxZQUFKLEtBQWUsS0FBZixVQUE4QixJQUFJLFlBQUosaUJBQTJCLEtBQXJFLFNBQTBDLENBQTlCLENBQVo7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBYSxLQUFiO0FBQ0E7O0FBRUE7QUFDQSxVQUFHLGNBQUgsS0FBc0I7QUFDcEIsWUFBTXhKLElBQUUsdUJBQVI7QUFDQSxZQUFJeUosVUFBSjtBQUNBO0FBQ0FBLGFBQUssZUFBZUMsTUFBZixDQUFlQSxDQUFmLE1BQTZCO0FBQUE7QUFBbENELFNBQUssQ0FBTEE7O0FBRUEsa0pBQWlCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUFUckssTUFBUzs7QUFDZixjQUFNdUssU0FBUyxrQ0FBd0IsdUJBQXhCLEdBQXdCLENBQXhCLEVBQW1EdkssTUFBRVksSUFBRlosZUFBbkQsVUFBNEUsY0FBM0YsSUFBZSxDQUFmO0FBQ0EsNEJBQWtCO0FBQ2hCdUssb0JBRGdCO0FBRWhCQyxvQkFBUXhLO0FBRlEsV0FBbEI7QUFJQTtBQUNEO0FBQ0Y7O0FBRUQsb0JBQWM7QUFDWnlLLGFBRFk7QUFFWjNFLGdCQUZZO0FBR1o0RSxxQkFIWTtBQUlaQyxnQkFKWTtBQUtaQyxZQUFJLElBQUksWUFBSixjQUxRLENBS1IsQ0FMUTtBQU1aQyxjQUFNLElBQUksWUFBSjtBQU5NLE9BQWQ7QUFRQSwyQ0EzRnFFLElBMkZyRSxFQTNGcUUsQ0EyRnpCOztBQUU1Qyw0Q0E3RnFFLElBNkZyRSxFQTdGcUUsQ0E2RnhCOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVEOzt5QkFFRHBGLE8sc0JBQVU7QUFDUiw0QkFBYSxLQUFiLGtJQUE2QjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBckJyRixJQUFxQjs7QUFDM0IsWUFBR0EsRUFBSCxLQUFVO0FBQ1JBO0FBQ0FBO0FBQ0Q7QUFDREE7QUFDRDtBQUNELGFBQU8sS0FBUDtBQUNBOzs7eUJBR0YwSyxPLHNCQUFVO0FBQ1IsYUFBTyxjQUFZLE9BQW5COzs7eUJBR0ZyQixRLHVCQUFXO0FBQ1QsMEJBQ0ssT0FETDtBQUVFc0IsZ0JBQVEsT0FBT0E7QUFGakI7Ozt5QkFNRkMsYSw0QkFBZ0I7QUFDZCxVQUFNQyxNQUFNLGFBQVdwTCxVQUFYLElBQXNCLGdDQUF0QixJQUFaO0FBQ0EsYUFBTyxDQUNILHVCQURHLEdBQ0gsQ0FERyxFQUVILHVCQUF1QixnQ0FGcEIsR0FFSCxDQUZHLEVBR0gsdUJBQXVCLENBQUMsNEJBQUQsS0FBb0IscUJBQXBCLE9BSHBCLEdBR0gsQ0FIRyxFQUlILHVCQUF1Qiw0QkFBZ0IscUJBQWhCLFdBSjNCLEdBSUksQ0FKRyxDQUFQOzs7eUJBUUZxTCxVLHlCQUFhO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFNQyxLQUFLLEtBQVgsYUFBVyxFQUFYO0FBQ0EsYUFBTztBQUNMcEMsZUFBT29DLGlCQUFpQkEsR0FEbkIsQ0FDbUJBLENBQWpCQSxDQURGO0FBRUxyRixnQkFBUXFGLGlCQUFpQkEsR0FBakJBLENBQWlCQSxDQUFqQkE7QUFGSCxPQUFQOzs7eUJBTUZDLG1CLGdDQUFvQkMsQyxFQUFHO0FBQ3JCQSxZQUFNLENBQUN4TCxLQUFELEtBQU53TDtBQUNBOzs7eUJBR0ZDLG1CLGdDQUFvQm5LLEMsRUFBRztBQUNyQixVQUFNUCxJQUFFLHVCQUFSO0FBQUEsVUFBdUNxSyxNQUFNLGFBQVdwTCxVQUFYLElBQXNCZSxJQUF0QixJQUE3QztBQUFBLFVBQTJFdUssS0FBSyxDQUM1RSx1QkFENEUsR0FDNUUsQ0FENEUsRUFFNUUsdUJBQXVCLGdDQUZxRCxHQUU1RSxDQUY0RSxFQUc1RSx1QkFBdUIsQ0FBQyw0QkFBRCxLQUFvQixxQkFBcEIsT0FIcUQsR0FHNUUsQ0FINEUsRUFJNUUsdUJBQXVCLDRCQUFnQixxQkFBaEIsV0FKM0IsR0FJSSxDQUo0RSxDQUFoRjtBQU1BaEs7QUFDQSx1SkFBa0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQVZvSyxLQUFVOztBQUNoQnBLLGVBQU8sT0FBS29LLEdBQVpwSztBQUNBQSxlQUFPLE9BQUtvSyxHQUFacEs7QUFDQUEsZUFBTyxPQUFLb0ssR0FBWnBLO0FBQ0Q7QUFDRDtBQUNBOzs7eUJBR0ZxSyxzQixtQ0FBdUJDLEksRUFBTUMsRyxFQUFLO0FBQ2hDLFVBQU1uSyxLQUFLLEVBQUNuQyxHQUFELElBQVFQLEdBQW5CLEVBQVcsRUFBWDtBQUFBLFVBQTJCOE0sSUFBSSxnQkFBL0I7QUFDQSx5SkFBbUI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQVgzTCxJQUFXOztBQUNqQnVCLDRCQUFjLDJCQUFkQSxDQUFjLENBQWRBO0FBQ0FBLGtCQUFVLENBQUNtSyxZQUFELENBQUNBLENBQUQsR0FBaUIsa0NBQWtDO0FBQUEsaUJBQU1DLElBQU47QUFBbkQsU0FBaUIsQ0FBakIsYUFBbUUsMkJBQTdFcEssQ0FBNkUsQ0FBbkUsQ0FBVkE7QUFDRDtBQUNEOzs7eUJBR0ZxSyxHLGdCQUFJL0IsSyxFQUEwRjtBQUFBLFVBQW5GQyxRQUFtRixvRUFBN0UsS0FBS0EsS0FBd0U7QUFBQSxVQUFqRWhFLFNBQWlFLG9FQUExRCxZQUFZQSxNQUE4QztBQUFBLFVBQXRDaUUsUUFBc0Msb0VBQWhDLE9BQU9BLEtBQXlCO0FBQUEsVUFBbEJDLE9BQWtCLG9FQUFiLE9BQU9BLElBQU07O0FBQzVGLFVBQU02QixLQUFLaE0sS0FBWDtBQUNBO0FBQ0EsVUFBSWlNLG1CQUFKO0FBQUEsVUFBaUJDLGtCQUFqQjtBQUNBLFVBQUcsa0VBQUgsVUFBNEI7QUFDMUIscUJBQWFsQyxNQUFiO0FBQ0FpQyxzQkFBY2pDLE1BQWRpQztBQUNBQyxxQkFBYWxDLG1CQUFpQmdDLEtBQWpCaEMsSUFBc0JnQyxLQUFHaEMsTUFBekJBLGFBQTBDQSxNQUF2RGtDO0FBSEYsYUFLSztBQUNIO0FBQ0Q7QUFDRDtBQUNBLFVBQUcsMEJBQXdCLGdCQUEzQixNQUErQztBQUM3Qyx1Q0FBK0IvQixPQUEvQjtBQUNBO0FBQ0EsWUFBRyxpQkFBSCxPQUF5QjtBQUN2Qiw0QkFBa0IsZUFBbEIsQ0FBa0IsQ0FBbEIsRUFBcUMsSUFBckM7QUFDRDtBQUNELFlBQUcsZ0JBQUgsTUFBdUI7QUFDckIsNEJBQWtCLGVBQWxCLENBQWtCLENBQWxCLEVBQXFDLFdBQXJDO0FBQ0Q7QUFDRjtBQUNEO0FBQ0E7QUFDQSxVQUFJVyxjQUFKO0FBQ0EsVUFBTVYsUUFBUSxLQUFkLFFBQWMsRUFBZDtBQUNBLFVBQUcsZUFBSCxVQUE0QjtBQUMxQlUsaUJBQVMsNEJBQTRCLEtBQTVCLDRCQUE2RCxLQUF0RUEsMEJBQVMsQ0FBVEE7QUFERixhQUdLLElBQUcsZUFBSCxVQUE0QjtBQUMvQixZQUFHbUIsNkJBQTJCak0sU0FBU2lNLGNBQVlELEtBQXJCaE0sS0FBOUIsTUFBK0Q7QUFDN0Q4SyxtQkFBUyw0QkFBNEIsS0FBNUIsMEJBQVRBLEVBQVMsQ0FBVEE7QUFDQSxjQUFNcEosS0FBSyxzQkFBc0IsNEJBQTRCLEtBQTVCLDRCQUE2RCxLQUFuRiwwQkFBc0IsQ0FBdEIsRUFBcUh1SyxjQUFZRCxLQUFaQyxJQUFpQkQsS0FBakJDLGNBQWhJLFdBQVcsQ0FBWDtBQUNBbkIsc0JBQVlwSixHQUFab0osVUFBb0JBLE9BQXBCQTtBQUNBQSxzQkFBWXBKLEdBQVpvSixVQUFvQkEsT0FBcEJBO0FBQ0E7QUFMRixlQU9LO0FBQ0hBLG1CQUFTLDRCQUE0QixLQUE1Qiw0QkFBNkQsS0FBdEVBLDBCQUFTLENBQVRBO0FBQ0Q7QUFDRjtBQUNELFVBQUlxQixVQUFKO0FBQUEsVUFBUUMsVUFBUjtBQUFBLFVBQVlDLFNBQVMsTUFBSWpDLE1BQUosU0FBaUJBLE1BQXRDO0FBQ0EsVUFBRyxlQUFILFVBQTBCO0FBQ3hCaUMsa0JBQVUsT0FBSyxPQUFmQTtBQUNEO0FBQ0QsVUFBRyxjQUFZTCxLQUFmLEdBQXFCO0FBQ25CRyxhQUFLLENBQUMvQixlQUFELFNBQXFCQSxNQUExQitCO0FBQ0FDLGFBQUssQ0FBQ2hDLGVBQUQsUUFBb0JBLE1BQXpCZ0M7QUFGRixhQUlLO0FBQ0hELGFBQUtqQyxRQUFNRSxNQUFYK0I7QUFDQUMsYUFBS2pDLE9BQUtDLE1BQVZnQztBQUNEOztBQUVELFVBQU1FLFVBQVUsYUFBV04sS0FBWCxJQUFnQkEsS0FBRyxLQUFuQixRQUE4QixLQUE5QztBQUFBLFVBQTBETyxTQUFTLG9DQUFtQ0wsMkJBQXdCRixLQUF4QkUsSUFBdEc7O0FBdkQ0RixrQ0F3RHRFLG9EQUFvRCxDQUFDQyxLQUFHL0IsTUFBSixPQUFpQmdDLEtBQUdoQyxNQXhERixLQXdEbEIsQ0FBcEQsQ0F4RHNFO0FBQUE7QUFBQTs7QUF5RDVGLFVBQUcsYUFBVzRCLEtBQWQsR0FBb0I7QUFDbEI7QUFDQTtBQUNBSyxpQkFBUyxDQUFUQTtBQUNEO0FBQ0Q7Ozt5QkFHRkcsUyxzQkFBVUMsSSxFQUFNQyxLLEVBQU9MLE0sRUFBUTtBQUFBOztBQUM3QixVQUFNaEwsSUFBSSxLQUFWLFFBQVUsRUFBVjtBQUNBLFVBQUlsQixJQUFKOztBQUVBLFVBQU13TSxLQUFLLFFBQVgsSUFBVyxDQUFYO0FBQ0EsV0FBSSxJQUFJM04sSUFBUixHQUFlQSxJQUFFLHFCQUFqQixNQUFrQyxFQUFsQyxHQUF1QztBQUNyQyxhQUFJLElBQUk0TixJQUFSLEdBQWVBLElBQUUscUJBQWpCLE1BQWtDLEVBQWxDLEdBQXVDO0FBQ3JDLGVBQUksSUFBSXJOLElBQVIsR0FBZUEsSUFBRSxxQkFBakIsTUFBa0MsRUFBbEMsR0FBdUM7QUFDckMsNENBQ0VvTixhQUFXdEwsRUFBWHNMLFFBREYsUUFFRUEsYUFBV3RMLEVBRmIsT0FHRXVMLElBQUV2TCxFQUFGdUwsVUFBWSw0QkFBWkEsS0FBK0IsTUFBSXZMLEVBSHJDO0FBS0Q7QUFDRjtBQUNGO0FBQ0QsVUFBR2xCLE1BQUksdUJBQVAsUUFBc0M7QUFDcEN3QjtBQUNEOztBQUVELFVBQUcsbUJBQW1CLENBQUMsbUJBQXZCLFFBQWtEO0FBQ2hELFlBQU1rTCxRQUFRLElBQUksWUFBbEIsS0FBYyxFQUFkO0FBQUEsWUFBaUNDLFNBQVNELE1BQTFDO0FBQUEsWUFBd0RFLGNBQWMsQ0FBQyxJQUFFLGdCQUFILGtCQUFtQy9NLFNBQVNxQixFQUFUckIsT0FBa0JxQixFQUEzSCxNQUF5R3JCLENBQXpHO0FBQUEsWUFBc0lnTixPQUFPLElBQUksWUFBakosT0FBNkksRUFBN0k7QUFDQUgsNENBQW9DLElBQUksWUFBSixRQUFrQixDQUFsQixNQUF1QixDQUF2QixHQUFwQ0EsU0FBb0MsRUFBcENBLEVBQTRFLElBQUksWUFBSixRQUFrQkUsY0FBbEIsV0FBeUMsTUFBSTFMLEVBQXpId0wsTUFBNEUsQ0FBNUVBO0FBQ0EsYUFBSSxJQUFJMU0sTUFBSixHQUFTWSxJQUFFLHVCQUFmLFFBQTZDWixNQUE3QyxHQUFpRCxFQUFqRCxLQUFzRDtBQUNwRDBNLDZCQUFtQix1QkFBbkJBLEdBQW1CLENBQW5CQTtBQUNBRyxtQkFBUyx1QkFBVEEsR0FBUyxDQUFUQTtBQUNBLGNBQUdBLFNBQU9GLE9BQVBFLElBQWdCQSxTQUFPRixPQUF2QkUsSUFBZ0NBLFNBQU9GLE9BQXZDRSxJQUFILEdBQXNEO0FBQ3BELGdCQUFNNUwsSUFBSTRMLGdCQUFWO0FBQ0Esc0NBQTBCaE4sU0FBUyxZQUFUQSxhQUExQixDQUEwQkEsQ0FBMUI7QUFDQSxvQ0FBd0IsRUFBQzJLLFFBQUQsS0FBWXNDLFVBQXBDLENBQXdCLEVBQXhCO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFVBQUcsbUJBQW1Cak4sU0FBUyxZQUFUQSxVQUF0QixNQUF5RDtBQUN2RCxZQUFNa04sVUFBVSxTQUFWQSxPQUFVO0FBQUEsaUJBQU03TCxvQkFBa0IsY0FBbEJBLFVBQXNDLElBQUVyQixTQUFTLENBQUNxQixFQUFELFdBQVlELElBQUUsTUFBSSxjQUF6RSxXQUF1RCxDQUFUcEIsQ0FBeENxQixDQUFOO0FBQWhCO0FBQ0EsNkJBQXFCLENBQXJCO0FBQ0Esd0NBQWdDLFlBQWhDLElBQWdELEtBQWhEO0FBQ0EsOEJBQWlCLFlBQWpCLCtIQUFxQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsY0FBN0I4TCxRQUE2Qjs7QUFDbkMsaUNBQXVCQSxNQUF2Qix1QkFBb0QsWUFBcEQsTUFBc0VELFFBQVFDLE1BQTlFLFFBQXNFRCxDQUF0RTtBQUNEO0FBQ0Y7O0FBRUQsNEJBQWEsS0FBYixnSUFBMkI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQW5CM00sSUFBbUI7O0FBQ3pCQSwrQkFBdUIsdUJBQXVCQSxFQUE5Q0EsTUFBdUIsQ0FBdkJBO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFHLEtBQUgsUUFBZ0I7QUFDZDtBQUNEOzs7eUJBR0g2TSxPLG9CQUFRMUwsRSxFQUFJO0FBQ1YsV0FBSSxJQUFJdkIsSUFBUixHQUFjQSxJQUFFdUIsS0FBaEIsUUFBNkIsRUFBN0IsR0FBa0M7QUFDaENBLGtCQUFRLENBQUNBLEtBQVRBLENBQVNBLENBQVRBO0FBQ0Q7QUFDRDs7O3lCQUdGMkwsYSwwQkFBYzNMLEUsRUFBSXNJLEssRUFBT3NELEUsRUFBSTtBQUFBOztBQUMzQixVQUFNbkosSUFBTjtBQUNBLDBDQUEwQixLQUExQjtBQUNBLFVBQUlvSixLQUFLLGdDQUFzQixLQUF0QixTQUFULENBQVMsQ0FBVDtBQUFBLFVBQWlEck4sSUFBakQ7QUFDQTtBQUNFLFlBQU1nRCxrQkFBUyxzQkFBc0IsQ0FBQ2lCLElBQUQsS0FBckMsQ0FBZSxDQUFUakIsQ0FBTjtBQUFBLFlBQWdEc0ssa0JBQVMsc0JBQXpELENBQXlELENBQVRBLENBQWhEO0FBQUEsWUFDRUMsS0FBSyxFQUFDbE8sR0FBR2lPLE9BQUt0SyxHQUFULEdBQWVsRSxHQUFHd08sT0FBS3RLLEdBRDlCLENBQ08sRUFEUDtBQUFBLFlBQ3FDd0ssS0FBSzFOLFVBQVV5TixPQUFLQSxHQUFMQSxJQUFVQSxPQUFLQSxHQURuRSxDQUMwQ3pOLENBRDFDO0FBQUEsWUFFRTJOLEtBQUssb0JBQW9CLDZCQUYzQixDQUVPLENBRlA7QUFHQUEsZUFBT0EsT0FBSyxNQUFJRixHQUFKLElBQVpFLElBQXlCQSxPQUFLLE1BQUlGLEdBQUosSUFBOUJFO0FBQ0FKLGFBQUssZ0NBQXNCLEtBQXRCLFNBQUxBLENBQUssQ0FBTEE7QUFDRDtBQUNEQTtBQUNBLGlDQUFpQkEsR0FBakIsSUFBd0JBLEdBQXhCLEtBQWdDLHFCQUFoQyxNQUFpRCxhQUFNO0FBQ3JELGFBQUksSUFBSW5OLElBQVIsR0FBYUEsSUFBRWtOLEdBQWYsUUFBMEIsRUFBMUIsR0FBK0I7QUFDN0IsY0FBRyxDQUFILEdBQU87QUFDTHBOLG1CQUFPLEVBQUNYLEdBQUcsQ0FBQyxDQUFDK04sR0FBRCxDQUFDQSxDQUFELEdBQU90TixTQUFaLEtBQVlBLENBQVIsQ0FBSixFQUE4QmhCLEdBQUcsQ0FBQ3NPLFFBQU10TixTQUEvQ0UsS0FBK0NGLENBQVAsQ0FBakMsRUFBUEU7QUFERixpQkFHSztBQUNILGdCQUFNK0Msa0JBQVMsd0JBQXNCLENBQUM5QyxJQUFELEtBQXJDLENBQWUsQ0FBVDhDLENBQU47QUFBQSxnQkFDTUMsS0FBSyx3QkFBc0IvQyxJQURqQyxDQUNXLENBRFg7QUFBQSxnQkFFTVosSUFBRSxFQUFFMkQsT0FBS0QsR0FGZixDQUVRLENBRlI7QUFBQSxnQkFFc0JqRSxJQUFHa0UsT0FBS0QsR0FGOUI7QUFBQSxnQkFFcUNsQyxJQUFFZixVQUFVVCxRQUFJUCxJQUZyRCxDQUV1Q2dCLENBRnZDO0FBR0FFLHdCQUFZZ0QsT0FBSzNELFFBQUkrTixHQUFyQnBOLENBQXFCb04sQ0FBckJwTjtBQUNBQSx3QkFBWWdELE9BQUtsRSxRQUFJc08sR0FBckJwTixDQUFxQm9OLENBQXJCcE47QUFDRDtBQUNGO0FBWkg7O0FBZUEsVUFBTTBOLE1BQU47O0FBM0IyQjtBQTZCekJBLGlCQUFPLEVBQUNyTyxHQUFELElBQU1QLEdBQWI0TyxFQUFPLEVBQVBBO0FBQ0EsNENBQTBCLE9BQTFCLFNBQXdDMU4sRUFBeEMsQ0FBd0NBLENBQXhDO0FBQ0EsWUFBTWEsSUFBSSxnQ0FBc0IsT0FBdEIsU0FBVixDQUFVLENBQVY7QUFDQUE7QUFDQSxtQ0FBaUJBLEVBQWpCLE9BQTBCLHFCQUExQixNQUEyQyxhQUFNO0FBQy9DLGNBQU1NLElBQUksd0JBQXNCbEIsSUFBaEMsQ0FBVSxDQUFWO0FBQ0F5Tix3QkFBY3ZNLEVBQWR1TTtBQUNBQSx3QkFBY3ZNLEVBQWR1TTtBQUhGO0FBakN5Qjs7QUE0QjNCLFdBQUksSUFBSXhOLElBQVIsR0FBYUEsSUFBRWtOLEdBQWYsUUFBMEIsRUFBMUIsR0FBK0I7QUFBQSxjQUF2QmxOLENBQXVCO0FBVTlCO0FBQ0Q7Ozt5QkFHRnlOLHFCLGtDQUFzQi9DLE0sRUFBUWQsSyxFQUFPdUMsTSxFQUFRZSxFLEVBQUk7QUFDL0MsVUFBTTVMLEtBQUssOEJBQVgsS0FBVyxDQUFYO0FBQ0EsYUFBTywrQkFBUCxFQUFPLENBQVA7Ozt5QkFHRm9NLGdCLDZCQUFpQmhELE0sRUFBUWQsSyxFQUFPO0FBQzlCLFVBQU10SSxLQUFHLEVBQUNuQyxHQUFELElBQVFQLEdBQWpCLEVBQVMsRUFBVDtBQUFBLFVBQXdCK08sU0FBeEI7QUFDQS9ELGVBQU9oSyxVQUFQZ0s7QUFDQSxXQUFJLElBQUk1SixJQUFSLEdBQWVBLElBQUUwSyxTQUFqQixRQUFrQyxFQUFsQyxHQUF1QztBQUNyQ2lELG9CQUFZM04sS0FBRzBLLGtCQUFmaUQsQ0FBWTNOLENBQVoyTjtBQUNEO0FBQ0QsV0FBSSxJQUFJNU4sSUFBUixHQUFlQSxJQUFFMkssWUFBakIsUUFBcUMsRUFBckMsR0FBMEM7QUFDeEMsWUFBTWtELE1BQU47QUFBQSxZQUFnQkMsTUFBaEI7QUFDQSxhQUFJLElBQUk3TixLQUFSLEdBQWVBLEtBQUUwSyxTQUFqQixRQUFrQyxFQUFsQyxJQUF1QztBQUNyQ2tELG1CQUFTbEQsYUFBVGtELENBQVNsRCxDQUFUa0Q7QUFDQUMsbUJBQVNuRCxhQUFUbUQsQ0FBU25ELENBQVRtRDtBQUNEO0FBQ0R2TSxrQkFBVSw4QkFBVkEsS0FBVSxDQUFWQTtBQUNBQSxrQkFBVSw4QkFBVkEsS0FBVSxDQUFWQTtBQUNEO0FBQ0Q7Ozt5QkFHRndNLFcsd0JBQVkzTyxDLEVBQUVQLEMsRUFBRVEsRSxFQUFJO0FBQ2xCLFVBQUcsQ0FBQyxjQUFjRCxFQUFsQixNQUFJLENBQUosRUFBNkI7QUFDM0Isc0JBQWNBLEVBQWQsVUFBMEIsSUFBSSxZQUFKLE9BQTFCLEVBQTBCLENBQTFCO0FBQ0EsWUFBTW1DLEtBQUssY0FBY25DLEVBQWQsUUFBWDtBQUNBLGFBQUksSUFBSVksSUFBUixHQUFZQSxJQUFFWixFQUFkLFFBQXVCLEVBQXZCLEdBQTRCO0FBQzFCbUMsa0JBQVEsSUFBSSxZQUFaQSxPQUFRLEVBQVJBO0FBQ0Q7QUFDRjtBQUNELFVBQU1ELFNBQVMsY0FBY2xDLEVBQTdCLE1BQWUsQ0FBZjtBQUNBLFdBQUksSUFBSVksT0FBUixHQUFZQSxPQUFFWixFQUFkLFFBQXVCLEVBQXZCLE1BQTRCO0FBQzFCa0MsZ0NBQXFCbEMsRUFBckJrQyxJQUFxQmxDLENBQXJCa0MsRUFBMkJ6QyxFQUEzQnlDLElBQTJCekMsQ0FBM0J5QztBQUNEO0FBQ0QsYUFBT0EsZ0JBQWdCekIsWUFBWUEsYUFBNUJ5QixDQUE0QnpCLENBQVpBLENBQWhCeUIsRUFBUDs7O3lCQUdGME0sVSx5QkFBYTtBQUNYLFVBQU01TyxJQUFOO0FBQUEsVUFBV1AsSUFBWDtBQURXLGlCQUVFLDRCQUZGLE1BRUUsQ0FGRjtBQUVYLHFEQUFrRDtBQUE5QyxZQUFJa0IsU0FBSixJQUFJQSxDQUFKO0FBQ0ZYLGVBQU9XLElBQUVGLFNBQVMsTUFBSUEsS0FBSixLQUFsQlQsQ0FBU1MsQ0FBVFQ7QUFDQVAsZUFBT2tCLElBQUVGLFNBQVMsTUFBSUEsS0FBSixLQUFsQmhCLENBQVNnQixDQUFUaEI7QUFDRDs7QUFFRCxVQUFNb1AsNkJBQTZCLENBQ2pDLE9BRGlDLENBQ2pDLENBRGlDLEVBRWpDLGFBRkYsQ0FFRSxDQUZpQyxDQUFuQztBQUFBLFVBSUFDLDZCQUE2QixDQUMzQixPQUQyQixDQUMzQixDQUQyQixFQUUzQixPQU5GLENBTUUsQ0FGMkIsQ0FKN0I7QUFBQSxVQVFBQywyQkFBMkIsQ0FDekIsSUFEeUIsQ0FDekIsQ0FEeUIsRUFFekIsSUFWRixDQVVFLENBRnlCLENBUjNCO0FBQUEsVUFZQUMsc0JBQXNCLENBQ3BCO0FBQ0VoUCxXQUFHLENBQ0QsNEJBREMsTUFDRCxDQURDLEVBRUQsNkJBRkMsS0FFRCxDQUZDLEVBR0QsNkJBSEMsS0FHRCxDQUhDLEVBSUQsNkJBSkMsS0FJRCxDQUpDLEVBS0QsYUFMQyxDQUtELENBTEMsRUFETCxDQUNLLENBREw7QUFTRVAsV0FBRyxDQUNELGFBREMsQ0FDRCxDQURDLEVBRUQsNkJBRkMsS0FFRCxDQUZDLEVBR0QsNkJBSEMsS0FHRCxDQUhDLEVBSUQsNkJBSkMsS0FJRCxDQUpDLEVBS0QsNEJBTEMsTUFLRCxDQUxDO0FBVEwsT0FEb0IsRUFtQnBCO0FBQ0VPLFdBQUcsQ0FDRCw0QkFEQyxNQUNELENBREMsRUFFRCw2QkFGQyxLQUVELENBRkMsRUFHRCw2QkFIQyxLQUdELENBSEMsRUFJRCw2QkFKQyxLQUlELENBSkMsRUFLRCw2QkFMQyxLQUtELENBTEMsRUFNRCw2QkFOQyxLQU1ELENBTkMsRUFPRCxhQVBDLENBT0QsQ0FQQyxFQURMLENBQ0ssQ0FETDtBQVdFUCxXQUFHLENBQ0QsYUFEQyxDQUNELENBREMsRUFFRCw2QkFGQyxLQUVELENBRkMsRUFHRCw2QkFIQyxLQUdELENBSEMsRUFJRCw2QkFKQyxLQUlELENBSkMsRUFLRCw2QkFMQyxLQUtELENBTEMsRUFNRCw2QkFOQyxLQU1ELENBTkMsRUFPRCw0QkFQQyxNQU9ELENBUEM7QUFYTCxPQW5Cb0IsQ0FadEI7O0FBdURBLGFBQU87QUFDTHVQLDZCQURLO0FBRUxILG9DQUZLO0FBR0xDLG9DQUhLO0FBSUxDO0FBSkssT0FBUDs7Ozs7O29CQWhkaUJ2RSxVOzs7Ozs7Ozs7OztVQ0xMSyxLLEdBQUFBLEs7QUFBVCxtQkFBaUI7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQU87QUFDTG5FLGNBREs7QUFFTGlELGFBRks7QUFHTHNGLGVBSEs7QUFJTEMsbUJBSks7QUFLTEMsMkJBTEs7QUFNTEMsbUNBTks7QUFPTEMsMkJBUEs7QUFRTEMsMEJBUks7QUFTTEMsb0JBVEs7QUFVTEMsV0FWSztBQVdMMUYsYUFBTztBQUNMMkYsdUJBREs7QUFFTEMseUJBRks7QUFHTEMscUJBSEs7QUFJTEMsd0JBSks7QUFLTEMsaUJBTEs7QUFNTEMsY0FOSztBQU9MQyxlQVBLO0FBUUwxRyxxQkFBYSxJQVJSO0FBU0xDLHNCQUFjLElBVFQ7QUFVTGIsZUFBTztBQVZGLE9BWEY7QUF1Qkx1QixhQUFPO0FBQ0xnRyx1QkFESztBQUVMQyxlQUZLO0FBR0xDLGlCQUhLO0FBSUxDLGNBQU07QUFKRCxPQXZCRjtBQTZCTGxHLFlBQU07QUFDSmdHLGVBREk7QUFFSkUsY0FBTTtBQUZGLE9BN0JEO0FBaUNMQyxxQkFBZTtBQUNiekcsZUFBTztBQURNO0FBakNWLEtBQVA7QUFxQ0Q7Ozs7Ozs7Ozs7Ozs7QUM1RUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFBQTs7QUFDRSwyQkFBK0I7QUFBQSxVQUFuQjBHLFVBQW1CLG9FQUFYN0csU0FBVzs7QUFBQTs7QUFBQSxtREFDN0IscUJBRDZCLElBQzdCLENBRDZCOztBQUc3QixtQkFBWTtBQUNWO0FBQ0Q7QUFMNEI7QUFNOUI7O0FBUEgsc0RBU2U7QUFDWDtBQUNEOztBQUVBLHVDQUFpQyxZQUFXO0FBQzNDLFlBQUksNEJBQUosTUFBc0M7QUFDckMsOENBQW9DLEtBQXBDO0FBQ0E7QUFIRjtBQWJIOztBQUFBO0FBQUEsSUFBOEMsWUFBOUM7O0FBcUJBO0FBQUE7O0FBQ0Usa0NBQXFCO0FBQUE7O0FBQUEsOENBQ25CLDhCQURtQixPQUNuQixDQURtQjtBQUVwQjs7QUFISDtBQUFBLElBQThDLFlBQTlDOztBQU1BLDhCQUNFLHlCQUFjO0FBQUE7O0FBRWI7QUFDQTs7QUFFQSxRQUFJOEcsU0FBUyxJQUFJLFlBQWpCLE9BQWEsRUFBYjs7QUFFQSxRQUFJcEgsUUFBUTtBQUNYcUgsY0FBUSxFQUFFQyxLQUFGLEdBQVVDLE9BRFAsRUFDSCxFQURHO0FBRVhDLGVBQVM7QUFGRSxLQUFaOztBQUtBLFFBQUlDLGFBQWFDLHVCQUFqQixLQUFpQkEsQ0FBakI7QUFDQUQ7O0FBRUE7O0FBRUEsUUFBSUUsZ0JBQWdCRCx1QkFBcEIsS0FBb0JBLENBQXBCOztBQUVBQztBQUNBQTtBQUNBQTs7QUFFQUY7O0FBRUEsUUFBSUcsT0FBTyxnQkFBaUJDLFVBQTVCLFNBQVcsQ0FBWDs7QUFFQSx5QkFBcUIsWUFBWSxDQUFqQzs7QUFFQSxtQkFBZSxZQUFZOztBQUUxQixhQUFPO0FBQ05wSCxlQURNO0FBRU5qRCxnQkFBUXNLO0FBRkYsT0FBUDtBQUZEOztBQVNBLG1CQUFlLHlCQUF3Qjs7QUFFdENDO0FBQ0FEO0FBQ0FFLG1CQUFhRCxTQUFiQztBQUNBQyxvQkFBY0gsVUFBZEc7O0FBRUFSLCtCQUF5QmhILFFBQXpCZ0g7QUFDQUEsZ0NBQTBCakssU0FBMUJpSzs7QUFFQUUsa0NBQTRCbEgsUUFBNUJrSDtBQUNBQSxtQ0FBNkJuSyxTQUE3Qm1LO0FBWEQ7O0FBZUEsNEJBQXlCOztBQUV4QixhQUFPcFEsOEJBQVA7QUFFQTs7QUFFRCx3Q0FBcUM7O0FBRXBDLFVBQUkyUSxXQUFXZCxPQUFmOztBQUVBLGFBQU8sY0FDTmUsUUFBU0QsU0FESCxDQUNHQSxDQUFUQyxDQURNLFNBRU5BLFFBQVMsQ0FBRUQsU0FGTCxDQUVLQSxDQUFYQyxDQUZNLFNBR05BLFFBQVNELFNBSEgsQ0FHR0EsQ0FBVEMsQ0FITSxTQUlOQSxRQUFTRCxTQUpILENBSUdBLENBQVRDLENBSk0sU0FLTkEsUUFBU0QsU0FMSCxDQUtHQSxDQUFUQyxDQUxNLFNBTU5BLFFBQVMsQ0FBRUQsU0FOTCxDQU1LQSxDQUFYQyxDQU5NLFNBT05BLFFBQVNELFNBUEgsQ0FPR0EsQ0FBVEMsQ0FQTSxTQVFOQSxRQUFTRCxTQVJILENBUUdBLENBQVRDLENBUk0sU0FTTkEsUUFBU0QsU0FUSCxDQVNHQSxDQUFUQyxDQVRNLFNBVU5BLFFBQVMsQ0FBRUQsU0FWTCxDQVVLQSxDQUFYQyxDQVZNLFNBV05BLFFBQVNELFNBWEgsRUFXR0EsQ0FBVEMsQ0FYTSxTQVlOQSxRQUFTRCxTQVpILEVBWUdBLENBQVRDLENBWk0sU0FhTkEsUUFBU0QsU0FiSCxFQWFHQSxDQUFUQyxDQWJNLFNBY05BLFFBQVMsQ0FBRUQsU0FkTCxFQWNLQSxDQUFYQyxDQWRNLFNBZU5BLFFBQVNELFNBZkgsRUFlR0EsQ0FBVEMsQ0FmTSxTQWdCTkEsUUFBU0QsU0FoQkgsRUFnQkdBLENBQVRDLENBaEJNLEdBQVA7QUFtQkE7O0FBRUQseURBQXNEOztBQUVyRCxVQUFJRCxXQUFXZCxPQUFmO0FBQ0EsVUFBSWdCLFdBQVcsY0FDZEQsUUFBU0QsU0FESyxDQUNMQSxDQUFUQyxDQURjLFNBRWRBLFFBQVNELFNBRkssQ0FFTEEsQ0FBVEMsQ0FGYyxTQUdkQSxRQUFTRCxTQUhLLENBR0xBLENBQVRDLENBSGMsU0FJZEEsUUFBU0QsU0FKSyxDQUlMQSxDQUFUQyxDQUpjLFNBS2RBLFFBQVMsQ0FBRUQsU0FMRyxDQUtIQSxDQUFYQyxDQUxjLFNBTWRBLFFBQVMsQ0FBRUQsU0FORyxDQU1IQSxDQUFYQyxDQU5jLFNBT2RBLFFBQVMsQ0FBRUQsU0FQRyxDQU9IQSxDQUFYQyxDQVBjLFNBUWRBLFFBQVMsQ0FBRUQsU0FSRyxDQVFIQSxDQUFYQyxDQVJjLFNBU2RBLFFBQVNELFNBVEssQ0FTTEEsQ0FBVEMsQ0FUYyxTQVVkQSxRQUFTRCxTQVZLLENBVUxBLENBQVRDLENBVmMsU0FXZEEsUUFBU0QsU0FYSyxFQVdMQSxDQUFUQyxDQVhjLFNBWWRBLFFBQVNELFNBWkssRUFZTEEsQ0FBVEMsQ0FaYyxTQWFkQSxRQUFTRCxTQWJLLEVBYUxBLENBQVRDLENBYmMsU0FjZEEsUUFBU0QsU0FkSyxFQWNMQSxDQUFUQyxDQWRjLFNBZWRBLFFBQVNELFNBZkssRUFlTEEsQ0FBVEMsQ0FmYyxTQWdCZEEsUUFBU0QsU0FoQkssRUFnQkxBLENBQVRDLENBaEJjLEdBQWY7O0FBbUJBLGdCQUFTOztBQUVSLGVBQU8scUdBQVA7QUFLQTs7QUFFRCxhQUFPLHlCQUFQO0FBRUE7O0FBRUQsMkRBQXdEOztBQUV2RCxVQUFHNUosa0JBQWtCLFlBQXJCLGFBQXdDOztBQUV2Qzs7QUFFQSxZQUFHQSxrQkFBa0IsWUFBckIsYUFBd0M7QUFDdkM2SSxzQkFBYUMsT0FBYkQ7QUFDQUE7QUFDQUEsOEJBQXFCN0ksT0FBckI2STtBQUNBQSx1QkFBYzdJLE9BQWQ2STs7QUFFQUE7QUFDQUE7QUFDQUE7QUFDQUE7O0FBRUFHLGtCQUFRYywyQkFBUmQsZUFBUWMsQ0FBUmQ7QUFYRCxlQWFPOztBQUVOQSxrQkFBUWMsbUJBQW9COUosT0FBcEI4SixhQUFSZCxlQUFRYyxDQUFSZDtBQUVBOztBQUVELFlBQUlKLFVBQVU1SSxPQUFkO0FBQ0EsWUFBSStKLGNBQWN0SSxjQUFlekIsT0FBZnlCLE9BQThCQSxjQUFlekIsT0FBZnlCLElBQWhEOztBQUVBLFlBQUdzSSw2QkFBNkJBLGdCQUFoQyxPQUF1RDtBQUN0RG5CO0FBQ0FBO0FBQ0FBOztBQUVBbkgsd0JBQWV6QixPQUFmeUIsTUFBNkIsRUFBRXVILE9BQS9CdkgsS0FBNkIsRUFBN0JBO0FBQ0Esb0JBQVM7QUFDUkEsMEJBQWV6QixPQUFmeUIsOEJBQXFEdUksNkJBQXJEdkksTUFBcUR1SSxDQUFyRHZJO0FBQ0E7QUFDRDs7QUFFRCxZQUFHbUgsdUJBQUgsZUFBeUM7QUFDeENRO0FBQ0E7QUFDRDs7QUFFRCxXQUFJLElBQUlqUSxJQUFKLEdBQVdZLElBQUlpRyxnQkFBbkIsUUFBMkM3RyxJQUEzQyxRQUF3RDs7QUFFdkQ4USxxQkFBY2pLLGdCQUFkaUssQ0FBY2pLLENBQWRpSztBQUVBO0FBRUQ7O0FBRUQsUUFBSUQsdUJBQXVCLFlBQVk7O0FBRXRDLFVBQUkxUyxJQUFJLElBQUksWUFBWixPQUFRLEVBQVI7QUFDQSxVQUFJRSxJQUFJLElBQUksWUFBWixPQUFRLEVBQVI7O0FBRUEsYUFBTyw0QkFBMkI7O0FBRWpDRixnQ0FBeUI0UyxRQUF6QjVTO0FBQ0FFLGdDQUF5QjJTLFFBQXpCM1M7O0FBRUEsZUFBT0Ysb0JBQVAsQ0FBT0EsQ0FBUDtBQUxEO0FBTEQsS0FBMkIsRUFBM0I7O0FBZ0JBLDJCQUF3Qjs7QUFFdkIsVUFBSThTLFFBQVEsWUFBYTNJLE1BQWIsY0FBa0MsZ0JBQWU7O0FBRTVELGVBQU9BLDJDQUE2Q0EsaUJBQXBEO0FBRkQsT0FBWSxDQUFaO0FBS0EsVUFBSTRJLE9BQU9ELE1BQVg7O0FBRUFFLHFCQUFnQixrQkFBaUI7O0FBRWhDLFlBQUlDLFFBQVFILGNBQWVwSyxZQUEzQixFQUFZb0ssQ0FBWjs7QUFFQSxZQUFHRyxVQUFVLENBQWIsR0FBa0I7O0FBRWpCdkssd0NBQThCcUssT0FBOUJySztBQUVBO0FBUkZzSztBQVlBOztBQUVELGtCQUFjLHlCQUF3Qjs7QUFFckMsVUFBSXZCLE1BQU1ELHNDQUFWOztBQUVBLFVBQUdySCxxQkFBSCxLQUE2Qjs7QUFFNUJ5SCw2Q0FBcUNILE1BQXJDRztBQUNBQSwwQ0FBa0NILE1BQWxDRztBQUNBQSx1Q0FBK0JILE1BQS9CRzs7QUFFQXpIO0FBRUE7O0FBRUQ2STs7QUFFQSxVQUFHeEIsa0JBQUgsTUFBMkJBOztBQUUzQixVQUFJMEIsa0JBQWtCLDhCQUNyQkMsbUJBQW9CM0IsT0FEckIsa0JBQ0MyQixDQUREOztBQUdBLFVBQUl6QixRQUFRd0Isb0VBQVo7O0FBR0EsVUFBRy9JLGdDQUFnQyxDQUFuQyxNQUEyQzs7QUFFMUMySDtBQUNBQTtBQUNBQTs7QUFFQTNIO0FBRUE7O0FBRUR3STs7QUFFQSxnQkFBUzs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBUztBQUVBO0FBNUNGO0FBbk5IOztvQkFxUWUsWUFBTUMsYTs7QUFFckIsTUFBTUMsZUFBZSxZQUFyQjtBQUFBLE1BQXdDQyxlQUFlLFlBQXZEO1VBRWtCQyxXLEdBQWhCRixZO1VBQ2dCRyxXLEdBQWhCRixZOzs7Ozs7Ozs7Ozs7QUN2U0Y7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCRyxXOzs7YUFJWkMsSSxpQkFBS0MsRyxFQUFnQjtBQUFBLFVBQVhDLFFBQVcsb0VBQUwsR0FBSzs7QUFDMUJIO0FBQ0FBLHVCQUFpQixnWkFZR0UsSUFacEJGLElBQWlCLENBQWpCQTs7O2FBY0twTSxPLHNCQUFVO0FBQ2ZvTTs7O0FBR0YsNENBQWtDO0FBQUE7O0FBQUEsbURBQ2hDLGtCQURnQyxJQUNoQyxDQURnQzs7QUFFaEM7QUFDQSx5QkFBa0IsYUFBbEIsc0NBQWtCLENBQWxCO0FBQ0QsVUFBTUksV0FBV2hJLE1BQWpCO0FBQUEsVUFBOEJpSSxZQUFZcE0saUJBQTFDO0FBQ0M7QUFDRCx1QkFBZ0JtTSxXQUFoQjtBQUNBLHVCQUFnQkEsV0FBaEI7O0FBRUM7QUFDQSxnQkFBUyxpQkFBVCxDQUFTLENBQVQ7QUFWZ0M7QUFXakM7O3VCQUVERSxZLHlCQUFhQyxJLEVBQU07QUFDakIsVUFBRyxlQUFlLFlBQWxCLElBQWtCLENBQWxCLEVBQXFDO0FBQ25DLFlBQUk7QUFDRjtBQURGLFVBR0EsVUFBUztBQUNQNVE7QUFDRDtBQUNGOzs7dUJBR0hpRSxPLHNCQUFVO0FBQ1I7Ozt1QkFHRjRNLGMsNkJBQWlCO0FBQ2Y7QUFDQSxPQUFDLEtBQUQsT0FBYSxTQUFiLE1BQWEsRUFBYjtBQUNBLE9BQUMsS0FBRCxRQUFjLFVBQWQsTUFBYyxFQUFkOzs7dUJBR0ZDLE8sc0JBQWdDO0FBQUEsVUFBeEJDLE1BQXdCLG9FQUFwQixFQUFvQjtBQUFBLFVBQWhCQyxPQUFnQixvRUFBWCxFQUFXO0FBQUEsVUFBUEMsS0FBTyxvRUFBSixFQUFJOztBQUM5Qjs7QUFFQSxpQkFBVyxvRUFBb0QsS0FBL0QsVUFBVyxDQUFYO0FBQ0Esa0JBQVksNEJBQWlCLEtBQTdCLFVBQVksQ0FBWjtBQUNBLFVBQU1YLE9BQU9ZLEtBQWIsRUFBYUEsQ0FBYjtBQUNBLGdCQUFTO0FBQ1Asc0JBQWNaLEtBQUssS0FBTEEsWUFBc0IsS0FBdEJBLFVBQWQ7QUFDRDs7O3VCQUdIYSxVLHVCQUFXQyxHLEVBQUs7QUFBQTs7QUFDZCxVQUFNQyxZQUFZLGlCQUFpQkMsS0FBbkMsR0FBbUNBLEVBQW5DO0FBQ0FDLGlCQUFXLFlBQUs7QUFDZCxZQUFHRixjQUFZLE9BQWYsV0FBK0I7QUFDN0JEO0FBQ0Q7QUFISEcsU0FJR2xCLFNBSkhrQjs7O3VCQU9GQyxRLHVCQUFXO0FBQ1QsYUFBTyx5QkFBUCxRQUFPLENBQVA7Ozt1QkFHRkMsSSxtQkFBTztBQUFBOztBQUNMLFVBQUkxUSxXQUFKO0FBQ0EsVUFBRyxDQUFDLEtBQUosUUFBSSxFQUFKLEVBQXFCO0FBQ25CO0FBQ0E7QUFDQUEsY0FBTSxZQUFZLG1CQUFZO0FBQzVCLDRCQUFnQixZQUFLO0FBQ25CO0FBQ0EyUTtBQUZGO0FBREYzUSxTQUFNLENBQU5BO0FBSEYsYUFVSztBQUNIQSxjQUFNNFEsUUFBTjVRLE9BQU00USxFQUFONVE7QUFDRDtBQUNEOzs7dUJBR0Y2USxJLG1CQUFPO0FBQUE7O0FBQ0wsVUFBSTdRLFdBQUo7QUFDQSxVQUFHLEtBQUgsUUFBRyxFQUFILEVBQW9CO0FBQ2xCO0FBQ0E7QUFDQUEsY0FBTSxZQUFZLG1CQUFZO0FBQzVCLDRCQUFnQixZQUFLO0FBQ25CO0FBQ0EyUTtBQUZGO0FBREYzUSxTQUFNLENBQU5BO0FBSEYsYUFVSztBQUNIQSxjQUFNNFEsUUFBTjVRLE9BQU00USxFQUFONVE7QUFDRDtBQUNEOzs7Ozs7b0JBbkhpQnNQLFE7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQ0hBd0IsUTtBQUVuQixxQkFBd0Q7QUFBQSxVQUE1Q0MsVUFBNEMsb0VBQXBDQyxRQUFvQztBQUFBLFVBQTFCQyxTQUEwQixvRUFBbkJILE1BQU1JLFdBQWE7O0FBQUE7O0FBQ3RELGdCQUFVLElBQVYsR0FBVSxFQUFWO0FBQ0E7QUFDQTtBQUNBO0FBQ0Q7O29CQUVEQyxPLG9CQUFRZCxHLEVBQUs7QUFDWCxzQkFBZ0I7QUFBQSxlQUFTQSxJQUFJLElBQWIsQ0FBYSxDQUFKQSxDQUFUO0FBQWhCOzs7VUFHS2EsVyx3QkFBWUUsSyxFQUFPO0FBQ3hCOzs7b0JBR0ZDLE0sbUJBQU8xVCxDLEVBQUc7QUFDUixVQUFJcUMsTUFBSjtBQUNBLFVBQU1wQixJQUFJLFlBQVYsQ0FBVSxDQUFWO0FBQ0EsVUFBRyxDQUFDQSxFQUFELFVBQWEsQ0FBQ0EsU0FBakIsQ0FBaUJBLENBQWpCLEVBQThCO0FBQzVCLHFCQUFhLFlBQWIsQ0FBYSxDQUFiO0FBQ0EsWUFBR0EsRUFBSCxTQUFjO0FBQ1pBO0FBQ0Q7QUFDRDtBQUNBb0I7QUFDRDtBQUNEOzs7b0JBR0ZzUixTLHdCQUFZO0FBQ1YsVUFBTUMsTUFBTjtBQUNBLDJCQUFhLEtBQWIsb0hBQXNCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFkNVMsSUFBYzs7QUFDcEI0UyxpQkFBUyxFQUFDakIsV0FBVzNSLEtBQVosV0FBNEI2UyxLQUFLN1MsRUFBMUM0UyxDQUEwQzVTLENBQWpDLEVBQVQ0UztBQUNEO0FBQ0RBLGVBQVM7QUFBQSxlQUFTM1YsY0FBWUUsRUFBckI7QUFBVHlWO0FBQ0EsV0FBSSxJQUFJOVQsSUFBUixHQUFhQSxJQUFFOFQsSUFBRjlULFVBQWdCLFlBQVUsSUFBRSxLQUFGLFVBQXZDLEdBQXlELEVBQXpELEdBQThEO0FBQzVELG9CQUFZOFQsT0FBWjtBQUNEOzs7b0JBR0hyTyxPLHNCQUFVO0FBQ1IsVUFBTXFPLE1BQU47QUFDQSw0QkFBYSxLQUFiLDJIQUFzQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBZDVTLElBQWM7O0FBQ3BCNFMsaUJBQVMsRUFBQzNTLEdBQUdELEVBQUosQ0FBSUEsQ0FBSixFQUFVaEIsR0FBR2dCLEVBQXRCNFMsQ0FBc0I1UyxDQUFiLEVBQVQ0UztBQUNEO0FBQ0Qsd0pBQWtCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFWN1AsSUFBVTs7QUFDaEIsWUFBR0EsSUFBSCxTQUFnQjtBQUNkQTtBQUNEO0FBQ0QsdUJBQWVBLEVBQWY7QUFDRDs7O1VBR0krUCxlLDRCQUFnQkwsSyxFQUFPO0FBQzVCLFVBQUlNLE9BQUo7QUFDQSxpQkFBVTtBQUNSO0FBQ0EsWUFBTXRTLE1BQU1nUyxNQUFaO0FBQ0EsWUFBR2hTLFFBQUgsV0FBb0I7QUFDbEIsZUFBSyxJQUFMLFlBQXFCO0FBQ25CLGdCQUFHZ1MscUJBQUgsQ0FBR0EsQ0FBSCxFQUE0QjtBQUMxQk0sc0JBQU1aLHNCQUFzQk0sTUFBNUJNLENBQTRCTixDQUF0Qk4sQ0FBTlk7QUFDRDtBQUNGO0FBTEgsZUFPSztBQUNIQTtBQUNEO0FBQ0Y7QUFDRDs7O29CQUdGQyxZLDJCQUFlO0FBQ2IsYUFBT3BCLEtBQVAsR0FBT0EsRUFBUDs7O29CQUlGcUIsRyxnQkFBSUosRyxFQUFLO0FBQ1AsVUFBTUosUUFBUSxZQUFkLEdBQWMsQ0FBZDtBQUNBLGlCQUFVO0FBQ1JBLDBCQUFrQixLQUFsQkEsWUFBa0IsRUFBbEJBO0FBQ0Q7QUFDRDs7O29CQUdGUyxHLGdCQUFJTCxHLEVBQUtKLEssRUFBTztBQUNkQSx3QkFBa0IsS0FBbEJBLFlBQWtCLEVBQWxCQTtBQUNBO0FBQ0EsbUJBQVcsWUFBWCxLQUFXLENBQVg7QUFDQSxVQUFHLFlBQVUsS0FBYixTQUEyQjtBQUN6QjtBQUNEO0FBQ0Q7Ozs7OztvQkE5RmlCTixLOzs7Ozs7Ozs7Ozs7QUNBckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCZ0IsYTs7Ozs7Ozs7O3lCQUVuQkMsYSwwQkFBY0MsRSxFQUFJeE4sQyxFQUFHekcsSSxFQUFNO0FBQ3pCOzs7eUJBR0ZrVSxhLDBCQUFjek4sQyxFQUFHO0FBQUE7O0FBQ2ZvTSw2QkFBdUI7QUFBQSxlQUFLLHFCQUFMLENBQUssQ0FBTDtBQUF2QkE7Ozt5QkFHRjFOLE8sc0JBQVUsQzs7O0lBVjRCLFlBQU1nUCxlOztvQkFBekJKLFU7Ozs7Ozs7Ozs7OztBQ0ZyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFFcUJLLHVCOzs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNENBQW1EO0FBQUEsVUFBN0JDLGFBQTZCLG9FQUFsQjtBQUFBO0FBQWtCO0FBQUEsVUFBTkMsT0FBTTs7QUFBQTs7QUFBQSxtREFDakQsZ0NBRGlELEdBQ2pELENBRGlEOztBQUdqRDtBQUNBO0FBQ0E7QUFMaUQ7QUFNbEQ7O21DQUVEQyxJLGlCQUFLOUQsTyxFQUFTQyxPLEVBQVM7QUFDckIsYUFBT0QscUJBQW9CLHlCQUFwQkEsT0FBb0IsQ0FBcEJBLEdBQVA7OzttQ0FHRm5LLFcsd0JBQVlDLE0sRUFBUTtBQUNsQixhQUFPQSxjQUFQOzs7bUNBR0ZpTyxTLHNCQUFVQyxNLEVBQVE7QUFDaEI7OzttQ0FHRkMsUyxzQkFBVWpPLEMsRUFBR3pHLEksRUFBTTtBQUNqQixVQUFJdUcsY0FBSjtBQUNBLFVBQUd2RyxhQUFXLEtBQWQsTUFBeUI7QUFDdkIsNkJBQWtCLEtBQWxCLHlIQUFnQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsY0FBeEJ5VSxTQUF3Qjs7QUFDOUJsTyxtQkFBU2tPLDJCQUFUbE8sSUFBU2tPLENBQVRsTztBQUNBLHNCQUFXO0FBQ1Q7QUFDRDtBQUNGO0FBQ0Y7QUFDRDs7Ozs7O29CQXJDaUI2TixvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0ZyQjs7Ozs7Ozs7Ozs7Ozs7TUFFcUJPLFM7V0FJWkMsVSx1QkFBVzNVLEMsRUFBRztBQUNuQixhQUFPQSxNQUFJMFUsT0FBWDs7O3FCQUdGRSxLLG9CQUFRO0FBQ04sVUFBTUMsS0FBTjtBQUFBLFVBQWVoTCxNQUFmO0FBQUEsVUFBeUJpTCxPQUFPLEtBQWhDO0FBQ0EsVUFBSW5VLElBQUo7QUFDQSxXQUFJLElBQUlsQixJQUFSLEdBQWFBLElBQUVxVixLQUFmLFFBQTRCLEVBQTVCLEdBQWlDO0FBQy9CLFlBQUdBLFFBQUgsUUFBbUI7QUFDakJqTCxtQkFBUztBQUNQdkYsa0JBRE87QUFFUHFILG9CQUFRaEw7QUFGRCxXQUFUa0o7QUFJQWdMLGtCQUFRQyxLQUFSRCxDQUFRQyxDQUFSRDtBQUNBbFUsZUFBS21VLFFBQUxuVTtBQUNBLGNBQUdsQixJQUFFcVYsY0FBRnJWLEtBQW1CLENBQUNpVixrQkFBa0JJLGVBQWVBLGlCQUFyRHJWLENBQXNDcVYsQ0FBbEJKLENBQXBCalYsSUFBMkUsQ0FBQ2lWLGtCQUFrQkksS0FBS3JWLElBQUxxVixVQUFqRyxDQUFpR0EsQ0FBbEJKLENBQS9FLEVBQXVIO0FBQ3JIRyxvQkFBUUgsT0FBUkc7QUFDQTtBQUNEO0FBQ0Y7QUFDRjtBQUNEO0FBQ0EsaUJBQVdBLFFBQVgsRUFBV0EsQ0FBWDs7O3FCQUdGRSxPLG9CQUFRcFUsQyxFQUFHO0FBQ1QsVUFBTXNILE9BQU8sU0FBUywyQkFBaUIsS0FBakIsS0FBMkIsRUFBQzBELFFBQTVCLENBQTJCLEVBQTNCLEVBQXdDO0FBQUEsZUFBUy9OLFdBQVNFLEVBQWxCO0FBQTlELE9BQXNCLENBQVQsQ0FBYjtBQUNBLFVBQUlrWCxRQUFRLGFBQVo7QUFBQSxVQUFpQ3ZWLElBQUl3SSxLQUFyQztBQUNBdEgsV0FBS3NILEtBQUx0SDtBQUNBLG9CQUFhO0FBQ1gsWUFBRyxhQUFILFFBQXdCO0FBQ3RCLGNBQU1zVSxZQUFZeFYsSUFBRSxtQkFBRkEsS0FBd0IsQ0FBQ2lWLGtCQUFrQixvQkFBb0Isc0JBQS9EalYsQ0FBMkMsQ0FBbEJpVixDQUF6QmpWLElBQTBGLENBQUNpVixrQkFBa0IsVUFBVWpWLElBQVYsVUFBL0gsQ0FBK0gsQ0FBbEJpVixDQUE3RztBQUFBLGNBQ01RLFNBQVM1VixTQUFTLHVCQUFxQjJWLGdCQUFyQixLQUFUM1YsR0FEZixLQUNlQSxDQURmO0FBRUEsY0FBR3FCLElBQUUsYUFBTCxRQUEwQjtBQUN4QiwyQkFBZTtBQUNia1EscUJBRGE7QUFFYmxGLHNCQUZhO0FBR2J1SixzQkFBUTVWLGlCQUFpQixzQkFBakJBO0FBSEssYUFBZjtBQUtEO0FBQ0QwVjtBQUNBO0FBQ0FyVTtBQUNEO0FBQ0Y7OztxQkFHSHdVLFUsdUJBQVd4VSxDLEVBQUc7QUFDWixVQUFJVyxJQUFKO0FBQUEsVUFBV2pCLElBQUlNLElBQUUsYUFBRkEsU0FBZjtBQUFBLFVBQXdDeVUsT0FBTyxXQUEvQztBQUFBLFVBQXlFQyxXQUFXRCxPQUFwRjtBQUNBLGFBQU1BLFFBQVFDLFdBQWQsTUFBNkI7QUFDM0JBO0FBQ0EsWUFBR0QsT0FBSCxHQUFXO0FBQ1QsZUFBSSxJQUFJM1YsSUFBRTZCLElBQVYsR0FBZTdCLEtBQWYsR0FBcUIsRUFBckIsR0FBMEI7QUFDeEIsZ0JBQUdpVixrQkFBa0IsU0FBbEJBLENBQWtCLENBQWxCQSxLQUFrQ2pWLE1BQXJDLEdBQTRDO0FBQzFDNkIsa0JBQUk3QixjQUFVQSxJQUFkNkI7QUFDQTtBQUNBO0FBQ0Q7QUFDRjtBQVBILGVBU0s7QUFDSCxlQUFJLElBQUk3QixLQUFFWSxJQUFWLEdBQWVaLEtBQUUsU0FBakIsUUFBa0MsRUFBbEMsSUFBdUM7QUFDckMsZ0JBQUdpVixrQkFBa0IsU0FBbEJBLEVBQWtCLENBQWxCQSxLQUFrQ2pWLE9BQUksa0JBQXpDLEdBQTREO0FBQzFEWSxrQkFBSVosT0FBSSxrQkFBSkEsSUFBdUJBLE9BQUksa0JBQTNCQSxJQUE4Q0EsS0FBbERZO0FBQ0E7QUFDQTtBQUNEO0FBQ0Y7QUFDRjtBQUNGO0FBQ0QseUJBQW1CLG1CQUFtQkEsUUFBdEMsQ0FBbUIsQ0FBbkI7OztxQkFHRmlWLE8sc0JBQVU7QUFDUixhQUFPLEtBQVA7OztxQkFHRkMsVywwQkFBYztBQUNaLGFBQU8sS0FBUDs7O0FBU0YsMENBQWtDO0FBQUE7O0FBQ2hDLGdDQUNLYixPQURMO0FBSUE7QUFDQSxVQUFNM1UsT0FBTyxXQUFiLElBQWEsQ0FBYjtBQUNBO0FBQ0E7QUFDQSxxQkFBZXlWLFFBQWYsV0FBZUEsRUFBZjtBQUNBLGtCQUFZLFNBQVosV0FBWSxFQUFaO0FBQ0EsVUFBSTdVLElBQUo7QUFDQSxtQkFBWTtBQUNWQSxZQUFJLGtCQUFrQixLQUFsQixTQUFKQSxDQUFJLENBQUpBO0FBQ0EsWUFBR0EsTUFBSSxDQUFQLEdBQVc7QUFDVDtBQURGLGVBR0s7QUFDSDtBQUNBO0FBQ0FBLGVBQUssYUFBTEE7QUFDRDtBQUNGO0FBQ0Y7Ozs7O0FBbEhrQitULFNBRVplLFNBRllmLEdBRUEsR0FGQUE7QUFBQUEsU0FxRlpnQixRQXJGWWhCLEdBcUZEO0FBQ2hCaUIsbUJBRGdCO0FBRWhCQyxVQUZnQjtBQUdoQkMsY0FBVTtBQUhNLEdBckZDbkI7b0JBQUFBLE07Ozs7Ozs7Ozs7OztBQ0ZyQjs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSwwQkFBa0IsQ0FBQ2hZLHFDQUFtQyxxREFBcEMsUUFBb0MsRUFBcEMsRUFBbEI7QUFDQSx3QkFBZ0IsQ0FBQ0EscUNBQW1DLHFEQUFwQyxRQUFvQyxFQUFwQyxFQUFoQjtBQUNBOztNQUVxQm9aLE07QUFFbkIsdUNBQWtDO0FBQUE7O0FBQUE7O0FBQ2hDLGlCQUFXLDZCQUFYLEdBQVcsQ0FBWDtBQUNBO0FBQ0EseUJBQW1CLEVBQUNDLFFBQVEsQ0FBVCxHQUFhQyxPQUFoQyxDQUFtQixFQUFuQjtBQUNBOztBQUVBLDhCQUFrQjtBQUNoQjNSLGFBQUssS0FEVztBQUVoQjRSLHdCQUFnQixNQUFJO0FBRkosT0FBbEIsY0FHZSxnQkFBUztBQUN0QixZQUFHLE1BQUgsaUJBQXlCO0FBQ3ZCLGNBQUlDLE1BQU01VyxXQUFXLE1BQUlTLEtBQUosU0FBZ0JBLEtBQXJDLEtBQVVULENBQVY7QUFBQSxjQUNNNlcsTUFBTTdXLFdBQVcsTUFBSSxrQkFBSixTQUE0QixrQkFEbkQsS0FDWUEsQ0FEWjtBQUVBLGNBQUc0VyxRQUFILEtBQWM7QUFDWkEsa0JBQU1FLGlCQUFORjtBQUNBQSxrQkFBTUEsa0JBQU5BO0FBQ0E7QUFDRDtBQUNGO0FBQ0Q7QUFiRixjQWVLLG1CQUFZO0FBQ2YsWUFBR0csbUJBQUgsR0FBdUI7QUFDckJ6RCxzQkFBWSxDQUFDeUQsZ0JBQUQsQ0FBQ0EsQ0FBRCxFQUFxQkEsZ0JBQWpDekQsQ0FBaUN5RCxDQUFyQixDQUFaekQsT0FDSyxpQkFBVTtBQUNiO0FBRkZBO0FBREYsZUFNSztBQUNIO0FBQ0Q7QUF4Qkg7QUEwQkQ7O2tCQUVEckIsSSxpQkFBSzhFLE8sRUFBU3JOLEssRUFBTztBQUNuQjtBQUNBLDBCQUFvQkEsUUFBUTFKLFNBQVMsSUFBRXdXLGdCQUFnQjlNLE1BQWhCOE0sQ0FBZ0I5TSxDQUFoQjhNLEVBQUYsUUFBa0NBLGdCQUFnQjlNLE1BQWhCOE0sQ0FBZ0I5TSxDQUFoQjhNLEVBQTNDeFcsU0FBNEV3VyxnQkFBZ0I5TSxNQUFoQjhNLENBQWdCOU0sQ0FBaEI4TSxFQUE1RXhXLFFBQVIwSixPQUFwQjtBQUNBLFVBQUk3RyxPQUFPeVEsZ0JBQVgsT0FBV0EsQ0FBWDs7QUFIbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUtqQnpRLGVBQU8sVUFBVSxtQkFBWTtBQUMzQmtRO0FBQ0E7QUFGRmxRLFNBQU8sQ0FBUEE7QUFMaUI7O0FBSW5CLDJCQUFlLGtCQUFmLE9BQWUsRUFBZixrSEFBNEM7QUFBQTs7QUFBQTs7QUFBQTtBQUszQzs7O2tCQUdIbVUsVyx3QkFBWWpWLEMsRUFBRztBQUNiLGFBQU8sQ0FBQyxLQUFELGdCQUFzQkEsTUFBdEIsS0FBK0JBLE1BQUkscUJBQW5DLGFBQWtFQSxpQkFBekU7OztrQkFHRmtWLE8sb0JBQVFsVixDLEVBQUc7QUFDVCxhQUFPLHFCQUFxQixvQkFBbUIvQixVQUFVK0IsSUFBVi9CLEtBQW5CLElBQXFDK0IsSUFBakUsQ0FBTyxDQUFQOzs7a0JBR0Y2RCxPLHNCQUFVO0FBQ1Isa0NBQTRCLGtCQUE1QjtBQUNBLGFBQU8sS0FBUDs7O2tCQUdGc1IscUIsa0NBQXNCbkUsRyxFQUFLO0FBQ3pCOzs7a0JBR0ZvRSxXLDBCQUFjO0FBQ1osYUFBTyxlQUFlLG9CQUFtQixLQUFHLHdCQUF0QixDQUFtQixDQUFuQixHQUFnRCxhQUEvRCxXQUFQOzs7UUFHS0MsVyx3QkFBWTVOLEksRUFBTTtBQUN2QixhQUFPO0FBQ0xOLGVBQU9NLGVBQWFBLFVBRGYsQ0FDZUEsQ0FEZjtBQUVMdkQsZ0JBQVF1RCxlQUFhQTtBQUZoQixPQUFQOzs7QUFNSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7a0JBRUU2TixVLHVCQUFXdEUsRyxFQUFLO0FBQ2QsVUFBRyxLQUFILFNBQWlCO0FBQ2ZBLFlBQUksS0FBSkE7QUFERixhQUdLO0FBQ0g7QUFDRDs7Ozs7O29CQTdGZ0J5RCxHOzs7Ozs7Ozs7Ozs7QUNQckI7Ozs7Ozs7O01BRXFCYyx3QjswQkFFWkMsVyx3QkFBWXJHLE8sRUFBU0MsTyxFQUFTO0FBQ25DLGFBQU9ELHFCQUFvQkEsbUJBQWlCQyxRQUFyQ0QsU0FBUDs7OzBCQUdLc0csbUIsZ0NBQW9CdEcsTyxFQUFTQyxPLEVBQVM7QUFDM0MsYUFBT0QscUJBQW9CQSxtQkFBaUJDLFFBQWpCRCxVQUFtQ0EsK0JBQTZCQyxhQUFwRkQsZ0JBQVA7OztBQUdGLGdEQUF5RTtBQUFBLFVBQWhEOEQsT0FBZ0Qsb0VBQTNDc0Msc0JBQXNCRSxtQkFBcUI7O0FBQUE7O0FBQ3ZFO0FBQ0Esb0JBQWMsSUFBSSxZQUFsQixPQUFjLEVBQWQ7QUFDQSx1QkFBaUIsWUFBakI7QUFDQSxvQkFBYyxZQUFkO0FBQ0E7QUFDQTtBQUNEOztvQ0FFREMsUSxxQkFBU0MsSyxFQUFPO0FBQ2Q7OztvQ0FHRkMsVyx3QkFBWUQsSyxFQUFPO0FBQ2pCLFVBQU12WCxJQUFJLG9CQUFWLEtBQVUsQ0FBVjtBQUNBLFVBQUcsQ0FBSCxHQUFPO0FBQ0w7QUFDRDs7O29DQUdIZ1YsUyxzQkFBVWpPLEMsRUFBRztBQUNYO0FBQ0EsbUNBQTZCLEtBQTdCLFFBQTBDLEtBQTFDO0FBQ0EsVUFBTTBRLGFBQWEsZ0NBQWdDLEtBQW5ELE1BQW1CLENBQW5CO0FBQ0EsYUFBT0EsV0FBUCxDQUFPQSxDQUFQOzs7Ozs7b0JBbENpQk4scUI7Ozs7Ozs7Ozs7OztBQ0ZyQjs7Ozs7Ozs7Ozs7Ozs7TUFFcUJPLGE7Ozs7O2VBRVpDLFkseUJBQWFDLFEsRUFBVUMsTyxFQUFTOU4sSyxFQUFPQyxJLEVBQU04TixTLEVBQVc7QUFDN0QsVUFBTS9YLElBQU47QUFDQSxXQUFJLElBQUlDLElBQVIsT0FBbUJBLElBQW5CLE1BQTJCLEVBQTNCLEdBQWdDO0FBQzlCLFlBQU0rWCxNQUFNLENBQUNGLFdBQUQsR0FBY0EsV0FBZCxHQUEyQkEsV0FBdkMsQ0FBWSxDQUFaO0FBQ0EsYUFBSSxJQUFJNVgsSUFBUixHQUFlQSxJQUFFOFgsSUFBakIsUUFBNkIsRUFBN0IsR0FBa0M7QUFDaEMsY0FBRyxDQUFDaFksRUFBRWdZLElBQU4sQ0FBTUEsQ0FBRmhZLENBQUosRUFBZTtBQUNiQSxjQUFFZ1ksSUFBRmhZLENBQUVnWSxDQUFGaFksSUFBWStYLFVBQVVGLFNBQVNHLElBQS9CaFksQ0FBK0JnWSxDQUFUSCxDQUFWRSxDQUFaL1g7QUFDRDtBQUNGO0FBQ0Y7QUFDRDs7O2VBR0tpWSxvQixpQ0FBcUJDLFEsRUFBVUMsSyxFQUFPO0FBQzNDLFVBQU1DLE1BQU0sQ0FDQSx3QkFBd0JGLFNBQXhCLFVBQTJDQSxTQUEzQyxVQUE4REMsTUFBOUQsQ0FBOERBLENBQTlELEVBQXdFO0FBQUEsZUFBSyxJQUFJeGEsTUFBSixRQUFrQndELEVBQWxCLEdBQXVCLElBQUVBLEVBQTlCLENBQUssQ0FBTDtBQUR4RSxPQUNBLENBREEsRUFFQSx3QkFBd0IrVyxTQUF4QixVQUEyQ0EsU0FBM0MsT0FBMkRDLE1BQTNELENBQTJEQSxDQUEzRCxFQUFxRUEsTUFBckUsQ0FBcUVBLENBQXJFLEVBQStFO0FBQUEsZUFBSyxJQUFJeGEsTUFBSixRQUFrQixJQUFFd0QsRUFBcEIsR0FBeUIsSUFBRUEsRUFBaEMsQ0FBSyxDQUFMO0FBRi9FLE9BRUEsQ0FGQSxFQUdBLHdCQUF3QitXLFNBQXhCLFVBQTJDQSxTQUEzQyxPQUEyREMsTUFBM0QsQ0FBMkRBLENBQTNELEVBQXFFQSxNQUFyRSxDQUFxRUEsQ0FBckUsRUFBK0U7QUFBQSxlQUFLLElBQUl4YSxNQUFKLFFBQWtCd0QsRUFBbEIsR0FBdUJBLEVBQTVCLENBQUssQ0FBTDtBQUgvRSxPQUdBLENBSEEsRUFJQSx3QkFBd0IrVyxTQUF4QixVQUEyQ0EsU0FBM0MsT0FBMkRDLE1BQTNELENBQTJEQSxDQUEzRCxFQUFxRUEsTUFBckUsQ0FBcUVBLENBQXJFLEVBQStFO0FBQUEsZUFBSyxJQUFJeGEsTUFBSixRQUFrQixJQUFFd0QsRUFBcEIsR0FBeUJBLEVBQTlCLENBQUssQ0FBTDtBQUovRSxPQUlBLENBSkEsRUFLQSx3QkFBd0IrVyxTQUF4QixVQUEyQ0EsU0FBM0MsT0FBMkRDLE1BQTNELENBQTJEQSxDQUEzRCxFQUFxRUEsTUFBckUsQ0FBcUVBLENBQXJFLEVBQStFO0FBQUEsZUFBSyxJQUFJeGEsTUFBSixRQUFrQndELEVBQWxCLEdBQXVCQSxFQUE1QixDQUFLLENBQUw7QUFML0UsT0FLQSxDQUxBLEVBTUEsd0JBQXdCK1csU0FBeEIsVUFBMkNBLFNBQTNDLE9BQTJEQyxNQUEzRCxDQUEyREEsQ0FBM0QsRUFBcUVELGVBQXJFLFFBQTRGO0FBQUEsZUFBSyxJQUFJdmEsTUFBSixRQUFrQixJQUFFd0QsRUFBcEIsR0FBeUJBLEVBQTlCLENBQUssQ0FBTDtBQU54RyxPQU1ZLENBTkEsQ0FBWjs7QUFTQSxVQUFJa1gsT0FBSjtBQUNBLFdBQUksSUFBSXBZLElBQVIsR0FBZUEsSUFBRWlZLGVBQWpCLFFBQXdDLEVBQXhDLEdBQTZDO0FBQzNDRyxnQkFBUUYsZ0JBQVJFO0FBQ0EsWUFBTXZXLElBQUlvVyxlQUFWLENBQVVBLENBQVY7QUFDQXBXO0FBQ0FvVyx1Q0FBK0IsQ0FBQ0UsVUFBVXRXLEVBQVgsQ0FBQ3NXLENBQUQsRUFBaUJBLFVBQVV0VyxFQUEzQixDQUFpQnNXLENBQWpCLEVBQWlDQSxVQUFVdFcsRUFBMUVvVyxDQUFnRUUsQ0FBakMsQ0FBL0JGO0FBQ0Q7OztlQUdJSSxZLHlCQUFhblgsQyxFQUFHZSxDLEVBQUdnUyxJLEVBQU07QUFDOUIsVUFBTTFKLFNBQVMsSUFBSTdNLE1BQUosS0FBZSxJQUFJQSxNQUFKLGVBQWYsSUFBZSxDQUFmLEVBQStDLElBQUlBLE1BQUosa0JBQTRCLEVBQUVtSyxPQUE1RixDQUEwRixFQUE1QixDQUEvQyxDQUFmO0FBQ0EwQywwQkFBb0JySixFQUFwQnFKLEdBQXdCckosRUFBeEJxSixHQUE0QnJKLEVBQTVCcUo7QUFDQTs7O2VBR0srTixVLHVCQUFXTCxRLEVBQVUxVyxFLEVBQUl3SSxLLEVBQU9DLEksRUFBTTtBQUMzQyxVQUFNekgsTUFBTjtBQUNBLCtJQUFpQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBVHJCLElBQVM7O0FBQ2YsWUFBSXFYLFFBQUo7QUFDQSxhQUFJLElBQUl2WSxJQUFSLE9BQWlCQSxZQUFVLENBQTNCLE9BQW1DLEVBQW5DLEdBQXdDO0FBQ3RDLGNBQU0yRCxNQUFNc1UsMEJBQVosQ0FBWUEsQ0FBWjtBQUNBLGNBQUcsOENBQUgsQ0FBRyxDQUFILEVBQTJDO0FBQ3pDMVYscUJBQVM7QUFDUHFCLHFCQUFPLGdEQURBLENBQ0EsQ0FEQTtBQUVQNUQ7QUFGTyxhQUFUdUM7QUFJQWdXO0FBQ0Q7QUFDRjtBQUNELFlBQUcsQ0FBSCxPQUFXO0FBQ1QvVztBQUNBZTtBQUNEO0FBQ0Y7QUFDRDs7O2VBR0tpVyxvQixpQ0FBcUJQLFEsRUFBVTFXLEUsRUFBSXdJLEssRUFBT0MsSSxFQUFNO0FBQ3JELFVBQU16SCxNQUFOO0FBQ0EsV0FBSSxJQUFJdkMsSUFBUixPQUFpQkEsSUFBakIsTUFBeUIsRUFBekIsR0FBOEI7QUFDNUIsWUFBTTJELE1BQU1zVSwwQkFBWixDQUFZQSxDQUFaO0FBQUEsWUFBMENwVyxJQUFJb1csZUFBOUMsQ0FBOENBLENBQTlDO0FBQUEsWUFBaUU5TSxLQUFLLENBQUN0SixFQUFELEdBQU1BLEVBQU4sR0FBV0EsRUFBakYsQ0FBc0UsQ0FBdEU7QUFDQSxhQUFJLElBQUk1QixJQUFSLEdBQWFBLElBQUUwRCxJQUFmLFFBQTJCLEVBQTNCLEdBQWdDO0FBQzlCLGNBQUdwQixJQUFJNEksR0FBSjVJLENBQUk0SSxDQUFKNUksbUJBQTBCLHlDQUErQm9CLElBQTVELENBQTREQSxDQUEvQixDQUE3QixFQUFxRTtBQUNuRXBCLGdCQUFJNEksR0FBSjVJLENBQUk0SSxDQUFKNUksSUFBYTtBQUNYckIsaUJBQUd5QyxJQURRLENBQ1JBLENBRFE7QUFFWDNELGlCQUFHbUwsR0FGUSxDQUVSQSxDQUZRO0FBR1h2SixpQkFBR0M7QUFIUSxhQUFiVTtBQUtEO0FBQ0Y7QUFDRjtBQUNELGFBQU80SCxjQUFQLEdBQU9BLENBQVA7Ozs7OztvQkE1RWlCdU4sVTs7Ozs7Ozs7Ozs7Ozs7Ozs7O01DREFlLFM7Ozs7O1dBRVo1RCxJLGlCQUFLOUQsTyxFQUFTQyxPLEVBQVM7QUFDNUIsYUFBT0QsbUJBQWlCQyxRQUF4Qjs7Ozs7O29CQUhpQnlILE07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRHJCOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUVBLHdCQUFnQixtQkFBa0I7QUFDaEMsUUFBTXRILFFBQVE7QUFBQSxrQ0FDRjtBQUNSLFlBQUcsS0FBSCxPQUFlO0FBQ2IsV0FBQ0EsTUFBRCxtQkFBMEJBLHNCQUExQixPQUEwQkEsRUFBMUI7QUFDQSxpQkFBT0EsTUFBUDtBQUNBQTtBQUNBLGlCQUFPQSxNQUFQO0FBQ0FBO0FBQ0EsaUJBQU9BLE1BQVA7QUFDQUE7QUFDQSxpQkFBT0EsTUFBUDtBQUNBLFdBQUNBLE1BQUQsYUFBb0JBLGdCQUFwQixPQUFvQkEsRUFBcEI7QUFDQSxpQkFBT0EsTUFBUDtBQUNBQTtBQUNBLGlCQUFPQSxNQUFQO0FBQ0FBO0FBQ0EsaUJBQU9BLE1BQVA7QUFDQUE7QUFDQSxpQkFBT0EsTUFBUDtBQUNBQTtBQUNBLGlCQUFPQSxNQUFQO0FBQ0EsaUJBQU9BLE1BQVA7QUFDQUE7QUFDQSxpQkFBT0EsTUFBUDtBQUNBQTtBQUNBLGlCQUFPQSxNQUFQO0FBQ0EsaUJBQU9BLE1BQVA7QUF4QkYsZUEwQks7QUFDSDtBQUNEO0FBQ0Y7QUEvQlcsS0FBZDtBQWlDQXVIO0FBQ0F2SCxpQkFBYSx1QkFBYSxjQUFhLEtBQWIsQ0FBYSxDQUFiLEdBQXNCLCtCQUFuQyxNQUFtQyxDQUFuQyxFQUFnRSxZQUFLO0FBQ2hGLFVBQUcsQ0FBQyxtQkFBSixPQUFvQjtBQUNsQiw4Q0FBNEIsRUFBQ3dILFFBQVF4SCxXQUFyQyxPQUFxQ0EsRUFBVCxFQUE1QjtBQURGLGFBR0s7QUFDSEEsNEJBQW9CLGdDQUFzQkEsTUFBdEIsWUFBd0M7QUFBQSxpQkFBYXlILGlCQUFjLGNBQWRBLDJDQUFjLENBQWRBLEdBQStELG9EQUE1RTtBQUE1RHpILFNBQW9CLENBQXBCQTtBQUNBQSx1QkFBZSwwQkFBZ0JBLHdDQUFoQixhQUFxRUEsMEJBQXJFLGVBQThHQSxXQUE3SEEsT0FBNkhBLEVBQTlHLENBQWZBO0FBQ0FBLDRCQUFvQix1Q0FBZ0M7QUFDbERsSCw2Q0FDS0EsTUFETEE7QUFFRWtIO0FBRkZsSDtBQUlBLGNBQUd5TyxRQUFILG9CQUErQjtBQUM3QnpPLG9CQUFReU8sMkJBQVJ6TyxLQUFReU8sQ0FBUnpPO0FBQ0Q7QUFDRGtILHVCQUFhLG1CQUFTQSxNQUFULDhCQUFiQSxLQUFhLENBQWJBO0FBQ0FBLDhCQUFvQiwwQkFBZ0JBLE1BQWhCLFFBQThCQSxNQUE5QixNQUEwQyxDQUFDdUgsb0JBQUQsSUFBOUR2SCxVQUFvQixDQUFwQkE7QUFDQUE7QUFDQSxpQkFBT0EsTUFBUDtBQUNBQSx1QkFBYSw2QkFBbUJBLE1BQW5CLE1BQStCQSxNQUEvQixNQUEyQ3VILFFBQXhEdkgsYUFBYSxDQUFiQTtBQUNBQSxpQ0FBdUIsYUFBTTtBQUMzQjBILHVCQUFXQSxZQUFYQTtBQUNBQSxxQkFBUzFILE1BQVQwSDtBQUNBQSx5QkFBYTFILE1BQWIwSDtBQUNBLGdCQUFHNU8sTUFBSCxVQUFtQjtBQUNqQkE7QUFDRDtBQU5Ia0g7QUFRQUEsZ0NBQXNCQSxNQUF0QkE7QUFDQUEsZ0NBQXNCQSxNQUF0QkE7QUFDQSxjQUFNMEQsT0FBT2lFLGFBQWIsQ0FBYUEsQ0FBYjs7QUFFQTNILHlCQUFlLHFCQUFXQSxXQUFYLGFBQVdBLEVBQVgsRUFBdUNBLFdBQXREQSxRQUFzREEsRUFBdkMsQ0FBZkE7QUFDQUEsaUNBQXVCQSx5QkFBeUJBLE1BQWhEQSxJQUF1QkEsQ0FBdkJBO0FBQ0FBLHVEQUE2QyxhQUFNO0FBQ2pEQSxvQ0FBd0JwSyxFQUF4Qm9LLFNBQW1DcEssRUFBbkNvSztBQURGQTs7QUFJQUEsNkJBQW1CLHlCQUFlQSxNQUFmLFFBQTZCQSxXQUE3QixpQkFBNkJBLEVBQTdCLGdCQUEyRSxLQUFHcEcsU0FBOUUsQ0FBMkUsQ0FBM0UsRUFBeUYsRUFBQ2dPLE9BQU85TyxjQUFZQSxNQUFoSWtILE1BQTRHLEVBQXpGLENBQW5CQTtBQUNBQSwwQkFBZ0IsNEJBQWtCQSxNQUFsQixNQUE4QkEsTUFBOUNBLElBQWdCLENBQWhCQTtBQUNBQSxzQ0FBNEJBLE1BQTVCQTtBQUNBQSxrQ0FBd0JBLE1BQXhCQTtBQUNBQSxnQ0FBc0JBLE1BQXRCQTtBQUNBQSxnQ0FBc0JBLE1BQXRCQTs7QUFFQSxjQUFHMEQsY0FBSCxPQUFzQjtBQUNwQjFELG9DQUF3Qiw4QkFBb0IwRCxLQUFwQixLQUE4QjFELE1BQTlCLE1BQTBDQSxhQUFsRUEsT0FBd0IsQ0FBeEJBO0FBQ0FBLHlEQUE2Q0EsdUNBQXVDQSxNQUFwRkEsZUFBNkNBLENBQTdDQTtBQUNBMEQsZ0NBQW9CLG1CQUFZO0FBQzlCK0Isd0NBQ08sbUJBQVk7QUFDZnpGLGtDQUFrQix3QkFBY0EsV0FBZCxnQkFBY0EsRUFBZCxFQUFsQkEsT0FBa0IsQ0FBbEJBO0FBQ0FBLDJDQUEyQkEsTUFBM0JBLFdBQTRDMEQsS0FBNUMxRDtBQUhKeUY7QUFERi9CO0FBT0EsZ0JBQUc2RCxvQkFBb0JBLGlCQUF2QixTQUFpRDtBQUMvQ3ZILCtDQUFpQ3VILGlCQUFqQ3ZIO0FBQ0Q7QUFDRjs7QUFFREEseUJBQWUsK0JBQXFCdUgsUUFBcEN2SCxRQUFlLENBQWZBO0FBQ0FBLCtCQUFxQkEsTUFBckJBO0FBQ0FBLHNDQUE0QkEsTUFBNUJBOztBQUVBQTtBQUNBLHNDQUFrQkEsTUFBbEIsUUFBZ0NBLE1BQWhDLE1BQTRDdUgsUUFBNUM7QUFDQSxjQUFHQSxRQUFILE9BQWtCO0FBQ2hCQTtBQUNEO0FBQ0QsY0FBR3ZILE1BQUgsZ0JBQXlCO0FBQ3ZCQTtBQUNEO0FBaEVIQTtBQWtFQSxZQUFHdUgsUUFBSCxLQUFnQjtBQUNkdkgsK0JBQXFCLGtDQUF3QnVILFFBQXhCLEtBQXFDdkgsTUFBMURBLFdBQXFCLENBQXJCQTtBQUNBQSx1REFBNkNBLG1DQUFtQ0EsTUFBaEZBLFdBQTZDQSxDQUE3Q0E7QUFGRixlQUlLLElBQUd1SCxRQUFILGNBQXlCO0FBQzVCdkgsK0JBQXFCLGtDQUF3QkEsTUFBeEIsUUFBc0N1SCxRQUF0QyxjQUE0REEsUUFBNUQsT0FBMkV2SCxNQUFoR0EsV0FBcUIsQ0FBckJBO0FBREcsZUFHQTtBQUNIQSwrQkFBcUIsa0NBQXdCQSxNQUF4QixRQUFzQyxlQUF0QyxpQkFBNERBLE1BQWpGQSxXQUFxQixDQUFyQkE7QUFDRDtBQUNGO0FBbkZVLE9Bb0ZWdUgsUUFwRkh2SCxRQUFhLENBQWJBO0FBcUZBO0FBeEhGOztBQTJIQSxlQUFFLFlBQUs7QUFDTCxRQUFJNkgsYUFBYSxhQUFqQixzQkFBaUIsQ0FBakI7QUFDQSxTQUFJLElBQUloWixJQUFSLEdBQWVBLElBQUVnWixXQUFqQixRQUFvQyxFQUFwQyxHQUF5QztBQUN2QyxVQUFNQyxhQUFhLGFBQUVELFdBQXJCLENBQXFCQSxDQUFGLENBQW5CO0FBQUEsVUFBcUNFLE1BQU1ELGdCQUEzQyxLQUEyQ0EsQ0FBM0M7QUFDQSxVQUFHLENBQUMsQ0FBSixLQUFVO0FBQ1JBLDRCQUFvQixFQUFDRSxLQUFyQkYsR0FBb0IsRUFBcEJBO0FBQ0Q7QUFDRjtBQVBIOztBQVVBaGMsa0JBQWdCQSxpQkFBaEJBOzs7Ozs7Ozs7O0FDdkpBLE1BQUksQ0FBQ3FOLGdCQUFMLE1BQTJCO0FBQ3pCQSwyQkFBdUIsaUJBQWdCOztBQUVyQztBQUNBLFVBQUksUUFBSixNQUFrQjtBQUNoQixjQUFNLGNBQU4sNkJBQU0sQ0FBTjtBQUNEOztBQUVELFVBQUk4TyxJQUFJalAsT0FBUixJQUFRQSxDQUFSOztBQUVBO0FBQ0EsVUFBSXhJLE1BQU15WCxhQUFWOztBQUVBO0FBQ0EsVUFBSUMsUUFBUUMsVUFBWixDQUFZQSxDQUFaO0FBQ0EsVUFBSUMsZ0JBQWdCRixTQUFwQjs7QUFFQTtBQUNBLFVBQUluWixJQUFJcVosb0JBQ04xWixTQUFTOEIsTUFBVDlCLGVBRE0wWixDQUNOMVosQ0FETTBaLEdBRU4xWix3QkFGRixHQUVFQSxDQUZGOztBQUlBO0FBQ0EsVUFBSTJaLE1BQU1GLFVBQVYsQ0FBVUEsQ0FBVjtBQUNBLFVBQUlHLGNBQWNELDBCQUNWQSxPQURSOztBQUdBO0FBQ0EsVUFBSUUsUUFBUUQsa0JBQ1Y1WixTQUFTOEIsTUFBVDlCLGFBRFU0WixDQUNWNVosQ0FEVTRaLEdBRVY1WixzQkFGRixHQUVFQSxDQUZGOztBQUlBO0FBQ0EsYUFBT0ssSUFBUCxPQUFrQjtBQUNoQmtaO0FBQ0FsWjtBQUNEOztBQUVEO0FBQ0E7QUF0Q0ZvSztBQXdDRDs7QUFFRCxNQUFJLENBQUNBLGdCQUFMLE1BQTJCO0FBQ3pCSCwwQkFBc0JHLE1BQXRCSCxtQkFBK0M7QUFDN0N3SixhQUFPLDBCQUFvQjtBQUMxQjs7QUFDQSxZQUFJLFFBQUosTUFBa0I7QUFDaEIsZ0JBQU0sY0FBTixrREFBTSxDQUFOO0FBQ0Q7QUFDRCxZQUFJLHFCQUFKLFlBQXFDO0FBQ25DLGdCQUFNLGNBQU4sOEJBQU0sQ0FBTjtBQUNEO0FBQ0QsWUFBSWdHLE9BQU94UCxPQUFYLElBQVdBLENBQVg7QUFDQSxZQUFJc0wsU0FBU2tFLGdCQUFiO0FBQ0EsWUFBSUMsVUFBVU4sVUFBZCxDQUFjQSxDQUFkO0FBQ0E7O0FBRUEsYUFBSyxJQUFJdFosSUFBVCxHQUFnQkEsSUFBaEIsYUFBaUM7QUFDL0IyVCxrQkFBUWdHLEtBQVJoRyxDQUFRZ0csQ0FBUmhHO0FBQ0EsY0FBSWtHLGtDQUFKLElBQUlBLENBQUosRUFBNkM7QUFDM0M7QUFDRDtBQUNGO0FBQ0Q7QUFDQTtBQXJCNEMsS0FBL0MxUDtBQXVCRDs7QUFFRCxNQUFJLENBQUNHLGdCQUFMLFdBQWdDO0FBQzlCQSxnQ0FBNEIscUJBQW9CO0FBQzlDLFVBQUksUUFBSixNQUFrQjtBQUNoQixjQUFNLGNBQU4sdURBQU0sQ0FBTjtBQUNEO0FBQ0QsVUFBSSxxQkFBSixZQUFxQztBQUNuQyxjQUFNLGNBQU4sOEJBQU0sQ0FBTjtBQUNEO0FBQ0QsVUFBSXFQLE9BQU94UCxPQUFYLElBQVdBLENBQVg7QUFDQSxVQUFJc0wsU0FBU2tFLGdCQUFiO0FBQ0EsVUFBSUMsVUFBVU4sVUFBZCxDQUFjQSxDQUFkO0FBQ0E7O0FBRUEsV0FBSyxJQUFJdFosSUFBVCxHQUFnQkEsSUFBaEIsYUFBaUM7QUFDL0IyVCxnQkFBUWdHLEtBQVJoRyxDQUFRZ0csQ0FBUmhHO0FBQ0EsWUFBSWtHLGtDQUFKLElBQUlBLENBQUosRUFBNkM7QUFDM0M7QUFDRDtBQUNGO0FBQ0QsYUFBTyxDQUFQO0FBbEJGdlA7QUFvQkQ7O0FBRUQsTUFBSSxDQUFDSCxPQUFMLFFBQW9CO0FBQ25CQSxvQkFBZ0IsbUJBQW1CO0FBQ2xDLGFBQU8sbUJBQW1CO0FBQUEsZUFBUWlQLEVBQVIsSUFBUUEsQ0FBUjtBQUFuQixZQUFQO0FBRERqUDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUM1Rm9CMlAsZ0I7QUFFbkIsOENBQXlDO0FBQUEsVUFBVjdQLFFBQVUsb0VBQUosRUFBSTs7QUFBQTs7QUFDdkNBO0FBRUU4UCxrQkFBVTlQLGtCQUZaQTtBQUdFK1AsbUJBQVcvUCxvQ0FBZ0NBLE1BQU0rUDtBQUhuRC9QO0FBS0E7QUFDQTtBQUNBO0FBQ0Esc0JBQWdCQSxNQUFoQjtBQUNBLGlCQUFXMUUsUUFBWDs7QUFFQSxtQ0FDSyxTQURMO0FBR0EsNkNBQ0ssY0FETDtBQUdBLHVCQUFpQix3QkFBd0IsS0FBeEIseUJBQ1osd0JBQXdCLEtBRDdCLFFBQ0ssQ0FEWSxDQUFqQjtBQUdBLGlDQUEyQixDQUFDLDRCQUFELEtBQTNCOztBQUVBLFVBQUcsNEJBQTBCLFdBQTdCLFdBQW1EO0FBQ2pELCtCQUF1QixLQUF2QixhQUF1QixFQUF2QjtBQUNEO0FBQ0Y7OzRCQUVERSxPLHNCQUFVLEM7OzRCQUlWd1Usa0IsK0JBQW1CN0gsSSxFQUFNeE4sRyxFQUFLO0FBQzVCLFVBQUksQ0FBSixLQUFVO0FBQ1JBLGNBQU0zSCxnQkFBTjJIO0FBQ0Q7QUFDRHdOLGFBQU9BLHdCQUFQQSxNQUFPQSxDQUFQQTtBQUNBLFVBQU04SCxRQUFRLFdBQVcsZ0JBQXpCLGlCQUFjLENBQWQ7QUFBQSxVQUNBQyxVQUFVRCxXQURWLEdBQ1VBLENBRFY7QUFFQSxVQUFJLENBQUosU0FBYztBQUNkLFVBQUksQ0FBQ0MsUUFBTCxDQUFLQSxDQUFMLEVBQWlCO0FBQ2pCLGFBQU9DLG1CQUFtQkQsMEJBQTFCLEdBQTBCQSxDQUFuQkMsQ0FBUDs7OzRCQUdGQyxhLDRCQUFnQjtBQUNkLFVBQUlDLFNBQVMsd0JBQXdCLEtBQXJDLFFBQWEsQ0FBYjtBQUNBQSxlQUFTQyxTQUFURCxNQUFTQyxDQUFURDtBQUNBLFVBQUczRCxNQUFILE1BQUdBLENBQUgsRUFBa0I7QUFDaEIyRDtBQUNEO0FBQ0QsYUFBT0EsU0FBUDs7Ozs7O29CQXBEaUJSLGE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNEckI7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O01BRXFCVSxTO0FBRW5CLCtCQUF1QjtBQUFBOztBQUFBOztBQUNyQjtBQUNBO0FBRUVDLGtCQUFVLElBQUV2WixRQUFGLFFBQWdCQSxXQUFTQSxPQUFPbU87QUFGNUM7QUFJQSxnQkFBVSxJQUFJLFlBQUosY0FBVixDQUFVLENBQVY7O0FBRUEsbUJBQWEsSUFBSSxZQUFKLFlBQXNCbk8sUUFBdEIsT0FBcUMsT0FBckMsVUFBc0RBLFFBQW5FLE1BQWEsQ0FBYjs7QUFFQSx1QkFBaUIsQ0FDQyxJQUFJLFlBQUosa0JBQTRCLEVBQUMyRyxPQUFPM0csUUFEckMsS0FDNkIsRUFBNUIsQ0FERCxFQUVDLElBQUksWUFBSixrQkFBNEIsRUFBQzJHLE9BQU8zRyxRQUZyQyxLQUU2QixFQUE1QixDQUZELEVBR0MsSUFBSSxZQUFKLGtCQUE0QixFQUFDMkcsT0FBTzNHLFFBSHJDLEtBRzZCLEVBQTVCLENBSEQsRUFJQyxJQUFJLFlBQUosa0JBQTRCLEVBQUMyRyxPQUFPM0csUUFKckMsS0FJNkIsRUFBNUIsQ0FKRCxFQUtDLElBQUksWUFBSixrQkFBNEIsRUFBQzJHLE9BQU8zRyxRQUxyQyxLQUs2QixFQUE1QixDQUxELEVBTUMsSUFBSSxZQUFKLGtCQUE0QixFQUFDMkcsT0FBTzNHLFFBTnRELEtBTThDLEVBQTVCLENBTkQsQ0FBakI7O0FBU0EsVUFBTXdaLFFBQVEsSUFBSSxZQUFKLEtBQWUsS0FBZixPQUEyQixJQUFJLFlBQUosaUJBQTJCLEtBQXBFLFNBQXlDLENBQTNCLENBQWQ7O0FBRUEsVUFBR3haLDBCQUFILElBQStCO0FBQzdCLHVDQUErQkEsUUFBL0IsZUFBc0QsbUJBQVk7QUFDaEU7QUFDQTtBQUNBeVosOEJBQW9CLFlBQXBCQTtBQUNBQTtBQUNBO0FBTEY7QUFPRDs7QUFFRCxtQkFBYSxJQUFJLFlBQWpCLFFBQWEsRUFBYjtBQUNBLGtCQUFZLElBQUksWUFBaEIsUUFBWSxFQUFaO0FBQ0Esb0JBQWMsSUFBSSxZQUFsQixRQUFjLEVBQWQ7QUFDQSxvQkFBYyxJQUFJLFlBQWxCLFFBQWMsRUFBZDtBQUNBLG9CQUFjLElBQUksWUFBbEIsUUFBYyxFQUFkO0FBQ0Esb0JBQWMsSUFBSSxZQUFsQixRQUFjLEVBQWQ7QUFDQSx1QkFBaUIsSUFBSSxZQUFyQixRQUFpQixFQUFqQjtBQUNBLHdCQUFrQixJQUFJLFlBQXRCLFFBQWtCLEVBQWxCOztBQUVBO0FBQ0Esb0JBQWMsS0FBZDtBQUNBLG9CQUFjLEtBQWQ7QUFDQSxzQkFBZ0IsS0FBaEI7QUFDQSxzQkFBZ0IsS0FBaEI7QUFDQSxzQkFBZ0IsS0FBaEI7QUFDQSxzQkFBZ0IsS0FBaEI7QUFDQSxxQkFBZSxLQUFmO0FBQ0Q7O3FCQUVEbFYsTyxzQkFBVTtBQUNSLDJCQUFhLEtBQWIsMkhBQTZCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFyQnJGLElBQXFCOztBQUMzQixZQUFHQSxFQUFILEtBQVU7QUFDUkE7QUFDQUE7QUFDRDtBQUNEQTtBQUNEO0FBQ0QsYUFBTyxLQUFQO0FBQ0E7OztxQkFHRndMLEcsZ0JBQUkvQixLLEVBQU87QUFDVCxVQUFJMEMsYUFBSjtBQUFBLFVBQVdELFlBQVg7QUFDQSxVQUFHekMsUUFBTWhLLFVBQVQsR0FBb0I7QUFDbEIwTSxnQkFBUTFNLFVBQVIwTTtBQUNBRCxlQUFPekMsUUFBTWhLLFVBQWJ5TTtBQUZGLGFBSUs7QUFDSEM7QUFDQUQ7QUFDRDtBQUNELFVBQU1wTCxJQUFJLEtBQVY7QUFBQSxVQUFpQjBaLE1BQUksRUFBQ3hiLEdBQUUsT0FBSzhCLFFBQVIsT0FBc0JyQyxHQUFFLE1BQUlxQyxFQUFKLFdBQWVBLFFBQTVELEtBQXFCLEVBQXJCO0FBQ0EsK0JBQXlCMFosSUFBekIsR0FBK0JBLElBQS9CO0FBQ0EsK0JBQXlCLENBQUNBLElBQTFCLEdBQWdDLENBQUNBLElBQWpDO0FBQ0EsOENBQXdDLEtBQXhDOztBQUVBLFVBQU1DLE1BQUksRUFBQ3piLEdBQUU4QixhQUFXLElBQUVBLFFBQWJBLFFBQTJCLE1BQUlBLFFBQWxDLE9BQWdEckMsR0FBRSxNQUFJcUMsRUFBSixXQUFlQSxRQUEzRSxLQUFVLEVBQVY7QUFDQSwrQkFBeUIyWixJQUF6QixHQUErQkEsSUFBL0I7QUFDQSwrQkFBeUIsQ0FBQ0EsSUFBMUIsR0FBZ0MsQ0FBQ0EsSUFBakM7QUFDQSw4Q0FBd0MsS0FBeEM7OztxQkFHRkMsTyxvQkFBUWpSLEssRUFBTztBQUNiLFVBQU1nQyxLQUFLaE0sS0FBWDtBQUNBLGtDQUE0QixzQ0FBNEIsQ0FBQyxDQUFELElBQUssTUFBakMsQ0FBNEIsQ0FBNUIsRUFBd0MsSUFBRyxhQUEzQyxLQUF3QyxDQUF4QyxFQUE1QixLQUE0QixDQUE1QixFQUFrRyxNQUFJLE9BQUosV0FBb0IsTUFBSSxhQUExSDtBQUNBLGlEQUEyQyxLQUEzQzs7O3FCQUdGa2IsUSxxQkFBU2xSLEssRUFBTztBQUNkLFVBQU1nQyxLQUFLaE0sS0FBWDtBQUNFLG1DQUE2QixzQ0FBNEIsQ0FBQyxNQUFELEdBQTVCLENBQTRCLENBQTVCLEVBQXNDLENBQUMsYUFBRCxPQUF0QyxDQUFzQyxDQUF0QyxFQUE3QixLQUE2QixDQUE3QixFQUFpRyxPQUFLLE9BQUwsV0FBcUIsTUFBSSxhQUExSDtBQUNBLGtEQUE0QyxLQUE1Qzs7O3FCQUdKbWIsYSwwQkFBYzVSLEssRUFBTztBQUNuQkEsa0NBQTJCLE9BQUssYUFBaENBO0FBQ0EseUJBQW1CQSxNQUFuQjs7O3FCQUdGNlIsbUIsZ0NBQW9CN1IsSyxFQUFPO0FBQ3pCLDRCQUFzQkEsTUFBdEI7OztxQkFHRjhSLGMsMkJBQWU5UixLLEVBQU87QUFDcEJBLGtDQUEyQixPQUFLLGFBQWhDQTtBQUNBLDBCQUFvQkEsTUFBcEI7OztxQkFHRitSLG9CLGlDQUFxQi9SLEssRUFBTztBQUMxQiw2QkFBdUJBLE1BQXZCOzs7Ozs7b0JBaEhpQm9SLE07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIckI7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFFcUJZLE87OztBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdURBQWlEO0FBQUE7O0FBQUEsbURBQy9DLDJCQUQrQyxJQUMvQyxDQUQrQzs7QUFFL0NyUSxlQUFTbEwsWUFBVGtMLE1BQVNsTCxDQUFUa0w7QUFDQXNRO0FBZUE7QUFDQTtBQUNBLDZCQUNLRCxrQkFETCxLQUNLQSxDQURMO0FBRUVyUSxnQkFGRjtBQUdFK04sc0JBSEY7QUFJRXdDLGNBSkY7QUFLRUMsb0JBTEY7QUFNRUMsd0JBQWdCO0FBQ2RDLGtCQURjO0FBRWR2YixhQUFHO0FBRlc7QUFObEI7QUFXQSwwQkFBbUIseUNBQThCLE1BQWpELENBQW1CLENBQW5CO0FBQ0EsOEJBQWNtYixPQUFkO0FBQ0EsMkJBQW9CLCtCQUFwQixLQUFvQixDQUFwQjtBQUNBLDJCQUFvQix5Q0FBK0IsS0FBR3RRLFNBQXRELENBQW1ELENBQS9CLENBQXBCO0FBQ0EsNkNBQXNDLHVCQUFnQjtBQUNwRDtBQUNBLDRCQUFtQjtBQUNqQi9ELGdCQURpQjtBQUVqQm1ULG1CQUFTLG1CQUZRO0FBR2pCdUIsb0JBSGlCO0FBSWpCQztBQUppQixTQUFuQjtBQUZGOztBQVVBLG9CQUFhLElBQUksWUFBakIsUUFBYSxFQUFiOztBQUVBLHFCQUFjLDZCQUFtQixNQUFqQyxDQUFjLENBQWQ7QUFDQSxzQkFBZSxhQUFmOztBQUVBLHdCQUFpQix5Q0FBc0IsTUFBdEIsS0FBOEJDLFlBQVksK0JBQTFDLEtBQTBDLENBQTFDLEtBQWdGL2IsVUFBaEYsR0FBakIsUUFBaUIsQ0FBakI7QUFDQSxpQ0FBMEIsTUFBMUI7QUFDQSxnQ0FBeUIsTUFBekI7QUFDQSx5QkFBa0IseUNBQXNCLE1BQXRCLEtBQThCK2IsWUFBWSxnQ0FBMUMsS0FBMEMsQ0FBMUMsUUFBbEIsUUFBa0IsQ0FBbEI7QUFDQSxrQ0FBMkIsTUFBM0I7QUFDQSxnQ0FBeUIsTUFBekIsWUFBMEMsS0FBRyxpQkFBN0MsQ0FBMEMsQ0FBMUM7O0FBRUEsK0JBQXdCLElBQUksWUFBNUIsUUFBd0IsRUFBeEI7QUFDQSxzQkFBZSxNQUFmO0FBQ0EsMENBQW1DLE1BQUksY0FBSixRQUF1QixlQUFXLGFBQXJFLE9BQXVGLGdCQUFZLGFBQW5HOztBQUVBO0FBQ0EsVUFBRzdRLFNBQUgsR0FBYTtBQUNYLCtCQUFzQiw4Q0FBMkIsTUFBM0IsS0FBbUM2USxZQUFZLDBCQUEvQyxLQUErQyxDQUEvQyxtQkFBdEIsUUFBc0IsQ0FBdEI7QUFDRDs7QUFFRCxvQkFBYSxjQUFZL2IsS0FBWixLQUFiO0FBQ0E7QUFDQSxnQkFBUyxNQUFUO0FBQ0EsMkJBQW9CO0FBQ2xCbEIsV0FBRztBQURlLE9BQXBCOztBQUlBLCtCQUF3QixPQUFLLGNBQUwsUUFBd0IsZUFBVyxhQUEzRDtBQUNBLDJCQUFvQiwyQkFBaUIscUJBQWtCLFFBQW5DLE9BQWlELFFBQWpELFNBQWlFLGFBQXJGLGVBQW9CLENBQXBCOztBQUVBLG9CQUFhO0FBQ1hrZCxnQkFBUSxrQkFERyxLQUNILENBREc7QUFFWEMsc0JBQWMseUJBQU07QUFDbEIsNENBQ0ssTUFETDtBQUVFQyxtQkFBT2hWLEVBRlQ7QUFHRWlWLG1CQUFPalYsRUFBRWlWO0FBSFg7QUFLRDtBQVJVLE9BQWI7QUFVQSxxQ0FBOEIsWUFBOUI7QUFDQSxtQkFBRSxhQUFGLHlCQUF1QyxZQUF2Qzs7QUFFQSxtQ0FBNEIsMEJBQTVCLEtBQTRCLENBQTVCO0FBQ0EseUNBQWtDLFlBQWxDO0FBQ0EsbUNBQTRCLDBCQUE1QixLQUE0QixDQUE1QjtBQUNBLHlDQUFrQyxZQUFsQztBQUNBLHNDQUErQiw2QkFBL0IsS0FBK0IsQ0FBL0I7QUFDQSw0Q0FBcUMsWUFBckM7O0FBRUE7QUFDQSxrQkFBVztBQUNUQyxjQUFNLENBQ0osSUFBSSxZQURBLElBQ0osRUFESSxFQUVKLElBQUksWUFGQSxJQUVKLEVBRkk7QUFERyxPQUFYOztBQU9BLDZCQUFzQixNQUF0QjtBQUNBLDhDQUF1QyxtQ0FBa0MsTUFBekUsV0FBdUMsQ0FBdkM7O0FBRUFsSixpQkFBVyxZQUFLO0FBQ2Q7QUFDQTtBQUZGQTtBQTNHK0M7QUErR2hEOzttQkFFRHROLE8sc0JBQVU7QUFDUiwrQkFBeUIsS0FBekI7QUFDQTtBQUNBLGFBQU8saUJBQVA7QUFDQSxhQUFPLGlCQUFQO0FBQ0EsYUFBTyxpQkFBUDtBQUNBLG1CQUFFLFlBQUYsMEJBQXdDLFdBQXhDO0FBQ0EsdUNBQWlDLFdBQWpDO0FBQ0EsZ0NBQTBCLGlCQUExQjtBQUNBLHNDQUFnQyxLQUFoQztBQUNBLDRCQUFzQixLQUF0QjtBQUNBLHVDQUFpQyxLQUFqQztBQUNBLDRCQUFzQixLQUF0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHRjs7bUJBRUF5VyxpQiw4QkFBa0JULE0sRUFBZTtBQUFBLFVBQVB2YixJQUFPLG9FQUFMLEdBQUs7O0FBQy9CLDJDQUNLLE9BREw7QUFFRXViLGdCQUZGO0FBR0V2YjtBQUhGOzs7bUJBT0ZpYyxPLG9CQUFRYixJLEVBQU1DLFUsRUFBWTtBQUN4QixVQUFHMWIsU0FBUyxjQUFUQSxnQkFBbUMwYixlQUFhLE9BQW5ELFlBQXNFO0FBQ3BFO0FBQ0E7QUFDQTtBQUNEOzs7bUJBR0g3UixlLDhCQUFrQjtBQUNoQixhQUFPLE9BQVA7OzttQkFHRjBTLFEscUJBQVNULEssRUFBTztBQUNkOzs7bUJBR0ZVLFksMkJBQWU7QUFDYixhQUFPLGdDQUFQOzs7bUJBR0ZDLFEsdUJBQVc7QUFDVCxhQUFPLElBQUUsSUFBRSxPQUFYOzs7bUJBR0ZDLGtCLCtCQUFtQjNKLEcsRUFBSztBQUN0Qjs7O21CQUdGNEosVyx3QkFBWTdULFEsRUFBVTtBQUNwQjs7O21CQUdGOFQsWSx5QkFBYTdhLEMsRUFBRztBQUNkLFVBQUlXLE1BQUo7QUFDQSxVQUFHWCxTQUFPQSxJQUFFLGtCQUFaLEdBQStCO0FBQzdCLDZCQUFhLEtBQWIsNkhBQStCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUF2QnZELElBQXVCOztBQUM3QixjQUFHdUQsUUFBSSxJQUFFdkQsSUFBTnVELFNBQW1CQSxRQUFJLElBQUV2RCxJQUFGLE9BQTFCLEdBQXdDO0FBQ3RDa0U7QUFDQTtBQUNEO0FBQ0Y7QUFDRjtBQUNEOzs7bUJBR0ZtYSxjLDJCQUFlOWEsQyxFQUFHO0FBQ2hCLFVBQUkrYSxhQUFKO0FBQ0EsVUFBRy9hLElBQUgsR0FBUTtBQUNOK2EsZ0JBQVEsS0FBUkE7QUFERixhQUdLLElBQUcvYSxJQUFFLEtBQUcsZ0JBQVIsQ0FBSyxDQUFMLEVBQTBCO0FBQzdCLDhCQUFhLEtBQWIsb0lBQStCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUF2QnZELElBQXVCOztBQUM3QixjQUFHdUQsU0FBSyxJQUFFdkQsSUFBUHVELFNBQW9CQSxRQUFJLElBQUV2RCxJQUE3QixNQUF1QztBQUNyQ3NlO0FBQ0E7QUFDRDtBQUNGO0FBTkUsYUFRQTtBQUNIQSxnQkFBUSxLQUFSQTtBQUNEO0FBQ0Q7OzttQkFHRkMsYSwwQkFBY0QsSyxFQUFPO0FBQ25CLFVBQUlFLGFBQUo7QUFDQTtBQUNFLGFBQUssS0FBTDtBQUFxQjtBQUNqQkEsb0JBQVEsSUFBUkEsQ0FBUSxDQUFSQTtBQUNGO0FBQ0Q7QUFDRCxhQUFLLEtBQUw7QUFBc0I7QUFDcEJBLG9CQUFRLENBQUMsS0FBRyxnQkFBSixDQUFDLENBQUQsRUFBc0IsS0FBRyxnQkFBSCxLQUE5QkEsQ0FBUSxDQUFSQTtBQUNBO0FBQ0Q7QUFDRDtBQUFTO0FBQ1BBLG9CQUFRRixRQUFPLENBQUMsS0FBR0EsZ0JBQUosQ0FBQyxDQUFELEVBQXNCLEtBQUdBLGVBQUgsS0FBN0JBLENBQU8sQ0FBUEEsR0FBUkU7QUFDRDtBQVhIO0FBYUE7OzttQkFHRi9GLE8sc0JBQVU7QUFDUixVQUFNakwsS0FBS2hNLEtBQVg7QUFDQSxVQUFJcUIsU0FBSjtBQUNBLFVBQUcsZUFBZTJLLEtBQWYsS0FBdUIsZUFBZSxTQUF6QyxHQUFpRDtBQUMvQyw4QkFBaUIsS0FBakIsb0lBQW1DO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUEzQjhRLFFBQTJCOztBQUNqQyxjQUFHQSxlQUFhOVEsS0FBaEIsR0FBc0I7QUFDcEIzSyxnQkFBSSwrQkFBSkE7QUFDQTtBQUNEO0FBQ0Y7QUFDRCxZQUFHLENBQUgsR0FBTztBQUNMQSxjQUFJLGtCQUFKQTtBQUNEO0FBVEgsYUFXSyxJQUFHLGFBQVcySyxLQUFkLEdBQW9CO0FBQ3ZCM0s7QUFERyxhQUdBLElBQUcsYUFBVyxTQUFkLEdBQXNCO0FBQ3pCQTtBQURHLGFBR0EsSUFBRyxhQUFILElBQWtCO0FBQ3JCQSxZQUFJLGtCQUFKQTtBQURHLGFBR0EsSUFBRyxjQUFILElBQW1CO0FBQ3RCQSxZQUFJLGtCQUFKQTtBQUNEO0FBQ0Q7OzttQkFHRjRiLFcsMEJBQWM7QUFDWixVQUFNNWIsSUFBSSxLQUFWLE9BQVUsRUFBVjtBQUNBLGFBQU9BLFdBQVNBLE1BQUksa0JBQWJBLElBQWdDLENBQWhDQSxDQUFnQyxDQUFoQ0EsR0FBcUMsSUFBSUEsSUFBaEQsQ0FBNEMsQ0FBNUM7OzttQkFHRjZiLFkseUJBQWFuYixDLEVBQUc7QUFDZCxhQUFPLDhCQUFQLENBQU8sQ0FBUDs7O21CQUdGb2Isc0IsbUNBQXVCdkIsTSxFQUFRO0FBQzdCOzs7bUJBR0Z3QixlLDhCQUFrQjtBQUNoQixVQUFJTixhQUFKO0FBQ0EsVUFBTXJRLE9BQU8saUJBQWIsQ0FBYSxDQUFiO0FBQUEsVUFBa0NULEtBQUtoTSxLQUF2QztBQUNBLFVBQUcsZUFBSCxJQUFvQjtBQUNsQjhjLGdCQUFRLEtBQVJBO0FBREYsYUFHSztBQUNILFlBQUdyUSxRQUFRQSxlQUFSQSxZQUFpQ0EsYUFBV1QsS0FBL0MsR0FBcUQ7QUFDbkQ4UTtBQURGLGVBR0ssSUFBRyxlQUFlOVEsS0FBZixLQUF1QixlQUFlLFNBQXpDLEdBQWlEO0FBQ3BEOFEsa0JBQVEsS0FBUkE7QUFDRDtBQUNGO0FBQ0Q7OzttQkFHRk8sZ0IsK0JBQW1CO0FBQ2pCLFVBQUlQLGFBQUo7QUFDQSxVQUFNcFEsUUFBUSxpQkFBaUIsMEJBQS9CLENBQWMsQ0FBZDtBQUFBLFVBQTJEVixLQUFLaE0sS0FBaEU7QUFDQSxVQUFHLGVBQUgsR0FBbUI7QUFDakI4YyxnQkFBUSxLQUFSQTtBQURGLGFBR0s7QUFDSCxZQUFHcFEsU0FBU0EsZ0JBQVRBLFlBQW1DQSxlQUFhVixLQUFuRCxHQUF5RDtBQUN2RDhRO0FBREYsZUFHSyxJQUFHLGVBQWE5USxLQUFiLEtBQXFCLGVBQWUsU0FBdkMsR0FBK0M7QUFDbEQ4USxrQkFBUSxLQUFSQTtBQUNEO0FBQ0Y7QUFDRDs7O21CQUdGUSxtQixnQ0FBb0J0VCxLLEVBQU87QUFDckI7QUFBQTs7QUFFSixVQUFHLGVBQUgsVUFBNEI7QUFDMUIsWUFBSWdMLFlBQUo7QUFDQSxZQUFJO0FBQ0ZBLGlCQUFPaFYsU0FBUyw4QkFBOEIsZUFBOUIscUJBQWhCZ1YsS0FBT2hWLENBQVBnVjtBQURGLFVBR0EsVUFBUztBQUNQQTtBQUNEO0FBQ0QvSSxzQkFBY2pDLFFBQU1nQyxLQUFOaEMsS0FBY2dMLE9BQUtoSixLQUFuQmhDLElBQXlCZ0MsS0FBekJoQyxJQUErQixLQUE3Q2lDO0FBUkYsYUFVSyxJQUFHLGdCQUFILFVBQTZCO0FBQ2hDLFlBQUkrSSxhQUFKO0FBQ0EsWUFBSTtBQUNGQSxrQkFBT2hWLFNBQVMsOEJBQThCLGdCQUE5QixxQkFBaEJnVixLQUFPaFYsQ0FBUGdWO0FBREYsVUFHQSxVQUFTO0FBQ1BBO0FBQ0Q7QUFDRC9JLHNCQUFjakMsUUFBTWdDLEtBQU5oQyxLQUFjZ0wsUUFBS2hKLEtBQW5CaEMsSUFBeUJnQyxTQUF6QmhDLE9BQW9DLEtBQWxEaUM7QUFSRyxhQVVBO0FBQ0hBLHNCQUFjRCxTQUFLLENBQUNoQyxVQUFELEtBQW5CaUM7QUFDRDs7QUFFRCxhQUFPO0FBQ0xzUixxQkFESztBQUVMdFIscUJBRks7QUFHTEMsb0JBQVksS0FBS0Q7QUFIWixPQUFQOzs7bUJBT0Z1UixRLHVCQUFxRDtBQUFBOztBQUFBLFVBQTVDcEosT0FBNEMsb0VBQXZDLENBQXVDO0FBQUEsVUFBcENxSixjQUFvQyxvRUFBeEIsT0FBT0MsZUFBaUI7O0FBQ25ELFVBQUlaLGFBQUo7QUFBQSxVQUFXcGEsV0FBWDtBQUNBLFVBQUcsOEJBQUgsSUFBbUM7QUFBQTtBQUNqQyxjQUFNK0osT0FBTyxtQkFBYixDQUFhLENBQWI7QUFBQSxjQUFrQ1QsS0FBS2hNLEtBQXZDO0FBQ0EsY0FBRyxpQkFBSCxJQUFvQjtBQUNsQjBDLGtCQUFNLHNCQUNKb2EsUUFBTSxPQURGLFlBRUosZUFGSSxVQUlKLENBQUMsZUFKRyxlQUtKLGVBTEksZ0JBT0o7QUFBQSxxQkFBZ0IsV0FBUyxhQUFPOVMsUUFBaEIsR0FBaEIsTUFBZ0IsQ0FBaEI7QUFQSSxlQVFKLHlCQUFpQjtBQUNmLHlCQUFTLGFBQU9BLFFBQWhCO0FBQ0Esb0NBQW9CQSxhQUFXZ0MsU0FBL0I7QUFWRSxlQUFOdEosV0FBTSxDQUFOQTtBQURGLGlCQWdCSztBQUNILGdCQUFHK0osUUFBUUEsZUFBUkEsWUFBaUNBLGFBQVdULEtBQS9DLEdBQXFEO0FBQ25EOFEsc0JBQVExSSxPQUFLM0gsS0FBTDJILE9BQUszSCxFQUFMMkgsR0FBcUIsMEJBQXdCM0gsaUJBQXhCLE1BQXJCMkgsQ0FBcUIsQ0FBckJBLEdBQVIwSTtBQUNBcGEsb0JBQU0sNkJBRUoscUJBQWlCb2EsTUFGYixPQUVhQSxFQUZiLE1BSUosQ0FBQyxjQUpHLGVBS0osY0FMSSxnQkFPSjtBQUFBLHVCQUFnQkEsVUFBVSwyQkFBVkEsS0FBVSxDQUFWQSxZQUFoQixNQUFnQkEsQ0FBaEI7QUFQSSxpQkFRSnZCLDZCQUE2QixFQUFDb0MsTUFBRCxRQUFhYixPQVJ0QyxLQVF5QixFQUE3QnZCLENBUkksRUFBTjdZLFdBQU0sQ0FBTkE7QUFGRixtQkFjSyxJQUFHLGlCQUFlc0osS0FBZixLQUF1QixpQkFBZSxTQUF6QyxHQUFpRDtBQUNwRHRKLG9CQUFNLHNCQUNKb2EsUUFBTSxPQURGLFdBRUosZUFGSSxVQUlKLENBQUMsZUFKRyxlQUtKLGVBTEksZ0JBT0oseUJBQWlCO0FBQ2YsMkJBQVMsU0FBSzlTLFFBQWQ7QUFDQSxvQkFBR0EsUUFBTWdDLEtBQVQsR0FBZTtBQUNiLHdDQUFvQmhDLFFBQU9nQyxLQUFQaEMsSUFBcEI7QUFDRDtBQVhDLGlCQWFKO0FBQUEsdUJBQWlCLFdBQVNBLGtCQUFjLFNBQUtBLFFBQTVCLEdBQWpCLENBQWlCLENBQWpCO0FBYkksaUJBQU50SCxXQUFNLENBQU5BO0FBZ0JEO0FBQ0Y7QUFuRGdDO0FBb0RsQztBQUNEOzs7bUJBR0ZrYixTLHdCQUFzRDtBQUFBOztBQUFBLFVBQTVDeEosT0FBNEMsb0VBQXZDLENBQXVDO0FBQUEsVUFBcENxSixjQUFvQyxvRUFBeEIsT0FBT0MsZUFBaUI7O0FBQ3BELFVBQUlaLGFBQUo7QUFBQSxVQUFXcGEsV0FBWDtBQUNBLFVBQUcsOEJBQUgsSUFBbUM7QUFBQTtBQUNqQyxjQUFNZ0ssUUFBUSxtQkFBaUIsNEJBQS9CLENBQWMsQ0FBZDtBQUFBLGNBQTJEVixLQUFLaE0sS0FBaEU7QUFDQSxjQUFHLGlCQUFILEdBQW1CO0FBQ2pCMEMsa0JBQU0sc0JBQ0pvYSxRQUFNLE9BREYsV0FFSixlQUZJLFNBSUosZUFKSSxlQUtKLGVBTEksZ0JBT0o7QUFBQSxxQkFBZ0IsV0FBUzlTLFFBQVQsR0FBaEIsTUFBZ0IsQ0FBaEI7QUFQSSxlQVFKLHlCQUFpQjtBQUNmLHlCQUFTQSxRQUFUO0FBQ0Esb0NBQW9CQSxRQUFPZ0MsS0FBUGhDLElBQXBCO0FBVkUsZUFBTnRILFdBQU0sQ0FBTkE7QUFERixpQkFnQks7QUFDSCxnQkFBR2dLLFNBQVNBLGdCQUFUQSxZQUFtQ0EsZUFBYVYsS0FBbkQsR0FBeUQ7QUFDdkQ4USxzQkFBUTFJLE9BQUsxSCxNQUFMMEgsT0FBSzFILEVBQUwwSCxHQUFzQix1QkFBcUIsNEJBQXJCLFNBQXRCQSxDQUFzQixDQUF0QkEsR0FBUjBJO0FBQ0FwYSxvQkFBTSw2QkFFSixxQkFBaUJvYSxNQUZiLE9BRWFBLEVBRmIsS0FJSixjQUpJLGVBS0osY0FMSSxnQkFPSjtBQUFBLHVCQUFnQkEsVUFBVSwyQkFBVkEsS0FBVSxDQUFWQSxZQUFoQixNQUFnQkEsQ0FBaEI7QUFQSSxpQkFRSnZCLDZCQUE2QixFQUFDb0MsTUFBRCxRQUFhYixPQVJ0QyxLQVF5QixFQUE3QnZCLENBUkksRUFBTjdZLFdBQU0sQ0FBTkE7QUFGRixtQkFjSyxJQUFHLGlCQUFhc0osS0FBYixLQUFxQixpQkFBZSxTQUF2QyxHQUErQztBQUNsRHRKLG9CQUFNLHNCQUNKb2EsUUFBTSxPQURGLFlBRUosZUFGSSxTQUlKLGVBSkksZUFLSixlQUxJLGdCQU9KLHlCQUFpQjtBQUNmLDJCQUFTOVEsU0FBS2hDLFFBQWQ7QUFDQSxvQkFBR0EsUUFBTWdDLEtBQVQsR0FBZTtBQUNiLHdDQUFvQkEsU0FBcEI7QUFDRDtBQVhDLGlCQWFKO0FBQUEsdUJBQWdCLFdBQVNBLFNBQUtoQyxRQUFkLEdBQWhCLENBQWdCLENBQWhCO0FBYkksaUJBQU50SCxXQUFNLENBQU5BO0FBZ0JEO0FBQ0Y7QUFuRGdDO0FBb0RsQztBQUNEOzs7QUFHRjs7bUJBRUFtYixjLDZCQUFpQjtBQUNmO0FBQ0EsYUFBTyxxQkFBUDtBQUNBLGFBQU8scUJBQVA7QUFDQSxhQUFPLEtBQVA7OzttQkFHRkMsUSx1QkFBVztBQUNULFVBQU0xQixPQUFPLFNBQWI7QUFBQSxVQUE0QjFaLE1BQTVCO0FBQ0EsVUFBRyxlQUFILFVBQTRCO0FBQzFCMFosOEJBQXNCLGdCQUF0QkE7QUFDQTFaLGtCQUFVLEVBQUVBLFVBQVUwWixZQUF0QjFaLENBQVUsQ0FBVkE7QUFGRixhQUlLLElBQUcsZ0JBQUgsVUFBNkI7QUFDaEMwWiw4QkFBc0IsZUFBdEJBO0FBQ0ExWixrQkFBVSxFQUFFQSxVQUFVMFosWUFBdEIxWixDQUFVLENBQVZBO0FBRkcsYUFJQTtBQUNIMFosOEJBQXNCLGVBQXRCQTtBQUNBQSw4QkFBc0IsZ0JBQXRCQTtBQUNBQSxzQkFBY0EsS0FBZEEsQ0FBY0EsQ0FBZEE7QUFDQTFaLGtCQUFVMFosWUFBVjFaO0FBQ0FBLGtCQUFVMFosWUFBVjFaO0FBQ0Q7QUFDRDs7O21CQUdGcWIsYSwwQkFBYzVRLEssRUFBTztBQUFBO0FBQUE7QUFBQSxnQkFDTyxLQURQLFFBQ08sRUFEUDtBQUFBOztBQUVuQm5ELGNBQVEsQ0FBQ2dVLFVBQUQsTUFBYUEsVUFBUUEsSUFBckIsT0FBOEJoZSxLQUF0Q2dLO0FBQ0E7QUFDQSxhQUFPaEssU0FBUyxLQUFUQSxXQUF5QkEsU0FBU0EsVUFBUSxLQUFqQkEsV0FBaEMsS0FBZ0NBLENBQXpCQSxDQUFQOzs7bUJBR0ZpZSxjLDJCQUFlalgsTSxFQUFRO0FBQ3JCLFVBQUl0RSxNQUFKO0FBQ0EsVUFBTW9hLFFBQVE5Vix1QkFBZDtBQUFBLFVBQ00zRixpQkFBUTJGLE9BRGQsRUFDTTNGLENBRE47QUFBQSxVQUMwQmxCLElBQUk2RyxZQUQ5QjtBQUVBLFVBQUc3RyxJQUFILEdBQVE7QUFDTmtCLGNBQU1sQixVQUFPa0IsRUFBUGxCLElBQVksSUFBRWtCLEVBQXBCQTtBQUNBLFlBQUd5YixnREFBZ0RBLE1BQW5ELFVBQW1FO0FBQ2pFLGNBQUcsS0FBSCxXQUFtQjtBQUNqQjtBQUNEO0FBQ0RBLHdCQUFjLHVCQUFkQTtBQUNBQSw4QkFBb0IsNkNBQW1DLG1CQUFtQjlWLE9BQTFFOFYsS0FBdUQsQ0FBbkMsQ0FBcEJBO0FBQ0EsMEJBQWdCO0FBQ2Q5VixvQkFEYztBQUVkOFY7QUFGYyxXQUFoQjtBQUlBcGE7QUFDQTtBQUNEO0FBQ0Y7QUFDRDs7O21CQUdGd2IsYywyQkFBZS9RLEssRUFBTztBQUNwQixVQUFNMlAsUUFBUSxjQUFkO0FBQUEsVUFBbUN6YixJQUFJeWIsTUFBdkMsUUFBdUNBLEVBQXZDO0FBQ0FBLG9CQUFjLHVCQUFkQTtBQUNBQSwwQkFBb0IsNkNBQW1DLG1CQUF2REEsS0FBdUQsQ0FBbkMsQ0FBcEJBO0FBQ0E7OzttQkFHRnFCLGlCLGdDQUFvQjtBQUNsQixhQUFPLG9CQUFQO0FBQ0EsYUFBTyxvQkFBUDtBQUNBLGFBQU8sS0FBUDtBQUNBOzs7bUJBR0ZDLFcsd0JBQVlqZSxDLEVBQUc7QUFDYixhQUFPQSxJQUFHLEtBQUhBLGVBQUcsRUFBSEEsR0FBMkIsS0FBbEMsZ0JBQWtDLEVBQWxDOzs7bUJBR0ZrZSxJLGlCQUFLbGUsQyxFQUFXO0FBQUEsVUFBUmlVLE9BQVEsb0VBQUgsQ0FBRzs7QUFDZCxhQUFPalUsSUFBRyxjQUFIQSxJQUFHLENBQUhBLEdBQXdCLGVBQS9CLElBQStCLENBQS9COzs7bUJBR0ZtZSxXLHdCQUFZMUMsTSxFQUFRO0FBQ2xCOzs7bUJBR0YyQyxjLDJCQUFlclgsQyxFQUFHekcsSSxFQUFNO0FBQUE7O0FBQ3RCLFVBQUcsS0FBSCxpQkFBeUI7QUFBQTtBQUFBLDJCQUNSQSxLQURRO0FBQUE7QUFBQTs7QUFFdkIsY0FBR3lHLFdBQUgsYUFBeUI7QUFDdkIsZ0JBQUcsb0JBQWtCLDhCQUFyQixXQUEwRDtBQUN4RCxnQkFBRSxpQkFBRjtBQURGLG1CQUdLO0FBQ0gsa0JBQUcsT0FBSCxXQUFtQjtBQUNqQnZGO0FBQ0Esb0JBQUcsdUJBQUgsR0FBeUI7QUFDdkI7QUFDRDtBQUNGO0FBQ0Qsa0JBQUcsQ0FBQyxPQUFELGFBQW1CLENBQUMsT0FBdkIsVUFBc0M7QUFBQTtBQUNwQyxzQkFBSWUsTUFBTTRRLGdCQUFWLFNBQVVBLENBQVY7QUFDQSxzQkFBTWtMLGFBQU47QUFBQSxzQkFDTUMsUUFBUSxzQkFEZCxDQUNjLENBRGQ7QUFBQSxzQkFFTUMsV0FBVyxtQkFGakIsQ0FFaUIsQ0FGakI7QUFHQSxzQkFBRzNjLFNBQU9BLElBQUUsS0FBRyxrQkFBWkEsQ0FBUyxDQUFUQSxJQUFnQzBjLE1BQWhDMWMsYUFBbUQwYyw0QkFBMEJBLGNBQVl6ZSxVQUE1RixVQUFHK0IsQ0FBSCxFQUFpSDtBQUMvR1csMEJBQU00USxnQkFBTjVRLEtBQU00USxDQUFONVE7QUFERix5QkFHSyxJQUFHK2IsVUFBSCxVQUFxQjtBQUN4Qix3QkFBTUUsZUFDSixPQURJQSxrQkFFRCxPQUZDQSxjQUdKLE9BSEYsVUFBTUEsRUFBTjtBQUtBLHdCQUFNdmUsSUFBSXVlLG9CQUFWLEtBQVVBLENBQVY7QUFBQSx3QkFBc0NDLFlBQVksS0FBSUQsWUFBWXZlLElBQUUsSUFBRkEsSUFBaEIsQ0FBSXVlLENBQUosR0FBbEQ7QUFDQSx3QkFBRyxjQUFjLENBQUNDLFVBQWYsWUFBcUNBLGdDQUE4QkEsa0JBQWdCNWUsVUFBdEYsWUFBMEc7QUFDeEcwQyw0QkFBTSx1QkFBcUIsaUJBQVU7QUFDbkMsNEJBQUcsQ0FBSCxPQUFXO0FBQ1QsaUNBQU8sT0FBUDtBQURGLCtCQUdLO0FBQ0gsMERBQThCb2EsTUFBOUI7QUFDRDtBQUNEO0FBUEZwYSx1QkFBTSxDQUFOQTtBQVNBLHlDQUFpQjtBQUNmbWMsa0NBQVU7QUFESyx1QkFBakI7QUFHRDtBQUNGO0FBQ0RuYywyQkFBUyxpQkFBVTtBQUNqQix3QkFBRyxvQkFBa0IsNEJBQXJCLEdBQWdEO0FBQzlDb2E7QUFDQSw2QkFBTyxPQUFQO0FBQ0Q7QUFDRCwrQkFBVTtBQUNSO0FBQ0EsMEJBQU96YixJQUFJeWIsTUFBWCxRQUFXQSxFQUFYO0FBQ0FBLG9DQUFjLHNDQUFvQ3piLFNBQU95YixNQUEzQyxPQUEyQ0EsRUFBM0MsRUFBNEQzYyxJQUFHSCxVQUFIRyxhQUExRTJjLFVBQWMsQ0FBZEE7QUFDQUEsMENBQW9CO0FBQUEsK0JBQUssQ0FBQzNjLElBQUcsQ0FBSEEsSUFBRCxLQUFXLHVCQUFoQixtQkFBZ0IsRUFBaEI7QUFBcEIyYztBQUNBLHNEQUE4QkEsTUFBOUIsbUJBQXVEM2MsSUFBR0gsVUFBUSxNQUFYRyxhQUEyQixNQUFsRjtBQUNBLHlDQUFpQjtBQUNmNEIsMkJBRGU7QUFFZithO0FBRmUsdUJBQWpCO0FBSUEsb0NBQVksSUFBWjtBQUNEO0FBaEJIcGE7QUE5Qm9DO0FBZ0RyQztBQUNGO0FBNURILGlCQStESyxJQUFHLG9CQUFrQndFLFdBQXJCLFlBQTBDO0FBQzdDLGdCQUFHLDhCQUFILFdBQXdDO0FBQ3RDLGdCQUFFLGlCQUFGO0FBREYsbUJBR0ssSUFBR25GLE1BQUksaUJBQVAsR0FBeUI7QUFDNUI7QUFDRDtBQU5FLGlCQVFBLElBQUdtRixXQUFILGFBQXlCO0FBQzVCLHFDQUF1QjtBQUNyQjNILGlCQUFHMkgsRUFEa0I7QUFFckJsSSxpQkFBR2tJLEVBQUVpVjtBQUZnQixhQUF2QjtBQURHLGlCQU1BLElBQUdqVixXQUFILFNBQXFCO0FBQ3hCLGdCQUFHbEgsVUFBVUEsU0FBUywyQkFBdUJrSCxFQUFoQ2xILFlBQTJDQSxTQUFTLDJCQUF1QmtILEVBQWhDbEgsT0FBckRBLENBQXFEQSxDQUFyREEsSUFBSCxHQUF1RztBQUNyRyxrQkFBTXllLFFBQVEsc0JBQWQsQ0FBYyxDQUFkO0FBQ0Esa0JBQUdBLE1BQUgsVUFBbUI7QUFDakIsb0JBQU0vSixLQUFLK0osTUFBWDtBQUFBLG9CQUNNclUsUUFBUXFVLE1BRGQsUUFDY0EsRUFEZDtBQUVBLGdFQUE4QyxDQUFDdGUsSUFBRyxDQUFIQSxJQUFELEtBQVdpSyxNQUF6RDtBQUNEO0FBQ0Y7QUFDRCxtQkFBTyxPQUFQO0FBQ0Q7QUF6RnNCO0FBMEZ4Qjs7O21CQUdIMFUsYSwwQkFBY3pkLEMsRUFBR3liLEssRUFBTztBQUN0QjtBQUNBO0FBQ0EsZ0NBQTBCQSxNQUExQjs7O21CQUdGaUMsbUIsZ0NBQW9CakMsSyxFQUFPelEsTSxFQUFRO0FBQUE7O0FBQ2pDLFVBQU0yUyxpQkFBaUIsbUNBQXlCLFlBQXpCLEtBQTBDLFlBQTFDLEtBQTJELHVCQUFsRixJQUF1QixDQUF2QjtBQUFBLFVBQ005ZSxJQUROO0FBQUEsVUFFTStlLFNBQVMsMkJBQWlCLElBQUUsTUFBbkIsR0FBMEIsTUFBMUIsR0FGZixDQUVlLENBRmY7QUFHQUE7QUFDQUEsd0JBQWtCLHlCQUFsQkEsSUFBa0IsQ0FBbEJBO0FBQ0FEO0FBQ0FsQztBQUNBQSwyQ0FBcUMsbUJBQVk7QUFDL0MsWUFBTTNjLElBQUlNLFVBQVY7QUFDQSxZQUFHTixJQUFILEdBQVE7QUFDTixjQUFNNEIsSUFBSTVCLFVBQU9rTSxTQUFPLElBQUV5USxRQUFoQjNjLFFBQStCa00sU0FBTyxJQUFFeVEsUUFBVHpRLE9BQXpDO0FBQ0EyUyxvQ0FBMEIsRUFBQ3pmLEdBQUdZLFVBQU9NLFFBQVBOLElBQWtCLElBQUVNLFFBQXhCLEdBQW1DekIsR0FBR3lCLFFBQXRDLEdBQWlETixHQUFqRCxHQUFvRDRCLEdBQTlFaWQsQ0FBMEIsRUFBMUJBO0FBQ0E7QUFDRDtBQU5IbEM7QUFRQUEsMkNBQXFDLG1CQUFZO0FBQy9DLFlBQU0zYyxJQUFJTSxVQUFWO0FBQ0EsWUFBR04sSUFBSCxHQUFRO0FBQ04sY0FBTTRCLElBQUk1QixVQUFPa00sU0FBTyxJQUFFeVEsUUFBaEIzYyxRQUErQmtNLFNBQU8sSUFBRXlRLFFBQVR6USxPQUF6QztBQUNBO0FBQ0Q7QUFMSHlRO0FBT0EsZ0NBQTBCQSxNQUExQjtBQUNBLHVDQUFpQ0EsTUFBakM7QUFDQSx1Q0FBaUNBLE1BQWpDOzs7bUJBR0ZvQyxnQiw2QkFBaUJwQyxLLEVBQU87QUFDdEIsMENBQW9DQSxNQUFwQztBQUNBLDBDQUFvQ0EsTUFBcEM7QUFDQSxtQ0FBNkJBLE1BQTdCO0FBQ0EsbUNBQTZCQSxNQUE3QjtBQUNBQTs7O21CQUdGcUMsaUIsOEJBQWtCalYsSyxFQUFPa0ssSSxFQUFNO0FBQzdCLFVBQU1nTCxTQUFTLCtCQUFmLElBQWUsQ0FBZjtBQUNBLDJKQUF5QjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBakJ0QyxRQUFpQjs7QUFDdkI7QUFDRDs7O21CQUdIZixVLHVCQUFXc0QsUSxFQUFVdGQsQyxFQUFHO0FBQ3RCOzs7bUJBR0Z1ZCxjLDJCQUFlRCxRLEVBQVV0ZCxDLEVBQUc7QUFDMUIsZ0NBQTBCQSxJQUExQjs7O21CQUdGd2QsbUIsZ0NBQW9CRixRLEVBQVV0ZCxDLEVBQUc7QUFDL0I7OzttQkFHRnlkLG9CLGlDQUFxQkgsUSxFQUFVdGQsQyxFQUFHO0FBQ2hDLGdDQUEwQkEsSUFBRSxLQUFHLGdCQUEvQixDQUE0QixDQUE1Qjs7O1NBR0swZCxrQiwrQkFBbUJ6VixLLEVBQU87QUFDL0IscUJBQWUscUNBQWY7QUFDQSxVQUFNN0osSUFBSSw4QkFBOEIsS0FBeEMsS0FBVSxDQUFWO0FBQ0EsVUFBRyxDQUFILEdBQU87QUFDTCxZQUFHNkosVUFBSCxHQUFjO0FBQ1osd0NBQThCLCtCQUE5QjtBQURGLGVBR0s7QUFDSCx3Q0FBOEI3SixJQUE5QjtBQUNEO0FBQ0Y7OzttQkFHSHVmLGMsMkJBQWU1QyxLLEVBQU85VixNLEVBQVFnRCxLLEVBQU8yVixRLEVBQVVDLFksRUFBYztBQUMzRCxhQUFPOUMsY0FBYUEscUNBQWJBLFlBQWFBLENBQWJBLEdBQVA7OzttQkFHRitDLG9CLGlDQUFxQi9DLEssRUFBTzlWLE0sRUFBUWdELEssRUFBTzJWLFEsRUFBVUMsWSxFQUFjO0FBQ2pFLGFBQU85QyxvQkFBbUJBLDJDQUFuQkEsWUFBbUJBLENBQW5CQSxHQUFQOzs7bUJBR0ZnRCxxQixvQ0FBd0I7QUFDdEIsVUFBSXBkLFdBQUo7QUFDQSxVQUFHLEtBQUgsdUJBQStCO0FBQzdCQSxjQUFNNFEsUUFBTjVRLE1BQU00USxFQUFONVE7QUFERixhQUdLO0FBQ0g7QUFDQSwyQkFBbUI7QUFDakJ5RSxnQkFBTTtBQURXLFNBQW5CO0FBR0F6RSxjQUFNLGtCQUFOQSxJQUFNLEVBQU5BO0FBQ0Q7QUFDRDs7O21CQUdGcWQsb0IsbUNBQXVCO0FBQ3JCLFVBQUcsS0FBSCx1QkFBK0I7QUFDN0IsZUFBTyxLQUFQO0FBQ0E7QUFDQSwyQkFBbUI7QUFDakI1WSxnQkFBTTtBQURXLFNBQW5CO0FBR0Q7OzttQkFHSDZZLGMsMkJBQWVsRCxLLEVBQU9wTixJLEVBQU0xRixLLEVBQU8yVixRLEVBQVV6USxXLEVBQWErUSxXLEVBQWFDLFcsRUFBYUMsUyxFQUFXMUMsVyxFQUFhO0FBQUE7O0FBQzFHLFVBQU10VyxPQUFPLFNBQVBBLElBQU87QUFBQSxlQUFLLDZCQUEwQiwyQkFBL0I7QUFBYjtBQUFBLFVBQ0V6RSxNQUFNLDhCQUE2QjRRLFFBQTdCLE9BQTZCQSxFQUE3QixHQUFnRCxLQUR4RCxxQkFDd0QsRUFEeEQ7QUFFQSxhQUFPLFNBQVMsWUFBSztBQUNuQndKLHlCQUFpQiwrRUFNZixvQkFBYTtBQUNYb0Q7QUFDQXpDLDZCQUFtQnpkLFNBQVNnSyxRQUFUaEssUUFBcUJBLEtBQXhDeWQ7QUFSYSxXQVVmLG9CQUFhO0FBQ1gwQztBQUNBLGlCQUFPckQsTUFBUDtBQUNBVyw2QkFBbUJ6ZCxTQUFTZ0ssUUFBVGhLLFFBQXFCQSxLQUF4Q3lkO0FBQ0FuSyxpQ0FBdUIsWUFBSztBQUMxQixnQkFBRyxDQUFDLG9CQUFKLE9BQUksRUFBSixFQUFpQztBQUMvQjtBQUNEO0FBSEhBO0FBZGEsV0FvQmY7QUFBQSxpQkFBMEMsc0RBQTFDLFlBQTBDLENBQTFDO0FBcEJlLFdBcUJmO0FBQUEsaUJBQTBDLDREQUExQyxZQUEwQyxDQUExQztBQXJCRndKLFNBQWlCLENBQWpCQTtBQXVCQVc7QUFDQTtBQXpCSyxlQTBCRTtBQUFBO0FBMUJULE9BQU8sQ0FBUDs7O21CQTZCRnpCLE0sbUJBQU9qZCxFLEVBQUk7QUFBQTs7QUFDVDtBQUNBLFVBQUcsdUJBQXVCLDRCQUF2QixhQUE4RCx1QkFBcUIsMkJBQXJCLEtBQTlELFFBQXlILENBQUMsS0FBMUgsYUFBNEksQ0FBQyxLQUFoSixVQUErSjtBQUM3SixrQ0FBMEIsa0JBQTFCO0FBQ0F1VSwrQkFBdUIsWUFBSztBQUMxQix1QkFBRSxjQUFGLGlCQUErQiwyQkFBcUIsT0FBcEQsWUFBK0IsQ0FBL0I7QUFERkE7QUFHRDtBQUNEOzs7bUJBR0Y4TSxlLDRCQUFnQmpnQixDLEVBQUdrZ0IsUSxFQUFVO0FBQzNCLFVBQU12RCxRQUFRLGlCQUFkLENBQWMsQ0FBZDtBQUNBLFVBQUdBLFNBQVN1RCxXQUFTdkQsTUFBckIsT0FBcUJBLEVBQXJCLEVBQXNDO0FBQ3BDLFlBQU13RCxXQUFXLHlCQUFlLEtBQWYscUJBQWdDLEtBQWhDLEtBQXdDdkUsWUFBWSx5QkFBcEQsSUFBb0QsQ0FBcEQsS0FBcUZlLFFBQXJGLE9BQW9HQSxnQkFBcEcsVUFBNEhBLE1BQTVILE9BQXlJQSxNQUExSixLQUFpQixDQUFqQjtBQUNBQSxrQkFBVUEsTUFBVkEsT0FBdUJBLE1BQXZCQSxPQUFvQ0EsYUFBcENBLFFBQXlEQSxnQkFBekRBLFVBQWlGQSxRQUFqRkE7QUFDQTtBQUNBLGVBQU8sV0FBUCxLQUFPLENBQVA7QUFDRDs7O21CQUdIeUQsZ0IsNkJBQWlCclcsSyxFQUFPa0ssSSxFQUFNO0FBQzVCLFVBQUdsSyxRQUFNLGlCQUFULFFBQWtDO0FBQ2hDa0ssZUFBT3BVLFNBQVMsMEJBQVRBLE9BQVBvVSxJQUFPcFUsQ0FBUG9VO0FBQ0EsWUFBTW9NLGFBQWEsaUJBQW5CLEtBQW1CLENBQW5CO0FBQUEsWUFBNENDLFlBQVksaUJBQWlCdlcsZUFBekUsQ0FBd0QsQ0FBeEQ7QUFDQXNXLHVCQUFlQSxXQUFmQSxPQUFpQ0EsV0FBakNBLE9BQW1EQSxrQkFBbkRBLFFBQTZFQSxhQUE3RUEsT0FBaUdDLFlBQWpHRDtBQUNBLCtCQUF1QnRXLFFBQXZCLEdBQWdDa0ssT0FBaEM7QUFDRDs7O21CQUdIc00sYywyQkFBZTFXLEssRUFBT0MsSyxFQUFPO0FBQzNCLFVBQUdBLFVBQUgsVUFBcUI7QUFDbkI7QUFDRDtBQUNELCtCQUF5QixhQUFNO0FBQzdCLFlBQUcsQ0FBQ3ZKLEVBQUosVUFBZ0I7QUFDZEE7QUFDRDtBQUhIOzs7bUJBT0ZxTCxHLGdCQUFJL0IsSyxFQUFpQjtBQUFBLFVBQVYvRCxTQUFVLG9FQUFILENBQUc7O0FBQ25CO0FBQ0EsVUFBTStGLEtBQUtoTSxLQUFYO0FBQ0EsVUFBR2dLLFFBQU1nQyxLQUFULEdBQWU7QUFDYjs7QUFFQSw0QkFBb0IsVUFBTSxJQUExQjtBQUNBLDJCQUFtQkEsS0FBbkI7O0FBRUE7O0FBRUE7QUFDQTtBQVRGLGFBV0ssSUFBR2hDLFFBQU0sU0FBVCxHQUFpQjtBQUNwQixZQUFNMUwsSUFBRSxLQUFHMEwsUUFBTWdDLEtBQWpCLENBQVEsQ0FBUjtBQUNBOztBQUVBLDRCQUFvQixDQUFwQjtBQUNBLDJCQUFtQkEsU0FBbkI7O0FBRUE7O0FBRUEsNkJBQXFCLENBQXJCO0FBQ0E7QUFWRyxhQVlBLElBQUdoQyxRQUFNLFNBQVQsR0FBaUI7QUFDcEIsWUFBTTFMLEtBQUUsS0FBRzBMLFFBQU1nQyxLQUFqQixDQUFRLENBQVI7QUFDQSx3QkFBZ0JBLEtBQWhCOztBQUVBLDRCQUFvQixNQUFwQjtBQUNBOztBQUVBLDZCQUFxQixNQUFyQjtBQUNBO0FBUkcsYUFVQSxJQUFHaEMsUUFBTSxTQUFULEdBQWlCO0FBQ3BCLFlBQU0xTCxNQUFFLEtBQUcwTCxRQUFNLFNBQVQsS0FBaUJnQyxLQUF6QjtBQUNBOztBQUVBLDRCQUFvQixDQUFwQjtBQUNBOztBQUVBOztBQUVBLDZCQUFxQixNQUFyQjtBQUNBLDRCQUFvQkEsS0FBcEI7QUFWRyxhQVlBLElBQUdoQyxRQUFNLFNBQVQsR0FBaUI7QUFDcEI7O0FBRUEsNEJBQW9CLENBQXBCO0FBQ0E7O0FBRUE7O0FBRUEsNkJBQXFCLFVBQU0sS0FBR0EsUUFBOUIsRUFBMkIsQ0FBM0I7QUFDQSw0QkFBb0JnQyxLQUFwQjtBQVRHLGFBV0EsSUFBR2hDLFFBQU0sU0FBVCxHQUFpQjtBQUNwQixZQUFNMUwsTUFBRSxLQUFHMEwsUUFBTSxTQUFqQixDQUFRLENBQVI7QUFDQSx3QkFBZ0JnQyxLQUFoQjs7QUFFQSw0QkFBb0IsTUFBcEI7QUFDQSwyQkFBbUJBLEtBQW5COztBQUVBLDRCQUFvQkEsS0FBcEI7O0FBRUEsNkJBQXFCLE1BQXJCO0FBQ0EsNEJBQW9CQSxTQUFwQjtBQVZHLGFBWUEsSUFBR2hDLFFBQU0sU0FBVCxHQUFpQjtBQUNwQixZQUFNMUwsTUFBRSxLQUFHMEwsUUFBTSxTQUFqQixDQUFRLENBQVI7QUFDQSx3QkFBZ0JnQyxLQUFoQjs7QUFFQSw0QkFBb0IsTUFBcEI7QUFDQSwyQkFBbUJBLEtBQW5COztBQUVBLDZCQUFxQixNQUFyQjtBQUNBO0FBUkcsYUFVQSxJQUFHaEMsUUFBTSxTQUFULEdBQWlCO0FBQ3BCLFlBQU0xTCxNQUFFLEtBQUcwTCxRQUFNLFNBQWpCLENBQVEsQ0FBUjtBQUNBLHdCQUFnQmdDLFNBQWhCOztBQUVBLDRCQUFvQixNQUFwQjtBQUNBLDJCQUFtQkEsS0FBbkI7O0FBRUEsNEJBQW9CQSxTQUFwQjs7QUFFQSw2QkFBcUIsVUFBckI7QUFDQSw0QkFBb0JBLFNBQXBCO0FBQ0Q7OztTQUdJMlUsaUIsOEJBQWtCM1ksSyxFQUFPO0FBQzlCLFVBQU00WSxLQUFLLGFBQVgsd0NBQVcsQ0FBWDtBQUNBLFVBQU16YSxNQUFNeWEsaUJBQVosSUFBWUEsQ0FBWjtBQUNBemE7QUFDQUEsc0JBQWdCLHVDQUFoQkEsQ0FBZ0IsQ0FBaEJBO0FBQ0FBO0FBQ0FBO0FBQ0FBO0FBQ0FBLHNCQUFnQixnQ0FBc0IseUNBQXRCLEdBQXNCLENBQXRCLEVBQWhCQSxDQUFnQixDQUFoQkE7QUFDQUE7QUFDQUE7QUFDQSxhQUFPeWEsR0FBUCxDQUFPQSxDQUFQOzs7U0FHS0MsWSx5QkFBYXpXLEssRUFBTztBQUN6QixhQUFPbVIsZUFBZUEsZ0JBQWdCLFVBQWhCQSxLQUFnQixHQUFoQkEsRUFBdEIsS0FBc0JBLENBQWZBLENBQVA7OztTQUdLdUYsVSx1QkFBVzVXLEssRUFBTzZXLE0sRUFBUTtBQUMvQkEsZUFBU0EsVUFBVEE7QUFDQTtBQUdFMVgsNEJBQ0thLE1BRExiLE9BRUswWCxPQUxQLEtBR0UxWCxDQUhGO0FBT0VFLDRCQUNLVyxNQURMWCxPQUVLd1gsT0FUUCxLQU9FeFgsQ0FQRjtBQVdFQywyQkFDS1UsTUFETFYsTUFFS3VYLE9BYlAsSUFXRXZYLENBWEY7QUFlRW1HLG9DQUNLekYsTUFETHlGLGVBRUtvUixPQUZMcFI7QUFmRjs7O1NBc0JLckcsUyxzQkFBVWMsSyxFQUFPO0FBQ3RCLFVBQU07QUFFSmYsNEJBQ0tlLE1BSEQsS0FFSmYsQ0FGSTtBQUtKRSw0QkFDS2EsTUFETGIsT0FFS2EsTUFQRCxLQUtKYixDQUxJO0FBU0pDLDJCQUNLWSxNQURMWixPQUVLWSxNQVhELElBU0paLENBVEk7QUFhSm1HLG9DQUNLdkYsTUFETHVGO0FBRUVoUztBQUZGZ1M7QUFiSSxRQUFOO0FBQUEsVUFrQkF4RyxRQWxCQTtBQUFBLFVBbUJBbEQsU0FBU2tELFFBQU05SCxFQW5CZjtBQUFBLFVBb0JBNkgsUUFBUUMsUUFBTTlILEVBcEJkO0FBQUEsVUFxQkFxYyxrQkFBa0IsU0FBbEJBLGVBQWtCO0FBQUE7QUFyQmxCO0FBQUEsVUFzQkFyVSxRQUFRO0FBQ04yWCxxQkFBYTNmLHVCQUF1QmthLHVCQUF1QmxhLFFBQXZCa2E7QUFEOUIsT0F0QlI7QUFBQSxVQXlCQSw0QkFFS2xhLEVBRkw7QUFHRW1PLGVBQU9yRyxRQUFNOUgsUUFIZjtBQUlFNkgsZUFKRjtBQUtFakQsZ0JBTEY7QUFNRXdKLGlCQUFTdEcsUUFBTTlILFFBQVFvTztBQU56QixRQXpCQTtBQUFBLFVBaUNBLDJCQUVLcE8sRUFGTDtBQUdFbU8sZUFBT3JHLFFBQU05SCxPQUhmO0FBSUU2SCxlQUFPSyxjQUFjQSxNQUp2QjtBQUtFdEQsZ0JBQVFzRCxlQUFlLElBQUVBLE1BQU1rRztBQUxqQyxRQWpDQTtBQUFBLFVBd0NBL0UsU0FBUztBQUNQRSxhQURPO0FBRVA1QyxlQUZPO0FBR1BvTSxjQUFNakwsUUFBTTtBQUhMLE9BeENUO0FBNkNBLFVBQUdJLGdCQUFjRixNQUFkRSxTQUE2QixDQUFDbEksUUFBakMsYUFBc0Q7QUFDcERrSSw0QkFBb0JnUyx1QkFBdUJoUyxNQUEzQ0EsS0FBb0JnUyxDQUFwQmhTO0FBQ0Q7QUFDRCxVQUFHQyxlQUFhSCxNQUFiRyxTQUE0QixDQUFDbkksT0FBaEMsYUFBb0Q7QUFDbERtSSwyQkFBbUIrUix1QkFBdUIvUixLQUExQ0EsS0FBbUIrUixDQUFuQi9SO0FBQ0Q7QUFDRCwrQkFBY0wsT0FBZCxPQUFxQmxELFFBQXJCLFFBQTZCaUQsT0FBN0IsT0FBb0N3VSxpQkFBcEMsaUJBQXFEblUsT0FBckQsT0FBNERDLE1BQTVELE1BQWtFa0IsUUFBbEU7Ozs7SUFoZ0M4QixZQUFNa0ssZTs7b0JBQW5CMkcsSTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2RyQjs7QUFDQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQUVxQjBGLGlCOzs7QUFFbkIsK0NBQStCO0FBQUE7O0FBQUEsbURBQzdCLGlCQUQ2QixJQUM3QixDQUQ2Qjs7QUFFN0I7QUFDQTtBQUNBLHFCQUFjdEQsS0FBZDtBQUNBLGdCQUFTc0QsNEJBQVQsS0FBU0EsQ0FBVDtBQUNBLG9CQUFhdEQsT0FBYjtBQUNBLCtCQUF3QixxQ0FBeEI7O0FBRUEsb0JBQWFBLFlBQWIsUUFBYUEsRUFBYjtBQUNBQSw4QkFBd0IsNkJBQXhCQSxLQUF3QixDQUF4QkE7QUFDQTtBQUNBOztBQUVBLG9CQUFhO0FBQ1h1RCxrQkFBVSxDQUFDLDZCQURBO0FBRVh4RixvQkFBWSx5Q0FBd0Msa0RBQWlELHlCQUYxRjtBQUdYeUYsZUFBTywwQkFISTtBQUlYQyxrQkFBVSxpQkFKQztBQUtYQyxvQkFBWTtBQUxELE9BQWI7O0FBUUEsbUJBQVksQ0FBQyxJQUFJLFlBQUwsSUFBQyxFQUFELEVBQW1CLElBQUksWUFBbkMsSUFBK0IsRUFBbkIsQ0FBWjtBQUNBLDBCQUFtQiw4QkFBb0IsTUFBcEIsUUFBaUMsWUFBSztBQUN2RCxZQUFHLFlBQUgsWUFBMEI7QUFDeEIsY0FBRyxZQUFILFlBQTBCO0FBQ3hCLHdDQUEyQjFELGdCQUEzQjtBQURGLGlCQUdLO0FBQ0gsd0NBQTJCQSxlQUEzQjtBQUNEO0FBTkgsZUFRSztBQUNILHNDQUEyQkEsZUFBM0I7QUFDQSxzQ0FBMkJBLGdCQUEzQjtBQUNBLDhCQUFtQixXQUFuQixDQUFtQixDQUFuQjtBQUNEO0FBQ0QsZUFBTyxXQUFQLENBQU8sQ0FBUDtBQWRGLE9BQW1CLENBQW5CO0FBZ0JBLGdDQUF5QixjQUF6QjtBQUNBLHlCQUFrQixrQkFBbEIsT0FBMEMsWUFBMUM7O0FBRUEsb0JBQWEsWUFBYixPQUFhLEVBQWI7QUFDQTtBQUNBOztBQUVBLG9DQUE2QixZQUE3QjtBQUNBLG9CQUFhO0FBQ1gyRCw2QkFBcUIsK0JBRFYsS0FDVSxDQURWO0FBRVhILGVBQU8sd0JBQXVCLE1BRm5CLEtBRUosQ0FGSTtBQUdYSSxzQkFBYztBQUhILE9BQWI7QUFLQSw0Q0FBNEIsZ0NBQTVCLGVBQTBFLFlBQTFFOztBQUVBOztBQUVBLFVBQUcsMEJBQUgsV0FBdUM7QUFDckNqTywrQkFBdUIsMEJBQXZCQTtBQUNEOztBQUVELHdDQUFpQyx5QkFBakM7QUFDQSxVQUFHLHlCQUFILE1BQWlDO0FBQy9CO0FBQ0Q7O0FBRUQsd0NBQWlDLHlCQUFqQztBQUNBLG1DQUE0Qix1QkFBNUIsU0FBMkQsdUJBQTNEO0FBbEU2QjtBQW1FOUI7OzZCQUVEMU4sTyxzQkFBVTtBQUNSLCtDQUErQiwrQkFBL0IsZUFBNkUsV0FBN0U7QUFDQSxhQUFPLEtBQVA7QUFDQSxhQUFPLEtBQVA7QUFDQSxhQUFPLEtBQVA7Ozs2QkFHRjRiLG9CLG1DQUF1QjtBQUFBOztBQUNyQixVQUFNekssVUFBVSxTQUFWQSxPQUFVLEdBQUs7QUFDbkIsWUFBTXJOLFFBQVEsWUFBZCxXQUFjLEVBQWQ7QUFDQSxZQUFJK1gsVUFBSjtBQUNBLG9KQUFvQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsY0FBWjFmLElBQVk7O0FBQ2xCLGNBQU1rSSxRQUFRLHlCQUFkLENBQWMsQ0FBZDtBQUNBd1gsb0JBQVV4WCx1QkFBcUJBLFVBQS9Cd1g7QUFDQSx1QkFBWTtBQUNWO0FBQ0Q7QUFDRjtBQUNELDJDQUFpQztBQUMvQkE7QUFEK0IsU0FBakM7QUFWRjtBQWNBO0FBQ0E7QUFDQTtBQUNBOzs7NkJBR0ZDLGdCLDZCQUFpQjlGLE0sRUFBUTtBQUN2Qjs7OzZCQUdGK0YsVSx1QkFBV0MsTyxFQUFTO0FBQ2xCO0FBQ0EsOEJBQXdCLHFCQUF4QixJQUF3QixDQUF4QjtBQUNBOzs7NkJBR0ZDLFUsdUJBQVdDLE8sRUFBUztBQUNsQjtBQUNBOzs7NkJBR0ZDLFMsc0JBQVVDLE0sRUFBUTtBQUNoQjtBQUNBQSx3QkFBa0IsMEJBQWxCQTtBQUNBOzs7NkJBSUZWLG1CLGdDQUFvQnBhLEMsRUFBRztBQUNyQjs7OzZCQUdGK2EsUyx3QkFBWTtBQUNWLGFBQU8sQ0FBQyxXQUFELFlBQXdCamlCLFNBQVMseUJBQXVCLGFBQWhDQSxPQUFrRCxPQUFqRjs7OzZCQUdGa2lCLFUseUJBQWE7QUFDWCxhQUFPLENBQUMsV0FBRCxZQUF3QmxpQixTQUFTLHlCQUF1QixhQUFoQ0EsT0FBa0QsT0FBakY7Ozs2QkFHRm1pQixjLDZCQUFpQjtBQUNmLGFBQU8sV0FBUDs7OzZCQUdGQyxXLHdCQUFZalosSyxFQUFPO0FBQUE7O0FBQ2pCK0osaUJBQVcsWUFBSztBQUNkLFlBQUcsNkJBQUgsT0FBbUM7QUFDakMscUNBQXlCLGFBQXpCO0FBQ0Q7QUFISEE7Ozs2QkFPRm1QLFMsd0JBQVk7QUFDVixVQUFHLFdBQUgsVUFBd0I7QUFDdEIsaUNBQXlCcmlCLFNBQVMsYUFBVEEsS0FBMkIseUJBQXVCLGFBQTNFLEtBQXlCQSxDQUF6QjtBQUNBLHlCQUFpQixpQkFBakI7QUFGRixhQUlLO0FBQ0gsMEJBQWtCLE1BQUksYUFBSixRQUFsQjtBQUNEO0FBQ0Q7Ozs2QkFHRnNpQixVLHlCQUFhO0FBQ1gsVUFBRyxXQUFILFVBQXdCO0FBQ3RCLGlDQUF5QnRpQixTQUFTLGFBQVRBLEtBQTJCLHlCQUF1QixhQUEzRSxLQUF5QkEsQ0FBekI7QUFDQSx5QkFBaUIsaUJBQWpCO0FBRkYsYUFJSztBQUNILDJCQUFtQixNQUFJLGFBQUosUUFBbkI7QUFDRDtBQUNEOzs7NkJBR0Z1aUIsYyw2QkFBaUI7QUFDZixVQUFHLFdBQUgsVUFBd0I7QUFDdEIsaUNBQXlCLGFBQXpCO0FBQ0EseUJBQWlCLGlCQUFqQjtBQUNBO0FBQ0Q7Ozs2QkFHSEMsTSxxQkFBUztBQUNQLFVBQUcsS0FBSCxTQUFpQjtBQUNmO0FBQ0Q7Ozs2QkFHSEMsZSw4QkFBa0I7QUFDaEIscUJBQWUsbUJBQWYsQ0FBZSxDQUFmOzs7NkJBR0ZDLFcsMEJBQWM7QUFBQTs7QUFDWixVQUFHLFdBQUgsWUFBMEI7QUFDeEIsZ0NBQXdCLENBQUMsaUJBQUQsS0FBeEI7QUFDQSxZQUFHLFdBQUgsWUFBMEI7QUFDeEI7QUFDQTtBQUZGLGVBSUs7QUFDSCx5QkFBZSxtQkFBZixDQUFlLENBQWYsT0FBMkMsaUJBQVU7QUFDbkQsdUJBQVU7QUFDUjtBQUNEO0FBSEg7QUFLRDtBQVpILGFBY0s7QUFDSCx1QkFBZSxtQkFBZixDQUFlLENBQWY7QUFDRDs7OzZCQUdIQyxVLHlCQUFhO0FBQUE7O0FBQ1gsVUFBRyxXQUFILFlBQTBCO0FBQ3hCLGdDQUF3QixDQUFDLGlCQUFELEtBQXhCO0FBQ0EsWUFBRyxDQUFDLFdBQUosWUFBMkI7QUFDekI7QUFDQTtBQUZGLGVBSUs7QUFDSCx5QkFBZSxvQkFBZixDQUFlLENBQWYsT0FBNEMsaUJBQVU7QUFDcEQsdUJBQVU7QUFDUjtBQUNEO0FBSEg7QUFLRDtBQVpILGFBY0s7QUFDSCx1QkFBZSxvQkFBZixDQUFlLENBQWY7QUFDRDs7OzZCQUdIQyxjLDZCQUFpQjtBQUNmLHFCQUFlLG9CQUFmLENBQWUsQ0FBZjs7OzZCQUdGQyxPLHNCQUFVO0FBQ1J6bEIsa0JBQVksT0FBWkE7Ozs2QkFHRjBsQixRLHVCQUFXO0FBQ1Q7Ozs2QkFHRkMsYSw0QkFBZ0I7QUFDZCxVQUFHLENBQUMscUJBQUosU0FBSSxFQUFKLEVBQTRCO0FBQzFCLHFDQUFtQixVQUFuQixrQkFBbUIsRUFBbkI7QUFERixhQUdLO0FBQ0g7QUFDRDs7OzZCQUdIQyxXLDBCQUFjO0FBQ1osNEJBQXNCLENBQUMsV0FBdkI7QUFDQSxVQUFHLFdBQUgsVUFBd0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0QsbUNBQTJCaGpCLFVBQTNCO0FBQ0M7QUFMRixhQU9LO0FBQ0gscUNBQTZCLENBQTdCO0FBQ0E7QUFDQTtBQUNELG1DQUEyQkEsS0FBM0I7QUFDQztBQUNEO0FBQ0Q7Ozs2QkFHRmlqQixhLDRCQUFnQjtBQUNkLDhCQUF3QixDQUFDLFdBQXpCO0FBQ0EsdUJBQWlCLGlCQUFqQjtBQUNBOzs7NkJBR0ZDLFMsd0JBQVk7QUFDVixVQUFHLEtBQUgsUUFBZ0I7QUFDZDtBQUNEO0FBQ0Q7Ozs2QkFHRkMsUSx1QkFBVztBQUNULHlCQUFtQixDQUFDLFdBQXBCO0FBQ0EsVUFBRyxXQUFILE9BQXFCO0FBQ25CLHFCQUFFLFVBQUYsWUFBRSxFQUFGLFNBQW1DLFdBQW5DO0FBQ0Esc0NBQThCLFdBQTlCO0FBRkYsYUFJSztBQUNILHFCQUFFLFVBQUYsWUFBRSxFQUFGLE9BQWlDLFdBQWpDO0FBQ0EseUNBQWlDLFdBQWpDO0FBQ0Q7QUFDRDs7OzZCQUdGQyxhLDRCQUFnQjtBQUNkLDRCQUFzQnBqQixTQUFTLHNCQUFvQixnQkFBN0JBLE9BQW9ELGdCQUExRSxHQUFzQkEsQ0FBdEI7QUFDQSxtQ0FBNkIsV0FBN0I7QUFDQTs7OzZCQUdGcWpCLGUsOEJBQWtCO0FBQ2hCLDRCQUFzQnJqQixTQUFTLHNCQUFvQixnQkFBN0JBLE9BQW9ELGdCQUExRSxHQUFzQkEsQ0FBdEI7QUFDQSxtQ0FBNkIsV0FBN0I7QUFDQTs7OzZCQUdGc2pCLFEscUJBQVM5WixJLEVBQU07QUFBQTs7QUFDYixVQUFHLE9BQUgsS0FBZTtBQUNiQSxlQUFPLDJCQUFQQTtBQUNEO0FBQ0QsVUFBTStaLFVBQVV2akIsU0FBU0EsZUFBZSx1QkFBeEJBLENBQVNBLENBQVRBLEVBQWhCLENBQWdCQSxDQUFoQjtBQUNBLDhCQUF3QixDQUFDdWpCLFVBQUQsS0FBeEI7QUFDQSxVQUFJdEUsU0FBU2pmLFNBQVNBLFNBQVN3SixXQUFPQSxPQUFoQnhKLEdBQXdCLHVCQUFqQ0EsQ0FBU0EsQ0FBVEEsRUFBYixDQUFhQSxDQUFiO0FBQUEsVUFBMEV3akIsVUFBVSxVQUFwRixPQUFvRixFQUFwRjtBQUFBLFVBQXlHQyxRQUF6RztBQUFBLFVBQXFIQyxPQUFySCxFQUE4SDtBQUM5SCxVQUFHekUsVUFBSCxTQUFvQjtBQUNsQixZQUFHdUUsWUFBSCxHQUFnQjtBQUNkQztBQUNBRDtBQUNBO0FBSEYsZUFLSyxJQUFHQSxZQUFVLHVCQUFiLEdBQXFDO0FBQ3hDQyxxQkFBVyxDQUFYQTtBQUNBRDtBQUNBO0FBQ0Q7QUFDRCxZQUFJRyxLQUFKO0FBQ0EsWUFBRzFFLFdBQUgsR0FBZTtBQUNiMEUsZUFBSyxDQUFMQTtBQUNBMUU7QUFDQTtBQUhGLGVBS0ssSUFBR0EsV0FBUyx1QkFBWixHQUFvQztBQUN2QzBFO0FBQ0ExRTtBQUNBO0FBQ0Q7QUFDRCxZQUFHQSxTQUFILFNBQW1CO0FBQ2pCd0UscUJBQVd6akIsVUFBVSxDQUFDaWYsU0FBRCxXQUFyQndFLENBQVd6akIsQ0FBWHlqQjtBQUNEO0FBQ0QsZ0JBQU87QUFDTEE7QUFDRDtBQUNGOztBQUVELFVBQU1HLFNBQVMsU0FBVEEsTUFBUyxnQkFBa0I7QUFDL0IxUSxtQkFBVyxZQUFLO0FBQ2QsY0FBRzJRLEtBQUgsR0FBUztBQUNQLDZCQUFlLHFCQUFtQixDQUFuQixJQUFmLEdBQWUsQ0FBZjtBQURGLGlCQUdLO0FBQ0gsNkJBQWUsMEJBQWYsR0FBZSxDQUFmO0FBQ0Q7QUFOSDNRO0FBREY7O0FBV0EsVUFBR3dRLFNBQUgsR0FBYTtBQUNYRSxlQUFPSCxNQUFQRyxDQUFPSCxDQUFQRyxLQUFvQixrQ0FBMkI7QUFDN0MsY0FBRzNaLHFCQUFtQjhPLFlBQXRCLEdBQW1DO0FBQ2pDNkssbUJBQU9ILE1BQU1BLGVBQWJHLENBQU9ILENBQVBHO0FBQ0Q7QUFISEE7QUFLQUEsZUFBT0gsTUFBUEcsQ0FBT0gsQ0FBUEc7QUFORixhQVFLO0FBQ0gsWUFBSUUsT0FBSjtBQUNBLDRKQUFxQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsY0FBYkQsS0FBYTs7QUFDbkJEO0FBQ0FFO0FBQ0Q7QUFDRjs7OzZCQUdIQyxTLHNCQUFVQyxPLEVBQVM7QUFBQTs7QUFDakIsYUFBTyxVQUFTLGFBQWEsaUJBQVU7QUFDckMsbUJBQVU7QUFDUiwrQkFBbUI7QUFDakI3YyxrQkFBTTtBQURXLFdBQW5CO0FBR0Q7QUFDRDtBQU5LLE9BQVMsQ0FBVCxHQU9IbU0sZ0JBUEosU0FPSUEsQ0FQSjs7OzZCQVVGMlEsTyxvQkFBUW5ILEssRUFBTztBQUNiLHlCQUFtQjtBQUNqQjNWLGNBQU07QUFEVyxPQUFuQjtBQUdBOzs7NkJBR0Y4UCxPLHNCQUFVO0FBQ1IsVUFBTXpOLE9BQU8sVUFBYixPQUFhLEVBQWI7QUFDQSxhQUFPQSxPQUFNeEosU0FBUyxzQkFBb0IsV0FBN0JBLFlBQW9ELHVCQUExRHdKLENBQU14SixDQUFOd0osR0FBUDs7OzZCQUdGMGEsYSw0QkFBZ0I7QUFDZCxVQUFJbmlCLElBQUksQ0FBQyx3QkFBdUIsS0FBdkIsT0FBdUIsRUFBdkIsR0FBdUMsVUFBeEMsT0FBd0MsRUFBeEMsSUFBUjtBQUNBLFVBQUcsT0FBSCxLQUFlO0FBQ2JBLFlBQUksMkJBQUpBO0FBQ0Q7QUFDRDs7OzZCQUdGb2lCLE8sb0JBQVFqZCxDLEVBQUd6RyxJLEVBQU07QUFDZixvQkFBY0EsT0FBZDs7OzZCQUdGMmpCLGlCLDhCQUFrQnRILEssRUFBTy9ELFEsRUFBVTlPLEssRUFBTzlDLEksRUFBTTtBQUM5QyxVQUFHOEMsb0JBQWtCQSxVQUFyQixVQUF1QztBQUNyQ2lKLG1CQUFXLHFCQUFYQSxJQUFXLENBQVhBO0FBQ0Q7QUFDRCxVQUFHakosVUFBSCxVQUFxQjtBQUNuQjtBQUNEOzs7NkJBR0hvYSxlLDhCQUFrQjtBQUNoQix1QkFBaUI7QUFDZixxQkFBYTtBQUNYekksa0JBQVEsS0FERyxTQUNILEVBREc7QUFFWDZGLG1CQUFTLDBCQUZFO0FBR1g2QyxrQkFBUTtBQUhHLFNBREU7QUFNZixzQkFBYztBQUNaMUksa0JBQVEsS0FESSxVQUNKLEVBREk7QUFFWjZGLG1CQUFTLDJCQUZHO0FBR1o2QyxrQkFBUTtBQUhJLFNBTkM7QUFXZiwwQkFBa0I7QUFDaEIxSSxrQkFBUSxLQURRLGNBQ1IsRUFEUTtBQUVoQjZGLG1CQUFTLCtCQUZPO0FBR2hCNkMsa0JBQVEseUJBQXlCdGtCLFNBQVMseUJBQXVCLGFBQWhDQSxXQUFzRCxPQUFPZ0U7QUFIOUUsU0FYSDtBQWdCZixrQkFBVTtBQUNSNFgsa0JBQVEsQ0FBQyxDQUFDLEtBREY7QUFFUjZGLG1CQUFTLGtDQUFrQyxLQUZuQztBQUdSNkMsa0JBQVEsZ0JBQWdCLGFBQWE3QztBQUg3QixTQWhCSztBQXFCZixvQkFBWTtBQUNWQSxtQkFEVTtBQUVWM04saUJBQU87QUFGRyxTQXJCRztBQXlCZixtQkFBVztBQUNUMk4sbUJBRFM7QUFFVDdGLGtCQUFRLENBQUMsVUFBRCxZQUFDLEVBQUQsSUFBNkIsS0FGNUI7QUFHVDlILGlCQUFPO0FBSEUsU0F6Qkk7QUE4QmYsbUJBQVc7QUFDVDhILGtCQURTO0FBRVQ2RixtQkFBUyxtQ0FBbUMsQ0FBQyxDQUFDLE9BRnJDO0FBR1Q2QyxrQkFBUTtBQUhDLFNBOUJJO0FBbUNmLG9CQUFZO0FBQ1YxSSxrQkFEVTtBQUVWNkYsbUJBQVMsb0NBQW9DLENBQUMsQ0FBQyxLQUZyQztBQUdWNkMsa0JBQVE7QUFIRSxTQW5DRztBQXdDZix5QkFBaUI7QUFDZjFJLGtCQUFRLHFCQURPLFNBQ1AsRUFETztBQUVmNkYsbUJBQVMsOEJBRk07QUFHZjZDLGtCQUFRLG9DQUEwQjtBQUhuQixTQXhDRjtBQTZDZix1QkFBZTtBQUNiMUksa0JBRGE7QUFFYjZGLG1CQUFTLDRCQUZJO0FBR2I2QyxrQkFBUTtBQUhLLFNBN0NBO0FBa0RmLHVCQUFlO0FBQ2IxSSxrQkFEYTtBQUViNkYsbUJBQVMsNEJBRkk7QUFHYjZDLGtCQUFRLFdBQVdwRDtBQUhOLFNBbERBO0FBdURmLHlCQUFpQjtBQUNmdEYsa0JBRGU7QUFFZjZGLG1CQUFTLDhCQUZNO0FBR2Y2QyxrQkFBUSxXQUFXNUk7QUFISixTQXZERjtBQTREZixxQkFBYTtBQUNYRSxrQkFEVztBQUVYNkYsbUJBQVUscUNBQXFDLENBQUMsQ0FBQyxLQUZ0QztBQUdYNkMsa0JBQVEsQ0FBQyxDQUFDLEtBQUYsVUFBaUIsWUFBWUM7QUFIMUIsU0E1REU7QUFpRWYsb0JBQVk7QUFDVjNJLGtCQURVO0FBRVY2RixtQkFBUyx5QkFGQztBQUdWNkMsa0JBQVEsV0FBV25EO0FBSFQsU0FqRUc7QUFzRWYseUJBQWlCO0FBQ2Z2RixrQkFBUTViLFNBQVMsc0JBQW9CLGdCQUE3QkEsT0FBa0QsT0FEM0M7QUFFZnloQixtQkFBUyw4QkFGTTtBQUdmNkMsa0JBQVE7QUFITyxTQXRFRjtBQTJFZiwyQkFBbUI7QUFDakIxSSxrQkFBUTViLFNBQVMsc0JBQW9CLGdCQUE3QkEsT0FBa0QsT0FEekM7QUFFakJ5aEIsbUJBQVMsZ0NBRlE7QUFHakI2QyxrQkFBUTtBQUhTO0FBM0VKLE9BQWpCOztBQWtGQSxVQUFNN1gsT0FBTyxVQUFiLGVBQWEsRUFBYjtBQUFBLFVBQ01DLFFBQVEsVUFEZCxnQkFDYyxFQURkO0FBRUEsVUFBTThYLGlCQUFpQjtBQUNyQi9CLHlCQUFpQixDQUFDLENBQUQsUUFBVSxLQUROO0FBRXJCQyxxQkFBYSxDQUFDLENBQUQsUUFBVSxLQUZGO0FBR3JCQyxvQkFBWSxDQUFDLENBQUQsU0FBVyxLQUhGO0FBSXJCQyx3QkFBZ0IsQ0FBQyxDQUFELFNBQVcsS0FBSzZCO0FBSlgsT0FBdkI7QUFNQSw0QkFBZ0JuYSxZQUFoQixjQUFnQkEsQ0FBaEIseUhBQTZDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFyQ2lJLE9BQXFDOztBQUMzQywrQkFBdUI7QUFDckJxSixrQkFBUTRJLGVBRGEsSUFDYkEsQ0FEYTtBQUVyQi9DLG1CQUFTLG1CQUZZO0FBR3JCNkMsa0JBQVE7QUFIYSxTQUF2QjtBQUtEOzs7NkJBR0hJLFUseUJBQWE7QUFDWCxVQUFHLEtBQUgsTUFBYztBQUNaO0FBQ0EsOEJBQWdCcGEsWUFBWSxLQUE1QixTQUFnQkEsQ0FBaEIseUhBQTZDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUFyQ2lJLE9BQXFDOztBQUMzQyxtQ0FBeUIsZUFBekIsSUFBeUIsQ0FBekI7QUFDRDtBQUNGOzs7NkJBR0hvUyxVLHlCQUFhO0FBQUE7O0FBQ1gsVUFBTUMsYUFBYSxTQUFiQSxVQUFhLE9BQVM7QUFDMUIsZUFBTyx3Q0FBc0Msc0NBQWtDLHFCQUF4RSxRQUFtRyxhQUFuRyxZQUEwSCw0QkFBakk7QUFERjtBQUFBLFVBRUdDLE9BRkg7O0FBRFc7QUFNVCxZQUFHdFMsd0JBQUgsR0FBNEI7QUFDMUJzUyx1QkFBYTtBQUNYQyxzQkFBVSxvQkFBWTtBQUNwQixrQkFBRyxvQkFBa0IsdUJBQXJCLFFBQWtEO0FBQ2hEO0FBQ0Q7QUFDRjtBQUxVLFdBQWJEO0FBT0Q7QUFkUTs7QUFLWCxXQUFJLElBQUosY0FBc0I7QUFBQSxjQUFkdFMsSUFBYztBQVVyQjs7QUFFRDtBQUVFd1Msb0JBQVk7QUFDVkQsb0JBQVU7QUFBQSxtQkFBTSw0QkFBMEI7QUFDeEM3YSxxQkFEd0M7QUFFeEN0SCxrQkFBSSxDQUFDLGFBRm1DO0FBR3hDOUQsa0JBQUk7QUFIb0MsYUFBMUIsQ0FBTjtBQUFBO0FBREEsU0FGZDtBQVNFbW1CLHFCQUFhO0FBQ1hGLG9CQUFVO0FBQUEsbUJBQU0sNEJBQTBCO0FBQ3hDN2EscUJBRHdDO0FBRXhDdEgsa0JBQUksYUFGb0M7QUFHeEM5RCxrQkFBSTtBQUhvQyxhQUExQixDQUFOO0FBQUE7QUFEQyxTQVRmO0FBZ0JFb21CLGtCQUFVO0FBQ1JILG9CQUFVO0FBQUEsbUJBQU0sNEJBQTBCO0FBQ3hDN2EscUJBRHdDO0FBRXhDdEgsa0JBRndDO0FBR3hDOUQsa0JBQUksQ0FBQyxhQUFXcW1CO0FBSHdCLGFBQTFCLENBQU47QUFBQTtBQURGLFNBaEJaO0FBdUJFQyxvQkFBWTtBQUNWTCxvQkFBVTtBQUFBLG1CQUFNLDRCQUEwQjtBQUN4QzdhLHFCQUR3QztBQUV4Q3RILGtCQUZ3QztBQUd4QzlELGtCQUFJLGFBQVdxbUI7QUFIeUIsYUFBMUIsQ0FBTjtBQUFBO0FBREEsU0F2QmQ7QUE4QkVFLHdCQUFnQjtBQUNkTixvQkFBVSxtQkFBbUJPO0FBRGYsU0E5QmxCO0FBaUNFQywwQkFBa0I7QUFDaEJSLG9CQUFVLDJCQUFZO0FBQ3BCLGdCQUFHcmtCLFVBQUgsR0FBYztBQUNaO0FBREYsbUJBR0ssSUFBR0EsVUFBSCxHQUFjO0FBQ2pCO0FBQ0Q7QUFDRjtBQVJlLFNBakNwQjtBQTJDRThrQixxQkFBYTtBQUNYVCxvQkFBVSxtQkFBbUJVO0FBRGxCLFNBM0NmO0FBOENFQywyQkFBbUI7QUFDakJYLG9CQUFVLHFCQUFNO0FBQ2Q1ZDtBQUNBLGdCQUFHQSxXQUFILEdBQWU7QUFDYjtBQURGLG1CQUdLLElBQUdBLFdBQUgsR0FBZTtBQUNsQjtBQUNEO0FBQ0Y7QUFUZ0IsU0E5Q3JCO0FBeURFd2Usd0JBQWdCO0FBQ2RaLG9CQUFVLDJCQUFZO0FBQ3BCLGdCQUFHLENBQUNGLFdBQUosZ0JBQUlBLENBQUosRUFBa0M7QUFDaEMxZDtBQUNBO0FBQ0Q7QUFDRjtBQU5hLFNBekRsQjtBQWlFRXllLHNCQUFjO0FBQ1piLG9CQUFVLDJCQUFZO0FBQ3BCLGdCQUFHLENBQUNGLFdBQUosY0FBSUEsQ0FBSixFQUFnQztBQUM5QjFkO0FBQ0Esa0JBQUd6RyxVQUFILEdBQWM7QUFDWjtBQURGLHFCQUdLLElBQUdBLFVBQUgsR0FBYztBQUNqQjtBQUNEO0FBQ0Y7QUFDRjtBQVhXLFNBakVoQjtBQThFRW1sQixxQkFBYTtBQUNYZCxvQkFBVSwyQkFBWTtBQUNwQixnQkFBRyxDQUFDRixXQUFKLGFBQUlBLENBQUosRUFBK0I7QUFDN0IxZDtBQUNBO0FBQ0Q7QUFDRjtBQU5VLFNBOUVmO0FBc0ZFMmUsdUJBQWU7QUFDYmYsb0JBQVUsMkJBQVk7QUFDcEIsZ0JBQUdGLFdBQUgsZUFBR0EsQ0FBSCxFQUFnQztBQUM5QjFkO0FBQ0Esa0JBQUd6RyxlQUFILFNBQXlCO0FBQ3ZCLG9CQUFNcWxCLFFBQVEsQ0FBQzVlLGFBQWFBLGdCQUFkLFNBQXVDLG9DQUFyRCxDQUFjLENBQWQ7QUFDQSxtQ0FBaUI7QUFDZjZlLDJCQURlO0FBRWZDLHNCQUFJRixNQUZXO0FBR2ZHLHNCQUFJSCxNQUhXO0FBSWZ2bUIscUJBQUd1bUIsTUFKWTtBQUtmOW1CLHFCQUFHOG1CLE1BQU0zSjtBQUxNLGlCQUFqQjtBQUZGLHFCQVVLLElBQUcxYixlQUFILFFBQXdCO0FBQzNCLG9CQUFHLENBQUMsaUJBQUosU0FBNEI7QUFDMUIsa0RBQ0ssT0FETDtBQUVFbEIsdUJBQUcscUJBQWlCa0IsS0FGdEI7QUFHRXpCLHVCQUFHLHFCQUFpQnlCLEtBQUs1QjtBQUgzQjtBQUtBLHNCQUFHbUIsU0FBUyxzQkFBa0IsaUJBQTNCQSxLQUFILEtBQXFEO0FBQ25ELDBDQUFrQixpQkFBbEIsSUFBb0MsT0FBcEMsVUFBb0MsRUFBcEMsR0FBdUQsT0FBdkQsV0FBdUQsRUFBdkQ7QUFDQTtBQUNEO0FBQ0Y7QUFYRSxxQkFhQTtBQUNILHVCQUFPLE9BQVA7QUFDRDtBQUNGO0FBQ0Y7QUEvQlksU0F0RmpCO0FBdUhFa21CLHFCQUFhO0FBQ1hwQixvQkFBVTtBQUFBO0FBQUE7QUFEQztBQXZIZjs7OzZCQTZIRnFCLFcsMEJBQWM7QUFDWixrQkFBWSw4QkFBb0IsYUFBRSxZQUFsQyxPQUFnQyxDQUFwQixDQUFaO0FBQ0EsMEJBQW9CO0FBQUEsZUFBTWpmLEVBQU4sY0FBTUEsRUFBTjtBQUFwQix3QkFBNkQsdUNBQTdEOztBQUVBLHFCQUFlLEtBQWYsVUFBZSxFQUFmO0FBQ0EsNEJBQWdCb0QsWUFBWSxLQUE1QixPQUFnQkEsQ0FBaEIseUhBQTJDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFuQ2lJLE9BQW1DOztBQUN6QyxZQUFNNlQsc0JBQ0QsYUFEQ0EsSUFDRCxDQURDQSxFQUVELGVBRkwsSUFFSyxDQUZDQSxDQUFOO0FBSUE7QUFDQSxZQUFHQSxPQUFILFNBQW1CO0FBQ2pCLGNBQU1DLFFBQVFELGdCQUFkO0FBQ0EsY0FBR0EsT0FBSCxNQUFnQjtBQUNkLGdDQUFvQkEsT0FBcEIsVUFBcUNBLE9BQXJDLE1BQWtEQSxPQUFsRDtBQURGLGlCQUdLLElBQUdBLGdCQUFILFdBQTRCO0FBQy9CLGdDQUFvQkEsT0FBcEIscUJBQWdEQSxPQUFoRDtBQUNEO0FBQ0Y7QUFDRjs7O21CQUdJdkYsWSx5QkFBYXpXLEssRUFBTztBQUN6QixhQUFPNlcseUJBQXlCQSwwQkFBMEIsb0JBQTFCQSxLQUEwQixHQUExQkEsRUFBaEMsS0FBZ0NBLENBQXpCQSxDQUFQOzs7bUJBR0txRixVLHVCQUFXbGMsSyxFQUFPbWMsTyxFQUFTO0FBQ2hDLDRCQUFnQmpjLFlBQVlpYyxXQUE1QixFQUFnQmpjLENBQWhCLHlIQUE0QztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBcENpSSxPQUFvQzs7QUFDMUNuSSwyQ0FDS0EsY0FETEEsSUFDS0EsQ0FETEEsRUFFS21jLFFBRkxuYyxJQUVLbWMsQ0FGTG5jO0FBSUQ7OzttQkFHSTBXLFUsdUJBQVc1VyxLLEVBQU82VyxNLEVBQVE7QUFDL0JBLGVBQVNBLFVBQVRBO0FBQ0Esb0NBQThCO0FBQzVCQSxpQkFBU0EsVUFBVEE7QUFDQSxZQUFNM1csNEJBQU4sTUFBTUEsQ0FBTjtBQUlBLDhCQUFnQkUsWUFBaEIsS0FBZ0JBLENBQWhCLHlIQUFvQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsY0FBNUJpSSxPQUE0Qjs7QUFDbEMsY0FBRyxRQUFPckksTUFBUCxJQUFPQSxDQUFQLE1BQUgsVUFBa0M7QUFDaENFLDBCQUFja0wsTUFBTXBMLE1BQU5vTCxJQUFNcEwsQ0FBTm9MLEVBQW1CeUwsT0FBakMzVyxJQUFpQzJXLENBQW5CekwsQ0FBZGxMO0FBQ0Q7QUFDRjtBQUNEO0FBQ0Q7QUFDRCxVQUFNQSxRQUFRa0wsYUFBZCxNQUFjQSxDQUFkO0FBQ0EyTCx1Q0FBaUMvVyxNQUFqQytXO0FBQ0FBLHVDQUFpQ0YsT0FBakNFO0FBQ0E7OzttQkFHSzNYLFMsc0JBQVVjLEssRUFBTztBQUN0QkEsMEJBQW9CLENBQUNBLGtCQUFnQkEsWUFBakIsT0FBa0NBLFlBQXREQTtBQUNBQSw2QkFBdUIsQ0FBQ0EscUJBQW1CQSxlQUFwQixPQUF3Q0EsZUFBL0RBO0FBQ0E7Ozs7OztvQkFudEJpQjZXLGM7Ozs7Ozs7Ozs7OztBQ1JyQjs7Ozs7Ozs7TUFFcUJ1RixjO0FBRW5CLG9EQUF1QztBQUFBOztBQUNyQztBQUNBO0FBQ0EsaUJBQVc5Z0IsUUFBWDtBQUNBLGlCQUFXQSxRQUFYO0FBQ0EsMEJBQW9CaVksS0FBcEIsZUFBb0JBLEVBQXBCO0FBQ0EsVUFBTTNJLE9BQU8sa0JBQWIsQ0FBYSxDQUFiO0FBQ0Esa0JBQVlBLEtBQVo7QUFDQSxVQUFHLGNBQUgsT0FBc0I7QUFDcEIsc0JBQWNBLFNBQWQ7QUFDRDtBQUNGOzswQkFFRHlSLE0scUJBQVM7QUFDUDs7OzBCQUdGN2dCLE8sc0JBQVU7QUFDUixVQUFHLEtBQUgsT0FBZTtBQUNiO0FBQ0EsZUFBTyxLQUFQO0FBQ0Q7OzswQkFHSDhnQixLLG9CQUFRO0FBQUE7O0FBQ04sYUFBTyxLQUFQO0FBQ0EsVUFBRyxjQUFILE9BQXNCO0FBQUE7QUFDcEIsY0FBSUMsZ0JBQUo7QUFBQSxjQUFjQyxlQUFkO0FBQ0EsY0FBRyxNQUFILFNBQUcsRUFBSCxFQUFxQjtBQUNuQkEsMkJBQWUsQ0FBQyxDQUFDLE1BQWpCQTtBQUNBLGdCQUFHLENBQUMsTUFBSixPQUFnQjtBQUNkLDRCQUFhLGFBQUUsa0JBQWdCLE1BQWhCLFNBQUYsK0NBQTZFLFVBQTFGLElBQWEsQ0FBYjtBQUNEO0FBQ0RELHVCQUFXLGVBQVhBO0FBTEYsaUJBT0s7QUFDSEEsdUJBQVcsZUFBYyxNQUF6QkEsTUFBVyxDQUFYQTtBQUNEO0FBQ0QsNEJBQWlCO0FBQ2ZBO0FBREYsaUJBR0s7QUFDSCw4Q0FBdUIsWUFBSztBQUMxQixrQkFBSTtBQUNGQTtBQURGLGdCQUdBLFVBQVM7QUFDUGhsQjtBQUNEO0FBTkg7QUFRRDtBQXhCbUI7QUFBdEIsYUEwQks7QUFDSCxrQ0FDTyxtQkFBWTtBQUNmLGNBQU1nbEIsV0FBVyxVQUFqQixJQUFpQixFQUFqQjtBQUFBLGNBQ0FFLFdBQVdGLFNBRFg7QUFBQSxjQUVBaFUsb01BTVFtVSxRQU5SblUsbWFBa0JRbVUsUUFsQlJuVSxPQUZBO0FBd0JBa1U7QUFDQUE7QUFDQUE7QUE1QkosaUJBOEJRO0FBQUEsaUJBQU1sbEIsYUFBTixxQ0FBTUEsQ0FBTjtBQTlCUjtBQStCRDs7OzBCQUdIb1gsUSxxQkFBU3pYLEMsRUFBRztBQUNWLFVBQUcsS0FBSCxVQUFrQjtBQUNoQjtBQUNEO0FBQ0QsVUFBRyxLQUFILFlBQW9CO0FBQ2xCLHdCQUFnQnRCLFdBQVdzQixJQUEzQixHQUFnQnRCLENBQWhCO0FBQ0Q7OzswQkFHSCttQixhLDRCQUFnQjtBQUFBOztBQUNkLFVBQU1yZCxRQUFRLFVBQWQsUUFBYyxFQUFkO0FBQUEsVUFBb0NzZCxPQUFPLElBQTNDLEdBQTJDLEVBQTNDO0FBQUEsVUFBc0RDLE9BQXREO0FBQ0EsVUFBSXBrQixPQUFPeVEsUUFBWCxPQUFXQSxFQUFYOztBQUZjO0FBSVosWUFBTTNLLE9BQU8sb0JBQWIsSUFBYSxDQUFiO0FBQ0EsWUFBR0EsY0FBSCxTQUF3QjtBQUN0QjlGLGlCQUFPLFVBQVUsWUFBSztBQUNwQiw0QkFBYzJHLE9BQWQ7QUFDQSxtQkFBTywrQkFBNkJiLEtBQXBDLEdBQU8sQ0FBUDtBQUZGOUYsV0FBTyxDQUFQQTtBQURGLGVBTUssSUFBRzhGLGNBQUgsUUFBdUI7QUFDMUI5RixpQkFBTyxVQUFVLFlBQUs7QUFDcEIsNEJBQWMyRyxPQUFkO0FBQ0EsbUJBQU8sOEJBQTRCYixLQUFuQyxHQUFPLENBQVA7QUFGRjlGLFdBQU8sQ0FBUEE7QUFJRDtBQWhCVzs7QUFHZCxXQUFJLElBQUkyRyxPQUFSLEdBQWdCQSxPQUFoQixPQUE0QixFQUE1QixNQUFvQztBQUFBLGNBQTVCQSxJQUE0QjtBQWNuQztBQUNELGFBQU8sVUFBVSxZQUFLO0FBQ3BCO0FBQ0EsZUFBTyxFQUFDd2QsTUFBTSxrQkFBUCxJQUFPLENBQVAsRUFBOEJDLE1BQU1BLFVBQTNDLElBQTJDQSxDQUFwQyxFQUFQO0FBRkYsT0FBTyxDQUFQOzs7Z0JBTUtDLEksaUJBQUtKLE8sRUFBUztBQUNuQjs7OzBCQUdGaGhCLFcsd0JBQVlraEIsSSxFQUFNQyxJLEVBQU01TixHLEVBQUs7QUFDM0I0TixnQkFBVVQsc0NBQVZTLE1BQVVULENBQVZTOzs7MEJBR0ZFLFUsdUJBQVdILEksRUFBTUMsSSxFQUFNNU4sRyxFQUFLO0FBQzFCLGFBQU8sWUFBWSwyQkFBb0I7QUFDckMseUJBQVcsZ0JBQVM7QUFDbEIsY0FBTStOLFFBQVF6VSw2QkFBZDtBQUNBLHNKQUF1QjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsZ0JBQWYwVSxPQUFlOztBQUNyQixnQkFBR0EsV0FBSCxhQUFHQSxDQUFILEVBQThCO0FBQzVCLGtCQUFNQyxPQUFPRCxXQUFiLDBCQUFhQSxDQUFiO0FBQ0Esd0JBQVM7QUFDUEwseUJBQVNNLEtBQVROLENBQVNNLENBQVROO0FBQ0Q7QUFDRjtBQUNGO0FBQ0QsY0FBTUYsVUFBVW5VLFdBQWhCLDZCQUFnQkEsQ0FBaEI7QUFDQSx1QkFBWTtBQUNWc1Usc0JBQVVULGlCQUFpQk0sUUFBM0JHLENBQTJCSCxDQUFqQk4sQ0FBVlM7QUFDRDtBQUNENVQ7QUFkRixnQkFlUSxhQUFNO0FBQ1oxUix3QkFBY3VGLEVBQWR2RjtBQUNBNGxCO0FBakJGO0FBREYsT0FBTyxDQUFQOzs7MEJBdUJGQyxVLHVCQUFXUixJLEVBQU07QUFDZixVQUFNRixVQUFOO0FBQ0FFLG1CQUFhO0FBQUEsZUFBTUYsbURBQU4sSUFBTUEsQ0FBTjtBQUFiRTtBQUNBRixtQkFBYSxvREFBaUQsS0FBakQsb0JBQXNFTixZQUFuRk0saUJBQW1GTixFQUFuRk07QUFDQSxhQUFPQSxhQUFQLElBQU9BLENBQVA7OzswQkFHRlcsUyx3QkFBWTtBQUNWLFVBQU1DLGFBQWEsU0FBbkI7QUFBQSxVQUNFQyxTQUFTLFNBRFg7QUFBQSxVQUVFQyxhQUFhRCxPQUZmO0FBQUEsVUFHRUUsV0FBV0YsbUNBQWlDLENBSDlDO0FBQUEsVUFJRUcsY0FBY0gsdUJBSmhCLE9BSWdCQSxDQUpoQjtBQUtBLFVBQUkvYyxXQUFKO0FBQ0EsdUJBQWU7QUFDYkE7QUFERixhQUVPLElBQUc4YyxjQUFjRSxlQUFkRixpQkFBNEMsQ0FBL0MsVUFBMEQ7QUFDL0Q5YztBQURLLGFBRUE7QUFDTEE7QUFDRDtBQUNEOzs7Z0JBR0ttZCxpQixnQ0FBb0I7QUFDekI7Ozs7OztvQkFuTGlCdkIsVzs7Ozs7Ozs7Ozs7O0FDRnJCOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQUVxQndCLFc7OztBQUluQiw0REFBa0Q7QUFBQTs7QUFBQSw4Q0FDaEQsOENBRGdELE9BQ2hELENBRGdEO0FBRWpEOzt1QkFFREMsUSx1QkFBVztBQUNULGtCQUFZLG9CQUFaLE9BQVksQ0FBWjtBQUNBLDJCQUFxQixvQkFBckIsZUFBcUIsQ0FBckI7QUFDQSw0QkFBc0Isb0JBQXRCLGdCQUFzQixDQUF0QjtBQUNBLHdCQUFrQixvQkFBbEIsWUFBa0IsQ0FBbEI7Ozt1QkFHRkMsVyx3QkFBWXhULEUsRUFBSTtBQUFBOztBQUNkLFVBQUl5VCxnQkFBSjtBQUNBLFVBQUd6VCxPQUFILFdBQW1CO0FBQ2pCeVQsbUJBQVcsQ0FBQztBQUNWaEUsbUJBQVM7QUFBQSxtQkFBWSxpQkFBZSx5Q0FBZixFQUFlLENBQWYsZUFBbUQ2RCxTQUEvRCxrQkFBWSxDQUFaO0FBQUE7QUFEQyxTQUFELENBQVhHO0FBREYsYUFLSztBQUNIQSxtQkFBVyx1Q0FBWEEsRUFBVyxDQUFYQTtBQUNEO0FBQ0Q7Ozt1QkFHRkMsa0IsK0JBQW1CMVQsRSxFQUFJekssSyxFQUFPO0FBQzVCLFVBQUd5SyxPQUFILGlCQUF5QjtBQUN2QixZQUFHekssTUFBSCxRQUFpQjtBQUNmO0FBREYsZUFHSztBQUNIO0FBQ0Q7QUFDRjs7O3VCQUdIb2UsTyxzQkFBVTtBQUNSLGFBQU8sS0FBUDs7O3VCQUdGQyxnQiwrQkFBbUI7QUFDakIsYUFBTyxLQUFQOzs7dUJBR0ZDLGlCLGdDQUFvQjtBQUNsQixhQUFPLEtBQVA7Ozt1QkFHRkMsYSw0QkFBZ0I7QUFDZCxhQUFPLEtBQVA7Ozt1QkFHRkMsUSx1QkFBVztBQUNUOzs7dUJBSUZDLFEsdUJBQVc7QUFDVCxhQUFPLDJTQUFQLGVBQU8sQ0FBUDs7O3VCQXlCRkMsVSx5QkFBYTtBQUNYLGFBQU8saUhBQVAsWUFBTyxDQUFQOzs7dUJBWUZDLFMsd0JBQVk7QUFDVixhQUFPLFlBQVAsVUFBTyxDQUFQOzs7dUJBTUZDLFEsdUJBQVc7QUFDVCxhQUFPLENBQVAsb0JBQU8sQ0FBUDs7O3VCQUtGQyxXLDBCQUFjO0FBQ1osYUFBTztBQUNMblcsY0FESztBQUVMb1csZ0JBQVEsQ0FGSCx5QkFFRyxDQUZIO0FBS0wzQixlQUFPLENBQ0w7QUFDRTRCLGVBREY7QUFFRTFCLGdCQUFNO0FBRlIsU0FESyxDQUxGO0FBV0wyQixnQkFBUTtBQVhILE9BQVA7Ozs7OztBQWpIaUJqQixXQUVaa0Isa0JBRllsQixHQUVTLElBRlRBO29CQUFBQSxROzs7Ozs7Ozs7Ozs7QUNIckI7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFFcUJtQixzQjs7O0FBQ25CLHdFQUFtRDtBQUFBOztBQUFBLG1EQUNqRCw2QkFEaUQsT0FDakQsQ0FEaUQ7O0FBRWpEO0FBQ0E7QUFDQSxvQkFBYTtBQUNYbFEsc0JBQWNBO0FBREgsT0FBYjtBQUdBLDJCQUFvQiwyQkFBcEIsT0FBb0IsQ0FBcEI7O0FBRUEsVUFBR3ZQLFFBQUgsR0FBWTtBQUFBO0FBQ1YsY0FBTXNMLE9BQU8seUJBQXdCaUUsYUFBeEIsQ0FBd0JBLENBQXhCLEtBQTRDLHFCQUE1QyxhQUE2RSxxQkFBN0UsY0FBK0cscUJBQTVILEtBQWEsQ0FBYjtBQUNBakUsd0JBQWMsWUFBSztBQUNqQiw0QkFBZUEsS0FBZixPQUEyQkEsS0FBM0I7QUFDQUE7QUFDQTtBQUhGQTtBQUZVO0FBQVosYUFRSztBQUNILHNCQUFhLE1BQWI7QUFDQTtBQUNEO0FBcEJnRDtBQXFCbEQ7Ozs7O29CQXRCa0JtVSxtQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFFcUJDLFE7OztBQUVuQiw0Q0FBcUM7QUFBQTs7QUFBQSw4Q0FDbkMsK0NBRG1DLEtBQ25DLENBRG1DO0FBRXBDOztvQkFFRHhmLFEsdUJBQVc7QUFDVCwwQkFDSyxPQURMO0FBRUVzQixnQkFBUTtBQUZWOzs7b0JBTUZpRCxVLHlCQUFhO0FBQ1gsVUFBTUMsNkJBQTZCLENBQ2pDLE9BRGlDLENBQ2pDLENBRGlDLEVBRWpDLGFBRkYsQ0FFRSxDQUZpQyxDQUFuQztBQUFBLFVBSUFDLDZCQUE2QixDQUMzQixPQUQyQixDQUMzQixDQUQyQixFQUUzQixPQU5GLENBTUUsQ0FGMkIsQ0FKN0I7QUFBQSxVQVFBRSxzQkFBc0IsQ0FDcEI7QUFDRWhQLFdBQUcsQ0FDRSw0QkFERixNQUNFLENBREYsRUFFRSw0QkFGRixNQUVFLENBRkYsRUFHRSw0QkFIRixNQUdFLENBSEYsRUFJRSw0QkFKRixNQUlFLENBSkYsRUFLRSxhQU5QLENBTU8sQ0FMRixDQURMO0FBUUVQLFdBQUcsQ0FDRSxhQURGLENBQ0UsQ0FERixFQUVFLGlCQUFjLENBQWQsT0FBcUIsQ0FGdkIsTUFFRSxDQUZGLEVBR0UsZ0JBQWEsQ0FBYixPQUFvQixDQUh0QixLQUdFLENBSEYsRUFJRSw0QkFKRixNQUlFLENBSkYsRUFLRSw0QkFMRixNQUtFLENBTEY7QUFSTCxPQURvQixFQWlCcEI7QUFDRU8sV0FBRyxDQUNFLDRCQURGLE1BQ0UsQ0FERixFQUVFLDRCQUZGLE1BRUUsQ0FGRixFQUdFLDRCQUhGLE1BR0UsQ0FIRixFQUlFLDZCQUpGLEtBSUUsQ0FKRixFQUtFLDZCQUxGLEtBS0UsQ0FMRixFQU1FLDZCQU5GLEtBTUUsQ0FORixFQU9FLGFBUlAsQ0FRTyxDQVBGLENBREw7QUFVRVAsV0FBRyxDQUNFLGFBREYsQ0FDRSxDQURGLEVBRUUsaUJBQWMsQ0FBZCxPQUFxQixDQUZ2QixNQUVFLENBRkYsRUFHRSxnQkFBYSxDQUFiLE9BQW9CLENBSHRCLEtBR0UsQ0FIRixFQUlFLDZCQUpGLEtBSUUsQ0FKRixFQUtFLDZCQUxGLEtBS0UsQ0FMRixFQU1FLDZCQU5GLEtBTUUsQ0FORixFQU9FLDRCQVBGLE1BT0UsQ0FQRjtBQVZMLE9BakJvQixDQVJ0QjtBQThDQSxhQUFPO0FBQ0x1UCw2QkFESztBQUVMSCxvQ0FGSztBQUdMQztBQUhLLE9BQVA7Ozs7OztvQkE1RGlCK2EsSzs7Ozs7Ozs7Ozs7O0FDRnJCOzs7Ozs7Ozs7Ozs7OztNQUVxQkMsbUI7QUFDbkIsb0NBQWtCO0FBQUE7O0FBQ2hCO0FBQ0EsbUJBQWExTCxPQUFiO0FBQ0Esb0JBQWNBLEtBQWQ7QUFDQSx5QkFBbUJBLEtBQW5CO0FBQ0E7QUFDRDs7K0JBRUQyTCxVLHlCQUFhO0FBQ1gsVUFBTTlmLE9BQU8sVUFBYixPQUFhLEVBQWI7QUFBQSxVQUFrQ0UsUUFBUSxVQUExQyxRQUEwQyxFQUExQztBQUNBLGFBQU9GLGNBQVlBLFNBQU9FLFFBQW5CRixJQUE0QixDQUE1QkEsSUFBNEIsQ0FBNUJBLEdBQW9DLE9BQU9BLE9BQWxELENBQTJDLENBQTNDOzs7K0JBR0Y1RCxPLHNCQUFVO0FBQ1IsMkJBQWEwRSxjQUFjLEtBQTNCLFFBQWFBLENBQWIsa0hBQTJDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFuQzBPLElBQW1DOztBQUN6Q0EseUJBQWlCO0FBQUEsaUJBQU1qWSxFQUFOLE9BQU1BLEVBQU47QUFBakJpWTtBQUNEO0FBQ0QsYUFBTyxLQUFQOzs7K0JBR0Z6RixJLG1CQUFPO0FBQUE7O0FBQ0w7O0FBREs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUdILFlBQU15RixJQUFJLGVBQVYsQ0FBVSxDQUFWO0FBQ0EsZUFBTTtBQUNKLGNBQUdBLHVCQUFxQkEsU0FBeEIsUUFBeUM7QUFBQTtBQUN2QyxrQkFBTThELFFBQVEsMEJBQWQsQ0FBYyxDQUFkO0FBQ0E5RCwrQkFBaUIsYUFBTTtBQUNyQixvQkFBR2pZLEVBQUgsUUFBR0EsRUFBSCxFQUFpQjtBQUNmQTtBQUNBQTtBQUNEO0FBSkhpWTtBQUZ1QztBQVF4QztBQVRILGVBV0s7QUFBQTtBQUNILGdCQUFNQSxJQUFJLG9CQUFtQjtBQUMzQi9PLHFCQUQyQjtBQUUzQnNmLHNCQUFRO0FBRm1CLGFBQTdCO0FBSUFqVyxtQ0FBdUIsWUFBSztBQUMxQiw2Q0FBOEIsa0JBQVc7QUFDdkMsb0JBQUdpVyxpQkFBaUIsTUFBcEIsVUFBbUM7QUFDakMsc0JBQU16TSxRQUFRLDBCQUFkLENBQWMsQ0FBZDtBQUNBLHVLQUFxQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsd0JBQWIvYixJQUFhOztBQUNuQix3QkFBTXlvQixLQUFLLDRCQUFrQixNQUFsQixlQUFzQyxNQUFqRCxLQUFXLENBQVg7QUFDQXhRO0FBQ0F3USwyQkFBT3pvQixFQUFQeW9CLEtBQWN6b0IsRUFBZHlvQixNQUFzQnpvQixFQUF0QnlvQjtBQUNEO0FBQ0R0Vyw2QkFBVyxZQUFLO0FBQ2Qsd0JBQUcsQ0FBQyxNQUFELFVBQWdCLENBQUMsMkJBQXBCLENBQW9CLENBQXBCLEVBQWtEO0FBQ2hEOEYsdUNBQWlCO0FBQUEsK0JBQU1qWSxFQUFOLElBQU1BLEVBQU47QUFBakJpWTtBQUNEO0FBSEg5RjtBQUtEO0FBQ0Q4RjtBQWRGO0FBREYxRjtBQUxHO0FBd0JKO0FBdkNFOztBQUVMLDRCQUFhLEtBQWIsVUFBYSxFQUFiLHlIQUFnQztBQUFBOztBQUFBOztBQUFBO0FBc0MvQjs7OytCQUlIRixJLG1CQUFPO0FBQ0w7QUFDQSxVQUFNcVcsT0FBTjtBQUNBLDRCQUFhbmYsY0FBYyxLQUEzQixRQUFhQSxDQUFiLHlIQUEyQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBbkMwTyxLQUFtQzs7QUFDekNBLDBCQUFpQjtBQUFBLGlCQUFNeVEsVUFBVTFvQixFQUFoQixJQUFnQkEsRUFBVjBvQixDQUFOO0FBQWpCelE7QUFDRDtBQUNELGFBQU8xRixZQUFQLElBQU9BLENBQVA7Ozs7OztvQkF2RWlCK1YsZ0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGckI7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7TUFFcUJLLGM7QUFFbkIsMENBQTZCO0FBQUE7O0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQWlCLG9CQUFVcm9CLEVBQTNCLFdBQWlCLENBQWpCO0FBQ0EsNEJBQXNCLFlBQXRCLE9BQXNCLEVBQXRCO0FBQ0Esb0JBQWMseUJBQWQsQ0FBYyxDQUFkO0FBQ0EsMEJBQW9CLGtEQUE2QnNvQixlQUFlaE0sd0JBQTVDLElBQTRDQSxDQUE1QyxFQUEyRWpYLGNBQWMsS0FBekYsUUFBc0dDLGlCQUFpQix1QkFBdkgsSUFBdUgsQ0FBdkgsS0FBc0osS0FBMUssY0FBb0IsQ0FBcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUJBQW1CLElBQUksWUFBdkIsaUJBQW1CLEVBQW5CO0FBQ0E2VSx1QkFBaUIsSUFBSSxZQUFKLEtBQWUsSUFBSSxZQUFKLGlCQUFmLENBQWUsQ0FBZixFQUE4QyxLQUEvREEsV0FBaUIsQ0FBakJBOztBQUVBO0FBQ0E7QUFDQSxtQkFBYW5hLFFBQWIsU0FBOEIsMEJBQTBCQSxFQUF4RCxLQUE4QixDQUE5QjtBQUNBLFVBQUdBLGlCQUFlQSxRQUFsQixPQUFpQztBQUMvQixxQkFBYUEsT0FBYixTQUE2QiwwQkFBMEJBLEVBQXZELElBQTZCLENBQTdCO0FBQ0Q7O0FBRUQ7O0FBRUFtYSwrQkFBeUIsaUJBQXpCQSxJQUF5QixDQUF6QkE7O0FBRUF0SSxpQkFBVyw0QkFBWEEsSUFBVyxDQUFYQTtBQUNEOzswQkFFRDBXLG9CLGlDQUFxQnZvQixDLEVBQUc7QUFDdEIsVUFBTXdvQixjQUFOO0FBQUEsVUFDRTFnQixRQUFRbkosVUFBVSx5QkFBaUJxQixnQkFBY0EsRUFEbkQsWUFDb0IsQ0FBVnJCLENBRFY7QUFBQSxVQUVFOHBCLFlBQVksK0JBQXFCM2dCLFFBQU05SCxFQUEzQixhQUEwQzhILFFBQU05SCxFQUFoRCxjQUFnRUEsRUFGOUUsS0FFYyxDQUZkO0FBQUEsVUFHRTBvQixXQUFXLDhCQUFvQkQsdUJBQXBCLFdBQW9CQSxDQUFwQiwrQkFIYixHQUdhLENBSGI7QUFJQUE7QUFDQTs7OzBCQUdGbGtCLE8sc0JBQVU7QUFDUjtBQUNBLDJCQUFpQjBFLFlBQVksS0FBN0IsT0FBaUJBLENBQWpCLGtIQUE0QztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBcEN0QyxRQUFvQzs7QUFDMUM7QUFDRDtBQUNELGFBQU8sS0FBUDtBQUNBO0FBQ0E7QUFDQSwyQkFBcUIsb0JBQXJCO0FBQ0EsYUFBTyxLQUFQOzs7MEJBR0ZnaUIsTyxvQkFBUWpvQixDLEVBQUc7QUFDVCxhQUFPQSxTQUFPQSxLQUFHLEtBQUcsZ0JBQXBCLENBQWlCLENBQWpCOzs7MEJBR0Zrb0IsUSx1QkFBVztBQUNULGFBQU8sQ0FBQyxvQ0FBRCxLQUFQOzs7MEJBR0YvTSxZLHlCQUFhbmIsQyxFQUFHO0FBQ2QsVUFBTWlGLFNBQVMsbUJBQWYsQ0FBZSxDQUFmO0FBQ0EsYUFBT0EsU0FBUUEsT0FBUkEsUUFBUDs7OzBCQUdGbVcsc0IsbUNBQXVCdkIsTSxFQUFRO0FBQzdCO0FBQ0EsNEJBQWEsS0FBYixpSUFBNEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQXBCeFgsSUFBb0I7O0FBQzFCO0FBQ0Q7OzswQkFHSDRYLE0sbUJBQU9qZCxFLEVBQUk7QUFDVCxVQUFHLEtBQUgsa0JBQTBCO0FBQ3hCLFlBQU1tckIsVUFBTjtBQUNBLDhCQUFhLEtBQWIsaUlBQTRCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUFwQjlsQixJQUFvQjs7QUFDMUIsY0FBR0EsRUFBSCxRQUFHQSxFQUFILEVBQWlCO0FBQ2Y4bEIsb0JBQVE5bEIsRUFBUjhsQixjQUF3QjtBQUN6QjtBQUNGO0FBQ0QsOEJBQWlCNWYsWUFBakIsT0FBaUJBLENBQWpCLHlIQUF1QztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsY0FBL0J0QyxRQUErQjs7QUFDckM7QUFDRDtBQUNGOzs7MEJBR0htaUIsa0IsK0JBQW1CL2xCLEMsRUFBRztBQUNwQixVQUFNakUsSUFBSSxzQkFBVixDQUFVLENBQVY7QUFDQSxVQUFHLENBQUgsR0FBTztBQUNMO0FBQ0Q7OzswQkFHSGlxQixxQixrQ0FBc0JobUIsQyxFQUFHO0FBQ3ZCLFVBQU1qRSxJQUFJLHlCQUFWLENBQVUsQ0FBVjtBQUNBLFVBQUcsQ0FBSCxHQUFPO0FBQ0w7QUFDRDs7OzBCQUdIa3FCLGdCLDZCQUFpQnRvQixDLEVBQWE7QUFBQSxVQUFWK1osUUFBVSxvRUFBSixFQUFJOztBQUM1QjtBQUNBLFVBQU05VSxTQUFTLG1CQUFmLENBQWUsQ0FBZjtBQUNBLFVBQUdBLFVBQVVBLE9BQVZBLFdBQTRCQSxlQUEvQixVQUF3RDtBQUN0RCxZQUFHLENBQUMsc0JBQUosQ0FBSSxDQUFKLEVBQThCO0FBQzVCQTtBQUNBO0FBQ0Q7QUFDRjs7OzBCQUdIc2pCLFcsMEJBQWM7QUFBQTs7QUFDWixVQUFHLHNCQUFILFFBQWlDO0FBQUE7QUFDL0IsY0FBTUMsS0FBTjtBQUNBLGtDQUF1QixhQUFNO0FBQzNCQTtBQURGO0FBR0FBLHFCQUFXLGFBQU07QUFDZixnQkFBTXZqQixTQUFTRSxFQUFmLENBQWVBLENBQWY7QUFDQSxnQkFBR0YsVUFBVUEsT0FBYixTQUE2QjtBQUMzQixrQkFBRyxDQUFDLHVCQUFzQkUsRUFBMUIsQ0FBMEJBLENBQXRCLENBQUosRUFBaUM7QUFDL0I7QUFDRDtBQUNGO0FBTkhxakI7QUFMK0I7QUFhaEM7OzswQkFHSEMsUyxzQkFBVXpvQixDLEVBQUdnUixHLEVBQUs7QUFBQTs7QUFDaEIsVUFBRyxPQUFILGlCQUEyQjtBQUN6QixrQ0FBMEIsWUFBWTtBQUFBLDRDQUFSMFgsT0FBUTtBQUFSQSxpQkFBUSxJQUFSQSxJQUFRLGVBQVJBO0FBQVE7O0FBQ3BDLGNBQU16akIsU0FBUyxxQkFBZixDQUFlLENBQWY7QUFDQSxzQkFBVztBQUNULGdCQUFHQSxpQkFBSCxVQUE0QjtBQUMxQkEsbUNBQXFCLEVBQUMrTCxLQUFELEtBQU0wWCxNQUEzQnpqQixJQUFxQixFQUFyQkE7QUFERixtQkFHSztBQUNIK0w7QUFDRDtBQUNGO0FBVEg7QUFERixhQWFLO0FBQ0hBO0FBQ0Q7OzswQkFHSDJYLGUsNEJBQWdCN0wsUSxFQUFVO0FBQ3hCLDZKQUF1QjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBZnhkLElBQWU7O0FBQ3JCLFlBQUk7QUFDRkEseUJBQVNBLEVBQVRBO0FBREYsVUFHQSxVQUFTO0FBQ1BNO0FBQ0Q7QUFDRjtBQUNEa2QseUJBQW1CQSxTQUFuQkE7OzswQkFHRjhMLFEscUJBQVM1b0IsQyxFQUFHO0FBQ1YsYUFBTyxhQUFZLEtBQUcsZ0JBQUgsU0FBWixJQUFQOzs7MEJBR0Y2b0IsSSxpQkFBS3ZMLFEsRUFBVXRkLEMsRUFBRztBQUFBOztBQUNoQixVQUFNOG9CLEtBQUssb0JBQW9CLGNBQS9CLENBQStCLENBQXBCLENBQVg7QUFBQSxVQUFrRHhwQixJQUFJLGtCQUFpQixPQUFqQixRQUErQixPQUFyRjtBQUNBLFVBQU0rQyxJQUFJO0FBQ1JyQyxXQURRO0FBRVIrWSxpQkFBUyxJQUFJLFlBRkwsT0FFQyxFQUZEO0FBR1JnUSxpQkFIUTtBQUlSN2dCLGVBSlE7QUFLUjhnQixnQkFBUTtBQUFBLGlCQUFNM21CLHlCQUF5QkEsWUFBekJBLGVBQW9ELHlCQUExRCxDQUEwRCxDQUExRDtBQUxBO0FBTVI0RCxlQUFPM0csRUFOQztBQU9SMnBCLGtCQUFVO0FBQUEsaUJBQUsseUJBQUwsQ0FBSyxDQUFMO0FBUEY7QUFRUkMsZUFBTztBQUFBLGlCQUFLLENBQUMsa0NBQU4sQ0FBTSxDQUFOO0FBUkM7QUFTUnJsQixpQkFBUyxtQkFBSztBQUNaO0FBQ0E7QUFDQSxjQUFHeEIsYUFBYUEsVUFBaEIsU0FBbUM7QUFDakNBO0FBQ0Q7QUFDREE7QUFDQSxpQkFBT0EsRUFBUDtBQUNBLGlCQUFPQSxFQUFQO0FBakJNO0FBbUJSeWEsa0JBQVU7QUFuQkYsT0FBVjtBQXFCQXphLDRCQUFzQixZQUF0QkE7QUFDQTtBQUNBOztBQUVBa1AsNkJBQXVCLFlBQUs7QUFDMUIsWUFBR2xQLEVBQUgsU0FBYztBQUNaQSwwQkFBZ0J5bUIsa0JBQWtCeHBCLEVBQWxDK0M7QUFDQUEsMkJBQWlCeW1CLG1CQUFtQnhwQixFQUFwQytDO0FBQ0EsY0FBTTFCLE1BQU0sc0JBQVosQ0FBWSxDQUFaO0FBQ0EwQixzQkFBWSw4QkFBNEJ5bUIsOEJBQTBCQSxHQUF0RCxRQUFpRW5vQixJQUFqRSxPQUE0RUEsSUFBNUUsUUFBd0ZyQixFQUF4RixPQUFpRyxTQUE3RytDLFFBQVksQ0FBWkE7QUFDQSxjQUFHQSxVQUFILFVBQXVCO0FBQ3JCQSwrQkFBbUIsT0FBbkJBO0FBQ0Q7QUFDREEsdUJBQWF5bUIsaUJBQWdCLENBQUN6bUIsc0JBQXVCO0FBQUE7QUFBeEIsa0JBQThDQSxFQUE5RHltQixPQUFnQixDQUFoQkEsR0FBYnptQjtBQUNBQSw2QkFBbUIsWUFBSztBQUN0QjtBQUNBLHNDQUF3QjtBQUN0QitDLG9CQURzQjtBQUV0QnFDLG9CQUFNekg7QUFGZ0IsYUFBeEI7QUFGRnFDO0FBT0FBLCtCQUFxQixpQkFBVTtBQUM3QixnQkFBR0EsRUFBSCxTQUFjO0FBQ1o7QUFDQSxrQkFBR0EsRUFBSCxVQUFlO0FBQ2JBLGlDQUFpQkEsRUFBakJBO0FBQ0FBLG1DQUFtQixJQUFJLFlBQUosTUFBbkJBLFFBQW1CLENBQW5CQTtBQUNBQTtBQUNEO0FBQ0RBO0FBQ0FBO0FBQ0FBLG1DQUFxQixZQUFLO0FBQ3hCLG9CQUFHQSxZQUFILG1CQUFrQztBQUNoQ0E7QUFDQSx5Q0FBcUJBLEVBQXJCO0FBQ0Q7QUFDRCx1QkFBTyxPQUFQO0FBQ0E7QUFORkE7QUFRQSx1Q0FBdUJBLEVBQXZCO0FBQ0E7QUFDRDtBQXBCSEE7QUFzQkQ7QUF2Q0hrUDtBQXlDQSw4QkFBd0I7QUFDdEJuTSxjQURzQjtBQUV0QnFDLGNBQU16SDtBQUZnQixPQUF4QjtBQUlBLGFBQU8sc0JBQVAsQ0FBTyxDQUFQOzs7MEJBR0ZtcEIsWSx5QkFBYTltQixDLEVBQUc7QUFDZCxhQUFPLHFCQUFxQixDQUFDQSxFQUF0QixLQUE2QkEsUUFBTSx1QkFBMUM7OzswQkFHRittQixjLDJCQUFlL21CLEMsRUFBRztBQUNoQixVQUFJMUIsV0FBSjtBQUNBLFVBQUcsc0JBQUgsUUFBaUM7QUFDL0IsWUFBTXJDLElBQUlMLFNBQVMsQ0FBQywyQkFBRCxPQUErQixZQUEvQixLQUErQixFQUEvQixHQUFtRG9FLEVBQTVEcEUsYUFBMkUsdUJBQXFCb0UsRUFBMUcsWUFBVXBFLENBQVY7QUFDQTBDLGNBQU07QUFDSndHLGlCQUFPLDBCQUF3QixPQUF4QixXQUFzQzlFLEVBRHpDO0FBRUo2QixrQkFBUSwwQkFBd0IsT0FBeEIsV0FBc0M3QixFQUFFeUU7QUFGNUMsU0FBTm5HO0FBRkYsYUFPSztBQUNIQSxjQUFNO0FBQ0p3RyxpQkFBTzlFLEVBREg7QUFFSjZCLGtCQUFRN0IsRUFBRXlFO0FBRk4sU0FBTm5HO0FBSUQ7QUFDRDs7OzBCQUdGMG9CLGlCLDhCQUFrQmhuQixDLEVBQUc7QUFDbkIsVUFBR0EsWUFBSCxtQkFBa0M7QUFDaENBO0FBQ0E7QUFDQTtBQUNEOzs7MEJBR0hpbkIsaUIsZ0NBQW9CO0FBQ2xCLFVBQUcsS0FBSCxRQUFnQjtBQUNkLFlBQU1ocUIsSUFBSSxLQUFWO0FBQ0EsWUFBRyxDQUFDLEtBQUQsY0FBb0JBLHlCQUF5QixDQUFDLFVBQWpELFlBQWlELEVBQTlDLENBQUgsRUFBNEU7QUFDMUUsY0FBSWlqQixjQUFKO0FBQUEsY0FBWWdILFdBQVo7QUFDQSxnQ0FBYSxLQUFiLG9JQUErQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsZ0JBQXZCbG5CLElBQXVCOztBQUM3QixnQkFBRyxXQUFXQSxFQUFkLFFBQWNBLEVBQWQsRUFBNEI7QUFDMUJrZ0I7QUFDRDtBQUNELGdCQUFHbGdCLEVBQUgsS0FBR0EsRUFBSCxFQUFjO0FBQ1prbkI7QUFDQTtBQUNEO0FBQ0Y7QUFDRCwyQkFBaUJBLE9BQWpCO0FBQ0EsY0FBRyxtQkFBbUJqcUIsRUFBbkIsK0JBQW9ELENBQUMsS0FBRCxRQUFDLEVBQUQsSUFBb0JBLEVBQTNFLHFCQUFrRztBQUNoRyw2QkFBaUIsa0JBQWtCLGlCQUFuQyxDQUFtQyxDQUFuQztBQUNEO0FBQ0QsY0FBRyxLQUFILFdBQW1CO0FBQ2pCLGdCQUFHLHVCQUFILGFBQXVDO0FBQ3JDLHlDQUEyQixLQUEzQjtBQUNBO0FBQ0EsbURBQXFDLG9CQUFvQixLQUF6RCxTQUFxQyxDQUFyQztBQUNBO0FBSkYsbUJBTUs7QUFDSCxxQkFBTyxLQUFQO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Q2UixtQkFBVyw0QkFBWEEsSUFBVyxDQUFYQTtBQUNEOzs7MEJBR0hxWSxZLDJCQUFlO0FBQ2I7OzswQkFHRkMsYSw0QkFBZ0I7QUFDZCxVQUFNQyxVQUFVLGNBQWhCLFNBQWdCLENBQWhCO0FBQUEsVUFBb0NDLFdBQVcsY0FBL0MsVUFBK0MsQ0FBL0M7QUFDQSw2QkFBdUIsZUFBUTtBQUM3QixZQUFNMWtCLFNBQVMya0IsSUFBZixDQUFlQSxDQUFmO0FBQ0EsWUFBRzNrQixPQUFILFVBQW9CO0FBQ2xCQTtBQUNBQTtBQUNEO0FBTEg7QUFPQTs7OzBCQUdGNGtCLHNCLG1DQUF1QjdwQixDLEVBQUdtRixDLEVBQUd6RyxJLEVBQU07QUFBQTs7QUFDakMsVUFBRyxLQUFILGdCQUF3QjtBQUN0QixZQUFNb3JCLFdBQVcsdUNBQWpCLENBQWlCLENBQWpCO0FBQ0EsWUFBR0EsU0FBSCxTQUFxQjtBQUFBO0FBQ2I7QUFBQSx3QkFBcUJBLGlCQUFyQixlQUFxQkEsRUFBckI7QUFDTixxQ0FBdUIsZUFBUTtBQUM3QixrQkFBTTdrQixTQUFTMmtCLElBQWYsQ0FBZUEsQ0FBZjtBQUNBLGtCQUFHM2tCLE9BQUgsVUFBb0I7QUFDbEJBLDBDQUEwQjhrQixHQUExQjlrQixHQUFnQzhrQixHQUFoQzlrQjtBQUNEO0FBSkg7QUFGbUI7QUFRcEI7QUFDRjs7OzBCQUdIK2tCLGtCLGlDQUFxQjtBQUNuQiwrQkFBeUIsZ0NBQXNCLEtBQXRCLGNBQXlDLE9BQWxFLFlBQXlCLENBQXpCO0FBQ0EsNEJBQWEsS0FBYiwwSUFBcUM7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQTdCMXFCLElBQTZCOztBQUNuQyxZQUFHQSxJQUFFLFVBQUZBLFFBQUUsRUFBRkEsSUFBMEIsQ0FBQyxtQkFBOUIsQ0FBOEIsQ0FBOUIsRUFBcUQ7QUFDbkQ7QUFDRDtBQUNGOzs7MEJBR0gycUIsYywyQkFBZWpxQixDLEVBQUc7QUFDaEI7QUFDQSxVQUFHLDJCQUF5QixPQUE1QixvQkFBdUQ7QUFDckQ7QUFDRDtBQUNEdVIsNkJBQXVCLDZCQUF2QkEsSUFBdUIsQ0FBdkJBOzs7MEJBR0YyWSxXLHdCQUFZN25CLEMsRUFBR2liLFEsRUFBVTtBQUN2Qiw2QkFBdUIsYUFBTTtBQUMzQixZQUFNNk0sS0FBS2hsQixFQUFYLENBQVdBLENBQVg7QUFDQSxZQUFHOUMsWUFBVThuQixnQkFBYixVQUFxQztBQUNuQyxpQkFBT0EsR0FBUDtBQUNEO0FBSkg7QUFNQSxVQUFHN00sWUFBWUEsYUFBV2piLEVBQTFCLFVBQXNDO0FBQ3BDQTtBQUNBO0FBQ0Q7OzswQkFHSCtuQixhLDBCQUFjL25CLEMsRUFBRztBQUNmQSx1QkFBaUJBLGtCQUFpQkEsRUFBakJBLFVBQTZCLHdCQUF1QixhQUFhQSxFQUFiLE9BQXZCLFVBQTlDQTtBQUNBLFVBQUcsQ0FBQ0EsV0FBSixLQUFvQjtBQUNsQkEsMkJBQW1CLElBQUksWUFBSixNQUFnQkEsRUFBbkNBLEtBQW1CLENBQW5CQTtBQUNEO0FBQ0RBOzs7MEJBR0Znb0Isc0IsbUNBQXVCL00sUSxFQUFVdGQsQyxFQUFHO0FBQ2xDLFVBQUlpRixTQUFTLG1CQUFiLENBQWEsQ0FBYjtBQUNBLFVBQUcsQ0FBSCxRQUFZO0FBQ1ZBLGlCQUFTLG9CQUFUQSxDQUFTLENBQVRBO0FBQ0E7QUFGRixhQUlLO0FBQ0g7QUFDRDs7QUFFRDs7OzBCQUdGK1UsVSx1QkFBV3NELFEsRUFBVXRkLEMsRUFBRztBQUN0QixVQUFHLENBQUMsK0JBQUosQ0FBSSxDQUFKLEVBQXVDO0FBQ3JDO0FBQ0Q7QUFDRDs7Ozs7O29CQXZZaUIybkIsVzs7Ozs7Ozs7Ozs7O0FDUHJCOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCMkMsc0I7OztBQUVuQiwrQ0FBMEI7QUFBQTs7QUFBQSxtREFDeEIsNkJBRHdCLE9BQ3hCLENBRHdCOztBQUV4QixrQkFBVyxrQkFBWCxHQUFXLENBQVg7QUFDQSw4QkFBdUI7QUFDckJsbEIsY0FEcUI7QUFFckJrUyxhQUFLLE1BRmdCO0FBR3JCaVQscUJBQWE7QUFIUSxPQUF2QjtBQUtBLG9CQUFhO0FBQ1hyVCxzQkFBYztBQURILE9BQWI7QUFHQSwyQkFBb0IsZ0JBQXBCLEtBQW9CLENBQXBCO0FBWHdCO0FBWXpCOztrQ0FFRHJULE8sc0JBQVU7QUFDUjtBQUNBOzs7a0NBR0ZxTSxJLGlCQUFLOEUsTyxFQUFTO0FBQUE7O0FBQ1osVUFBTXJOLFFBQVEsU0FBZCxXQUFjLEVBQWQ7QUFDQTtBQUNBLFVBQUdBLFFBQUgsR0FBWTtBQUNWcU4sZ0NBQ0ssZ0JBQVM7QUFDWixjQUFNM0MsT0FBTywwQkFBYixJQUFhLENBQWI7QUFDQSwyQkFBZUEsS0FBZixPQUEyQkEsS0FBM0I7QUFDQTtBQUpGMkMsaUJBTU0sYUFBTTtBQUNWcFY7QUFQRm9WO0FBREYsYUFXSztBQUNILHFCQUFhLEtBQWI7QUFDQTtBQUNEOzs7a0NBR0hrQyxZLHlCQUFhbFgsQyxFQUFHO0FBQ2QsYUFBTyxLQUFQOzs7Ozs7b0JBMUNpQnNxQixtQjs7Ozs7Ozs7Ozs7O0FDSHJCOzs7Ozs7OztNQUVxQkUsa0I7QUFFbkIsaURBQWdDO0FBQUE7O0FBQzlCO0FBQ0E7QUFDQSxxQkFBZSxhQUFmLE9BQWUsQ0FBZjtBQUNBO0FBQ0Q7OzhCQUVEM21CLE8sc0JBQVUsQzs7OEJBSVY0bUIsVSx1QkFBV3pWLE8sRUFBUztBQUNsQjs7OzhCQUdGMFYsYywyQkFBZXRsQixJLEVBQU11bEIsVyxFQUFhO0FBQ2hDLFVBQUd2bEIsU0FBSCxZQUFzQjtBQUNwQjtBQURGLGFBR0ssSUFBR0EsU0FBSCxZQUFzQjtBQUN6Qi9KO0FBQ0Q7Ozs4QkFHSHV2QixZLHlCQUFheGxCLEksRUFBTXVsQixXLEVBQWE7QUFDOUIsVUFBRyxDQUFDLEtBQUQsV0FBaUIsQ0FBQyxtQkFBckIsV0FBcUIsQ0FBckIsRUFBc0Q7QUFDcEQ7QUFDRDs7OzhCQUdIRSxXLHdCQUFZbnNCLEksRUFBTTtBQUFBOztBQUNoQixVQUFNeUcsSUFBSXpHLEtBQVY7QUFBQSxVQUFzQm9zQixPQUFPcHNCLEtBQTdCO0FBQ0EsY0FBT3lHLEVBQVA7QUFDRTtBQUFrQjtBQUNoQiw4QkFBa0IsaUJBQWxCLFFBQWtCLENBQWxCO0FBQ0E7QUFDQTtBQUNEO0FBQ0Q7QUFBaUI7QUFDZix1Q0FBMkIsc0JBQTNCO0FBQ0E7QUFDRDtBQUNEO0FBQ0E7QUFBYztBQUNaLGdCQUFHMmxCLEtBQUgsS0FBYTtBQUNYLDRDQUE4QkEsS0FBOUI7QUFERixtQkFHSyxJQUFHQSxLQUFILE1BQWM7QUFDakIsa0JBQUlDLG1CQUFKO0FBQ0Esa0JBQUcsT0FBT0QsS0FBUCxTQUFILFVBQWdDO0FBQzlCQyw4QkFBYyxnQ0FBZ0NELEtBQTlDQyxJQUFjLENBQWRBO0FBREYscUJBR0s7QUFDSEEsOEJBQWN4WixnQkFBZ0J1WixLQUE5QkMsSUFBY3haLENBQWR3WjtBQUNEO0FBQ0RBLCtCQUNPO0FBQUEsdUJBQVMsT0FBT0MsS0FBUCxDQUFPQSxDQUFQLGdCQUEyQkEsS0FBM0IsQ0FBMkJBLENBQTNCLEdBQW9DLCtCQUE4QkEsS0FBM0UsQ0FBMkVBLENBQTlCLENBQTdDO0FBRFBELHNCQUVPO0FBQUEsdUJBQVcsK0JBQVgsTUFBVyxDQUFYO0FBRlBBLHVCQUdRO0FBQUEsdUJBQUtuckIsY0FBTCxVQUFLQSxDQUFMO0FBSFJtckI7QUFJRDtBQUNEO0FBQ0Q7QUE3Qkg7Ozs7OztvQkFsQ2lCUCxlOzs7Ozs7Ozs7Ozs7QUNGckI7Ozs7Ozs7Ozs7Ozs7O01BRXFCUyxlO0FBQ25CLCtDQUFpQztBQUFBOztBQUMvQjtBQUNBO0FBQ0E7QUFDRDs7MkJBRUR6USxRLHFCQUFTVCxLLEVBQU87QUFDZDtBQUNBO0FBQ0E7OzsyQkFHRm1SLE8sc0JBQVU7QUFBQTs7QUFDUixVQUFHLEtBQUgsUUFBZ0I7QUFDZCxZQUFNM1MsVUFBVSxLQUFoQjtBQUNBO0FBQ0EsWUFBRyxLQUFILG1CQUEyQjtBQUN6Qix3SkFBd0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLGdCQUFoQjVYLE1BQWdCOztBQUN0QjtBQUNEO0FBQ0Y7QUFDRDtBQUNBO0FBQ0EscUJBQWF1USxLQUFiLEdBQWFBLEVBQWI7QUFDQSxZQUFHLG9CQUFILEdBQXdCO0FBQ3RCO0FBQ0Q7QUFiSCxhQWVLO0FBQ0gsWUFBRyxZQUFVLEtBQWIsT0FBeUI7QUFBQTtBQUN2QixnQkFBTWlhLFFBQVEsTUFBZDtBQUNBLHVCQUFVLG1CQUFrQixNQUE1QixJQUFVLENBQVYsT0FDTyxvQkFBYTtBQUNoQixrQkFBR0EsVUFBVSxNQUFiLE9BQXlCO0FBQ3ZCLG9CQUFHM1csU0FBSCxRQUFvQjtBQUNsQixxQ0FBa0I7QUFDaEIvTSwwQkFBTSxNQURVO0FBRWhCK007QUFGZ0IsbUJBQWxCO0FBSUQ7QUFDRCxrQkFBRSxNQUFGO0FBQ0Esb0JBQUcsTUFBSCxtQkFBMkI7QUFDekIsMENBQXVCLE1BQXZCLE1BQWtDLE1BQWxDO0FBQ0Q7QUFDRDtBQUNEO0FBZEw7QUFGdUI7QUFrQnhCO0FBQ0Y7OzsyQkFHSDRXLEksaUJBQUt0QyxFLEVBQUk7QUFBQTs7QUFDUCxVQUFJdUMsWUFBSjtBQUNBLFVBQUd2QyxZQUFILE9BQW9CO0FBQ2xCdUMsZUFBTyxZQUFZLG1CQUFZO0FBQzdCdkMsNEJBQWtCLFlBQUs7QUFDckIsZ0JBQU05b0IsSUFBSThvQiwwQkFBdUIsT0FBdkJBLE9BQWtDQSxHQUE1QztBQUNBLGdCQUFHQSwwQkFBSCxTQUFvQztBQUNsQ3hYO0FBREYsbUJBR0s7QUFDSHdYLHFDQUNLLGdCQUFTO0FBQ1pyaEIsMkNBQ0ssdUJBQWdCO0FBQ25CNkosMEJBQVEscUJBQVcsc0JBQXNCO0FBQUEsMkJBQVNnYSxLQUFUO0FBQWpDLG1CQUFXLENBQVgsRUFBcUQsT0FBckQsT0FBaUUsRUFBQy9XLE1BQWxFLEtBQWlFLEVBQWpFLEVBQVJqRCxXQUFRLEVBQVJBO0FBRkY3SjtBQUZGcWhCLHVCQU9NO0FBQUEsdUJBQUt4WCxRQUFMLEVBQUtBLENBQUw7QUFQTndYO0FBUUQ7QUFkSEE7QUFERnVDLFNBQU8sQ0FBUEE7QUFERixhQW9CSztBQUNIQSxlQUFPOVosZ0JBQVA4WixFQUFPOVosQ0FBUDhaO0FBQ0Q7QUFDRDs7Ozs7O29CQTdFaUJKLFk7Ozs7Ozs7Ozs7OztBQ0ZyQjs7Ozs7Ozs7Ozs7Ozs7TUFFcUJNLGdCO0FBQ25CLGlEQUFrQztBQUFBOztBQUNoQztBQUNBLFVBQU1sWixPQUFPMEksTUFBYixVQUFhQSxFQUFiO0FBQ0EsbUJBQWEsdUJBQWExSSxLQUFiLE9BQXlCQSxLQUF6QixRQUFiLEtBQWEsQ0FBYjs7QUFFQTtBQUNBLCtCQUF5QixLQUF6QjtBQUNEOzs0QkFFRHhPLE8sc0JBQVU7QUFDUjtBQUNBLGtDQUE0QixLQUE1Qjs7OzRCQUdGdU4sUSx1QkFBVztBQUNULGFBQU8sV0FBUCxRQUFPLEVBQVA7Ozs0QkFHRkMsSSxtQkFBTztBQUNMLGFBQU8sV0FBUCxJQUFPLEVBQVA7Ozs0QkFHRkcsSSxtQkFBTztBQUNMLGFBQU8sV0FBUCxJQUFPLEVBQVA7Ozs0QkFHRnhILEcsZ0JBQUkyRyxHLEVBQUtDLEksRUFBTUMsRSxFQUFJO0FBQ2pCOzs7NEJBR0ZvSixNLG1CQUFPYyxLLEVBQU87QUFDWjtBQUNBLHFDQUErQixXQUEvQjtBQUNBLHFDQUErQixXQUEvQjs7Ozs7O29CQWxDaUJ3USxhOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRnJCOzs7Ozs7Ozs7Ozs7OztNQUVxQkMsZTtpQkFFWkMsYywyQkFBZXBwQixDLEVBQUU5RixDLEVBQUVnRCxDLEVBQUVtc0IsRSxFQUFJO0FBQzlCLFVBQU0xc0IsSUFBSXpDLElBQUUsS0FBWjtBQUNBLGFBQU8sTUFBSSxLQUFKLElBQVcsS0FBWCxLQUFtQixLQUFHLElBQUUwQixTQUFTLE1BQUllLElBQUUsS0FBcEIsRUFBYyxDQUFUZixDQUFMLElBQW5CLEtBQXFELGNBQTVEOzs7aUJBR0swdEIsbUIsZ0NBQW9CdHBCLEMsRUFBRTlDLEMsRUFBRVAsQyxFQUFFMHNCLEUsRUFBSTtBQUNuQzs7OzJCQUdGRSxpQiw4QkFBa0JqZSxJLEVBQU1rZSxXLEVBQWE7QUFDbkMsYUFBTyxpQ0FBaUM7QUFDdENDLFdBQUcsT0FEbUM7QUFFdEN0dEIsV0FGc0M7QUFHdEN1dEIsWUFBSUYsY0FBWSxPQUhzQjtBQUl0QzF0QixXQUFHLE9BQU9BO0FBSjRCLE9BQWpDLENBQVA7OztpQkFRSzZ0QixZLHlCQUFhM3BCLEMsRUFBRTlGLEMsRUFBRWdELEMsRUFBRW1zQixFLEVBQUk7QUFDNUIsYUFBT3JwQixTQUFPQSxFQUFQQSxLQUFZLEtBQUdBLEVBQUgsU0FBVSxVQUFNLElBQUVwRSxTQUFTLE1BQUlBLFNBQWxELEVBQWtEQSxDQUFiQSxDQUFSLENBQXRCb0UsQ0FBUDs7O2lCQUdLNHBCLGtCLCtCQUFtQjVwQixDLEVBQUU5RixDLEVBQUVnRCxDLEVBQUVtc0IsRSxFQUFJO0FBQ2xDLGFBQU8sTUFBSSxLQUFHLElBQUV6dEIsU0FBUyxNQUFJMUIsSUFBRSxLQUFOLE1BQWU4RixFQUE3QixDQUFLcEUsQ0FBTCxJQUFYLENBQU8sQ0FBUDs7O2lCQUdLaXVCLHFCLGtDQUFzQkwsVyxFQUFhO0FBQ3hDLGFBQU8scUNBQXFDO0FBQzFDenNCLFlBQUl5c0I7QUFEc0MsT0FBckMsQ0FBUDs7O0FBS0YsNEJBQTJEO0FBQUEsVUFBL0MxdEIsSUFBK0Msb0VBQTdDLENBQTZDO0FBQUEsVUFBMUNzTyxVQUEwQyxvRUFBbEMsQ0FBa0M7QUFBQSxVQUEvQlMsa0JBQStCLG9FQUFmLElBQWU7QUFBQSxVQUFUaWYsTUFBUyxvRUFBTCxHQUFLOztBQUFBOztBQUN6RCxlQUFTO0FBQ1BodUIsV0FETztBQUVQK08seUJBRk87QUFHUGxPLFdBQUdmLFVBSEk7QUFJUG11QixpQkFBUyxJQUpGO0FBS1AzZixpQkFMTztBQU1QNGYsZ0JBQVEsUUFORDtBQU9QQyxjQVBPO0FBUVBDLGtCQVJPO0FBU1BDLHVCQUFlO0FBVFIsT0FBVDtBQVdBO0FBQ0Q7OzJCQUVEM29CLE8sc0JBQVU7QUFDUjs7OzJCQUdGcUYsTyxzQkFBVTtBQUNSLGFBQU8sUUFBUDs7OzJCQUdGdWpCLFMsc0JBQVU5ZSxJLEVBQU0xRixLLEVBQU8yVixRLEVBQVV6USxXLEVBQWEwUSxZLEVBQWNNLFcsRUFBYUMsUyxFQUFtRDtBQUFBLFVBQXhDc08sV0FBd0Msb0VBQS9CO0FBQUE7QUFBK0I7QUFBQSxVQUF2QkMsaUJBQXVCLG9FQUFSO0FBQUE7QUFBUTs7QUFDMUgsVUFBTUMsS0FBSztBQUNUamEsWUFBSSxvQkFESyxTQUNMLEVBREs7QUFFVG5VLFdBRlM7QUFHVGUsV0FIUztBQUlUUCxXQUFHaUosUUFBTSxPQUpBO0FBS1RoSSxXQUxTO0FBTVQ0c0IsWUFOUztBQU9UbkIsWUFQUztBQVFUb0IsY0FSUztBQVNUM08scUJBVFM7QUFVVEM7QUFWUyxPQUFYO0FBWUEsVUFBSWhnQixJQUFJLGtCQUFrQjtBQUFBLGVBQU13dUIsUUFBTXZxQixFQUFaO0FBQTFCLE9BQVEsQ0FBUjtBQUNBakUsVUFBSSxTQUFPLFFBQVhBO0FBQ0E7QUFDQSxhQUFPd3VCLEdBQVA7OzsyQkFHRkcsYywyQkFBZXZjLEksRUFBTTtBQUNuQixVQUFNaEksTUFBTTtBQUNWbUYsY0FEVTtBQUVWaVEsa0JBRlU7QUFHVnpRLHFCQUhVO0FBSVYwUSxzQkFKVTtBQUtWTSxxQkFMVTtBQU1WQyxtQkFOVTtBQU9Wc08sa0JBUFU7QUFRVkMsd0JBQWdCO0FBUk4sT0FBWjtBQVVBLGFBQU9ua0IsSUFBUCxJQUFPQSxDQUFQOzs7MkJBR0Z3a0IsVyx3QkFBWXJhLEUsRUFBSW5DLEksRUFBTXVCLEssRUFBTztBQUMzQixVQUFNMVAsSUFBSSxhQUFhO0FBQUEsZUFBTUEsU0FBTjtBQUF2QixPQUFVLENBQVY7QUFDQSxVQUFHbU8sU0FBSCxTQUFxQjtBQUNuQm5PLGNBQU0wUCxRQUFNLE9BQVoxUDtBQURGLGFBR0s7QUFDSEEsVUFBRSxvQkFBRkEsSUFBRSxDQUFGQTtBQUNEOzs7MkJBR0g0cUIsVyx3QkFBWXRhLEUsRUFBSW5DLEksRUFBTTtBQUNwQixVQUFNbk8sSUFBSSxhQUFhO0FBQUEsZUFBTUEsU0FBTjtBQUF2QixPQUFVLENBQVY7QUFDQSxVQUFJMFAsYUFBSjtBQUNBLFVBQUd2QixTQUFILFNBQXFCO0FBQ25CdUIsZ0JBQVExUCxNQUFJLE9BQVowUDtBQURGLGFBR0s7QUFDSEEsZ0JBQVExUCxFQUFFLG9CQUFWMFAsSUFBVSxDQUFGMVAsQ0FBUjBQO0FBQ0Q7QUFDRDs7OzJCQUdGbWIsUSxxQkFBU0MsQyxFQUFHO0FBQ1YsVUFBSXB3QixJQUFKO0FBQUEsVUFDSUMsS0FBRyxPQURQO0FBQUEsVUFFSW93QixVQUZKO0FBQUEsVUFHSUMsS0FISjs7QUFLQSxhQUFNdHdCLFNBQU9zd0IsS0FBRyxPQUFoQixlQUFzQztBQUNwQyxZQUFHcndCLEtBQUdtd0IsSUFBTixHQUFXO0FBQ1Rud0IsZUFBS213QixJQUFMbndCO0FBQ0Q7QUFDRCxZQUFNc3dCLE1BQU0sZUFBZSxLQUFmLElBQVosRUFBWSxDQUFaO0FBQUEsWUFDTUMsS0FBSyxvQkFEWCxHQUNXLENBRFg7QUFFQSxZQUFHQSxjQUFZSCxVQUFRLE9BQXZCLFVBQXdDO0FBQ3RDcHdCO0FBQ0E7QUFGRixlQUlLO0FBQ0gsY0FBR3V3QixXQUFILEdBQWU7QUFDYixnQkFBTUMsT0FBTyxvQkFBb0JGLElBQUlDLFVBQXhCLENBQW9CRCxDQUFwQixFQUFvQ0EsSUFBSUMsR0FBckQsSUFBaURELENBQXBDLENBQWI7QUFDQUEsZ0JBQUlDLFVBQUpELEtBQWlCRSxLQUFqQkYsQ0FBaUJFLENBQWpCRjtBQUNBQSxnQkFBSUMsR0FBSkQsUUFBZUUsS0FBZkYsQ0FBZUUsQ0FBZkY7QUFIRixpQkFLSyxJQUFHQyxTQUFILEdBQWE7QUFDaEIsZ0JBQU1FLEtBQU47QUFDQSxnQkFBSXJsQixPQUFPLENBQVg7QUFDQSxpQ0FBYW1sQixHQUFiLHFIQUFxQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsa0JBQWJudkIsSUFBYTs7QUFDbkIsa0JBQUdBLFdBQUgsR0FBYTtBQUNYcXZCO0FBQ0Q7QUFDREEsaUJBQUdBLFlBQUhBO0FBQ0FybEI7QUFDRDtBQUNELDZKQUFpQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsa0JBQVQwakIsSUFBUzs7QUFDZixrQkFBSXZxQixVQUFKO0FBQUEsa0JBQVFtc0IsVUFBUjtBQUNBLGtCQUFHSixJQUFJeEIsRUFBSndCLENBQUl4QixDQUFKd0IsTUFBWXJ2QixjQUFVLE9BQXpCLEdBQW1DO0FBQ2pDc0QscUJBQUssQ0FBTEE7QUFDQW1zQixxQkFBSzVCLEVBQUVBLFdBQVA0QixDQUFLNUIsQ0FBTDRCO0FBRkYscUJBSUs7QUFDSG5zQjtBQUNBbXNCLHFCQUFLNUIsRUFBTDRCLENBQUs1QixDQUFMNEI7QUFDRDtBQUNELG1CQUFJLElBQUl0dkIsTUFBUixJQUFjQSxNQUFFa3ZCLElBQUZsdkIsVUFBZ0JBLE1BQUUsQ0FBaEMsR0FBb0NBLE9BQXBDLElBQTJDO0FBQ3pDLG9CQUFNaUUsSUFBSWlyQixJQUFJbHZCLE1BQWQsRUFBVWt2QixDQUFWO0FBQ0Esb0JBQUdqckIsS0FBS2QsTUFBSWMsTUFBSWlyQixTQUFSL3JCLE1BQW1CLE9BQTNCLFFBQTBDO0FBQ3hDYyx3QkFBSWlyQixhQUFTL3JCLFNBQUssT0FBbEJjO0FBQ0Esc0JBQUdBLE1BQUksT0FBSkEsS0FBZ0JBLE1BQW5CLEdBQTBCO0FBQ3hCQSwwQkFBTUEsTUFBSSxPQUFKQSxJQUFjLE9BQWRBLElBQU5BO0FBQ0FBO0FBQ0FBO0FBQ0F6QztBQUNEO0FBUEgsdUJBU0s7QUFDSDtBQUNEO0FBQ0Y7QUFDRjtBQUNGO0FBQ0Q7QUFDQTtBQUNBN0M7QUFDQUMsZUFBRyxPQUFIQTtBQUNBb3dCO0FBQ0Q7QUFDRDtBQUNEOztBQUVEOzs7MkJBR0ZPLGEsNEJBQWdCO0FBQ2QsVUFBTUwsTUFBTjtBQUFBLFVBQWdCcG9CLFNBQVMsS0FBekIsRUFBeUIsQ0FBekI7QUFDQSw0QkFBYSxLQUFiLDJIQUFzQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBZDdDLElBQWM7O0FBQ3BCLFlBQUdBLEVBQUgsYUFBa0I7QUFDaEJBLHdCQUFjQSxNQUFJLE9BQWxCQSxHQUE0QkEsRUFBNUJBO0FBQ0Q7QUFDRCxZQUFHLENBQUNBLFFBQU0sT0FBTkEsS0FBa0JBLFFBQW5CLE1BQStCQSxRQUFsQyxHQUEyQztBQUN6QyxjQUFHQSxnQkFBSCxXQUE4QjtBQUM1QjZDLG1CQUFPLENBQUM3QyxRQUFNLE9BQVAsS0FBUDZDO0FBQ0Q7QUFISCxlQUtLO0FBQ0hvb0I7QUFDRDtBQUNGO0FBQ0Q7QUFDQSw0QkFBYXBvQixVQUFiLE9BQWFBLEVBQWIseUhBQWtDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUExQjdDLEtBQTBCOztBQUNoQ0EscUJBQVlwRSxLQUFab0UsSUFBcUJBLEdBQXJCQTtBQUNEO0FBQ0QsNEJBQWE2QyxPQUFiLENBQWFBLENBQWIseUhBQXdCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFoQjdDLE1BQWdCOztBQUN0QkEseUJBQWVBLElBQWZBO0FBQ0Q7OzsyQkFHSHVyQiw0QiwyQ0FBK0I7QUFDN0IsVUFBRyxRQUFILFFBQW1CO0FBQ2pCLFlBQU0sbUJBRUMsUUFGRCxDQUVDLENBRkQ7QUFHRjV1QixhQUhFO0FBSUZSLGFBQUcsT0FKRDtBQUtGa3RCLGNBQUk7QUFMRixtQkFPRCxLQVBDLGtCQVNDLFFBVEQsQ0FTQyxDQVREO0FBVUYxc0IsYUFBRyxPQUFLLE9BVk47QUFXRlIsYUFBRyxPQVhEO0FBWUZrdEIsY0FBSTtBQVpGLFlBQU47O0FBZ0JBLGFBQUksSUFBSXR0QixJQUFSLEdBQWFBLElBQUV5dkIsR0FBZixRQUEwQixFQUExQixHQUErQjtBQUM3QixjQUFNdHhCLElBQUVzeEIsR0FBR3p2QixJQUFYLENBQVF5dkIsQ0FBUjtBQUFBLGNBQWlCcHhCLElBQUVveEIsR0FBbkIsQ0FBbUJBLENBQW5CO0FBQUEsY0FDTUMsS0FBR3Z4QixNQUFJLHlCQUF1QkEsRUFBdkIsS0FBNEIsT0FEekM7QUFBQSxjQUVNaVAsS0FBRy9PLE1BQUkseUJBQXVCQSxFQUF2QixLQUE0QixPQUZ6QztBQUdBLGNBQUcsa0JBQWNGLE9BQUtFLEVBQXRCLElBQTRCO0FBQzFCLGdCQUFNc3hCLE1BQU14eEIsT0FBS0UsRUFBakI7QUFBQSxnQkFBdUJ1eEIsS0FBR3p4QixNQUFJQSxFQUFKQSxPQUFXRSxNQUFJQSxFQUF6QztBQUFBLGdCQUFpREgsS0FBR0MsTUFBSUEsRUFBSkEsT0FBcEQ7QUFBQSxnQkFBbUVDLEtBQUdDLE1BQUlBLEVBQUpBLE9BQXRFO0FBQ0FGLG1CQUFLQSxPQUFLQyxLQUFWRDtBQUNBRSxtQkFBS0EsT0FBS0gsS0FBVkc7QUFDRDtBQUNGO0FBQ0Y7OzsyQkFHSHd4QixjLDJCQUFlMXhCLEMsRUFBR0UsQyxFQUFHO0FBQ25CLFVBQU15eEIsS0FBSXp4QixNQUFJRixFQUFkO0FBQUEsVUFDRTR4QixLQUFLLENBQUMsQ0FBQzV4QixFQUFELElBQUtFLEVBQUwsSUFBU0YsTUFBSUEsRUFBYixJQUFpQixJQUFFRSxFQUFGLElBQU1BLEVBQXhCLEtBRFA7QUFBQSxVQUVFMnhCLEtBQUssQ0FBQzN4QixNQUFJQSxFQUFKQSxJQUFRQSxNQUFJRixFQUFaRSxJQUFnQixJQUFFRixFQUFGLElBQU1BLEVBQXZCLEtBRlA7QUFHQSxhQUFPLG1CQUFRZ0QsR0FBUix5QkFBdUJBLEdBQTlCLEVBQU8sSUFBUDs7OzJCQUdGOHVCLGMsMkJBQWVSLEUsRUFBSTtBQUNqQixVQUFNTixLQUFLO0FBQ1R4dUIsYUFEUztBQUVUcUosY0FGUztBQUdUa21CLGFBQUs7QUFISSxPQUFYO0FBS0EsV0FBSSxJQUFJbHdCLElBQVIsR0FBZUEsSUFBRXl2QixHQUFGenZCLFVBQWVtdkIsU0FBOUIsR0FBd0MsRUFBeEMsR0FBNkM7QUFDM0MsWUFBR00sR0FBR3p2QixJQUFIeXZCLE9BQVVBLE1BQVZBLEtBQXFCLGlCQUFpQkEsR0FBR3p2QixJQUFwQixDQUFpQnl2QixDQUFqQixFQUEwQkEsR0FBbEQsQ0FBa0RBLENBQTFCLENBQXhCLEVBQTBEO0FBQ3hELGNBQUdBLEdBQUd6dkIsSUFBSHl2QixPQUFVQSxNQUFiLEdBQXNCO0FBQ3BCLGNBQUVOLEdBQUY7QUFDRDtBQUNELFlBQUVBLEdBQUY7QUFDQUE7QUFDQSxjQUFHQSxlQUFlbnZCLElBQWZtdkIsT0FBc0IsQ0FBekIsR0FBNkI7QUFDM0JBLHdCQUFZbnZCLElBQVptdkI7QUFDRDtBQUNELGNBQUdBLHNCQUFvQixDQUF2QixHQUEyQjtBQUN6QkE7QUFDRDtBQUNGO0FBQ0Y7QUFDRDs7OzJCQUdGZ0IsVyx3QkFBWWh5QixDLEVBQUdFLEMsRUFBRztBQUNoQixhQUFPd0IsU0FBUzFCLE1BQUlFLEVBQWJ3QixLQUFrQixPQUFsQkEsVUFBbUMxQixNQUFJRSxFQUE5Qzs7OzJCQUdGK3hCLFMsc0JBQVVYLEUsRUFBSTd3QixFLEVBQUk7QUFDaEIsVUFBTXN3QixNQUFOO0FBQ0EsdUpBQWlCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFUanJCLElBQVM7O0FBQ2YsWUFBTTBDLEtBQUssd0JBQ1QsYUFBYTtBQUNYK21CLGFBQUcsT0FEUTtBQUVYM3RCLGFBQUcsT0FGUTtBQUdYSyxhQUFHNkQsRUFIUTtBQUlYcEMsYUFBR29DLEVBSlE7QUFLWHdxQixjQUFJeHFCLEVBTE87QUFNWHFwQixjQUFJcnBCLEVBTk87QUFPWHlxQixnQkFBTXpxQixFQUFFeXFCO0FBUEcsU0FBYixDQURTLFNBWVQsQ0FBQ3pxQixFQUFELEdBQU1BLEVBQU4sR0FBV0EsRUFaYixFQVlFLENBWlMsQ0FBWDtBQWNBLFlBQU07QUFFSjlDLGFBQUd3RixHQUZDLENBRURBLENBRkM7QUFHSi9GLGFBQUcrRixHQUhDLENBR0RBLENBSEM7QUFJSjJtQixjQUFJM21CO0FBSkEsVUFBTjtBQU1BLFlBQUc2bkIsYUFBV0EsUUFBTSxPQUFwQixHQUE4QjtBQUM1QkEsaUJBQUtBLGdCQUFZLE9BQWpCQTtBQUNBQTtBQUNBQTtBQUNEO0FBQ0RVO0FBQ0Q7QUFDRDs7OzJCQUdGeHdCLEUsZUFBR0MsQyxFQUFFRSxDLEVBQUc7QUFDTixVQUFNc0MsSUFBRXRDLEVBQVIsQ0FBUUEsQ0FBUjtBQUFBLFVBQWMrQixJQUFFL0IsRUFBaEIsQ0FBZ0JBLENBQWhCO0FBQUEsVUFBc0J5dUIsS0FBR3p1QixFQUF6QixDQUF5QkEsQ0FBekI7QUFBQSxVQUErQmdELElBQUUsYUFBWWpCLElBQUUsS0FBZCxNQUFqQyxFQUFpQyxDQUFqQztBQUFBLFVBQTZENnRCLEtBQUcsY0FBYTd0QixJQUFFLEtBQWYsTUFBaEUsRUFBZ0UsQ0FBaEU7QUFDQSxhQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUQsSUFBUWYsU0FBU2UsSUFBRSxLQUFuQixDQUFRZixDQUFSLEdBQTJCLEtBQTNCLElBQUQsS0FBc0MsS0FEakMsR0FFTHNCLElBQUUsUUFBTXRCLGdCQUZILEdBRUgsQ0FGRyxFQUdMLGFBQVcsQ0FBQyxLQUFHLElBQUVBLFNBQVMsT0FBZCxFQUFLQSxDQUFMLElBQUQsTUFBNkIsSUFBRSxLQUFHLElBQUVBLFNBQVMsTUFBSUEsZUFBakQsQ0FBNkMsQ0FBVEEsQ0FBTCxDQUEvQixJQUhiLEVBR0UsQ0FISyxDQUFQOzs7Ozs7b0JBcFRpQnV0QixZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUNBQWlELG1CO0FBRW5CLGdDQUF5QjtBQUFBLFVBQWJDLFdBQWEsb0VBQUosRUFBSTs7QUFBQTs7QUFDdkIsb0JBQWNBLG1CQUFkO0FBQ0E7QUFDQSxVQUFHLFlBQUgsV0FBMEI7QUFDeEIsK0JBQXVCLFVBQVUsWUFBakMsU0FBdUIsQ0FBdkI7QUFDRDtBQUNELFVBQUcsWUFBSCxTQUF3QjtBQUN0Qiw2QkFBcUIsVUFBVSxZQUEvQixPQUFxQixDQUFyQjtBQUNEO0FBQ0Y7OytCQUVEQyxVLHVCQUFXbk0sTyxFQUFTO0FBQ2xCOzs7K0JBR0ZvTSxLLG9CQUFRO0FBQ04scUJBQWUsQ0FBQyxLQUFoQjs7OytCQUdGL3FCLE8sc0JBQVU7QUFDUixhQUFPLFdBQVA7QUFDQSxhQUFPLFdBQVA7OzsrQkFHRm1lLFMsd0JBQVk7QUFDVixVQUFHLGdCQUFnQixXQUFuQixXQUF5QztBQUN2QztBQUNEOzs7K0JBR0hFLE8sc0JBQVU7QUFDUixVQUFHLGdCQUFnQixXQUFuQixXQUF5QztBQUN2QztBQUNBO0FBQ0Q7QUFDRCxVQUFHLGdCQUFnQixXQUFuQixTQUF1QztBQUNyQztBQUNEOzs7K0JBR0gyTSxjLDJCQUFlQyxPLEVBQVM7QUFDdEJBLDRDQUFzQyxvQkFBdENBLElBQXNDLENBQXRDQTtBQUNBQSwwQ0FBb0Msa0JBQXBDQSxJQUFvQyxDQUFwQ0E7Ozs7OztvQkE1Q2lCTCxnQjs7Ozs7Ozs7Ozs7O0FDRnJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQUVxQk0sZ0I7OztBQUVuQiwyQ0FBNEI7QUFBQTs7QUFBQSxtREFDMUIsNkJBRDBCLElBQzFCLENBRDBCOztBQUUxQjtBQUNBO0FBSDBCO0FBSTNCOzs0QkFFREMsYSwwQkFBY0MsVSxFQUFZO0FBQ3hCO0FBQ0FBLDhCQUF3Qiw2QkFBeEJBLElBQXdCLENBQXhCQTtBQUNBLFVBQUcsYUFBSCxRQUF3QjtBQUN0QjtBQUNEO0FBQ0Q7Ozs0QkFHRkMsUyxzQkFBVUMsTSxFQUFRO0FBQ2hCO0FBQ0FBLDBCQUFvQix5QkFBcEJBLElBQW9CLENBQXBCQTtBQUNBOzs7NEJBR0ZDLFkseUJBQWFDLFMsRUFBVzlYLEcsRUFBSztBQUMzQjtBQUNBO0FBQ0E4WCw2QkFBdUIsNEJBQXZCQSxJQUF1QixDQUF2QkE7QUFDQSxVQUFHQSxVQUFILE9BQUdBLEVBQUgsRUFBd0I7QUFDdEI7QUFDQTtBQUNEO0FBQ0Q7Ozs0QkFHRkMsWSwyQkFBZTtBQUNiO0FBQ0E7Ozs0QkFHRkMsYSw0QkFBZ0I7QUFDZDtBQUNBOzs7NEJBR0ZDLFMsd0JBQVk7QUFDVjtBQUNBOzs7NEJBR0ZDLFcsMEJBQWM7QUFDWjs7OzRCQUdGQyxrQiwrQkFBbUJoWCxNLEVBQVE7QUFDekI7Ozs0QkFHRmlYLGMsMkJBQWVqWCxNLEVBQVE7QUFDckI7Ozs0QkFHRmtYLGlCLDhCQUFrQnRFLEksRUFBTTtBQUFBOztBQUN0QixVQUFHQSxLQUFILEtBQWE7QUFDWGp3QixvQkFBWWl3QixLQUFaandCO0FBREYsYUFHSyxJQUFHaXdCLEtBQUgsTUFBYztBQUNqQixZQUFJUCxtQkFBSjtBQUNBLFlBQUcsT0FBT08sS0FBUCxTQUFILFVBQWdDO0FBQzlCUCx3QkFBYyxnQ0FBZ0NPLEtBQTlDUCxJQUFjLENBQWRBO0FBREYsZUFHSztBQUNIQSx3QkFBY3haLGdCQUFnQitaLEtBQTlCUCxJQUFjeFosQ0FBZHdaO0FBQ0Q7QUFDREEseUJBQ087QUFBQSxpQkFBUyxnQ0FBOEJDLEtBQXZDLENBQXVDQSxDQUE5QixDQUFUO0FBRFBELGdCQUVPO0FBQUEsaUJBQVcseUJBQVgsTUFBVyxDQUFYO0FBRlBBLGlCQUdRO0FBQUEsaUJBQUtuckIsY0FBTCxjQUFLQSxDQUFMO0FBSFJtckI7QUFJRDs7OzRCQUdIcEksVSx5QkFBYTtBQUFBOztBQUNYLFVBQUcsS0FBSCxNQUFjO0FBQ1oseUNBQWlDO0FBQy9COUksa0JBRCtCO0FBRS9CNkYsbUJBRitCO0FBRy9CNkMsa0JBQVE7QUFIdUIsU0FBakM7QUFLQSw0Q0FBb0M7QUFDbEMxSSxrQkFEa0M7QUFFbEM2RixtQkFBUyxhQUZ5QjtBQUdsQzZDLGtCQUFRO0FBSDBCLFNBQXBDO0FBS0Esd0NBQWdDO0FBQzlCMUksa0JBRDhCO0FBRTlCNkYsbUJBQVMsYUFGcUI7QUFHOUI2QyxrQkFBUTtBQUhzQixTQUFoQztBQUtBLDJDQUFtQztBQUNqQzFJLGtCQURpQztBQUVqQzZGLG1CQUFTLGFBRndCO0FBR2pDNkMsa0JBQVE7QUFIeUIsU0FBbkM7QUFLQSwyQ0FBbUM7QUFDakMxSSxrQkFEaUM7QUFFakM2RixtQkFGaUM7QUFHakM2QyxrQkFBUSxhQUFXO0FBSGMsU0FBbkM7QUFLQSwwQ0FBa0M7QUFDaEMxSSxrQkFEZ0M7QUFFaEM2RixtQkFGZ0M7QUFHaEM2QyxrQkFBUTtBQUh3QixTQUFsQztBQUtBLDRDQUFvQztBQUNsQzFJLGtCQURrQztBQUVsQzZGLG1CQUZrQztBQUdsQzZDLGtCQUFRLGFBQVc7QUFIZSxTQUFwQztBQUtBLHdDQUFnQztBQUM5QjFJLGtCQUQ4QjtBQUU5QjZGLG1CQUY4QjtBQUc5QjZDLGtCQUFRLGFBQVc7QUFIVyxTQUFoQztBQUtBaFIsK0JBQXVCO0FBQUEsaUJBQUssNEJBQTBCLGtCQUFnQixlQUEvQyxZQUFLLENBQUw7QUFBdkJBO0FBQ0E7QUFDRDs7Ozs7O29CQTVIZ0J3ZCxhOzs7Ozs7Ozs7Ozs7QUNGckI7O0FBQ0E7Ozs7Ozs7O0FBRUEsTUFBTWMsT0FBTjtBQUFBLE1BQ01DLE9BRE47QUFBQSxNQUVNQyxPQUZOO0FBQUEsTUFHTTNvQixRQUhOO0FBQUEsTUFJTWtQLFFBSk47O0FBTUEsTUFBTTBaLGdCQUFnQixJQUFJLFlBQUosNEJBQXNDSCxPQUF0QyxHQUE4Q0MsT0FBcEUsQ0FBc0IsQ0FBdEI7QUFDQUUsMEJBQXdCLE1BQXhCQSxPQUFrQyxNQUFsQ0E7QUFDQSxNQUFNQyxlQUFlLElBQUksWUFBSiw0QkFBc0NKLE9BQXRDLEdBQThDQyxPQUFuRSxDQUFxQixDQUFyQjtBQUNBRyx1QkFBcUJoeUIsS0FBckJneUI7QUFDQUEseUJBQXVCLE1BQXZCQSxPQUFpQyxNQUFqQ0E7QUFDQSxNQUFNQyxlQUFlLElBQUksWUFBSiw0QkFBc0NILE9BQXRDLEdBQThDRCxPQUFuRSxDQUFxQixDQUFyQjtBQUNBSSx1QkFBcUIsQ0FBQ2p5QixLQUFELEtBQXJCaXlCO0FBQ0FBLDRCQUF5QixNQUF6QkEsT0FBbUMsTUFBbkNBO0FBQ0EsTUFBTUMsZ0JBQWdCLElBQUksWUFBSiw0QkFBc0NKLE9BQXRDLEdBQThDRCxPQUFwRSxDQUFzQixDQUF0QjtBQUNBSyx3QkFBc0JseUIsVUFBdEJreUI7QUFDQUEsaUNBQThCLE1BQTlCQSxPQUF3QyxNQUF4Q0E7QUFDQSxNQUFNQyxjQUFjLElBQUksWUFBSiw0QkFBc0NQLE9BQXRDLEdBQThDRSxPQUFsRSxDQUFvQixDQUFwQjtBQUNBSyxzQkFBb0IsQ0FBQ255QixLQUFELEtBQXBCbXlCO0FBQ0FBLHdCQUFzQixNQUF0QkEsY0FBc0MsTUFBdENBO0FBQ0EsTUFBTUMsaUJBQWlCRCxZQUF2QixLQUF1QkEsRUFBdkI7QUFDQUMsOEJBQTJCLENBQTNCQTtBQUNBLHVCQUFhQSxlQUFiLHVIQUFtQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsUUFBM0Jwd0IsSUFBMkI7QUFBQSxnQkFDcEIsQ0FBQ0EsRUFBRCxHQUFNQSxFQURjLENBQ3BCLENBRG9CO0FBQ2hDQSxNQURnQyxDQUNoQ0EsR0FEZ0MsUUFDaENBO0FBQUtBLE1BRDJCLENBQzNCQSxHQUQyQixRQUMzQkE7QUFDUDs7QUFFRCxNQUFNb1csV0FBVyxJQUFJLFlBQXJCLFFBQWlCLEVBQWpCO0FBQ0FBLGdDQUF3QmdhLGVBQXhCaGEsVUFBb0QrWixZQUFwRC9aOztBQUVBLE1BQU1pYSxXQUFXLFNBQVhBLFFBQVcsVUFBWTtBQUMzQixxSkFBaUI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFVBQVRyd0IsSUFBUzs7QUFDZm9XLDBCQUFvQixJQUFJLFlBQUosTUFBZ0I3TixJQUFJdkksRUFBcEIsQ0FBZ0J1SSxDQUFoQixFQUEwQkEsSUFBSXZJLEVBQTlCLENBQTBCdUksQ0FBMUIsRUFBb0NBLElBQUl2SSxFQUE1RG9XLENBQXdEN04sQ0FBcEMsQ0FBcEI2TjtBQUNEO0FBQ0RDLGVBQVdELGVBQVhDO0FBSkY7O0FBT0EsTUFBTWlhLGNBQWMsU0FBZEEsV0FBYyxXQUFhO0FBQy9CLFFBQU0vbkIsTUFBTjtBQUNBLFFBQU1nb0IsS0FBSyxTQUFMQSxFQUFLO0FBQUEsYUFBU3Z5QixTQUFTMUIsTUFBSUUsRUFBYndCLEtBQWtCQSxTQUFTMUIsTUFBSUUsRUFBL0J3QixDQUFrQkEsQ0FBbEJBLEdBQW9DQSxTQUFTMUIsTUFBSUUsRUFBakR3QixDQUFvQ0EsQ0FBcENBLEdBQVQ7QUFBWDtBQUNBLFNBQUksSUFBSUcsSUFBUixHQUFhQSxJQUFFa1osSUFBZixRQUEyQixFQUEzQixHQUFnQztBQUM5QixXQUFJLElBQUlqWixJQUFSLEdBQWFBLElBQUVveUIsSUFBZixRQUEyQixFQUEzQixHQUFnQztBQUM5QixZQUFHRCxHQUFHbFosSUFBSGtaLENBQUdsWixDQUFIa1osRUFBV0MsSUFBZCxDQUFjQSxDQUFYRCxDQUFILEVBQXVCO0FBQ3JCaG9CO0FBQ0E7QUFDRDtBQUNGO0FBQ0Y7QUFDRDtBQVhGOztBQWNBLE1BQU1rb0IsV0FBV0gsWUFBWVAsY0FBWk8sVUFBb0NsYSxTQUFyRCxRQUFpQmthLENBQWpCO0FBQ0EsTUFBTUksVUFBVUosWUFBWU4sYUFBWk0sVUFBbUNsYSxTQUFuRCxRQUFnQmthLENBQWhCO0FBQ0EsTUFBTUssVUFBVUwsWUFBWUwsYUFBWkssVUFBbUNsYSxTQUFuRCxRQUFnQmthLENBQWhCO0FBQ0EsTUFBTU0sV0FBV04sWUFBWUosY0FBWkksVUFBb0NsYSxTQUFyRCxRQUFpQmthLENBQWpCOztBQUVBRCxXQUFTRixZQUFURSxPQUE0QjtBQUFBLFdBQU1seUIsSUFBRWl5Qix3QkFBUjtBQUE1QkM7QUFDQUEsV0FBU0QsZUFBVEMsT0FBK0I7QUFBQTtBQUEvQkE7QUFDQUEsV0FBU04sY0FBVE0sT0FBOEI7QUFBQSxXQUFNSSxTQUFOLENBQU1BLENBQU47QUFBOUJKO0FBQ0FBLFdBQVNMLGFBQVRLLE9BQTZCO0FBQUEsV0FBTUssUUFBTixDQUFNQSxDQUFOO0FBQTdCTDtBQUNBQSxXQUFTSixhQUFUSSxPQUE2QjtBQUFBLFdBQU1NLFFBQU4sQ0FBTUEsQ0FBTjtBQUE3Qk47QUFDQUEsV0FBU0gsY0FBVEcsT0FBOEI7QUFBQSxXQUFNTyxTQUFOLENBQU1BLENBQU47QUFBOUJQO0FBQ0FoYTs7QUFFQTs7QUFFQUQ7QUFDQTtBQUNBQTtBQUNBO0FBQ0FBOztvQkFFZTtBQUNkd1osVUFEYztBQUVkQyxVQUZjO0FBR2RDLFVBSGM7QUFJZHpaLFdBSmM7QUFLZEQ7QUFMYyxHOzs7Ozs7Ozs7OztVQ3BFQ2hPLEssR0FBQUEsSztBQU5oQixNQUFNeW9CLGVBQWU7QUFDbkJDLFVBRG1CO0FBRW5CQyxZQUZtQjtBQUduQkMsV0FBTztBQUhZLEdBQXJCOztBQU1PLG1CQUFpQjtBQUN0QixXQUFPO0FBQ0xodkIsV0FESztBQUVMaXZCLFlBQU07QUFDSkMsaUJBQVM7QUFETCxPQUZEO0FBS0wvcEIsYUFBTztBQUNMK3BCLGlCQURLO0FBRUxDLGFBRks7QUFHTEMsYUFISztBQUlMQyxnQkFBUTtBQUpILE9BTEY7QUFXTGpTLGdCQUFVO0FBQ1I4UixpQkFEUTtBQUVSQyxhQUZRO0FBR1JDLGFBSFE7QUFJUkMsZ0JBQVE7QUFKQSxPQVhMO0FBaUJMN04sV0FBSztBQUNITixlQUFPO0FBREosT0FqQkE7QUFvQkxvTyx3QkFBa0I7QUFDaEJMLGNBRGdCO0FBRWhCdFYsY0FBTTtBQUZVLE9BcEJiO0FBd0JMaEMsc0JBQWdCO0FBQ2Q0SSxpQkFEYztBQUVkZ1AscUJBQWE7QUFGQyxPQXhCWDtBQTRCTGhOLGVBQVM7QUFDUGxFLG1CQUFXO0FBQ1RrQyxtQkFBUztBQURBLFNBREo7QUFJUGpDLG9CQUFZO0FBQ1ZpQyxtQkFBUztBQURDLFNBSkw7QUFPUGhDLHdCQUFnQjtBQUNkZ0MsbUJBRGM7QUFFZHBkLGdCQUZjO0FBR2Rxc0IsZ0JBQU07QUFIUSxTQVBUO0FBWVBoUixnQkFBUTtBQUNOK0IsbUJBQVM7QUFESCxTQVpEO0FBZVA5Qix5QkFBaUI7QUFDZjhCLG1CQUFTO0FBRE0sU0FmVjtBQWtCUDdCLHFCQUFhO0FBQ1g2QixtQkFBUztBQURFLFNBbEJOO0FBcUJQNUIsb0JBQVk7QUFDVjRCLG1CQUFTO0FBREMsU0FyQkw7QUF3QlAzQix3QkFBZ0I7QUFDZDJCLG1CQUFTO0FBREssU0F4QlQ7QUEyQlAxQixpQkFBUztBQUNQMEIsbUJBQVM7QUFERixTQTNCRjtBQThCUHpCLGtCQUFVO0FBQ1J5QixtQkFBUztBQURELFNBOUJIO0FBaUNQeEIsdUJBQWU7QUFDYndCLG1CQUFTO0FBREksU0FqQ1I7QUFvQ1AyQixxQkFBYTtBQUNYM0IsbUJBQVM7QUFERSxTQXBDTjtBQXVDUHZCLHFCQUFhO0FBQ1h1QixtQkFEVztBQUVYRCxrQkFBUTtBQUZHLFNBdkNOO0FBMkNQckIsdUJBQWU7QUFDYnNCLG1CQURhO0FBRWJELGtCQUZhO0FBR2JtUCwyQkFBaUI7QUFISixTQTNDUjtBQWdEUHZRLG1CQUFXO0FBQ1RxQixtQkFEUztBQUVURCxrQkFBUTtBQUZDLFNBaERKO0FBb0RQbkIsa0JBQVU7QUFDUm9CLG1CQURRO0FBRVJELGtCQUFRO0FBRkEsU0FwREg7QUF3RFBsQix1QkFBZTtBQUNibUIsbUJBQVM7QUFESSxTQXhEUjtBQTJEUGxCLHlCQUFpQjtBQUNma0IsbUJBQVM7QUFETSxTQTNEVjtBQThEUFEsb0JBQVk7QUFDVlIsbUJBQVM7QUFEQyxTQTlETDtBQWlFUFMscUJBQWE7QUFDWFQsbUJBQVM7QUFERSxTQWpFTjtBQW9FUFUsa0JBQVU7QUFDUlYsbUJBQVM7QUFERCxTQXBFSDtBQXVFUFksb0JBQVk7QUFDVlosbUJBQVM7QUFEQyxTQXZFTDtBQTBFUGEsd0JBQWdCO0FBQ2RiLG1CQURjO0FBRWRwZCxnQkFGYztBQUdkcXNCLGdCQUFNWCxhQUFhRztBQUhMLFNBMUVUO0FBK0VQMU4sMEJBQWtCO0FBQ2hCZixtQkFEZ0I7QUFFaEJwZCxnQkFGZ0I7QUFHaEJxc0IsZ0JBQU1YLGFBQWFFO0FBSEgsU0EvRVg7QUFvRlB4TixxQkFBYTtBQUNYaEIsbUJBRFc7QUFFWHBkLGdCQUZXO0FBR1hxc0IsZ0JBQU1YLGFBQWFDO0FBSFIsU0FwRk47QUF5RlByTiwyQkFBbUI7QUFDakJsQixtQkFEaUI7QUFFakJwZCxnQkFGaUI7QUFHakJxc0IsZ0JBQU07QUFIVyxTQXpGWjtBQThGUDlOLHdCQUFnQjtBQUNkbkIsbUJBRGM7QUFFZHBkLGdCQUZjO0FBR2Rxc0IsZ0JBQU07QUFIUSxTQTlGVDtBQW1HUDdOLHNCQUFjO0FBQ1pwQixtQkFEWTtBQUVacGQsZ0JBRlk7QUFHWnFzQixnQkFBTTtBQUhNLFNBbkdQO0FBd0dQNU4scUJBQWE7QUFDWHJCLG1CQURXO0FBRVhwZCxnQkFGVztBQUdYcXNCLGdCQUFNO0FBSEssU0F4R047QUE2R1AzTix1QkFBZTtBQUNidEIsbUJBRGE7QUFFYnBkLGdCQUZhO0FBR2Jxc0IsZ0JBQU07QUFITztBQTdHUjtBQTVCSixLQUFQO0FBZ0pEOzs7Ozs7Ozs7Ozs7QUN2SkQ7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCRSxhOzs7QUFFbkIsdURBQTJDO0FBQUE7O0FBQUEsbURBQ3pDLDhDQUR5QyxLQUN6QyxDQUR5Qzs7QUFHekNwZ0IsNkJBQ08sWUFBSztBQUNSLDRCQUFtQixZQUFLO0FBQ3RCO0FBQ0E7QUFGRjtBQUlBO0FBTkpBO0FBSHlDO0FBVzFDOzs7OztvQkFia0JvZ0IsVTs7Ozs7Ozs7Ozs7O0FDSHJCOzs7Ozs7OztNQUVxQkMsWTtBQUVuQix5Q0FBNkU7QUFBQTs7QUFBQSxVQUEvQ0MsV0FBK0Msb0VBQXRDO0FBQUEsZUFBTXp6QixFQUFOO0FBQXNDO0FBQUEsVUFBdkIwekIsV0FBdUIsb0VBQWQ7QUFBQSxlQUFLMXpCLEVBQUw7QUFBYzs7QUFBQTs7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBYSxxQkFBcUIsS0FBbEMsR0FBYSxDQUFiOztBQUVBLG1CQUFhO0FBQ1h3d0IsZUFBTyxrQkFBTTtBQUNYenBCO0FBQ0EsY0FBSTRzQixLQUFLLGFBQUU1c0IsRUFBWCxNQUFTLENBQVQ7QUFDQSxpQkFBTTRzQixTQUFTQSxVQUFRQyxVQUFqQkQsQ0FBaUJDLENBQWpCRCxJQUFpQyxDQUFDQSxZQUF4QyxNQUF3Q0EsQ0FBeEMsRUFBNkQ7QUFDM0RBLGlCQUFLLGFBQUVBLE1BQVBBLFVBQUssQ0FBTEE7QUFDRDtBQUNELGNBQUdBLFlBQUgsTUFBR0EsQ0FBSCxFQUF3QjtBQUN0QixnQkFBSUUsTUFBTSxhQUFFOXNCLEVBQVosTUFBVSxDQUFWO0FBQ0EsbUJBQU04c0IsVUFBVUEsV0FBU0YsR0FBbkJFLENBQW1CRixDQUFuQkUsSUFBNEIsQ0FBQ0EsYUFBbkMsS0FBbUNBLENBQW5DLEVBQXdEO0FBQ3REQSxvQkFBTSxhQUFFQSxPQUFSQSxVQUFNLENBQU5BO0FBQ0Q7QUFDRCxnQkFBR0EsYUFBSCxLQUFHQSxDQUFILEVBQXdCO0FBQ3RCLGtCQUFNQyxPQUFPLFVBQVNILFFBQXRCLFNBQXNCQSxDQUFULENBQWI7QUFDQSxrQkFBR0UsYUFBSCxPQUFHQSxDQUFILEVBQTBCO0FBQ3hCQyxpQ0FBaUIsQ0FBQ0EsS0FBbEJBO0FBQ0Esb0JBQUdBLEtBQUgsV0FBbUI7QUFDakJIO0FBQ0FBO0FBRkYsdUJBSUs7QUFDSEE7QUFDQUEsNEJBQVUsQ0FBQywrQ0FBOEMsQ0FBL0MsRUFBK0MsQ0FBL0MsRUFBVkEsQ0FBVSxDQUFWQTtBQUNEO0FBVEgscUJBV0s7QUFDSCxvQkFBRyxNQUFILFlBQW9CO0FBQ2xCLG1DQUFnQkcsS0FBaEI7QUFDRDtBQUNGO0FBQ0Y7QUFDRjtBQUNGO0FBaENVLE9BQWI7O0FBbUNBRiw0QkFBc0IsV0FBdEJBO0FBQ0E7QUFDRDs7d0JBRUQ5b0IsTyxzQkFBVTtBQUNSLGFBQU8sU0FBUDs7O3dCQUdGckYsTyxzQkFBVTtBQUNSLGtDQUE0QixXQUE1QjtBQUNBOzs7d0JBR0ZvVyxNLHFCQUFTO0FBQ1AsMEJBQW9CLGlCQUFpQixLQUFyQyxLQUFvQixDQUFwQjs7O3dCQUdGbkksTyxvQkFBUTdSLEMsRUFBcUI7QUFBQSxVQUFsQmt5QixRQUFrQixvRUFBWixLQUFLQSxLQUFPOztBQUMzQiwyQkFBaUJBLFNBQWpCLG9IQUErQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBdkJELE9BQXVCOztBQUM3Qmp5QjtBQUNBLHdCQUFnQml5QixLQUFoQjtBQUNEOzs7d0JBR0hFLE0scUJBQVM7QUFDUCxtQkFBYTtBQUFBLGVBQU1weUIsY0FBTjtBQUFiO0FBQ0E7Ozt3QkFHRnF5QixRLHVCQUFXO0FBQ1QsbUJBQWE7QUFBQSxlQUFNcnlCLGNBQU47QUFBYjtBQUNBOzs7d0JBR0ZzeUIsVSx1QkFBV0osSSxFQUFNO0FBQ2YsYUFBTyx1QkFDTEEsZ0JBQWUsa0NBQWtDQSxnQ0FBbEMsTUFBZkEsNkNBREssMERBRXFCQSxLQUZyQixzQkFFK0NBLEtBRi9DLHFCQUdMQSxzQkFBb0IsaUJBQWlCQSxLQUhoQyxRQUdlLENBSGYsT0FBUCxFQUFPLENBQVA7Ozt3QkFPRkssVyx3QkFBWUosSyxFQUFPO0FBQ2pCLFVBQUl4eEIsTUFBTSxDQUFWLHlCQUFVLENBQVY7QUFDQSxVQUFHd3hCLFNBQVNBLE1BQVosUUFBMEI7QUFDeEJ4eEIsc0NBQThCd3hCLFNBQTlCeHhCO0FBQ0EsNEpBQXVCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUFmdXhCLE9BQWU7O0FBQ3JCdnhCLG1CQUFTLCtCQUN1QnV4QixLQUR2QixVQUVMLGdCQUZLLElBRUwsQ0FGSyxnQkFBVHZ4QixFQUFTLENBQVRBO0FBSUQ7QUFDREE7QUFDRDtBQUNEQTtBQUNBLGFBQU9BLFNBQVAsRUFBT0EsQ0FBUDs7O3dCQUdGNnhCLFEscUJBQVNDLEssRUFBd0I7QUFBQSxVQUFqQmpxQixNQUFpQixvRUFBYixFQUFhO0FBQUEsVUFBVGtxQixRQUFTLG9FQUFILENBQUc7O0FBQy9CLFVBQUlQLFFBQUo7QUFDQSxVQUFHTSxTQUFTQSxNQUFaLFFBQTBCO0FBQ3hCTjtBQUNBLDRKQUF1QjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsY0FBZjdHLE9BQWU7O0FBQ3JCLGNBQU0zWSxLQUFLbkssSUFBWDtBQUNBQTtBQUNBLGNBQU0wcEIsT0FBTztBQUNYdmYsZ0JBRFc7QUFFWGdnQixtQkFBTyxjQUZJLElBRUosQ0FGSTtBQUdYRCxtQkFIVztBQUlYcEgsa0JBSlc7QUFLWHNILHVCQUxXO0FBTVhDLHNCQUFVLGNBQWMsY0FBZCxJQUFjLENBQWQsT0FBd0NILFFBQXhDO0FBTkMsV0FBYjtBQVFBUDtBQUNBM3BCO0FBQ0Q7QUFDRjtBQUNEOzs7Ozs7b0JBekhpQm9wQixTOzs7Ozs7Ozs7Ozs7QUNGckI7Ozs7Ozs7O01BRXFCa0IsVzs7Ozs7YUFrQmJDLG9CLG1DQUF1QjtBQUM3QixVQUFNbGxCLFVBQVVPLHVCQUFoQixLQUFnQkEsQ0FBaEI7QUFDQVA7QUFDQUE7QUFDQUE7QUFDQUE7QUFDQUE7QUFDQUE7QUFDQUE7QUFDQUE7QUFDQUE7QUFDQUE7O0FBRUEsVUFBSSxDQUFDaWxCLFNBQUwsT0FBcUI7QUFDcEJqbEIsNEJBQW9CeFMsK0JBQStCLHVQQUEvQkEsSUFBK0IsQ0FBL0JBLEdBR0wsZ1BBSGZ3UyxJQUdlLENBSGZBO0FBT0E7QUFDRDs7O2FBR01tbEIsa0IsK0JBQW1CQyxVLEVBQVk7QUFDckMsVUFBSWxjLGNBQUo7QUFBQSxVQUFZcEUsVUFBWjtBQUFBLFVBQWdCOUUsZUFBaEI7QUFDQW9sQixtQkFBYUEsY0FBYkE7O0FBRUFsYyxlQUFTa2MscUJBQXFCLGFBQUU3a0IsU0FBaEMySSxJQUE4QixDQUE5QkE7QUFDQXBFLFdBQUtzZ0IsaUJBQUx0Z0I7O0FBRUE5RSxnQkFBVWlsQixTQUFWamxCLG9CQUFVaWxCLEVBQVZqbEI7QUFDQTs7QUFFQWtKOzs7Ozs7QUFyRG1CK2IsV0FFYkksTUFGYUosR0FFSixDQUFDLENBQUV6M0IsT0FBTzgzQix3QkFGTkw7O0FBQUFBLFdBSWJNLEtBSmFOLEdBSUosWUFBVztBQUMxQixRQUFJO0FBQ0gsVUFBTUksU0FBUzlrQix1QkFBZixRQUFlQSxDQUFmO0FBQ0EsYUFBTyxDQUFDLEVBQUcvUyxpQ0FBaUM2M0IsOEJBQThCQSxrQkFBMUUsb0JBQTBFQSxDQUEvRDczQixDQUFILENBQVI7QUFGRCxNQUlBLFVBQVU7QUFDVDtBQUNBO0FBUGEsR0FBQyxFQUpJeTNCOztBQUFBQSxXQWNiTyxPQWRhUCxHQWNILENBQUMsQ0FBRXozQixPQUFPaTRCLE1BZFBSO0FBQUFBLFdBZ0JiUyxPQWhCYVQsR0FnQkh6M0IsZUFBZUEsT0FBZkEsY0FBb0NBLE9BQXBDQSxZQUF1REEsT0FBT200QixJQWhCM0RWO29CQUFBQSxROzs7Ozs7Ozs7Ozs7QUNGckI7Ozs7Ozs7O01BRXFCVyxvQjtBQUtuQixnREFBcUQ7QUFBQSxVQUF4QkMsV0FBd0Isb0VBQWZ0bEIsU0FBUzhXLElBQU07O0FBQUE7O0FBQ25EO0FBQ0EsaUJBQVd5TyxVQUFYO0FBQ0EsaUJBQVdBLFVBQVg7QUFDQSxxQkFBZTlsQixXQUFXc0MsSUFBMUI7QUFDQTtBQUNBLDhCQUF3QixLQUF4QiwwQkFBd0IsRUFBeEI7QUFDQSxpQ0FBMkIsS0FBM0IsNkJBQTJCLEVBQTNCO0FBQ0E7QUFDQTtBQUNBLFVBQU15akIsUUFBUSxDQUNFO0FBQ0V4SSxjQURGO0FBRUV5SSxpQkFBUyxNQUFJSixrQkFBa0JLO0FBRmpDLE9BREYsRUFLRTtBQUNFMUksY0FERjtBQUVFeUksaUJBQVMsTUFBSUosa0JBQWtCTTtBQUZqQyxPQUxGLENBQWQ7QUFVQSxVQUFJOWxCLFFBQVEsQ0FBWix5QkFBWSxDQUFaO0FBQ0EsV0FBSyxJQUFJN1AsSUFBVCxHQUFnQkEsSUFBSSxxQkFBcEIsUUFBaUQsRUFBakQsR0FBc0Q7QUFDcEQsWUFBSTQxQixLQUFLLHFCQUFULENBQVMsQ0FBVDtBQUNBLGFBQUssSUFBSTMxQixJQUFULEdBQWdCQSxJQUFJMjFCLFlBQXBCLFFBQXdDLEVBQXhDLEdBQTZDO0FBQzNDLGNBQUk3MUIsSUFBSTYxQixZQUFSLENBQVFBLENBQVI7QUFBQSxjQUF3QkMsZUFBeEI7QUFDQSxzSkFBdUI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLGdCQUFmQyxPQUFlOztBQUNyQixnQkFBSSxDQUFDLzFCLHVCQUF1QisxQixLQUE1QixJQUFLLzFCLENBQUwsRUFBd0M7QUFDdEM4MUIsd0JBQVUsQ0FBQ0EsV0FBVzkxQixFQUFaLGlCQUErQixXQUFXKzFCLEtBQVgsTUFBL0IsR0FBK0IsQ0FBL0IsRUFBMkRBLEtBQXJFRCxPQUFVLENBQVZBO0FBQ0Q7QUFDRjtBQUNELHVCQUFZO0FBQ1ZobUI7QUFDRDtBQUNGO0FBQ0Y7QUFDREE7QUFDQSxtQkFBRSxTQUFGLGFBQXdCLGFBQUVBLFdBQTFCLEVBQTBCQSxDQUFGLENBQXhCO0FBQ0Q7O2dDQUVEa21CLGEsMEJBQWMzMkIsQyxFQUFHUCxDLEVBQUc7QUFDbEIsVUFBTW0zQixXQUFXLGFBQUUsS0FBbkIsT0FBaUIsQ0FBakI7QUFDQSxVQUFNOXBCLFNBQVM4cEIsU0FBZixNQUFlQSxFQUFmO0FBQ0EsYUFBTztBQUNMNTJCLFdBQUc4TSxjQUFZOHBCLG1CQURWO0FBRUxuM0IsV0FBR3FOLGFBQVc4cEIscUJBQW1CLElBQW5CQTtBQUZULE9BQVA7OztnQ0FNRkMsWSx5QkFBYXhtQixPLEVBQVMxSSxDLEVBQUc3RixDLEVBQUc4RixJLEVBQU1rdkIsYSxFQUFlO0FBQy9DLFVBQU1qc0IsUUFBTjtBQUNBLDRCQUFhLEtBQWIseUlBQW9DO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUE1QnJJLEtBQTRCOztBQUNsQ3FJLG9CQUFXbEQsRUFBWGtELEVBQVdsRCxDQUFYa0Q7QUFDRDtBQUNELDRCQUFhLEtBQWIsNElBQXVDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUEvQnJJLE1BQStCOztBQUNyQ3FJO0FBQ0Q7QUFDRCxXQUFJLElBQUosb0JBQTRCO0FBQzFCLFlBQUdpc0IsNkJBQUgsQ0FBR0EsQ0FBSCxFQUFvQztBQUNsQ2pzQixxQkFBV2lzQixjQUFYanNCLENBQVdpc0IsQ0FBWGpzQjtBQUNEO0FBQ0Y7QUFDREEsbUJBQWEsS0FBYkE7QUFDQUEsb0JBQWMvSSxFQUFkK0k7QUFDQUEsb0JBQWMvSSxFQUFkK0k7QUFDQSxVQUFNN0MsS0FBSyxvQkFBWCxLQUFXLENBQVg7QUFDQUEscUJBQWVMLEVBQWZLO0FBQ0E7OztnQ0FHRit1QixRLHFCQUFTMW1CLE8sRUFBUzJDLEksRUFBTTtBQUN0QjtBQUNBLFVBQU12QyxRQUFRLDBCQUFkLE9BQWMsQ0FBZDtBQUNBLHdCQUFrQixhQUFFLEtBQUYsY0FBbEIsUUFBa0IsQ0FBbEI7QUFDQSxtQkFBRSxLQUFGLHdCQUErQkEsdUJBQS9CLFFBQStCQSxDQUEvQjs7O2dDQUdGdW1CLFcsd0JBQVkzbUIsTyxFQUFTMkMsSSxFQUFNO0FBQ3pCO0FBQ0EsbUJBQUUsS0FBRix3QkFBK0IsYUFBL0IsR0FBK0IsRUFBL0I7OztnQ0FHRmlrQixZLHlCQUFhNW1CLE8sRUFBUztBQUNwQiw2QkFBdUI0bEIsa0JBQXZCOzs7Z0NBR0ZpQixZLHlCQUFhN21CLE8sRUFBUztBQUNwQixnQ0FBMEI0bEIsa0JBQTFCOzs7Z0NBR0ZrQixlLDRCQUFnQjltQixPLEVBQVM7QUFDdkIsNkJBQXVCNGxCLGtCQUF2Qjs7O2dDQUdGbUIsaUIsOEJBQWtCL21CLE8sRUFBUztBQUN6QixnQ0FBMEI0bEIsa0JBQTFCOzs7Z0NBR0ZvQixlLDRCQUFnQjdqQixHLEVBQUs7QUFDbkI7OztnQ0FHRjlMLE0scUJBQVM7QUFDUCw0QkFBZSxLQUFmLHdJQUFxQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBN0I4TCxNQUE2Qjs7QUFDbkNBLFlBQUksS0FBSkEsS0FBYyxLQUFkQTtBQUNEOzs7Z0NBR0g4akIsZ0IsNkJBQWlCeDFCLEMsRUFBRztBQUNsQixVQUFJNHlCLE9BQU8sU0FBWDtBQUFBLFVBQTBCN0csT0FBMUI7QUFDQSxtQkFBWTtBQUNWQTtBQUNBLGFBQUksSUFBSWp0QixJQUFSLEdBQWFBLElBQUU4ekIsZ0JBQWYsUUFBdUMsRUFBdkMsR0FBNEM7QUFDMUMsY0FBTTZDLFFBQVE3QyxnQkFBZCxDQUFjQSxDQUFkO0FBQ0EsY0FBRzZDLGlCQUFpQixTQUFwQixTQUFzQztBQUNwQyxnQkFBTWxXLEtBQUssYUFBWCxLQUFXLENBQVg7QUFBQSxnQkFBcUJ2VSxTQUFTdVUsR0FBOUIsTUFBOEJBLEVBQTlCO0FBQUEsZ0JBQTJDM2EsU0FBUzJhLEdBQXBELE1BQW9EQSxFQUFwRDtBQUFBLGdCQUFpRTFYLFFBQVEwWCxHQUF6RSxLQUF5RUEsRUFBekU7QUFDQSxnQkFBR3ZmLE1BQUlnTCxPQUFKaEwsUUFBbUJBLE1BQUlnTCxjQUF2QmhMLFNBQTRDQSxNQUFJZ0wsT0FBaERoTCxPQUE4REEsTUFBSWdMLGFBQXJFLFFBQXdGO0FBQ3RGNG5CO0FBQ0E3RztBQUNBO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7QUFDRDs7O2dDQUdGMkosVSx1QkFBVzExQixDLEVBQUc7QUFDWixVQUFNMjFCLE9BQU8sWUFBYixNQUFhLEVBQWI7QUFDQSx5QkFBbUIsRUFBQ3ZxQixNQUFNLE1BQUlyUCxPQUFKLGFBQXNCaUUsRUFBN0IsR0FBa0NpcUIsS0FBSyxNQUFJbHVCLE9BQUosY0FBdUJpRSxFQUFqRixDQUFtQixFQUFuQjtBQUNBLFVBQUl1TyxVQUFVLDBCQUEwQnZPLEVBQTFCLEdBQStCQSxFQUE3QyxDQUFjLENBQWQ7QUFDQSxVQUFHLENBQUgsU0FBYTtBQUFFO0FBQ2J1TyxrQkFBVSwwQkFBMEJ2TyxFQUExQixHQUErQkEsRUFBekN1TyxDQUFVLENBQVZBO0FBQ0Q7QUFDRDtBQUNBLGFBQU9BLG9CQUFrQixzQkFBekIsQ0FBeUIsQ0FBekI7OztnQ0FHRnFmLFEscUJBQVMvbkIsQyxFQUFHZ0wsRyxFQUFLM1MsQyxFQUFHUCxDLEVBQUc7QUFDckIsVUFBTXFDLElBQUksc0JBQVYsQ0FBVSxDQUFWO0FBQUEsVUFDTXVPLFVBQVVzQyxRQUFNLEtBQU5BLE1BQWdCLGdCQUFoQkEsQ0FBZ0IsQ0FBaEJBLEdBRGhCO0FBRUEsVUFBSStrQixVQUFVcm5CLFlBQWQ7QUFBQSxVQUFxQzNJLFNBQXJDOztBQUVBLGNBQU9DLEVBQVA7QUFDRTtBQUFrQjtBQUNoQixnQkFBRyxLQUFILFlBQW9CO0FBQ2xCLHFDQUF1QixLQUF2QjtBQUNBRDtBQUNEO0FBQ0Q7QUFDQSxnQkFBRyxLQUFILFlBQW9CO0FBQ2xCLG1DQUFxQixLQUFyQjtBQUNBQTtBQUNEO0FBQ0Q7QUFDRDtBQUNEO0FBQWdCO0FBQ2QsZ0JBQUcsS0FBSCxZQUFvQjtBQUNsQixxQ0FBdUIsS0FBdkI7QUFDQUE7QUFDRDtBQUNELDZCQUFpQkMsRUFBakI7QUFDQTtBQUNEO0FBQ0Q7QUFBYztBQUNaK3ZCLHNCQUFVcm5CLFdBQVcsb0JBQVhBLFdBQTBDMUksZ0JBQWdCLEtBQXBFK3ZCO0FBQ0E7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQWtCO0FBQ2hCLGdCQUFJQyxTQUFKO0FBQ0EsZ0JBQUcsK0JBQStCLEtBQWxDLFlBQW1EO0FBQ2pELGdDQUFrQixLQUFsQiw4QkFBcUQsRUFBQ0MsZUFBZXZuQixvQkFBckUsSUFBcUQsRUFBckQ7QUFDQSxnQ0FBa0IsS0FBbEI7QUFDQXNuQix1QkFBUyxLQUFUQTtBQUNBO0FBQ0Fqd0I7QUFDRDtBQUNELGdCQUFHLENBQUMsS0FBRCxjQUFILFNBQWdDO0FBQzlCLDREQUE4QyxFQUFDa3dCLGVBQS9DLE1BQThDLEVBQTlDO0FBQ0E7QUFDQTtBQUNBbHdCO0FBQ0Q7QUFDRGd3QixzQkFBVXJuQixXQUFXMUksV0FBckIrdkI7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUFpQjtBQUNmLGdCQUFHLEtBQUgsWUFBb0I7QUFDbEIsZ0NBQWtCLEtBQWxCLDhCQUFxRCxFQUFDRSxlQUFlandCLEVBQXJFLGFBQXFELEVBQXJEO0FBQ0EsZ0NBQWtCLEtBQWxCO0FBQ0E7QUFDQUQ7QUFDRDtBQUNEZ3dCO0FBQ0E7QUFDRDtBQXhESDtBQTBEQSxtQkFBWTtBQUNWLHlDQUFpQy92QixFQUFqQztBQUNEO0FBQ0Qsa0JBQVc7QUFDVDtBQUNEOzs7Z0NBR0hrd0IsNkIsNENBQWdDO0FBQzlCLGFBQU8sd0RBQVAsU0FBTyxDQUFQOzs7Z0NBVUZDLDBCLHlDQUE2QjtBQUMzQixhQUFPLGlRQUFQLE9BQU8sQ0FBUDs7Ozs7O0FBNEJKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBN1BxQjdCLG9CQUVaSyxLQUZZTCxHQUVKLGlCQUZJQTtBQUFBQSxvQkFHWk0sTUFIWU4sR0FHSCxrQkFIR0E7b0JBQUFBLGlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUNGQThCLFlBRW5CLG9DQUE2QjtBQUFBOztBQUMzQixRQUFNQyxPQUFOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQU1DLE9BQU47QUFDQSxRQUFNQyxVQUFOO0FBQ0EsUUFBTUMsWUFBTjtBQUNBLFFBQU1DLFNBQU47O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFZO0FBQ0VELGlCQURGO0FBRUVDLGNBRkY7QUFHRUgsWUFIRjtBQUlFQyxlQUFTQTtBQUpYLEtBQVo7O0FBT0E7Ozs7Ozs7Ozs7Ozs7O0FBY0Esa0NBQThCO0FBQzFCNWUsZ0JBQVVBLFdBQVZBO0FBQ0EsYUFBTywyQkFDRyxnQkFBZ0I7QUFDbEIsZUFBTytlLGdCQUFnQi9lLFFBQWhCK2UsUUFBUCxJQUFPQSxDQUFQO0FBRkQscUVBT0csaUJBQWlCO0FBQ25CLGVBQU9DLHNCQUNIaGYsaUJBQWlCMmUsV0FEZEssSUFDY0wsQ0FEZEssRUFFSGhmLGtCQUFrQjJlLFlBRnRCLElBRXNCQSxDQUZmSyxDQUFQO0FBUlIsT0FBTyxDQUFQOztBQWNBLG1DQUE2QjtBQUN6QixZQUFJaGYsUUFBSixTQUFxQmlmLDhCQUE4QmpmLFFBQTlCaWY7O0FBRXJCLFlBQUlqZixRQUFKLE9BQW1CaWYsb0JBQW9CamYsZ0JBQXBCaWY7QUFDbkIsWUFBSWpmLFFBQUosUUFBb0JpZixxQkFBcUJqZixpQkFBckJpZjs7QUFFcEIsWUFBSWpmLFFBQUosT0FDSSx3QkFBd0JBLFFBQXhCLGVBQStDLG9CQUFvQjtBQUMvRGlmLGtDQUF3QmpmLGNBQXhCaWYsUUFBd0JqZixDQUF4QmlmO0FBREo7O0FBSUo7QUFDSDtBQUNKOztBQUVEOzs7OztBQUtBLHdDQUFvQztBQUNoQyxhQUFPLFdBQVdqZixXQUFYLFNBQ0csa0JBQWtCO0FBQ3BCLGVBQU9vYywyQ0FHSHVDLFdBSEd2QyxJQUdIdUMsQ0FIR3ZDLEVBSUh1QyxZQUpHdkMsSUFJSHVDLENBSkd2QyxFQUFQO0FBRlIsT0FBTyxDQUFQO0FBU0g7O0FBRUQ7Ozs7O0FBS0Esa0NBQThCO0FBQzFCLGFBQU8sV0FBV3BjLFdBQVgsU0FDRyxrQkFBa0I7QUFDcEIsZUFBT29jLE9BQVAsU0FBT0EsRUFBUDtBQUZSLE9BQU8sQ0FBUDtBQUlIOztBQUVEOzs7OztBQUtBLG1DQUErQjtBQUMzQnBjLGdCQUFVQSxXQUFWQTtBQUNBLGFBQU8seUJBQ0csa0JBQWtCO0FBQ3BCLGVBQU9vYywrQkFBK0JwYyxtQkFBdEMsR0FBT29jLENBQVA7QUFGUixPQUFPLENBQVA7QUFJSDs7QUFFRDs7Ozs7QUFLQSxtQ0FBK0I7QUFDM0IsYUFBTzhDLFdBQVdsZixXQUFYa2YsU0FDR1AsS0FEVixZQUFPTyxDQUFQO0FBRUg7O0FBRUQsb0NBQWdDO0FBQzVCLGFBQU8sNkJBQ0dQLEtBREgsZ0JBRUdBLFdBRkgsR0FFR0EsQ0FGSCxPQUdHLGlCQUFpQjtBQUNuQixZQUFNdkMsU0FBUytDLFVBQWYsT0FBZUEsQ0FBZjtBQUNBL0M7QUFDQTtBQU5SLE9BQU8sQ0FBUDs7QUFTQSxrQ0FBNEI7QUFDeEIsWUFBTUEsU0FBU3NDLDRCQUFmLFFBQWVBLENBQWY7QUFDQXRDLHVCQUFlcGMsaUJBQWlCMmUsV0FBaEN2QyxPQUFnQ3VDLENBQWhDdkM7QUFDQUEsd0JBQWdCcGMsa0JBQWtCMmUsWUFBbEN2QyxPQUFrQ3VDLENBQWxDdkM7O0FBRUEsWUFBSXBjLFFBQUosU0FBcUI7QUFDakIsY0FBTTFTLE1BQU04dUIsa0JBQVosSUFBWUEsQ0FBWjtBQUNBOXVCLDBCQUFnQjBTLFFBQWhCMVM7QUFDQUEsNkJBQW1COHVCLE9BQW5COXVCLE9BQWlDOHVCLE9BQWpDOXVCO0FBQ0g7O0FBRUQ7QUFDSDtBQUNKOztBQUVELDJDQUF1QztBQUNuQyxVQUFJLG1CQUFtQixDQUFDOHhCLE9BQXhCLElBQXdCQSxDQUF4QixFQUFzQyxPQUFPM2tCLFFBQVAsT0FBT0EsRUFBUDs7QUFFdEMsYUFBTyw4Q0FFRyxpQkFBaUI7QUFDbkIsZUFBTzRrQiwyQkFBUCxNQUFPQSxDQUFQO0FBSEQsY0FLRyxpQkFBaUI7QUFDbkIsZUFBT0MsbUJBQVAsS0FBT0EsQ0FBUDtBQU5SLE9BQU8sQ0FBUDs7QUFTQSxrQ0FBNEI7QUFDeEIsWUFBSVgsY0FBSixJQUFJQSxDQUFKLEVBQXlCLE9BQU9BLGVBQWV2RCxLQUF0QixTQUFzQkEsRUFBZnVELENBQVA7QUFDekIsZUFBT3ZELGVBQVAsS0FBT0EsQ0FBUDtBQUNIOztBQUVELHNEQUFnRDtBQUM1QyxZQUFNVyxXQUFXd0QsU0FBakI7QUFDQSxZQUFJeEQsb0JBQUosR0FBMkIsT0FBT3RoQixnQkFBUCxLQUFPQSxDQUFQOztBQUUzQixlQUFPLDRCQUE0QmtrQixhQUE1QixRQUE0QkEsQ0FBNUIsZUFDRyxZQUFZO0FBQ2Q7QUFGUixTQUFPLENBQVA7O0FBS0EsZ0VBQXdEO0FBQ3BELGNBQUkzMEIsT0FBT3lRLFFBQVgsT0FBV0EsRUFBWDtBQUNBc2hCLDJCQUFpQixpQkFBaUI7QUFDOUIveEIsbUJBQU8sVUFDRyxZQUFZO0FBQ2QscUJBQU8rMEIsaUJBQVAsTUFBT0EsQ0FBUDtBQUZELG9CQUlHLHNCQUFzQjtBQUN4Qiw4QkFBZ0I5ZTtBQUx4QmpXLGFBQU8sQ0FBUEE7QUFESit4QjtBQVNBO0FBQ0g7QUFDSjs7QUFFRCw2Q0FBdUM7QUFDbkMsWUFBSSxDQUFDNEMsZUFBTCxLQUFLQSxDQUFMLEVBQTRCOztBQUU1QixlQUFPLG1HQUtHLFlBQVk7QUFDZDtBQU5SLFNBQU8sQ0FBUDs7QUFTQSw4QkFBc0I7QUFDbEJhLG9CQUFVZCw2QkFBVmMsUUFBVWQsQ0FBVmMsRUFBa0RQLE1BQWxETzs7QUFFQSw2Q0FBbUM7QUFDL0IsZ0JBQUlDLE9BQUosU0FBb0JyWixpQkFBaUJxWixPQUFyQyxPQUFvQnJaLENBQXBCLEtBQ0tzWjs7QUFFTCxvREFBd0M7QUFDcENmLDJDQUE2QixnQkFBZ0I7QUFDekN2WSx5Q0FFSXFaLHdCQUZKclosSUFFSXFaLENBRkpyWixFQUdJcVosMkJBSEpyWixJQUdJcVosQ0FISnJaO0FBREp1WTtBQU9IO0FBQ0o7QUFDSjs7QUFFRCx1Q0FBK0I7QUFDM0Isd0NBQThCLG1CQUFtQjtBQUM3Q2dCO0FBREo7O0FBSUEsK0NBQXFDO0FBQ2pDLGdCQUFNeG9CLFFBQVF1bkIsdUNBQWQsT0FBY0EsQ0FBZDtBQUNBLGdCQUFNelEsVUFBVTlXLHVCQUFoQixTQUFnQkEsQ0FBaEI7O0FBRUEsZ0JBQUk4VyxrQkFBa0JBLFlBQXRCLFFBQTBDOztBQUUxQyxnQkFBTTJSLFlBQVlqQixLQUFsQixHQUFrQkEsRUFBbEI7QUFDQU0sOEJBQWtCQSx3QkFBbEJBO0FBQ0EsZ0JBQU1ZLGVBQWVuQiw0QkFBckIsT0FBcUJBLENBQXJCO0FBQ0FtQixxQ0FBeUJDLDZDQUF6QkQsS0FBeUJDLENBQXpCRDtBQUNBWjs7QUFFQSx5RUFBNkQ7QUFDekQsa0JBQU1jLFdBQVcsd0JBQWpCO0FBQ0Esa0JBQU01QyxVQUFVaG1CLGdCQUFnQjZvQixjQUFoQjdvQixLQUFnQjZvQixDQUFoQjdvQixHQUF1QzhvQixvQkFBdkQsS0FBdURBLENBQXZEO0FBQ0EscUJBQU92Qiw2QkFBNkJxQiwyQkFBcEMsR0FBT3JCLENBQVA7O0FBRUEsNENBQThCO0FBQzFCLG9CQUFNelEsVUFBVTlXLHVCQUFoQixTQUFnQkEsQ0FBaEI7QUFDQSx1QkFBT0EseUNBQVA7QUFDSDs7QUFFRCxrREFBb0M7O0FBRWhDLHVCQUFPd25CLHFEQUFQOztBQUlBLDhDQUE4QjtBQUMxQix5QkFBT2psQixjQUNIdkMsdUJBREd1QyxJQUNIdkMsQ0FER3VDLElBRUZ2QyxrREFGTCxFQUFPdUMsQ0FBUDtBQUdIO0FBQ0o7QUFDSjtBQUNKO0FBQ0o7O0FBRUQsaUNBQXlCO0FBQ3JCLGNBQUlpbEIsZ0JBQUosUUFBSUEsQ0FBSixFQUErQk0sa0JBQWtCTSxTQUFsQk47QUFDL0IsY0FBSU4sYUFBSixRQUFJQSxDQUFKLEVBQTRCTSw0QkFBNEJNLFNBQTVCTjtBQUMvQjs7QUFFRCwwQkFBa0I7QUFDZCxjQUFJLENBQUNOLFdBQUwsS0FBS0EsQ0FBTCxFQUF3QjtBQUN4Qk07O0FBRUEsY0FBSSxDQUFDTixlQUFMLEtBQUtBLENBQUwsRUFBNEI7QUFDNUIsc0NBQTRCLHFCQUFxQjtBQUM3QyxnQkFBTTFqQixRQUFRZ2tCLG1CQUFkLFNBQWNBLENBQWQ7QUFDQSxnQkFBSSxDQUFKLE9BQVk7O0FBRVpBO0FBSko7QUFNSDtBQUNKO0FBQ0o7O0FBRUQsOEJBQTBCO0FBQ3RCLGFBQU8sNEJBQ0csbUJBQW1CO0FBQ3JCLFlBQU1pQixZQUFZeEIsNEJBQWxCLE9BQWtCQSxDQUFsQjtBQUNBdEQ7QUFDQThFLDhCQUFzQnhCLDZCQUF0QndCLE9BQXNCeEIsQ0FBdEJ3QjtBQUNBO0FBTFIsT0FBTyxDQUFQO0FBT0g7O0FBRUQsZ0NBQTRCO0FBQ3hCLGFBQU8sNEJBQ0csWUFBWTtBQUNkO0FBRlIsT0FBTyxDQUFQO0FBSUg7O0FBRUQsaURBQTZDO0FBQ3pDLGFBQU8sMkJBQ0csZ0JBQWdCO0FBQ2xCOUU7QUFDQSxlQUFPLElBQUlzRCxZQUFKLGtDQUFQLElBQU8sQ0FBUDtBQUhELGNBS0dDLEtBTEgsa0JBTUcsaUJBQWlCO0FBQ25CLGVBQU8sZ09BQVAsRUFBTyxDQUFQO0FBUFIsT0FBTyxDQUFQO0FBWUg7O0FBRUQsdUJBQW1CO0FBQ2YsYUFBTztBQUNId0IsZ0JBREc7QUFFSEMsd0JBRkc7QUFHSEMsa0JBSEc7QUFJSEMsbUJBSkc7QUFLSEMsbUJBTEc7QUFNSEMsc0JBTkc7QUFPSEMsb0JBUEc7QUFRSEMsc0JBUkc7QUFTSEMsYUFURztBQVVIcm5CLGVBVkc7QUFXSHNuQixpQkFYRztBQVlIQyxxQkFaRztBQWFIQyxtQkFiRztBQWNIendCLGVBZEc7QUFlSGpELGdCQWZHOztBQWlCSDJ6QixtQkFqQkc7QUFrQkhDLGtCQWxCRztBQW1CSEMsb0JBbkJHO0FBb0JIQyxpQkFwQkc7QUFxQkhDLGVBckJHO0FBc0JIQyxtQkF0Qkc7QUF1QkhDO0FBdkJHLE9BQVA7O0FBMEJBLHVCQUFpQjtBQUNiOzs7O0FBSUEsWUFBTUMsT0FBTjtBQUNBLFlBQU1DLE9BQU47O0FBRUEsZUFBTztBQUNILGtCQURHO0FBRUgsbUJBRkc7QUFHSCxpQkFIRztBQUlILGlCQUpHO0FBS0gsaUJBTEc7QUFNSCxpQkFORztBQU9ILGtCQVBHO0FBUUgsaUJBUkc7QUFTSCxrQkFURztBQVVILGlCQUFPO0FBVkosU0FBUDtBQVlIOztBQUVELG1DQUE2QjtBQUN6QixZQUFNQyxRQUFRLHVCQUFkLEdBQWMsQ0FBZDtBQUNBLG1CQUFXLE9BQU9BLE1BQWxCLENBQWtCQSxDQUFQLENBQVgsS0FDSztBQUNSOztBQUVELDZCQUF1QjtBQUNuQixZQUFNQyxZQUFZckIsb0JBQWxCLFdBQWtCQSxFQUFsQjtBQUNBLGVBQU9zQixzQkFBUDtBQUNIOztBQUVELDhCQUF3QjtBQUNwQixlQUFPeDFCLDJCQUEyQixDQUFsQztBQUNIOztBQUVELDhCQUF3QjtBQUNwQixlQUFPLFlBQVksbUJBQW1CO0FBQ2xDLGNBQU15MUIsZUFBZWpELGlCQUFpQnRDLDhCQUF0QyxDQUFzQ0EsQ0FBakJzQyxDQUFyQjtBQUNBLGNBQU0zaEIsU0FBUzRrQixhQUFmO0FBQ0EsY0FBTUMsY0FBYyxJQUFJbEQsWUFBSixXQUFwQixNQUFvQixDQUFwQjs7QUFFQSxlQUFLLElBQUlwM0IsSUFBVCxHQUFnQkEsSUFBaEI7QUFDSXM2Qiw2QkFBaUJELHdCQUFqQkMsQ0FBaUJELENBQWpCQztBQUVKcG5CLG1CQUFRLElBQUlra0IsWUFBSixLQUFxQixDQUFyQixXQUFxQixDQUFyQixFQUFvQztBQUN4Q3B3QixrQkFBTTtBQURrQyxXQUFwQyxDQUFSa007QUFSSixTQUFPLENBQVA7QUFZSDs7QUFFRCxvQ0FBOEI7QUFDMUIsWUFBSTRoQixPQUFKLFFBQ0ksT0FBTyxZQUFZLG1CQUFtQjtBQUNsQ0E7QUFESixTQUFPLENBQVA7O0FBSUosZUFBT3lGLE9BQVAsTUFBT0EsQ0FBUDtBQUNIOztBQUVELHdDQUFrQztBQUM5QixZQUFNeG9CLE1BQU1xbEIsNkJBQVosa0JBQVlBLEVBQVo7QUFDQSxZQUFNdnlCLE9BQU9rTixrQkFBYixNQUFhQSxDQUFiO0FBQ0FBO0FBQ0EsWUFBTTVULElBQUk0VCxrQkFBVixHQUFVQSxDQUFWO0FBQ0FBO0FBQ0FsTjtBQUNBMUc7QUFDQSxlQUFPQSxFQUFQO0FBQ0g7O0FBRUQscUJBQWU7QUFDWCxZQUFJaVQsUUFBSjs7QUFFQSxlQUFPLFlBQVk7QUFDZixpQkFBTywwQkFBUDs7QUFFQSxxQ0FBMkI7QUFDdkI7QUFDQSxtQkFBTyxDQUFDLFNBQVMsQ0FBQ2dtQiw0QkFBNEJBLHlCQUE1QkEsQ0FBNEJBLENBQTVCQSxJQUFELFlBQVYsRUFBVSxDQUFWLFFBQTZGLENBQXBHLENBQU8sQ0FBUDtBQUNIO0FBTkw7QUFRSDs7QUFFRCw4QkFBd0I7QUFDcEIsZUFBTyxZQUFZLDJCQUEyQjtBQUMxQyxjQUFNeHhCLFFBQVEsSUFBSXd4QixZQUFsQixLQUFjLEVBQWQ7QUFDQXh4Qix5QkFBZSxZQUFZO0FBQ3ZCc047QUFESnROO0FBR0FBO0FBQ0FBO0FBTkosU0FBTyxDQUFQO0FBUUg7O0FBRUQsaUNBQTJCO0FBQ3pCLFlBQUl0RixPQUFPODJCLGVBQVgsR0FBV0EsQ0FBWDtBQUNBLGtCQUFTO0FBQ1AsY0FBRzkyQixLQUFILFNBQWlCO0FBQ2YsbUJBQU9BLEtBQVA7QUFERixpQkFHSztBQUNILG1CQUFPLFlBQVksbUJBQVk7QUFDN0Isa0JBQUdBLEtBQUgsU0FBaUI7QUFDZjRTLHdCQUFRNVMsS0FBUjRTO0FBREYscUJBR0s7QUFDSDVTO0FBQ0Q7QUFOSCxhQUFPLENBQVA7QUFRRDtBQWJILGVBZUs7QUFDSEEsaUJBQU84MkIsb0JBQW9CLEVBQUMxWSxVQUE1QnBlLEVBQTJCLEVBQXBCODJCLENBQVA5MkI7O0FBRUEsY0FBTWs2QixVQUFOOztBQUVBLGlCQUFPLFlBQVksbUJBQW1CO0FBQ2xDLGdCQUFNQyxVQUFVLElBQUlyRCxZQUFwQixjQUFnQixFQUFoQjs7QUFFQXFEO0FBQ0FBO0FBQ0FBO0FBQ0FBO0FBQ0FBO0FBQ0FBOztBQUVBLDRCQUFnQjtBQUNaLGtCQUFJQSx1QkFBSixHQUE4Qjs7QUFFOUIsa0JBQUlBLG1CQUFKLEtBQTRCO0FBQ3hCQyxxQkFBSyxpREFBaURELFFBQXREQztBQUNBO0FBQ0g7O0FBRUQsa0JBQU1DLFVBQVUsSUFBSXZELFlBQXBCLFVBQWdCLEVBQWhCO0FBQ0F1RCxrQ0FBb0IsWUFBWTtBQUM1QnI2QiwrQkFBZXE2QiwwQkFBZnI2QixDQUFlcTZCLENBQWZyNkI7QUFDQSxxQ0FBbUJBLEtBQW5CLDBIQUFrQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsc0JBQTFCNFMsV0FBMEI7O0FBQ2hDQSwyQkFBUTVTLEtBQVI0UztBQUNEO0FBQ0Q1UztBQUNBNFMsd0JBQVE1UyxLQUFSNFM7QUFOSnluQjtBQVFBQSxvQ0FBc0JGLFFBQXRCRTtBQUNIOztBQUVELCtCQUFtQjtBQUNmRCxtQkFBSyxtRUFBTEE7QUFDSDs7QUFFRCxtQ0FBdUI7QUFDbkJsNUI7QUFDQTBSO0FBQ0g7QUFyQ0wsV0FBTyxDQUFQO0FBdUNEO0FBQ0Y7O0FBRUQsd0NBQWtDO0FBQzlCLGVBQU8sMENBQVAsRUFBTyxDQUFQO0FBQ0g7O0FBRUQsOEJBQXdCO0FBQ3BCLGVBQU8wbkIsMkNBQVAsTUFBT0EsQ0FBUDtBQUNIOztBQUVELHlCQUFtQjtBQUNmLGVBQU8sZUFBZTtBQUNsQixpQkFBTyxZQUFZLG1CQUFtQjtBQUNsQzduQix1QkFBVyxZQUFZO0FBQ25CRztBQURKSDtBQURKLFdBQU8sQ0FBUDtBQURKO0FBT0g7O0FBRUQsa0NBQTRCO0FBQ3hCLFlBQU04bkIsUUFBTjtBQUNBLFlBQU1wbEIsU0FBU3FsQixVQUFmO0FBQ0EsYUFBSyxJQUFJOTZCLElBQVQsR0FBZ0JBLElBQWhCO0FBQWlDNjZCLHFCQUFXQyxVQUFYRCxDQUFXQyxDQUFYRDtBQUNqQztBQUNIOztBQUVELG1DQUE2QjtBQUN6QixlQUFPLDBCQUEwQjtBQUFBLGlCQUFNNTRCLG9CQUFOO0FBQWpDLFNBQU8sQ0FBUDtBQUNIOztBQUVELDJCQUFxQjtBQUNqQixZQUFNODRCLGFBQWFDLFNBQW5CLG1CQUFtQkEsQ0FBbkI7QUFDQSxZQUFNQyxjQUFjRCxTQUFwQixvQkFBb0JBLENBQXBCO0FBQ0EsZUFBT2xILGdDQUFQO0FBQ0g7O0FBRUQsNEJBQXNCO0FBQ2xCLFlBQU1vSCxZQUFZRixTQUFsQixrQkFBa0JBLENBQWxCO0FBQ0EsWUFBTUcsZUFBZUgsU0FBckIscUJBQXFCQSxDQUFyQjtBQUNBLGVBQU9sSCxnQ0FBUDtBQUNIOztBQUVELHVDQUFpQztBQUM3QixZQUFNbmdCLFFBQVF5akIsb0RBQWQsYUFBY0EsQ0FBZDtBQUNBLGVBQU9nRSxXQUFXem5CLG9CQUFsQixFQUFrQkEsQ0FBWHluQixDQUFQO0FBQ0g7O0FBRUQsK0JBQXlCO0FBQ3ZCLGVBQU90SCxnQkFBZ0JzRCxZQUF2QjtBQUNEOztBQUVELDhCQUF3QjtBQUN0QixlQUFPdEQsZ0JBQWdCc0QsWUFBdkI7QUFDRDs7QUFFRCxnQ0FBMEI7QUFDeEIsZUFBT3RELGdCQUFnQnNELFlBQXZCO0FBQ0Q7O0FBRUQsNkJBQXVCO0FBQ3JCLGVBQU90RCxnQkFBZ0JzRCxZQUF2QjtBQUNEOztBQUVELDJCQUFxQjtBQUNuQixlQUFPdEQsZ0JBQWdCc0QsWUFBdkI7QUFDRDs7QUFFRCwrQkFBeUI7QUFDdkIsZUFBT3RELGdCQUFnQnNELFlBQXZCO0FBQ0Q7O0FBRUQsNkJBQXVCO0FBQ3JCLGVBQU90RCxnQkFBZ0JzRCxZQUF2QjtBQUNEO0FBQ0o7O0FBRUQsMEJBQXNCO0FBQ2xCLFVBQU1pRSxZQUFOOztBQUVBLGFBQU87QUFDSEMsbUJBREc7QUFFSEMsdUJBRkc7QUFHSEMsY0FBTTtBQUNGQyxvQkFERTtBQUVGQyxrQkFBUUE7QUFGTjtBQUhILE9BQVA7O0FBU0EscUNBQStCO0FBQzNCLGVBQU9kLDZCQUE2QixDQUFwQztBQUNIOztBQUVELGdDQUEwQjtBQUN0QixZQUFNZSxTQUFOO0FBQ0EsWUFBSXpCLGFBQUo7QUFDQSxlQUFPLENBQUNBLFFBQVFtQixlQUFULE1BQVNBLENBQVQsTUFBUCxNQUFrRDtBQUM5Q00sc0JBQVl6QixNQUFaeUIsQ0FBWXpCLENBQVp5QjtBQUNIO0FBQ0QsZUFBTyxjQUFjLGVBQWU7QUFDaEMsaUJBQU8sQ0FBQ3RFLGVBQVIsR0FBUUEsQ0FBUjtBQURKLFNBQU8sQ0FBUDtBQUdIOztBQUVELGlEQUEyQztBQUN2QyxlQUFPLDBCQUNHLGVBQWU7QUFDakIsaUJBQU91RSxVQUFVdkUscUJBQVZ1RSxPQUFVdkUsQ0FBVnVFLEdBQVA7QUFGRCxnQkFJR3puQixPQUFPa2pCLEtBSlYsbUJBS0csZ0JBQWdCO0FBQ2xCLGlCQUFPQSxxQkFBcUJBLGNBQTVCLEdBQTRCQSxDQUFyQkEsQ0FBUDtBQU5ELGdCQVFHLG1CQUFtQjtBQUNyQixpQkFBT3VELGVBQWVpQixXQUFmakIsR0FBZWlCLENBQWZqQixFQUFnQywyQkFBdkMsRUFBdUMsQ0FBaENBLENBQVA7QUFUUixTQUFPLENBQVA7O0FBWUEsaUNBQXlCO0FBQ3JCLGlCQUFPLElBQUl4RCxZQUFKLE9BQXVCLG9CQUFvQkMsWUFBcEIsR0FBb0JBLENBQXBCLHVCQUF2QixFQUF1QixDQUF2QixFQUFQLEdBQU8sQ0FBUDtBQUNIO0FBQ0o7O0FBRUQsK0NBQXlDO0FBQ3JDLCtCQUF1QixPQUFPbGtCLGdCQUFQLE1BQU9BLENBQVA7O0FBRXZCLGVBQU8sNENBRUcsZ0JBQWdCO0FBQ2xCLGNBQUl6USxPQUFPeVEsZ0JBQVgsTUFBV0EsQ0FBWDtBQUNBMm9CLHVCQUFhLGVBQWU7QUFDeEJwNUIsbUJBQU8sVUFBVSxrQkFBa0I7QUFDL0IscUJBQU9nNUIsNkJBQVAsR0FBT0EsQ0FBUDtBQURKaDVCLGFBQU8sQ0FBUEE7QUFESm81QjtBQUtBO0FBVFIsU0FBTyxDQUFQOztBQVlBLG1DQUEyQjtBQUN2QixpQkFBTyxDQUFDUCxjQUFSLE1BQVFBLENBQVI7QUFDSDtBQUNKO0FBQ0o7O0FBRUQsNEJBQXdCO0FBQ3BCLGFBQU87QUFDSFEsb0JBREc7QUFFSFAsY0FBTTtBQUNGUSxtQkFBU0E7QUFEUDtBQUZILE9BQVA7O0FBT0EsNEJBQXNCO0FBQ2xCLGVBQU8sUUFBUTVFLEtBQVIsZUFDRyxvQkFBb0I7QUFDdEIsaUJBQU8sWUFDSCxhQUFhLG1CQUFtQjtBQUM1QixtQkFBTzZFLFFBQVAsT0FBT0EsRUFBUDtBQUZSLFdBQ0ksQ0FERyxDQUFQO0FBRkQsZ0JBUUcsc0JBQXNCO0FBQ3hCLGlCQUFPQyxnQkFBUCxJQUFPQSxDQUFQO0FBVFIsU0FBTyxDQUFQO0FBV0g7O0FBRUQseUJBQW1CO0FBQ2YsZUFBTyxnQkFBZ0I3RSxhQUFhRCxjQUE3QixXQUFnQkMsQ0FBaEIsa0RBR0csaUJBQWlCO0FBQ25CLGlCQUFPOEUsVUFBUCxVQUFPQSxDQUFQO0FBSlIsU0FBTyxDQUFQOztBQU9BLDhDQUFzQztBQUNsQyxpQkFBTyxnQkFDSyxnQkFBZ0I7QUFDcEIsbUJBQU9DLGNBQWNDLFFBQXJCO0FBRkQsb0JBSUssZ0JBQWdCO0FBQ3BCLG1CQUFPL0Usc0JBQXNCOEUsNEJBQTdCLEtBQTZCQSxDQUF0QjlFLENBQVA7QUFMUixXQUFPLENBQVA7QUFPSDs7QUFFRCwwQ0FBa0M7QUFDOUIsY0FBTWdGLFdBQU47QUFDQUMsOEJBQW9CLGlCQUFpQjtBQUNqQyxnQkFBSTtBQUNBbEYsMkJBQWFudUIsa0JBQWJtdUIsWUFBMkNpRixtQkFBM0NqRixRQUEyQ2lGLENBQTNDakY7QUFESixjQUVFLFVBQVU7QUFDUjcxQiwwQkFBWSx3Q0FBd0MwSCxNQUFwRDFILE1BQWdFdUYsRUFBaEV2RixRQUFnRXVGLEVBQWhFdkY7QUFDSDtBQUxMKzZCO0FBT0E7QUFDSDs7QUFFRCx5Q0FBaUM7QUFDN0IsaUJBQU87QUFDSHJwQixxQkFBUyxtQkFBbUI7QUFDeEIsa0JBQU0wb0IsVUFBVSxDQUFDWSxnQ0FBRCxJQUFoQjtBQUNBLHFCQUFPbEYsa0JBQWtCa0YsWUFBbEJsRixTQUFQLE9BQU9BLENBQVA7QUFIRDtBQUtIcGUsaUJBQUssZUFBWTtBQUNiLHFCQUFPc2pCLG1DQUFQLEtBQU9BLENBQVA7QUFDSDtBQVBFLFdBQVA7QUFTSDtBQUNKO0FBQ0o7O0FBRUQseUJBQXFCO0FBQ2pCLGFBQU87QUFDSGxCLG1CQURHO0FBRUhFLGNBQU07QUFDRmlCLG9CQUFVQTtBQURSO0FBRkgsT0FBUDs7QUFPQSxpQ0FBMkI7QUFDdkIsZUFBTztBQUNIZixrQkFBUUE7QUFETCxTQUFQOztBQUlBLDZCQUFxQjtBQUNqQixjQUFJckUsZUFBZTVuQixRQUFuQixHQUFJNG5CLENBQUosRUFBaUMsT0FBT2xrQixRQUFQLE9BQU9BLEVBQVA7O0FBRWpDLGlCQUFPLGdCQUFnQjFELFFBQWhCLFVBQ0cwRSxPQUFPa2pCLEtBRFYsbUJBRUcsZ0JBQWdCO0FBQ2xCLG1CQUFPQSxxQkFBcUJBLGNBQWM1bkIsUUFBMUMsR0FBNEI0bkIsQ0FBckJBLENBQVA7QUFIRCxrQkFLRyxtQkFBbUI7QUFDckIsbUJBQU8sWUFBWSwyQkFBMkI7QUFDMUM1bkI7QUFDQUE7QUFDQUE7QUFISixhQUFPLENBQVA7QUFOUixXQUFPLENBQVA7QUFZSDtBQUNKOztBQUVELCtCQUF5QjtBQUNyQixZQUFJLENBQUM0bkIsZUFBTCxJQUFLQSxDQUFMLEVBQTJCLE9BQU9sa0IsZ0JBQVAsSUFBT0EsQ0FBUDs7QUFFM0IsZUFBTyw0QkFDRyxZQUFZO0FBQ2QsY0FBSWtrQixhQUFKLElBQUlBLENBQUosRUFDSSxPQUFPb0YsZUFEWCxNQUNXQSxFQUFQLENBREosS0FHSSxPQUFPLFlBQ0gsYUFBYTNJLEtBQWIsZ0JBQWtDLGlCQUFpQjtBQUMvQyxtQkFBT3dILFVBQVAsS0FBT0EsQ0FBUDtBQUZSLFdBQ0ksQ0FERyxDQUFQO0FBTFosU0FBTyxDQUFQOztBQVlBLHdDQUFnQztBQUM1QixjQUFNb0IsYUFBYTVJLDRCQUFuQixZQUFtQkEsQ0FBbkI7O0FBRUEsY0FBSSxDQUFKLFlBQWlCLE9BQU8zZ0IsZ0JBQVAsSUFBT0EsQ0FBUDs7QUFFakIsaUJBQU8sbUNBQ0csbUJBQW1CO0FBQ3JCMmdCLDBEQUdJQSwrQkFISkEsWUFHSUEsQ0FISkE7QUFGRCxrQkFRRyxZQUFZO0FBQ2Q7QUFUUixXQUFPLENBQVA7QUFXSDtBQUNKO0FBQ0o7OztvQkFwd0JnQnFELFM7Ozs7Ozs7Ozs7OztBQ0FyQjs7Ozs7Ozs7TUFFcUJ3RixPO0FBRW5CLHlDQUFtQztBQUFBOztBQUNqQztBQUNBO0FBQ0E7QUFDQSxvQkFBYyxJQUFJLFlBQWxCLE9BQWMsRUFBZDtBQUNBLDBCQUFvQixJQUFJLFlBQXhCLE9BQW9CLEVBQXBCO0FBQ0EsdUJBQWlCLFlBQWpCO0FBQ0Esb0JBQWMsWUFBZDtBQUNBLG1CQUFhLElBQUksWUFBakIsS0FBYSxFQUFiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQXFCLFlBQXJCLGdCQUFxQixFQUFyQjs7QUFFQSxxQkFBZSxZQUFmO0FBQ0EsbUJBQWE7QUFDWEMscUJBQWEsc0JBREYsSUFDRSxDQURGO0FBRVhDLHFCQUFhLHNCQUZGLElBRUUsQ0FGRjtBQUdYQyxtQkFBVztBQUhBLE9BQWI7QUFLQSxtQkFBRSxLQUFGLHlCQUFnQyxXQUFoQztBQUNBLG1CQUFFLEtBQUYseUJBQWdDLFdBQWhDO0FBQ0EsbUJBQUUsS0FBRixtQkFBMEIsV0FBMUI7QUFDRDs7bUJBRUR4bEIsUSxxQkFBU0MsSyxFQUFPO0FBQ2Q7OzttQkFHRkMsVyx3QkFBWUQsSyxFQUFPO0FBQ2pCLFVBQU12WCxJQUFJLG9CQUFWLEtBQVUsQ0FBVjtBQUNBLFVBQUcsQ0FBSCxHQUFPO0FBQ0w7QUFDRDs7O21CQUdIOGQsYyw2QkFBaUI7QUFDZjs7O21CQUdGQyxjLDZCQUFpQjtBQUNmOzs7bUJBR0ZDLGlCLGdDQUFvQixDOzttQkFJcEJ2WSxPLHNCQUFVO0FBQ1IsbUJBQUUsS0FBRiwwQkFBaUMsV0FBakM7QUFDQSxtQkFBRSxLQUFGLDBCQUFpQyxXQUFqQztBQUNBLG1CQUFFLEtBQUYsb0JBQTJCLFdBQTNCOzs7bUJBR0ZzM0Isa0IsK0JBQW1CaDJCLEMsRUFBRztBQUNwQixVQUFNaXZCLFdBQVcsYUFBRSxLQUFuQixPQUFpQixDQUFqQjtBQUNBLFVBQU05cEIsU0FBUzhwQixTQUFmLE1BQWVBLEVBQWY7QUFDQSxzQkFBaUIsQ0FBQ2p2QixVQUFRbUYsT0FBVCxRQUFzQjhwQixTQUF2QixLQUF1QkEsRUFBdEIsR0FBRCxDQUFDLEdBQWpCO0FBQ0Esc0JBQWdCLEVBQUUsQ0FBQ2p2QixVQUFRbUYsT0FBVCxPQUFxQjhwQixTQUF2QixNQUF1QkEsRUFBdkIsUUFBaEI7QUFDQSxhQUFPLEtBQVA7OzttQkFHRjZHLFcsd0JBQVk5MUIsQyxFQUFHO0FBQ2IsVUFBRyxDQUFDLEtBQUosU0FBa0I7O0FBRWxCLFVBQUcsS0FBSCxVQUFrQjs7QUFFbEI7QUFDRCxtQ0FBNkIsS0FBN0IsUUFBMEMsS0FBMUM7O0FBRUEsVUFBTTBRLGFBQWEsZ0NBQWdDLEtBQW5ELE1BQW1CLENBQW5CO0FBQ0EsVUFBR0Esb0JBQUgsR0FBMEI7QUFDdkIsWUFBTXVsQixXQUFXdmxCLGNBQWpCO0FBQ0EsWUFBRyxDQUFDLG9CQUFvQkEsV0FBeEIsQ0FBd0JBLENBQXBCLENBQUosRUFBd0M7QUFDeEMsWUFBTXRXLElBQUlzVyxvQkFBVixLQUFVQSxFQUFWO0FBQ0Esd0JBQWdCdFcsTUFBTSxtQkFBTkEsUUFBaEIsTUFBZ0JBLEVBQWhCLENBQTBEO0FBQzFELDZCQUFxQixZQUFyQixnQkFBcUIsRUFBckI7QUFDQTtBQUNBLGlEQUF5QyxxQ0FBcUMsV0FBOUUsTUFBeUMsQ0FBekMsRUFBa0dzVyxjQUFsRztBQUNBO0FBQ0E7QUFDRjs7O21CQUlGbWxCLFcsd0JBQVk3MUIsQyxFQUFHO0FBQ2IsVUFBRyxDQUFDLEtBQUosU0FBa0I7QUFDbkJBOztBQUVBLFVBQUcsS0FBSCxVQUFrQjtBQUNmO0FBQ0QscUNBQTZCLEtBQTdCLFFBQTBDLEtBQTFDO0FBQ0EsWUFBRyxrQ0FBa0MsS0FBbEMsT0FBOEMsS0FBakQsWUFBRyxDQUFILEVBQXFFO0FBQ2xFLGNBQUcsQ0FBQyxvQkFBb0IsS0FBeEIsWUFBSSxDQUFKLEVBQTRDO0FBSi9CLFVBS2Q7QUFDRDtBQUNBO0FBQ0Y7OzttQkFHRisxQixTLHNCQUFVLzFCLEMsRUFBRztBQUNYLFVBQUcsS0FBSCxVQUFrQjtBQUNoQjtBQUNGO0FBQ0UscUNBQTZCLEtBQTdCO0FBQ0Y7QUFDQSxVQUFHLENBQUMsS0FBSixTQUFrQjtBQUNuQkE7Ozs7OztvQkE3R2tCNDFCLEk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGckI7Ozs7Ozs7O0FBQ0E7O01BRXFCTSxrQjtvQkFjWkMsYSwwQkFBY24yQixDLEVBQUc7QUFDdEIsYUFBT0EsaUJBQWVBLGNBQWZBLElBQStCQSxZQUF0Qzs7O29CQUdLbzJCLFcsd0JBQVlDLE8sRUFBUztBQUMxQixVQUFJaCtCLFNBQUo7QUFBQSxVQUFPUCxTQUFQO0FBQ0EsVUFBR3UrQixtQkFBSCxHQUF1QjtBQUNyQmgrQixZQUFJZytCLG1CQUFpQkEsV0FBckJoK0I7QUFDQVAsWUFBSXUrQixtQkFBaUJBLFdBQXJCditCO0FBQ0FBLFlBQUksQ0FBQ2dCLFVBQVVULFFBQUlQLElBQW5CQSxDQUFLZ0IsQ0FBTGhCO0FBQ0FPO0FBSkYsYUFNSztBQUNIQSxZQUFJZytCLFdBQUpoK0I7QUFDQVAsWUFBSXUrQixXQUFKditCO0FBQ0Q7QUFDRCxhQUFPO0FBQ0xPLFdBREs7QUFFTFA7QUFGSyxPQUFQOzs7QUFNRiwrQ0FBOEI7QUFBQTs7QUFDNUIscUJBQWV1bkIsV0FBZjtBQUNBO0FBQ0EsaUJBQVczVyxXQUFYO0FBQ0EsaUJBQVcsU0FBWDtBQUNBOztBQUVBLG1CQUFhO0FBQ1g0dEIscUJBQWEsc0JBREYsSUFDRSxDQURGOztBQUdYQyxtQkFBVyxvQkFIQSxJQUdBLENBSEE7QUFJWEMsbUJBQVcsb0JBSkEsSUFJQSxDQUpBO0FBS1hDLGlCQUFTLGtCQUxFLElBS0YsQ0FMRTtBQU1YQyxvQkFBWSxxQkFORCxJQU1DLENBTkQ7O0FBUVhDLHNCQUFjLHVCQVJILElBUUcsQ0FSSDtBQVNYQyxvQkFBWSxxQkFURCxJQVNDLENBVEQ7O0FBV1hDLGVBQU8sZ0JBWEksSUFXSixDQVhJO0FBWVhDLGtCQUFVLG1CQVpDLElBWUQsQ0FaQzs7QUFjWEMsb0JBQVkscUJBZEQsSUFjQyxDQWREO0FBZVhDLG1CQUFXLG9CQWZBLElBZUEsQ0FmQTtBQWdCWEMsa0JBQVUsbUJBaEJDLElBZ0JELENBaEJDOztBQWtCWEMsaUJBQVMsa0JBbEJFLElBa0JGLENBbEJFO0FBbUJYQyxrQkFBVSxtQkFuQkMsSUFtQkQsQ0FuQkM7QUFvQlhDLGVBQU87QUFwQkksT0FBYjs7QUF1QkEscUNBQStCLFdBQS9COztBQUVBLG1DQUE2QixXQUE3QjtBQUNBLG1DQUE2QixXQUE3QjtBQUNBLGlDQUEyQixXQUEzQjtBQUNBLG9DQUE4QixXQUE5Qjs7QUFFQSxtQkFBRSxLQUFGLHFCQUE0QixXQUE1QjtBQUNBLG1CQUFFLEtBQUYsbUJBQTBCLFdBQTFCOztBQUVBLCtCQUF5QixXQUF6QjtBQUNBLGtDQUE0QixXQUE1Qjs7QUFFQSxvQ0FBOEIsV0FBOUI7QUFDQSxtQ0FBNkIsV0FBN0I7QUFDQSxrQ0FBNEIsV0FBNUI7O0FBRUEsbUJBQUUsS0FBRixtQkFBMEIsV0FBMUI7QUFDQSxtQkFBRSxLQUFGLG9CQUEyQixXQUEzQjtBQUNBLG1CQUFFLEtBQUYsaUJBQXdCLFdBQXhCO0FBQ0Q7OzhCQUVEQyxTLHNCQUFVblksTSxFQUFRamYsSSxFQUFNcXNCLEksRUFBTW5OLEssRUFBTztBQUNuQ2xmLGFBQU9BLEtBQVBBLFdBQU9BLEVBQVBBO0FBQ0EsVUFBRyxDQUFDLGFBQUosSUFBSSxDQUFKLEVBQXdCO0FBQ3RCO0FBQ0Q7QUFDRCxVQUFHLENBQUMsbUJBQUosSUFBSSxDQUFKLEVBQThCO0FBQzVCO0FBQ0Q7QUFDRCxVQUFHLENBQUMseUJBQUosS0FBSSxDQUFKLEVBQXFDO0FBQ25DO0FBQ0Q7QUFDRDs7OzhCQUdGd2QsVSx1QkFBV3hkLEksRUFBTXFzQixJLEVBQU1uTixLLEVBQU87QUFDNUIsYUFBTyxDQUFDLENBQUMsc0JBQUQsYUFBRCxjQUFQOzs7OEJBR0ZtWSxXLHdCQUFZalksTyxFQUFTcmYsQyxFQUFHekcsSSxFQUFNO0FBQzVCLG9KQUEyQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBbkIybEIsU0FBbUI7O0FBQ3pCQTtBQUNEOzs7OEJBR0hvWCxXLHdCQUFZdDJCLEMsRUFBRztBQUNiLFVBQUcsS0FBSCxTQUFpQjtBQUNmLFlBQU1tZixRQUFRK1csOEJBQWQsQ0FBY0EsQ0FBZDtBQUNBLHlCQUFpQiwrQkFBK0JsMkIsRUFBL0IsUUFBakIsS0FBaUIsQ0FBakI7QUFDRDs7OzhCQUdIdTJCLFMsc0JBQVV2MkIsQyxFQUFHO0FBQ1gsVUFBRyxLQUFILFFBQWdCO0FBQ2Q7QUFDRDtBQUNELFVBQUcsS0FBSCxTQUFpQjtBQUNmLFlBQU1tZixRQUFRK1csOEJBQWQsQ0FBY0EsQ0FBZDtBQUNBLHlCQUFpQiw2QkFBNkJsMkIsRUFBN0IsUUFBakIsS0FBaUIsQ0FBakI7QUFDQSxzQkFBYztBQUNaM0gsYUFBRzJILEVBRFM7QUFFWmxJLGFBQUdrSSxFQUZTO0FBR1pxZixtQkFBUyw2QkFBNkJyZixFQUE3QjtBQUhHLFNBQWQ7QUFLQSx5QkFBaUIsWUFBakIsWUFBeUM7QUFDdkMrQyxpQkFBTztBQURnQyxTQUF6QztBQUdEOzs7OEJBR0h5ekIsUyxzQkFBVXgyQixDLEVBQUc7QUFDWCxVQUFHLEtBQUgsU0FBaUI7QUFDZixZQUFNbWYsUUFBUStXLDhCQUFkLENBQWNBLENBQWQ7QUFDQSx5QkFBaUIsNkJBQTZCbDJCLEVBQTdCLFFBQWpCLEtBQWlCLENBQWpCO0FBQ0Q7Ozs4QkFHSDIyQixZLHlCQUFhMzJCLEMsRUFBRztBQUNkLFVBQUcsZ0JBQWdCLEtBQW5CLFFBQWdDO0FBQzlCLHlCQUFpQixZQUFqQixZQUF5QztBQUN2QytDLGlCQUR1QztBQUV2Q3RILGNBQUl1RSxVQUFRLFlBRjJCO0FBR3ZDckksY0FBSXFJLFVBQVEsWUFBWWxJO0FBSGUsU0FBekM7QUFLQSxzQkFBYztBQUNaTyxhQUFHMkgsRUFEUztBQUVabEksYUFBR2tJLEVBRlM7QUFHWnFmLG1CQUFTLFlBQVlBO0FBSFQsU0FBZDtBQUtEOzs7OEJBR0hvWCxPLG9CQUFRejJCLEMsRUFBRztBQUNULFVBQUcsS0FBSCxTQUFpQjtBQUNmLFlBQU1tZixRQUFRK1csOEJBQWQsQ0FBY0EsQ0FBZDtBQUNBLHlCQUFpQiwyQkFBMkJsMkIsRUFBM0IsUUFBakIsS0FBaUIsQ0FBakI7QUFDRDs7OzhCQUdINDJCLFUsdUJBQVc1MkIsQyxFQUFHO0FBQ1osVUFBRyxLQUFILFFBQWdCO0FBQ2QseUJBQWlCLFlBQWpCLFlBQXlDO0FBQ3ZDK0MsaUJBQU87QUFEZ0MsU0FBekM7QUFHQSxlQUFPLEtBQVA7QUFDRDs7OzhCQUdIMnpCLFUsdUJBQVcxMkIsQyxFQUFHO0FBQ1osVUFBRyxLQUFILFNBQWlCO0FBQ2YsWUFBTW1mLFFBQVErVyw4QkFBZCxDQUFjQSxDQUFkO0FBQ0EseUJBQWlCLGlDQUFqQixLQUFpQixDQUFqQjtBQUNEOzs7OEJBR0hxQixNLG1CQUFPdjNCLEMsRUFBR0MsSSxFQUFNO0FBQ2QsVUFBRyxLQUFILFNBQWlCO0FBQ2YsWUFBTWtmLFFBQVErVyw4QkFBZCxDQUFjQSxDQUFkO0FBQ0EseUJBQWlCLHNCQUFzQmwyQixFQUF0QixRQUFqQixLQUFpQixDQUFqQjtBQUNEOzs7OEJBR0g2MkIsSyxrQkFBTTcyQixDLEVBQUc7QUFDUDs7OzhCQUdGODJCLFEscUJBQVM5MkIsQyxFQUFHO0FBQ1Y7Ozs4QkFHRnczQixTLHNCQUFVeDNCLEMsRUFBR21mLEssRUFBT2tYLE8sRUFBUztBQUMzQixzQ0FDS0gsNEJBREwsT0FDS0EsQ0FETDtBQUVFN1csaUJBQVMsNkJBQTZCZ1gsUUFBN0IsUUFGWCxLQUVXLENBRlg7QUFHRS9KLGNBQU0rSixRQUhSO0FBSUVsWDtBQUpGO0FBTUEsdUJBQWlCLGlCQUFqQixZQUE4QztBQUM1Q3BjLGVBQU87QUFEcUMsT0FBOUM7Ozs4QkFLRmcwQixVLHVCQUFXLzJCLEMsRUFBRztBQUNaLFVBQUcsS0FBSCxhQUFxQjtBQUNuQjtBQUNEO0FBQ0QsVUFBRyxLQUFILFNBQWlCO0FBQ2YsWUFBTW1mLFFBQVErVyw4QkFBZCxDQUFjQSxDQUFkO0FBQUEsWUFBZ0RHLFVBQVVyMkIsYUFBYUEsZ0JBQXZFO0FBQ0EseUJBQWlCLDhCQUE4QnEyQixRQUE5QixRQUFqQixLQUFpQixDQUFqQjtBQUNBO0FBQ0Q7Ozs4QkFHSFcsUyxzQkFBVWgzQixDLEVBQUc7QUFDWCxVQUFHLEtBQUgsU0FBaUI7QUFDZixZQUFNbWYsUUFBUStXLDhCQUFkLENBQWNBLENBQWQ7QUFBQSxZQUFnREcsVUFBVXIyQixhQUFhQSxnQkFBdkU7QUFDQSx5QkFBaUIsNkJBQTZCcTJCLFFBQTdCLFFBQWpCLEtBQWlCLENBQWpCO0FBQ0EsWUFBRyxLQUFILGFBQXFCO0FBQ25CLGNBQUcsMEJBQXdCQSxRQUF4QixVQUEwQywyQkFBN0MsT0FBNkU7QUFDM0UsZ0JBQU1vQixNQUFNdkIsNEJBQVosT0FBWUEsQ0FBWjtBQUNBLDZCQUFpQixpQkFBakIsWUFBOEM7QUFDNUNuekIscUJBRDRDO0FBRTVDdEgsa0JBQUlnOEIsUUFBTSxpQkFGa0M7QUFHNUM5L0Isa0JBQUk4L0IsUUFBTSxpQkFBaUIzL0I7QUFIaUIsYUFBOUM7QUFLQSw0Q0FDSyxLQURMO0FBUEYsaUJBWUs7QUFDSDtBQUNBO0FBQ0Q7QUFDRjtBQUNGOzs7OEJBR0htL0IsUSxxQkFBU2ozQixDLEVBQUc7QUFDVixVQUFHLEtBQUgsYUFBcUI7QUFDbkIseUJBQWlCLGlCQUFqQixZQUE4QztBQUM1QytDLGlCQUFPO0FBRHFDLFNBQTlDO0FBR0EsZUFBTyxLQUFQO0FBQ0Q7Ozs4QkFHSGlLLEcsZ0JBQUloTixDLEVBQUdDLEksRUFBTTtBQUNYLFVBQUcsS0FBSCxTQUFpQjtBQUNmLFlBQU1rZixRQUFRK1csOEJBQWQsQ0FBY0EsQ0FBZDtBQUNBLHlCQUFpQixzQkFBc0JsMkIsRUFBdEIsU0FBakIsS0FBaUIsQ0FBakI7QUFDRDs7OzhCQUdIazNCLE8sb0JBQVFsM0IsQyxFQUFHO0FBQ1Q7Ozs4QkFHRm0zQixRLHFCQUFTbjNCLEMsRUFBRztBQUNWOzs7OEJBR0ZvM0IsSyxrQkFBTXAzQixDLEVBQUc7QUFDUDs7OzhCQUdGdEIsTyxzQkFBVTtBQUNSLHNDQUFnQyxXQUFoQzs7QUFFQSxvQ0FBOEIsV0FBOUI7QUFDQSxvQ0FBOEIsV0FBOUI7QUFDQSxrQ0FBNEIsV0FBNUI7QUFDQSxxQ0FBK0IsV0FBL0I7O0FBRUEsbUJBQUUsS0FBRixzQkFBNkIsV0FBN0I7QUFDQSxtQkFBRSxLQUFGLG9CQUEyQixXQUEzQjs7QUFFQSxnQ0FBMEIsV0FBMUI7QUFDQSxtQ0FBNkIsV0FBN0I7O0FBRUEscUNBQStCLFdBQS9CO0FBQ0Esb0NBQThCLFdBQTlCO0FBQ0EsbUNBQTZCLFdBQTdCOztBQUVBLG1CQUFFLEtBQUYsb0JBQTJCLFdBQTNCO0FBQ0EsbUJBQUUsS0FBRixxQkFBNEIsV0FBNUI7QUFDQSxtQkFBRSxLQUFGLGtCQUF5QixXQUF6Qjs7Ozs7O0FBclNpQnczQixrQkFFWndCLE9BRll4QixHQUVGO0FBQ2Z5QixVQURlO0FBRWZDLFdBRmU7QUFHZkMsU0FBSztBQUhVLEdBRkUzQjtBQUFBQSxrQkFRWnZLLFlBUll1SyxHQVFHO0FBQ3BCdEssVUFEb0I7QUFFcEJDLFlBRm9CO0FBR3BCQyxXQUFPO0FBSGEsR0FSSG9LO29CQUFBQSxlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUNGQTRCLGE7Ozs7O2VBTWJDLFMsd0JBQVk7QUFDbEIsYUFBT0QsbUNBQW1DQSxXQUFuQ0EscUJBQW1FQSxXQUExRTs7O2VBR01FLFMsd0JBQVk7QUFDbEIsVUFBR0YsV0FBSCxzQkFBb0M7QUFDbkMsZUFBTzd1QixTQUFQO0FBREQsYUFHSyxJQUFHNnVCLFdBQUgsbUJBQWlDO0FBQ3JDLGVBQU83dUIsU0FBUDtBQURJLGFBR0EsSUFBRzZ1QixXQUFILGtCQUFnQztBQUNwQyxlQUFPLENBQUMsQ0FBQzd1QixTQUFUO0FBREksYUFHQTtBQUNKeE87QUFDQTs7O2VBR0t3OUIsZ0IsNkJBQWlCdnZCLE8sRUFBU21ILE8sRUFBUztBQUN6QyxVQUFJbkgsUUFBSixrQkFBOEI7QUFDMUJBO0FBQ0FBO0FBQ0FBO0FBQ0FBO0FBQ0g7OztlQUdLd3ZCLG1CLGdDQUFvQnh2QixPLEVBQVNtSCxPLEVBQVM7QUFDNUMsVUFBSW5ILFFBQUoscUJBQWlDO0FBQzdCQTtBQUNBQTtBQUNBQTtBQUNBQTtBQUNIOzs7ZUFHS2dyQixPLG9CQUFRaHJCLE8sRUFBUztBQUN2QkEsZ0JBQVVBLFdBQVdPLFNBQXJCUDtBQUNBLFVBQUdvdkIsV0FBSCxzQkFBb0M7QUFDbkNwdkI7QUFERCxhQUdLLElBQUdvdkIsV0FBSCxtQkFBaUM7QUFDckNwdkI7QUFESSxhQUdBLElBQUdvdkIsV0FBSCxrQkFBZ0M7QUFDcENwdkI7QUFESSxhQUdBO0FBQ0pqTztBQUNBOzs7ZUFHSzhrQixNLHFCQUFTO0FBQ2YsVUFBR3VZLFdBQUgsc0JBQW9DO0FBQ25DN3VCO0FBREQsYUFFTSxJQUFHNnVCLFdBQUgsbUJBQWlDO0FBQ3RDN3VCO0FBREssYUFHRCxJQUFHNnVCLFdBQUgsa0JBQWdDO0FBQ3BDN3VCO0FBREksYUFHQTtBQUNKeE87QUFDQTs7Ozs7O0FBdEVrQnE5QixhQUViSyxvQkFGYUwsR0FFVSxDQUFDLENBQUM3dUIsU0FBU212QixzQkFGckJOO0FBQUFBLGFBR2JPLGlCQUhhUCxHQUdPLENBQUMsQ0FBQzd1QixTQUFTcXZCLG1CQUhsQlI7QUFBQUEsYUFJYlMsZ0JBSmFULEdBSU0sQ0FBQyxDQUFDN3VCLHlCQUF5QnV2QixtQkFKakNWO29CQUFBQSxVOzs7Ozs7Ozs7Ozs7QUNEckI7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCVyxtQjs7O0FBRW5CLG1GQUFpRTtBQUFBOztBQUFBLG1EQUMvRCw4Q0FEK0QsS0FDL0QsQ0FEK0Q7O0FBRy9ELGtCQUFXLE1BQUksd0JBQWYsU0FBZSxFQUFmO0FBQ0EsVUFBTWpLLFNBQVMsYUFBRSxpQkFBZSxNQUFmLHdCQUFqQixxREFBZSxDQUFmO0FBQ0EsbUJBQUUsVUFBRjtBQUNBLG9CQUFhQSxPQUFiLENBQWFBLENBQWI7O0FBRUE7O0FBRUEsb0JBQWE7QUFDWDVzQixpQkFBUyxZQUFUQTtBQUNEOztBQUVELFVBQUcsd0ZBQUgsS0FBRyxDQUFILEVBQWtHO0FBQUU7QUFDbEcsc0JBQWEsSUFBYixLQUFhLEVBQWI7QUFDQSxnQ0FBdUIsWUFBSztBQUMxQiw0QkFBaUIsTUFBakI7QUFDQTtBQUZGO0FBSUEscUJBQUUsTUFBRixrQkFBeUIsWUFBekI7QUFDQSwwQkFBaUIsd0JBQWMsWUFBZCxlQUF3QyxZQUF4QyxpQkFBakIsS0FBaUIsQ0FBakI7QUFyQjZELFFBc0I3RDs7QUFFRiw4QkFBdUIsWUFBSztBQUMxQixZQUFHLENBQUMsMENBQUosS0FBSSxDQUFKLEVBQXFEO0FBQ25ELDhCQUFtQixZQUFLO0FBQ3RCO0FBQ0E7QUFGRjtBQUlBO0FBTEYsZUFPSztBQUNIb0sscUJBQVcsWUFBSztBQUNkLGdCQUFHLE1BQUgsT0FBZTtBQUNiLDRCQUFhLGFBQUUsNEJBQUYsTUFBYixLQUFhLEVBQWI7QUFDQSw2QkFBYyxhQUFFLDRCQUFGLE1BQWQsTUFBYyxFQUFkO0FBQ0F3aUIsa0NBQW9CLGNBQXBCQSxvQkFBbUQsZUFBbkRBO0FBQ0FBLDRCQUFjLEVBQUNqcEIsTUFBTSxDQUFDLE1BQUQsUUFBUCxLQUF3QjZlLEtBQXRDb0ssQ0FBYyxFQUFkQTtBQUNBLGtCQUFHLE1BQUgsV0FBbUI7QUFDakIsa0NBQWlCLHdDQUE4Qiw0QkFBOUIsTUFBK0QsTUFBaEYsT0FBaUIsQ0FBakI7QUFDQSxnREFBK0Isc0JBQS9CLEtBQStCLENBQS9CO0FBQ0Q7QUFDRCxrQ0FBbUIsWUFBSztBQUN0QjtBQURGO0FBR0E7QUFDRDtBQWRIeGlCO0FBZ0JEO0FBekJIO0FBMkJBLG1CQUFFLFlBQUYsMEJBQXVDLFlBQXZDO0FBbkQrRDtBQW9EaEU7OytCQUVEek0sZSw4QkFBa0I7QUFDaEIsYUFBTyxXQUFQOzs7K0JBR0ZtNUIsTSxxQkFBUztBQUFBOztBQUNQLFVBQUcsS0FBSCxXQUFtQjtBQUNqQiw2QkFBcUIsZUFBckIsU0FBNkMsRUFBQzM1QixRQUFRLGNBQVQsTUFBMkJpRCxPQUFPLGFBQS9FLElBQTZDLEVBQTdDLE9BQ1EsbUJBQVk7QUFDaEI7QUFGSixpQkFJUyxpQkFBVTtBQUNmdkg7QUFDQTtBQUNBO0FBUEo7QUFERixhQVdLO0FBQ0gsK0JBQVksMkJBQVosTUFBNkMsRUFBQ2srQixTQUE5QyxLQUE2QyxFQUE3QyxPQUNPLGtCQUFXO0FBQ2Q7QUFDQTtBQUhKO0FBS0Q7OzsrQkFHSGo2QixPLHNCQUFVO0FBQ1IsbUJBQUUsS0FBRixtQkFBMEIsV0FBMUI7QUFDQSxtQkFBRSxXQUFGLDJCQUF3QyxXQUF4QztBQUNBLG1CQUFFLFNBQUYsV0FBc0IsTUFBSSxLQUExQjtBQUNBLFVBQUcsS0FBSCxPQUFlO0FBQ2I7QUFDQSxlQUFPLEtBQVA7QUFDRDtBQUNEO0FBQ0EsYUFBTyxLQUFQO0FBQ0E7OzsrQkFHRnFwQixRLHFCQUFTL25CLEMsRUFBR2dMLEcsRUFBSzNTLEMsRUFBR1AsQyxFQUFHO0FBQ3JCLFVBQUcsS0FBSCxXQUFtQjtBQUNqQjtBQUNEOzs7Ozs7b0JBakdnQjJnQyxnQjs7Ozs7Ozs7Ozs7O0FDTnJCOztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O01BRXFCRyxtQjsrQkFFbkJqaEMsRSxlQUFHQyxDLEVBQUVFLEMsRUFBRztBQUNOLFVBQU1nYSxJQUFFaGEsRUFBUixDQUFRQSxDQUFSO0FBQUEsVUFBY1YsSUFBRVUsRUFBaEIsQ0FBZ0JBLENBQWhCO0FBQ0EsYUFBTyxDQUNMLENBQUMsS0FBRCxJQUFRZ0IsU0FESCxDQUNHQSxDQURILEVBQVAsQ0FBTyxDQUFQOzs7K0JBTUZ1d0IsUyxzQkFBVXJCLEMsRUFBRztBQUNYLFVBQUlwd0IsSUFBSjtBQUFBLFVBQVNDLEtBQUcsT0FBWjtBQUFBLFVBQXVCNndCLEtBQUssS0FBNUI7QUFDQSxhQUFNOXdCLElBQU4sR0FBVztBQUNULFlBQUdBLFNBQUgsR0FBVztBQUNUQyxlQUFHbXdCLElBQUhud0I7QUFDRDtBQUNENndCLGFBQUcsd0JBQWMsYUFBYSxFQUFDL0IsR0FBRyxPQUEvQixDQUEyQixFQUFiLENBQWQsU0FBSCtCLEVBQUcsQ0FBSEE7QUFDQTl3QjtBQUNEO0FBQ0Q7OzsrQkFHRmloQyxVLHVCQUFXOWdCLE0sRUFBUTtBQUNqQixVQUFJbmdCLElBQUo7QUFBQSxVQUFTQyxLQUFHLE9BQVo7QUFBQSxVQUF1QjZ3QixLQUFLLEtBQTVCO0FBQ0EsYUFBTTV2QixTQUFTNHZCLFFBQVQ1dkIsVUFBTixNQUFtQztBQUNqQyxZQUFNcXZCLE1BQUksd0JBQWMsYUFBYSxFQUFDeEIsR0FBRyxPQUEvQixDQUEyQixFQUFiLENBQWQsU0FBVixFQUFVLENBQVY7QUFDQSxZQUFHd0IsY0FBWUEsU0FBWkEsVUFBNkJBLGNBQVlBLFNBQTVDLFFBQTJEO0FBQ3pEdHdCO0FBREYsZUFHSztBQUNINndCO0FBQ0E5d0I7QUFDRDtBQUNGO0FBQ0Q7OzsrQkFHRmtkLE0sbUJBQU9rVCxDLEVBQUc7QUFDUixnQkFBVSxlQUFWLENBQVUsQ0FBVjs7QUFFQTtBQUNBLFVBQUcsVUFBUSxPQUFYLGdCQUFrQztBQUNoQztBQUNBLFlBQU1odkIsSUFBSSxPQUFLRixTQUFTLE9BQVRBLE9BQXVCLE9BQXRDLE1BQWVBLENBQWY7QUFBQSxZQUNNMUIsSUFBSSxRQURWLENBQ1UsQ0FEVjtBQUFBLFlBRU0wbkIsS0FBSyxNQUFJLE9BRmY7QUFBQSxZQUdNQyxLQUFLLE1BQUksT0FIZjtBQUFBLFlBSU05ZixNQUFNLEtBSlo7O0FBTUFBLDRCQUFvQixPQUFwQkEsT0FBa0MsT0FBbENBO0FBQ0FBO0FBQ0FBLHdCQUFnQixnQ0FBc0IsT0FBdEIsT0FBaEJBLENBQWdCLENBQWhCQTtBQUNBQSx1QkFBZSxPQUFmQSxPQUE2QixPQUE3QkE7QUFDQUE7O0FBRUFBO0FBQ0FBO0FBQ0FBLHdCQUFnQixnQ0FBc0Isa0NBQXdCLE9BQXhCLE9BQXRCLEdBQXNCLENBQXRCLEVBQWdFbkcsU0FBUyxhQUF6Rm1HLElBQWdGbkcsQ0FBaEUsQ0FBaEJtRztBQUNBQSwwQkFBa0IsZ0NBQXNCLGtDQUF3QixPQUF4QixPQUF0QixDQUFzQixDQUF0QixFQUFsQkEsR0FBa0IsQ0FBbEJBO0FBQ0FBO0FBQ0FBO0FBQ0FBLG1CQUFTLFVBQVFuRyxXQUFXLE9BQW5CLENBQVFBLENBQVIsR0FBVG1HO0FBQ0FBO0FBQ0FBO0FBQ0FBLHFCQUFhLGNBQWJBLFlBQWEsQ0FBYkE7O0FBRUEsWUFBTXpFLEtBQU47QUFBQSxZQUFlcytCLEtBQUcsSUFBRWhnQyxLQUFGLEtBekJjLEVBeUJoQyxDQXpCZ0MsQ0F5QkQ7QUFDL0JtRywwQkFBa0IsZ0NBQXNCLGtDQUF3QixPQUF4QixPQUF0QixDQUFzQixDQUF0QixFQUFsQkEsR0FBa0IsQ0FBbEJBO0FBQ0EsYUFBSSxJQUFJaEcsSUFBSixHQUFTOC9CLEtBQVQsR0FBZUMsS0FBRyxNQUF0QixHQUE2Qi8vQixJQUE3QixJQUFtQyxLQUFLKy9CLE1BQUwsS0FBY0QsTUFBakQsSUFBeUQ7QUFDdkQ5NUI7QUFDQUEsMEJBQWdCLGdDQUFzQixrQ0FBd0IsT0FBeEIsT0FBcUMsQ0FBQ3pFLEtBQUQsS0FBM0QsRUFBc0IsQ0FBdEIsRUFBc0UsT0FBS0EsS0FBTCxLQUF0RnlFLEVBQWdCLENBQWhCQTtBQUNBLGNBQU1nNkIsS0FBR25hLEtBQUc5bEIsSUFBRUYsU0FBZCxFQUFjQSxDQUFkO0FBQUEsY0FBNEJvZ0MsS0FBR25hLEtBQUcvbEIsSUFBRUYsU0FBcEMsRUFBb0NBLENBQXBDO0FBQUEsY0FBa0RxZ0MsS0FBR3JhLEtBQUc5bEIsSUFBRUYsU0FBU2lnQyxLQUFuRSxFQUEwRGpnQyxDQUExRDtBQUFBLGNBQTJFc2dDLEtBQUdyYSxLQUFHL2xCLElBQUVGLFNBQVNpZ0MsS0FBNUYsRUFBbUZqZ0MsQ0FBbkY7QUFDQW1HLDhCQUFvQixPQUFLazZCLEtBQXpCbDZCLEVBQW9CLENBQXBCQTtBQUNBQSw4QkFBb0IsT0FBS202QixLQUF6Qm42QixFQUFvQixDQUFwQkE7QUFDQUEsaUNBQXVCbkcsVUFBdkJtRztBQUNBQTtBQUNEO0FBQ0QsWUFBRyxLQUFILFVBQWtCO0FBQ2hCLHdCQUFjLEtBQWQsR0FBc0IsT0FBdEI7QUFDRDtBQUNGOzs7K0JBR0hvNkIsUSx1QkFBVztBQUNULGFBQU8sS0FBUDs7OytCQUdGMzZCLE8sc0JBQVU7QUFDUjtBQUNBO0FBQ0EsYUFBTyxLQUFQO0FBQ0EsYUFBTyxLQUFQOzs7K0JBR0Y0NkIsWSx5QkFBYXorQixDLEVBQUc7QUFDZCxVQUFNSyxJQUFJLGFBQUUsb0JBQWtCLGVBQWxCLG1CQUE4QyxPQUE5QyxTQUFGLGVBQVYsQ0FBVSxDQUFWO0FBQUEsVUFBMkYrRCxNQUFNL0QsYUFBakcsSUFBaUdBLENBQWpHO0FBQUEsVUFDQXRELElBQUksZ0JBQWdCLGFBQVdrQixVQUFVLFFBQVZBLENBQVUsQ0FBVkEsUUFBd0JBLEtBRHZELEVBQ0ksQ0FESjtBQUFBLFVBQ2lFakIsS0FBR0QsS0FBR2lELElBRHZFLENBQ29FakQsQ0FEcEU7QUFEYywyQkFHVyxLQUhYLENBR1csQ0FIWDs7QUFJZDtBQUNBLFdBQUksSUFBSXFCLElBQVIsR0FBYUEsSUFBYixHQUFrQixFQUFsQixHQUF1QjtBQUNyQjtBQUNBZ0csc0JBQWMsS0FBZEEsR0FBc0JoRyxJQUFFLE9BQXhCZ0c7QUFDRDtBQUNEO0FBQ0E7OztBQUdGLG9EQUFrQztBQUFBOztBQUNoQyxVQUFNeWEsS0FBSyxhQUFFLG9EQUFiLGFBQVcsQ0FBWDtBQUNBLGVBQVNBLEdBQVQsQ0FBU0EsQ0FBVDtBQUNBLGVBQVM7QUFDUGlOLFdBRE87QUFFUDl1QixZQUFJLElBRkc7QUFHUGlKLGVBSE87QUFJUHk0Qix3QkFBZ0I7QUFKVCxPQUFUO0FBTUEsaUJBQVcsa0JBQVgsSUFBVyxDQUFYO0FBQ0EsZ0JBQVUsQ0FBQyxDQUFELEdBQUt6Z0MsVUFBZixDQUFVLENBQVY7QUFDQSxlQUFTLE9BQVQ7QUFDRDs7Ozs7b0JBdkhrQjgvQixnQjs7Ozs7Ozs7Ozs7O0FDSnJCOzs7Ozs7OztNQUVxQlksb0I7QUFFbkIscUNBQTJEO0FBQUEsVUFBekNDLGVBQXlDLG9FQUE1QixJQUE0QjtBQUFBLFVBQXRCQyxhQUFzQixvRUFBWDczQixTQUFXOztBQUFBOztBQUN6RDtBQUNBO0FBQ0E7QUFDQSwyQkFBcUI2M0IsY0FBY0Ysa0JBQW5DO0FBQ0E7QUFDRDs7c0JBRU1HLGlCLDhCQUFrQjluQixRLEVBQVU7QUFDakMsYUFBTyxvRUFBUCxFQUFPLENBQVA7OztnQ0FHRm5ULE8sc0JBQVU7QUFDUjtBQUNBO0FBQ0EsYUFBTyxLQUFQOzs7Z0NBR0ZrN0IsVyx3QkFBWXgvQixDLEVBQUc7QUFDYjtBQUNBOzs7Z0NBR0ZvakIsVSx5QkFBYTtBQUNYLFVBQUcsS0FBSCxNQUFjOztBQUVaLGlEQUF5QztBQUN2QzlJLGtCQUR1QztBQUV2QzZGLG1CQUFTLEtBRjhCO0FBR3ZDNkMsa0JBQVE7QUFIK0IsU0FBekM7O0FBTUEsaURBQXlDO0FBQ3ZDeFEsaUJBQU8sbUJBQW1CLEtBRGEsUUFDaEMsQ0FEZ0M7QUFFdkMyTixtQkFBUztBQUY4QixTQUF6Qzs7QUFLQSw2QkFBZ0IsVUFBaEIsUUFBZ0IsRUFBaEIsa0hBQXNDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUE5QmxQLE9BQThCOztBQUNwQyxtQ0FBeUI7QUFDdkJxSixvQkFEdUI7QUFFdkI2RixxQkFGdUI7QUFHdkI2QyxvQkFBUTtBQUhlLFdBQXpCO0FBS0Q7O0FBRUQsdUNBQStCO0FBQzdCN0MsbUJBRDZCO0FBRTdCM04saUJBQU87QUFGc0IsU0FBL0I7O0FBS0Esc0NBQThCO0FBQzVCMk4sbUJBRDRCO0FBRTVCN0Ysa0JBRjRCO0FBRzVCOUgsaUJBQU87QUFIcUIsU0FBOUI7QUFNRDs7Ozs7O29CQTFEZ0I0c0IsaUI7Ozs7Ozs7Ozs7OztBQ0ZyQjs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFFcUJLLHNCOzs7QUFFbkIsb0RBQStCO0FBQUE7O0FBQUEsbURBQzdCLGdDQUQ2QixHQUM3QixDQUQ2Qjs7QUFHN0I7QUFDQSxvQkFBYTtBQUNYdjVCLGlCQUFTO0FBREUsT0FBYjtBQUdBLG1CQUFFLE1BQUYsNERBQW1FLFlBQW5FO0FBQ0EsbUJBQUUsTUFBRixtQkFBMEIsWUFBMUI7QUFSNkI7QUFTOUI7O2tDQUVENUIsTyxzQkFBVTtBQUNSLG1CQUFFLEtBQUYsNkRBQW9FLFdBQXBFO0FBQ0EsbUJBQUUsS0FBRixvQkFBMkIsV0FBM0I7Ozs7OztvQkFmaUJtN0IsbUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIckI7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O01BRXFCQyxrQjtBQUVuQixrREFBMkQ7QUFBQSxVQUExQkMsWUFBMEIsb0VBQWhCLEtBQUtBLFNBQVc7O0FBQUE7O0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLG9CQUFjemxCLE9BQWQ7QUFDQSxxQkFBZSxZQUFmO0FBQ0EseUJBQW1CLEVBQUN4QyxHQUFELEdBQU96VCxHQUExQixDQUFtQixFQUFuQjtBQUNBLDhCQUF3QixvQ0FBeEI7QUFDQSxtQkFBYWlXLE9BQWIsUUFBYUEsRUFBYjtBQUNBOztBQUVBO0FBQ0EsZUFBUyxJQUFJLFlBQWIsT0FBUyxFQUFUO0FBQ0EsZ0JBQVUsSUFBSSxZQUFkLE9BQVUsRUFBVjs7QUFFQTs7QUFFQUEsK0JBQXlCLGlCQUF6QkEsSUFBeUIsQ0FBekJBOztBQUVBLGdCQUFVO0FBQ1IwbEIsWUFEUTtBQUVSQyxZQUZRO0FBR1I1aEMsV0FIUTtBQUlSUCxXQUFHO0FBSkssT0FBVjtBQU1BO0FBQ0E7QUFDQSxVQUFJb2lDLE1BQU0sS0FBVixxQkFBVSxFQUFWO0FBQUEsVUFBd0MvZ0MsSUFBeEM7QUFDQSxtQkFBYSxFQUFDZCxHQUFHLEtBQUc2aEMsUUFBUCxHQUFrQnBpQyxHQUFHLEtBQUdvaUMsUUFBckMsQ0FBYSxFQUFiO0FBQ0Q7OzhCQUVEQyxPLG9CQUFRdFIsRSxFQUFJO0FBQ1YscUJBQWVBLE9BQUssWUFBcEIsS0FBb0IsRUFBcEIsRUFBeUMsQ0FBQ0EsR0FBRCxJQUFNLFlBQS9DLE1BQStDLEVBQS9DOzs7OEJBR0Z1UixTLHNCQUFVaGdDLEMsRUFBRztBQUNYQSxnQkFBVSxLQUFWQTtBQUNBLGFBQU87QUFDTC9CLFdBQUcsTUFBSStCLEVBREY7QUFFTHRDLFdBQUcsTUFBSXNDLEVBQUV0QztBQUZKLE9BQVA7Ozs4QkFNRnVpQyxxQixvQ0FBd0I7QUFDdEIsVUFBTUgsTUFBTSxLQUFaLFdBQVksRUFBWjtBQUFBLFVBQ0VJLEtBQUssQ0FBQ0osUUFBRCxHQUFZQSxRQURuQixDQUNPLENBRFA7QUFBQSxVQUVFejBCLEtBQUssSUFGUCxDQUVPLENBRlA7QUFBQSxVQUdFODBCLEtBQUssQ0FBQ0wsUUFBRCxHQUFZQSxRQUhuQixDQUdPLENBSFA7O0FBS0EsVUFBTTEvQixLQUFOO0FBQUEsVUFBZWdCLE1BQU0sRUFBQzB3QixLQUFELElBQVVELEtBQS9CLEVBQXFCLEVBQXJCO0FBQ0EsK0lBQWlCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFUNXpCLElBQVM7O0FBQ2YseUpBQWlCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUFUUCxJQUFTOztBQUNmLDJKQUFpQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsZ0JBQVQ0TixJQUFTOztBQUNmbEwsb0JBQVEsZUFBZSxpQkFBdkJBLENBQXVCLENBQWYsQ0FBUkE7QUFDRDtBQUNGO0FBQ0Y7O0FBRURBLGNBQVE7QUFBQSxlQUFXd0IsT0FBS3NLLEdBQWhCO0FBQVI5TDtBQUNBZ0Isa0JBQVloQixNQUFaZ0I7QUFDQUEsa0JBQVloQixHQUFHQSxZQUFIQSxHQUFaZ0I7QUFDQWhCLGNBQVE7QUFBQSxlQUFXd0IsT0FBS3NLLEdBQWhCO0FBQVI5TDtBQUNBZ0Isa0JBQVloQixNQUFaZ0I7QUFDQUEsa0JBQVloQixHQUFHQSxZQUFIQSxHQUFaZ0I7O0FBRUFBLGtCQUFZQSxZQUFVQSxRQUF0QkE7QUFDQUEsbUJBQWFBLFlBQVVBLFFBQXZCQTs7QUFFQUEsZ0JBQVU7QUFDUm5ELFdBQUcsT0FBS21ELFlBQVVBLFFBRFYsQ0FDTCxDQURLO0FBRVIxRCxXQUFHLE9BQUswRCxZQUFVQSxRQUFmO0FBRkssT0FBVkE7O0FBS0E7Ozs4QkFHRmcvQixTLHNCQUFVQyxXLEVBQWE7QUFDckI7Ozs4QkFHRlYsUyx3QkFBWTtBQUNWOzs7OEJBR0ZXLFcsd0JBQVk5MUIsQyxFQUFHcW5CLEcsRUFBS0MsRyxFQUFLO0FBQ3ZCLFVBQUl5TyxPQUFKO0FBQ0EsVUFBRy8xQixJQUFILEdBQVE7QUFDTixZQUFHcW5CLE1BQUksQ0FBUCxLQUFhO0FBQ1gwTyxpQkFBTyxPQUFQQTtBQURGLGVBR0ssSUFBR3pPLE1BQUgsS0FBWTtBQUNmeU8saUJBQU8sTUFBUEE7QUFDRDtBQU5ILGFBUUs7QUFDSCxZQUFHMU8sTUFBSSxDQUFQLEtBQWE7QUFDWDBPLGlCQUFPLE9BQVBBO0FBREYsZUFHSyxJQUFHek8sTUFBSCxLQUFZO0FBQ2Z5TyxpQkFBTyxNQUFQQTtBQUNEO0FBQ0Y7QUFDRDs7OzhCQUdGQyxRLHVCQUFXO0FBQ1QsVUFBTVYsTUFBTSxLQUFaLHFCQUFZLEVBQVo7QUFBQSxVQUNFVyxLQUFLLHFCQUFtQlgsSUFEMUI7QUFBQSxVQUVFWSxLQUFLLHFCQUFtQlosSUFGMUI7QUFHQSxhQUFPLElBQUVwaEMsYUFBVCxFQUFTQSxDQUFUOzs7OEJBR0ZpaUMsVSx1QkFBVy9TLEMsRUFBRztBQUFBOztBQUNaLFVBQUlrUyxNQUFNLEtBQVYscUJBQVUsRUFBVjtBQUFBLFVBQ0VXLEtBQUsscUJBQW1CWCxJQUQxQjtBQUFBLFVBRUVZLEtBQUsscUJBQW1CWixJQUYxQjtBQUFBLFVBR0V0MUIsSUFBSTlMLGFBSE4sRUFHTUEsQ0FITjs7QUFLQSxVQUFHLG9CQUFvQkEsU0FBUyxRQUFJLEtBQWJBLFNBQXlCLEtBQWhELEtBQTBEO0FBQ3hELFlBQU1tSixRQUFRLFFBQUksT0FBSyxhQUFXLElBQWxDLENBQWtCLENBQWxCO0FBQ0EsNEJBQW9CLHlCQUF1QjJDLElBQTNDLEtBQW9CLENBQXBCO0FBQ0E7QUFDQTtBQUNBczFCLGNBQU0sS0FBTkEscUJBQU0sRUFBTkE7QUFDRVcsYUFBSyxxQkFBbUJYLElBQXhCVztBQUNBQyxhQUFLLHFCQUFtQlosSUFBeEJZO0FBQ0FsMkIsWUFBSTlMLGFBQUo4TCxFQUFJOUwsQ0FBSjhMO0FBQ0g7O0FBRUQsVUFBTWlrQixLQUFLLEtBQVg7QUFDQSxVQUFHamtCLElBQUUsSUFBRSxLQUFQLEtBQWlCO0FBQ2Zpa0IsZUFBTyxDQUFDcVIsUUFBUnJSLEdBQW1CLENBQUNxUixRQUFwQnJSO0FBREYsYUFHSztBQUNIQSxlQUFPLHFCQUFxQnFSLFFBQXJCLEdBQWdDQSxRQUF2Q3JSLENBQU8sQ0FBUEEsRUFDTyxxQkFBcUJxUixRQUFyQixHQUFnQ0EsUUFEdkNyUixDQUNPLENBRFBBO0FBRUQ7O0FBRUQsVUFBRy92QixVQUFVLGFBQVcsUUFBWCxLQUFzQixhQUFXLFFBQTNDQSxlQUFnRSt2QixjQUFuRSxPQUFzRjtBQUNwRixZQUFJaHhCLEtBQUssSUFBVDtBQUFBLFlBQWVELElBQWY7QUFBQSxZQUFvQixrQkFDZixLQURlO0FBRWxCUyxhQUZrQjtBQUdsQlAsYUFBRztBQUhlLFVBQXBCO0FBS0E0d0IsZ0JBQVE7QUFBQSxpQkFBa0I7QUFDeEJyd0IsZUFBRyxNQUFJd3dCLE9BQUosS0FBWS92QixTQUFTLE1BQVRBLGtCQURTLEdBQ1RBLENBRFM7QUFFeEJoQixlQUFHLE1BQUkrd0IsT0FBSixLQUFZL3ZCLFNBQVMsTUFBVEE7QUFGUyxXQUFsQjtBQUFSNHZCO0FBSUEsZUFBTTl3QixJQUFOLEdBQVc7QUFDVCxjQUFHQSxTQUFILEdBQVc7QUFDVEMsaUJBQUttd0IsSUFBTG53QjtBQUNEO0FBQ0Q2d0IsZUFBSyxtQkFBTEEsRUFBSyxDQUFMQTtBQUNBOXdCO0FBQ0Q7QUFDRDtBQUNBO0FBQ0Q7Ozs4QkFHSHl4QixTLHNCQUFVWCxFLEVBQUk3d0IsRSxFQUFJO0FBQUEsMEJBQ08sd0JBQ3JCLGFBRHFCLEVBQ3JCLENBRHFCLFNBSXJCLENBQUM2d0IsR0FBRCxJQUFRQSxHQUFSLElBQWVBLEdBQWYsR0FBcUJBLEdBTFAsQ0FLZCxDQUpxQixDQURQO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBT2hCO0FBRUVzUixZQUZGLElBRU1DLElBRk4sSUFFVTVoQyxHQUZWLEdBRWFQO0FBRmI7Ozs4QkFNRkgsRSxlQUFHQyxDLEVBQUVvakMsQyxFQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGVBQ2tDLG1CQURsQyxDQUNrQyxDQURsQzs7QUFFTixhQUFPLENBQ0xDLE9BQUtDLEtBREEsSUFFTEQsT0FBS0MsS0FGQSxRQUFQLEVBQU8sQ0FBUDs7OzhCQVFGcG1CLE0sbUJBQU9qZCxFLEVBQUk7QUFDVCxVQUFHLGdCQUFnQixLQUFuQixhQUFxQztBQUNuQztBQUNEOzs7Ozs7b0JBNUxnQmlpQyxlOzs7Ozs7Ozs7Ozs7QUNIckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCcUIsUTs7O0FBRW5CLHVDQUFnQztBQUFBOztBQUFBLG1EQUM5QiwyQkFEOEIsSUFDOUIsQ0FEOEI7O0FBRS9CO0FBQ0EseUJBQWtCbnlCLGNBQWNDLFNBQWhDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBYyxJQUFJLFlBQWxCLE9BQWMsRUFBZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0QkFyQitCLENBcUIvQixDQXJCK0IsQ0FxQlA7QUFDeEIsNEJBQXFCblEsS0F0QlUsRUFzQi9CLENBdEIrQixDQXNCRDs7QUFFOUI7QUFDQTtBQUNBLDhCQUF1QixDQTFCUSxRQTBCL0IsQ0ExQitCLENBMEJHO0FBQ2xDLDhCQTNCK0IsUUEyQi9CLENBM0IrQixDQTJCRTs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOEJBakQrQixHQWlEL0IsQ0FqRCtCLENBaURIOztBQUU1QjtBQUNBLHNCQUFlLGFBQWYsS0FBZSxFQUFmO0FBQ0Esd0JBQWlCLHNCQUFqQixLQUFpQixFQUFqQjtBQUNBLG9CQUFhLGFBQWI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNEJBQXFCLFlBQVk7QUFDaEMsZUFBT3NpQyxVQUFQO0FBREQ7O0FBSUEsZ0NBQXlCLFlBQVk7QUFDcEMsZUFBT0EsVUFBUDtBQUREOztBQUlBLG9CQUFhLFlBQVk7QUFDeEJDLDBCQUFrQkEsTUFBbEJBO0FBQ0FBLG1DQUEyQkEsTUFBM0JBO0FBQ0FBLDRCQUFvQkEsTUFBcEJBOztBQUVBQTtBQUNBQTs7QUFFQUE7QUFSRDs7QUFXQyxzQkFBZSxZQUErQjtBQUFBLFlBQXRCcmQsUUFBc0Isb0VBQWhCLEtBQUtzZCxTQUFXOztBQUM1QyxZQUFNQyxTQUFTLEtBQWY7QUFDQTtBQUNBQztBQUNBO0FBSkY7O0FBT0EscUJBQWMsWUFBK0I7QUFBQSxZQUF0QnhkLFFBQXNCLG9FQUFoQixLQUFLc2QsU0FBVzs7QUFDM0MsWUFBTUMsU0FBUyxLQUFmO0FBQ0E7QUFDQUU7QUFDQTtBQUpGOztBQU9BLHVCQUFnQixZQUFXO0FBQ3pCO0FBREY7O0FBSUEsdUJBQWdCLG9CQUFtQjtBQUNqQ3g1QjtBQURGOztBQUlEO0FBQ0EscUJBQWMsWUFBVztBQUN4QixZQUFJa0QsU0FBUyxJQUFJLFlBQWpCLE9BQWEsRUFBYjtBQUNBO0FBQ0EsWUFBSXUyQixPQUFPLElBQUksWUFBSixnQ0FBMEM1N0IsT0FBMUMsSUFBcUQsSUFBSSxZQUFKLGNBQWhFLENBQWdFLENBQXJELENBQVg7QUFDQSxZQUFJNjdCLGNBQWNELGFBQWxCLE9BQWtCQSxFQUFsQjtBQUNBLFlBQUlFLGVBQWUsSUFBSSxZQUF2QixPQUFtQixFQUFuQjtBQUNBLFlBQUlDLGlCQUFpQixJQUFJLFlBQXpCLFVBQXFCLEVBQXJCOztBQUVBLGVBQU8sa0JBQW1CO0FBQ3pCLGNBQUlDLFdBQVdULGFBQWY7QUFDQWwyQixvQ0FBMEJrMkIsTUFBMUJsMkI7QUFDQTtBQUNBQTtBQUNBO0FBQ0FpMkI7QUFDQSxjQUFHQyxNQUFILFlBQXFCO0FBQ3BCVTtBQUNBO0FBQ0RYLDZCQUFtQlksZUFBbkJaO0FBQ0FBLDJCQUFpQlksZUFBakJaO0FBQ0E7QUFDQUEsNEJBQWtCdGlDLFNBQVN1aUMsTUFBVHZpQyxpQkFBZ0NBLFNBQVN1aUMsTUFBVHZpQyxpQkFBZ0NzaUMsVUFBbEZBLEtBQWtEdGlDLENBQWhDQSxDQUFsQnNpQztBQUNBO0FBQ0FBLDBCQUFnQnRpQyxTQUFTdWlDLE1BQVR2aUMsZUFBOEJBLFNBQVN1aUMsTUFBVHZpQyxlQUE4QnNpQyxVQUE1RUEsR0FBOEN0aUMsQ0FBOUJBLENBQWhCc2lDO0FBQ0FBO0FBQ0FBO0FBQ0E7QUFDQUEsNkJBQW1CdGlDLFNBQVN1aUMsTUFBVHZpQyxhQUE0QkEsU0FBU3VpQyxNQUFUdmlDLGFBQTRCc2lDLFVBQTNFQSxNQUErQ3RpQyxDQUE1QkEsQ0FBbkJzaUM7QUFDQTtBQUNBQztBQUNBbDJCO0FBQ0E7QUFDQUE7QUFDQTIyQix3QkFBY1QsTUFBZFM7QUFDQVQsOEJBQW9CQSxNQUFwQkE7O0FBRUEsY0FBR0Esd0JBQUgsTUFBK0I7QUFDOUJXLG9DQUF3QixJQUFFWCxNQUExQlc7QUFDQUEsa0NBQXNCLElBQUVYLE1BQXhCVztBQUZELGlCQUdPO0FBQ05BO0FBQ0E7O0FBRUQvNUI7QUFDQWc2Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsY0FBR0MsZUFDRk4sK0JBQStCUCxhQUEvQk8sWUFERU0sT0FFRixLQUFJLElBQUVMLG1CQUFtQlIsYUFBekIsVUFBTVEsQ0FBTixJQUZELEtBRTJEOztBQUUxRFI7O0FBRUFPLDhCQUFrQlAsYUFBbEJPO0FBQ0FDLGdDQUFvQlIsYUFBcEJRO0FBQ0FLOztBQUVBO0FBQ0E7QUFDRDtBQXRERDtBQVJELE9BQWMsRUFBZDs7QUFrRUMsc0JBQWUsWUFBVyxDQUExQjs7QUFJRDtBQUNBO0FBQ0E7QUFDQSxVQUFJYixRQUFKO0FBQ0EsVUFBSWMsY0FBYyxFQUFFbDhCLE1BQXBCLFFBQWtCLEVBQWxCO0FBQ0EsVUFBSW04QixNQUFKO0FBQ0E7QUFDQSxVQUFJaEIsWUFBWSxJQUFJLFlBQXBCLFNBQWdCLEVBQWhCO0FBQ0EsVUFBSVksaUJBQWlCLElBQUksWUFBekIsU0FBcUIsRUFBckI7O0FBRUEsVUFBSS81QixRQUFKO0FBQ0EsVUFBSWc2QixZQUFZLElBQUksWUFBcEIsT0FBZ0IsRUFBaEI7QUFDQSxVQUFJQyxjQUFKOztBQUVBLHNDQUFnQztBQUMvQixlQUFPLElBQUlwakMsS0FBSixlQUF3QnVpQyxNQUEvQjtBQUNBOztBQUVELDhCQUF3QjtBQUN2QixlQUFPdmlDLGVBQWV1aUMsTUFBdEIsU0FBT3ZpQyxDQUFQO0FBQ0E7O0FBRUQsaUNBQTJCO0FBQzFCa2pDO0FBQ0E7O0FBRUQsK0JBQXlCO0FBQ3hCQTtBQUNBOztBQUVELFVBQUlLLFVBQVUsWUFBVztBQUN4QixZQUFJamlDLElBQUksSUFBSSxZQUFaLE9BQVEsRUFBUjtBQUNBLGVBQU8seUNBQXlDO0FBQy9DQSw4Q0FEK0MsQ0FDL0NBLEVBRCtDLENBQ1A7QUFDeENBLDJCQUFpQixDQUFqQkE7QUFDQTZoQztBQUhEO0FBRkQsT0FBYyxFQUFkOztBQVNBLFVBQUlLLFFBQVEsWUFBVztBQUN0QixZQUFJbGlDLElBQUksSUFBSSxZQUFaLE9BQVEsRUFBUjtBQUNBLGVBQU8sdUNBQXVDO0FBQzdDQSw4Q0FENkMsQ0FDN0NBLEVBRDZDLENBQ0w7QUFDeENBO0FBQ0E2aEM7QUFIRDtBQUZELE9BQVksRUFBWjs7QUFTQTtBQUNBWixrQkFBWSxZQUFXO0FBQ3RCLFlBQUlsMkIsU0FBUyxJQUFJLFlBQWpCLE9BQWEsRUFBYjtBQUNBLGVBQU8sNkJBQTZCO0FBQ25DLGNBQUl1RCxVQUFVMnlCLE1BQWQ7QUFDQSxjQUFHQSx3QkFBd0IsWUFBM0IsbUJBQW9EO0FBQ25EO0FBQ0EsZ0JBQUlTLFdBQVdULGFBQWY7QUFDQWwyQixzQ0FBMEJrMkIsTUFBMUJsMkI7QUFDQSxnQkFBSW8zQixpQkFBaUJwM0IsT0FBckIsTUFBcUJBLEVBQXJCO0FBQ0E7QUFDQW8zQiw4QkFBa0J6akMsU0FBVXVpQyxtQkFBRCxDQUFDQSxHQUF3QnZpQyxLQUF6QixFQUFDdWlDLEdBQTVCa0IsS0FBa0J6akMsQ0FBbEJ5akM7QUFDQTtBQUNBRixvQkFBUSw4QkFBOEIzekIsUUFBdEMyekIsY0FBNERoQixhQUE1RGdCO0FBQ0FDLGtCQUFNLDhCQUE4QjV6QixRQUFwQzR6QixjQUEwRGpCLGFBQTFEaUI7QUFURCxpQkFVTyxJQUFHakIsd0JBQXdCLFlBQTNCLG9CQUFxRDtBQUMzRDtBQUNBZ0Isb0JBQVFHLFVBQVNuQixxQkFBbUJBLGFBQTVCbUIsUUFBaURuQixhQUFqRG1CLE9BQXFFOXpCLFFBQTdFMnpCLGFBQWtHaEIsYUFBbEdnQjtBQUNBQyxrQkFBTUcsVUFBU3BCLG1CQUFpQkEsYUFBMUJvQixVQUFpRHBCLGFBQWpEb0IsT0FBcUUvekIsUUFBM0U0ekIsY0FBaUdqQixhQUFqR2lCO0FBSE0saUJBSUE7QUFDTjtBQUNBN2hDO0FBQ0E0Z0M7QUFDQTtBQXBCRjtBQUZEQSxPQUFZLEVBQVpBOztBQTBCQSxtQ0FBNkI7QUFDMUIsWUFBR0Esd0JBQXdCLFlBQTNCLG1CQUFvRDtBQUNyRHA1QjtBQURDLGVBRUssSUFBR281Qix3QkFBd0IsWUFBM0Isb0JBQXFEO0FBQzNEQSw4QkFBb0J2aUMsU0FBU3VpQyxNQUFUdmlDLFNBQXdCQSxTQUFTdWlDLE1BQVR2aUMsU0FBd0J1aUMsb0JBQXBFQSxVQUE0Q3ZpQyxDQUF4QkEsQ0FBcEJ1aUM7QUFDQUE7QUFDQWE7QUFITSxlQUlBO0FBQ056aEM7QUFDQTRnQztBQUNBO0FBQ0Q7O0FBRUQsb0NBQThCO0FBQzNCLFlBQUdBLHdCQUF3QixZQUEzQixtQkFBb0Q7QUFDckRwNUI7QUFEQyxlQUVLLElBQUdvNUIsd0JBQXdCLFlBQTNCLG9CQUFxRDtBQUMzREEsOEJBQW9CdmlDLFNBQVN1aUMsTUFBVHZpQyxTQUF3QkEsU0FBU3VpQyxNQUFUdmlDLFNBQXdCdWlDLG9CQUFwRUEsVUFBNEN2aUMsQ0FBeEJBLENBQXBCdWlDO0FBQ0FBO0FBQ0FhO0FBSE0sZUFJQTtBQUNOemhDO0FBQ0E0Z0M7QUFDQTtBQUNEOztBQUVBOztBQUVBLG1DQUE2QjtBQUMzQixZQUFHQSxpQkFBaUJBLE1BQWpCQSxnQkFBdUM5aEMsZUFBMUMsUUFBK0Q7QUFDN0QsY0FBSW1QLFVBQVUyeUIsTUFBZDtBQUNBO0FBQ0FVLHFCQUFXLElBQUlqakMsS0FBSixLQUFjUyxLQUFkLEtBQXdCbVAsUUFBeEIsY0FBOEMyeUIsTUFBekRVO0FBQ0E7QUFDQVcsbUJBQVMsSUFBSTVqQyxLQUFKLEtBQWNTLEtBQWQsS0FBd0JtUCxRQUF4QixlQUErQzJ5QixNQUF4RHFCO0FBQ0FyQjtBQUNEO0FBQ0Y7O0FBRUQsZ0NBQTBCO0FBQ3hCLFlBQUdBLGlCQUFpQkEsTUFBakJBLGFBQW9DOWhDLGVBQXZDLFFBQTREO0FBQzFEOGhDLG9CQUFVOWhDLEtBQVY4aEMsSUFBbUI5aEMsS0FBbkI4aEM7QUFDQUE7QUFDRDtBQUNGOztBQUVELHdDQUFrQztBQUNoQyxZQUFHQSxpQkFBaUJBLE1BQWpCQSxjQUFxQzloQyxlQUF4QyxRQUE2RDtBQUMzRCxjQUFHQSxVQUFILEdBQWM7QUFDWmlpQztBQURGLGlCQUVPLElBQUdqaUMsVUFBSCxHQUFjO0FBQ25Ca2lDO0FBQ0Q7QUFDREo7QUFDRDtBQUNGOztBQUVELGlDQUEyQjtBQUN6QixZQUFHQSxpQkFBaUJBLE1BQXBCLFlBQXNDO0FBQ3BDLGNBQUdzQixlQUFILEdBQW1CO0FBQ2pCbEI7QUFERixpQkFFTyxJQUFHa0IsZUFBSCxHQUFtQjtBQUN4Qm5CO0FBQ0Q7QUFDREg7QUFDRDtBQUNGOztBQUVELHNCQUFlO0FBQ2JsZCxnQkFEYTtBQUViRyxhQUZhO0FBR2JzZSxxQkFIYTtBQUliQztBQUphLE9BQWY7O0FBT0Q7QUFDQTtBQWxVK0I7QUFtVS9COzs7SUFyVWdDLFlBQU1udkIsZTs7b0JBQXBCeXRCLEs7Ozs7Ozs7Ozs7OztBQ0ZyQjs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCMkIsVzs7O0FBRW5CLDZEQUFtRDtBQUFBOztBQUFBLG1EQUNqRCw4Q0FEaUQsS0FDakQsQ0FEaUQ7O0FBR2pEO0FBQ0E7QUFDQTtBQUNBLGdCQUFTLEVBQUN6a0MsR0FBRCxHQUFPUCxHQUFQLEdBQWE0TixHQUFiLEdBQW1CYixLQUFLLHNCQUFnQjtBQUMvQyxxQkFBVSxXQUFVO0FBQ3BCO0FBRk8sV0FHTms0QixXQUFXLHNCQUFZO0FBQ3hCLGNBQU0xa0MsSUFBRWdCLFlBQVUsS0FBVkEsSUFBaUJBLFlBQVUsS0FBM0JBLElBQWtDQSxZQUFVLEtBQXBEO0FBQUEsY0FDTXZCLElBQUV1QixZQUFVLEtBQVZBLElBQWlCQSxZQUFVLEtBQTNCQSxJQUFrQ0EsWUFBVSxLQURwRDtBQUFBLGNBRU1xTSxJQUFFck0sWUFBVSxLQUFWQSxJQUFpQkEsWUFBVSxLQUEzQkEsSUFBa0NBLFlBQVUsS0FGcEQ7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQVZGLFNBQVMsRUFBVDtBQVlBLGdCQUFTLEVBQUNBLEdBQUcsQ0FBQyxPQUFELENBQUMsQ0FBRCxFQUFTLE9BQVQsQ0FBUyxDQUFULEVBQWlCLE9BQXJCLENBQXFCLENBQWpCLENBQUosRUFBK0J3TCxLQUFLLDBEQUE4QztBQUN6RixtQkFBTyxDQUFDLFdBQUQsR0FBQyxDQUFELEVBQWUsV0FBZixHQUFlLENBQWYsRUFBNkIsV0FBcEMsR0FBb0MsQ0FBN0IsQ0FBUDtBQUNBO0FBRkYsU0FBUyxFQUFUOztBQUtBLDBCQUFtQixZQUFLO0FBQ3RCLDZCQUFvQixrQkFBcEIsS0FBb0IsQ0FBcEI7QUFERjtBQUdBdUgsNkJBQ087QUFBQSxlQUFLLHFCQUFvQixnQkFBekIsS0FBeUIsQ0FBcEIsQ0FBTDtBQURQQTtBQTFCaUQ7QUE0QmxEOzt1QkFFRGlKLFEscUJBQVNULEssRUFBTztBQUNkLG1CQUFhQSxNQUFiLElBQWFBLEVBQWI7QUFDQSxVQUFHLEtBQUgsYUFBcUI7QUFDbkIscUJBQWEsS0FBYjtBQUNBO0FBQ0Q7Ozt1QkFHSG9vQixRLHFCQUFTaGtDLEMsRUFBRztBQUNWLGFBQU87QUFDTGdKLGVBQU9oSixPQUFLQSxFQURQLENBQ09BLENBRFA7QUFFTCtGLGdCQUFRL0YsT0FBS0E7QUFGUixPQUFQOzs7dUJBTUZpa0MsVSx1QkFBVzVqQyxDLEVBQUdjLEMsRUFBR1gsQyxFQUFHO0FBQ2xCLFVBQU1nRSxPQUFOO0FBQUEsVUFBaUJwRCxJQUFJLEtBQXJCO0FBQ0FBLFlBQU1ELEVBQU5DLEdBQVdELEVBQVhDO0FBQ0FvRCxnQkFBVSxFQUFDbkYsR0FBRytCLEVBQUosR0FBU3RDLEdBQUdzQyxFQUF0Qm9ELENBQVUsRUFBVkE7QUFDQXBELFlBQU1ELEVBQU5DLEdBQVdELE1BQUlYLEVBQWZZO0FBQ0FvRCxnQkFBVSxFQUFDbkYsR0FBRytCLEVBQUosR0FBU3RDLEdBQUdzQyxFQUF0Qm9ELENBQVUsRUFBVkE7QUFDQXBELFlBQU1ELE1BQUlYLEVBQVZZLE9BQW1CRCxNQUFJWCxFQUF2Qlk7QUFDQW9ELGdCQUFVLEVBQUNuRixHQUFHK0IsRUFBSixHQUFTdEMsR0FBR3NDLEVBQXRCb0QsQ0FBVSxFQUFWQTtBQUNBcEQsWUFBTUQsTUFBSVgsRUFBVlksT0FBbUJELEVBQW5CQztBQUNBb0QsZ0JBQVUsRUFBQ25GLEdBQUcrQixFQUFKLEdBQVN0QyxHQUFHc0MsRUFBdEJvRCxDQUFVLEVBQVZBO0FBQ0E7Ozt1QkFHRitCLGUsOEJBQWtCO0FBQ2hCLGFBQU8sS0FBUDs7O3VCQUdGd29CLFEscUJBQVMvbkIsQyxFQUFHZ0wsRyxFQUFLM1MsQyxFQUFHUCxDLEVBQUc7QUFDckIsVUFBRyxLQUFILGdCQUF3QjtBQUN0Qix1Q0FBK0IsRUFBQ2tULEtBQUQsS0FBTTNTLEdBQU4sR0FBU1AsR0FBeEMsQ0FBK0IsRUFBL0I7QUFDRDs7O3VCQUdIb2xDLGMsMkJBQWVDLEssRUFBTztBQUFBOztBQUNwQixVQUFNdmxDLElBQUksY0FBVjtBQUFBLFVBQ0V3bEMsVUFERjtBQUVBLGlCQUNFeGxDLEVBREYsQ0FDRUEsQ0FERixFQUNPQSxFQURQLENBQ09BLENBRFAsS0FFRUEsRUFGRixDQUVFQSxDQUZGLEVBRU9BLEVBRlAsQ0FFT0EsQ0FGUCxLQUdFQSxFQUhGLENBR0VBLENBSEYsRUFHT0EsRUFIUCxDQUdPQSxDQUhQOztBQUtBLGtKQUF1QjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBZit0QixPQUFlOztBQUNyQixZQUFJQSxpQkFBSixRQUEyQjtBQUN6QixjQUFNMFgsT0FBTzFYLEtBQWI7QUFBQSxjQUNFMlgsT0FBTztBQUNMamxDLGVBQUdnbEMsS0FERSxDQUNGQSxDQURFO0FBRUx2bEMsZUFBR3VsQztBQUZFLFdBRFQ7QUFBQSxjQUtFRSxNQUFNLGNBTFIsSUFLUSxDQUxSO0FBTUEsY0FBTXhsQixVQUFTLHlCQUFlLGdCQUFnQixLQUFoQixrQkFBdUM7QUFBQSxtQkFBTyxFQUFDMWYsR0FBRzhCLE1BQUksZ0JBQVIsT0FBNkJyQyxHQUFHLElBQUVxQyxNQUFJLGdCQUE3QyxNQUFPLEVBQVA7QUFBckUsV0FBOEIsQ0FBZixDQUFmO0FBQ0E0ZDtBQUNBQSw2QkFBa0Isa0JBQWxCQSxJQUFrQixDQUFsQkE7QUFDQXFsQjtBQUNEO0FBQ0Y7QUFDRCxVQUFHQSxRQUFILFFBQW1CO0FBQ2pCLDhCQUFzQixtQ0FBeUIsS0FBekIsS0FBbUMsS0FBbkMsS0FBNkMscUJBQTdDLE1BQThELEtBQXBGLElBQXNCLENBQXRCO0FBQ0EsOEpBQTJCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUFuQnJsQixTQUFtQjs7QUFDekI7QUFDRDtBQUNGOzs7dUJBR0h5bEIsTyxvQkFBUUMsVyxFQUFhO0FBQ25CO0FBQ0EsVUFBRyxlQUFILElBQW9CO0FBQ2xCLHNCQUFjLHFCQUFXLHNCQUFzQjtBQUFBLGlCQUFTdFgsS0FBVDtBQUFqQyxTQUFXLENBQVgsRUFBcUQsS0FBckQsT0FBaUUsRUFBQzlXLFVBQWhGLEtBQStFLEVBQWpFLENBQWQ7QUFDRDs7O3VCQUdIcXVCLFUseUJBQWE7QUFBQTs7QUFDWCxVQUFHLEtBQUgsUUFBZ0I7QUFDZCxZQUFNdjlCLE9BQU8sVUFBYjtBQUFBLFlBQ0V3OUIsU0FBUyxxRkFEWCxNQUNXLENBRFg7QUFBQSxZQUM4RkMsVUFBVUQsT0FEeEcsQ0FDd0dBLENBRHhHO0FBQUEsWUFFRUUsYUFBYUYsZ0JBRmY7QUFHQSw4QkFBZSxZQUFmLE9BQWUsRUFBZix5SEFBc0M7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLGNBQTlCRyxNQUE4Qjs7QUFDbEMsY0FBTTNYLE9BQU8sdUJBQXVCMlgsSUFBcEMsS0FBYSxDQUFiO0FBQUEsY0FDTWxtQyxJQUFJZCxxQkFBcUIsY0FBckJBLFdBQThDcXZCLEtBRHhELFNBQ1VydkIsQ0FEVjtBQUFBLGNBRU1nUyxRQUFRLHdCQUF3QnFkLEtBRnRDLFFBRWMsQ0FGZDtBQUFBLGNBR01yakIsUUFBUWhLLFdBQVdsQixFQUFYa0IsQ0FBV2xCLENBQVhrQixFQUFpQmxCLEVBQWpCa0IsQ0FBaUJsQixDQUFqQmtCLEtBQXdCZ1EsaUJBQWdCaFEsVUFBaEJnUSxJQUh0QyxDQUdjaFEsQ0FIZDtBQUFBLGNBSU1pbEMsYUFBYWpsQyxVQUFXbEIsT0FBT0EsRUFBUixDQUFRQSxDQUFQQSxHQUFnQkEsT0FBT0EsRUFKckQsQ0FJcURBLENBQWxDa0IsQ0FKbkI7QUFBQSxjQUtNa2xDLGFBQWFsMUIsZUFDQ0EsZUFEREEsYUFFRUEsZ0JBQWUsQ0FBQyxJQUFJQSxNQUFMLFdBQWZBLGFBUHJCO0FBUUE2MEIsc0JBQVl4WCxtQkFBbUIyWCxJQUFuQjNYLHFCQUF3Q0EsZ0JBQWdCMlgsSUFBaEIzWCxRQUE0QjJYLElBQXBFM1gsTUFBd0NBLENBQXhDQSxlQUEwRkEsZ0JBQWdCMlgsYUFBV0EsSUFBaklILE1BQXNHeFgsQ0FBdEd3WDs7QUFFQUMsbUNBQXlCRyxhQUF6Qkg7QUFDQUEscUNBQTJCOTBCLE1BQTNCODBCOztBQUVBLGNBQU1LLFdBQVdOLFlBQWpCLE1BQWlCQSxDQUFqQjtBQUFBLGNBQ0lPLFNBQVNwMUIsaUJBQWdCcWQsY0FBWSxjQUE1QnJkLFFBQWlEcWQsYUFBVyxjQUR6RTtBQUFBLGNBRUlua0IsUUFBUTI3QixPQUZaLEtBRVlBLEVBRlo7QUFBQSxjQUdJUSxpQkFBaUIsQ0FBQ0YseUJBQUQsY0FIckI7QUFJQSx1Q0FHRXJtQyxPQUFLb21DLGFBQVdsbEMsU0FIbEIsS0FHa0JBLENBSGxCLEVBR2tDbEIsT0FBS29tQyxhQUFXbGxDLFNBSGxELEtBR2tEQSxDQUhsRDtBQUlBLGNBQUkwRSxPQUFPLGdCQUFnQixLQUFoQixHQUF3QixFQUFDbkYsR0FBRzhsQyxpQkFBSixRQUEyQnJtQyxHQUFuRCxDQUF3QixFQUF4QixFQUEwRCxFQUFDa0ssT0FBT2s4QixTQUFPRCxTQUFQQyxLQUFPRCxFQUFQQyxHQUFSLE9BQXVDbi9CLFFBQVFrL0IsU0FBcEgsTUFBb0hBLEVBQS9DLEVBQTFELENBQVg7QUFDQXpnQyxpQkFBTyxTQUFTO0FBQUEsbUJBQU8sRUFBQ25GLEdBQUc4QixNQUFJLGdCQUFSLE9BQTZCckMsR0FBRyxJQUFFcUMsTUFBSSxnQkFBN0MsTUFBTyxFQUFQO0FBQWhCcUQsV0FBTyxDQUFQQTtBQUNBO0FBQ0g7QUFDRG1nQztBQUNEOzs7dUJBR0hTLE8sb0JBQVFwK0IsQyxFQUFHekcsSSxFQUFNO0FBQ2YsVUFBRyxhQUFILGVBQStCO0FBQzdCLG1DQUEyQjtBQUN6QjBHLGdCQUR5QjtBQUV6QjA4QixpQkFGeUI7QUFHekIwQixzQkFBWTlrQyxZQUFZb3NCO0FBSEMsU0FBM0I7QUFLRDs7O3VCQUdIMlksWSwyQkFBZTtBQUNiLFVBQU1yOEIsUUFBUSxrQ0FBd0IsVUFBeEIsT0FBeUMsVUFBekMsUUFBMkQsS0FBM0QsTUFBc0UsS0FBcEYsSUFBYyxDQUFkO0FBQ0EsVUFBRyxDQUFDLEtBQUQsWUFBa0JuSixTQUFTLHNCQUFUQSxTQUFyQixNQUErRDtBQUM3RCx3QkFBZ0Isc0JBQWhCLEtBQWdCLENBQWhCO0FBQ0EsWUFBRyxjQUFILFFBQXVCO0FBQ3JCLGNBQUcsY0FBSCxTQUF3QjtBQUN0QixxQ0FBeUIsTUFBSSxjQUE3QjtBQUNBLDBDQUE4QixNQUFJLGNBQWxDO0FBQ0Q7QUFDRDtBQUNEO0FBQ0Qsb0JBQVksYUFBYSxjQUF6QjtBQUNBLG9CQUFZLGNBQWMsY0FBMUI7QUFDRDs7O3VCQUdIaVMsSSxtQkFBTztBQUFBOztBQUNMLGtCQUFZLHFCQUFxQixLQUFqQyxDQUFZLENBQVo7QUFDQSx1QkFBaUIsS0FBakIsUUFDTyxnQkFBUztBQUNaO0FBQ0Esc0JBQVksMEJBQVosSUFBWSxDQUFaO0FBQ0EsWUFBRyxnQkFBSCxRQUF1QjtBQUNyQjtBQUNEO0FBQ0R6SSxtQ0FDTywyQkFEUEEsTUFDTyxDQURQQTtBQUVBQSxtQ0FDTyxvQkFEUEEsTUFDTyxDQURQQTtBQUVBO0FBQ0E7QUFaSixlQWNRLGFBQU07QUFDVjdILHNCQUFjLDRCQUEwQixXQUF4Q0EsQ0FBYyxDQUFkQTtBQUNBO0FBaEJKOzs7dUJBb0JGZ0UsYSwwQkFBY2pELEcsRUFBSztBQUNqQjtBQUNBLFVBQUcsS0FBSCxNQUFjO0FBQ1o7QUFDRDs7O3VCQUdIazlCLE0sbUJBQU83b0IsTyxFQUFTO0FBQUE7O0FBQ2QsVUFBRyxLQUFILE1BQWM7QUFDWix5QkFBaUI7QUFDZjB1Qix5QkFBZSxLQURBLE9BQ0EsRUFEQTtBQUVmQyxvQkFBVSxLQUFLQTtBQUZBLFNBQWpCLE9BSUssWUFBSztBQUNSO0FBQ0E7QUFDQTtBQVBGO0FBREYsYUFXSztBQUNIO0FBQ0E7QUFDRDs7Ozs7O29CQXBOZ0IxQixROzs7Ozs7Ozs7Ozs7QUNUckI7Ozs7Ozs7O01BRXFCMkIsUztBQUVuQixzQ0FBOEI7QUFBQTs7QUFDNUI7QUFDQTtBQUNBO0FBQ0E1UjtBQVlBLG1CQUFhQSxlQUFiLGNBQWFBLENBQWI7QUFDQSxxQkFBZUEsZUFBZixVQUFlQSxDQUFmO0FBQ0Esb0JBQWNBLGVBQWQsU0FBY0EsQ0FBZDs7QUFFQSxtQkFBYTtBQUNYNlIsa0JBQVUsbUJBREMsSUFDRCxDQURDO0FBRVhDLGlCQUFTO0FBRkUsT0FBYjs7QUFLQSwrQkFBeUIsV0FBekI7QUFDQSwrQkFBeUIsV0FBekI7QUFDRDs7cUJBRURqZ0MsTyxzQkFBVTtBQUNSLGdDQUEwQixXQUExQjtBQUNBLGdDQUEwQixXQUExQjs7O3FCQUdGZ2dDLFEscUJBQVMxK0IsQyxFQUFHO0FBQ1ZBO0FBQ0EsVUFBRyxvQkFBSCxXQUFnQztBQUM5QixZQUFJK1gsU0FBUyxhQUFFL1gsRUFBZixNQUFhLENBQWI7QUFDQSxZQUFHLENBQUMrWCxnQkFBSixRQUFJQSxDQUFKLEVBQStCO0FBQzdCLGNBQU1uZ0IsSUFBSW1nQixZQUFWLFNBQVVBLENBQVY7QUFDQSxjQUFHbmdCLEVBQUgsUUFBYTtBQUNYbWdCO0FBREYsaUJBR0s7QUFDSCxtQkFBTUEsaUJBQWlCLENBQUNBLGdCQUF4QixRQUF3QkEsQ0FBeEIsRUFBbUQ7QUFDakRBLHVCQUFTLGFBQUVBLFVBQVhBLFVBQVMsQ0FBVEE7QUFDRDtBQUNGO0FBQ0Y7QUFDRCxZQUFNelYsT0FBT3lWLFlBQWIsTUFBYUEsQ0FBYjtBQUNBLFlBQUd6VixTQUFILFdBQXFCO0FBQ25CLDBCQUFnQmtSLFNBQWhCLElBQWdCQSxDQUFoQjtBQUNEO0FBQ0Y7OztxQkFHSG1yQixPLHNCQUFVO0FBQUE7O0FBQ1IsVUFBRyxLQUFILFNBQWlCO0FBQ2YsWUFBTUMsYUFBYSxrQkFBa0I3eUIsS0FBckMsR0FBcUNBLEVBQXJDO0FBQ0FDLG1CQUFXLFlBQUs7QUFDZCxjQUFHNHlCLGVBQWUsTUFBbEIsWUFBbUM7QUFDakMsMEJBQWEscUJBQWIsSUFBYSxFQUFiO0FBQ0Q7QUFISDV5QjtBQUtEOzs7cUJBR0g2eUIsVSx1QkFBV3pyQixPLEVBQVN1QixRLEVBQVU7QUFDNUIsVUFBRywyQkFBMkJ2QixlQUFhLGlCQUEzQyxDQUEyQyxDQUEzQyxFQUFnRTtBQUM5RDtBQUNBO0FBQ0Q7QUFDRCxVQUFNMHJCLFFBQU47QUFDQSxXQUFJLElBQUk3bEMsSUFBRSxpQkFBVixRQUFtQ0EsSUFBRW1hLFFBQXJDLFFBQXFELEVBQXJELEdBQTBEO0FBQ3hELFlBQU13aEIsU0FBU3hoQixRQUFmLENBQWVBLENBQWY7QUFDQTByQixtQkFBVywrQkFBNkJsSyxPQUE3QixPQUFYa0s7QUFDRUE7QUFDRUEsbUJBQVcsVUFBUWxLLHFCQUFSLGFBQVFBLENBQVIsR0FBWGtLO0FBQ0ZBO0FBQ0ZBO0FBQ0Q7QUFDRCxtQkFBRUEsV0FBRixFQUFFQSxDQUFGLFdBQTJCLEtBQTNCO0FBQ0E7QUFDQSxVQUFHbnFCLGFBQUgsV0FBeUI7QUFDdkI7QUFERixhQUdLO0FBQ0gseUJBQWlCQSxvQkFBZ0IsS0FBakM7QUFDRDs7Ozs7O29CQTFGZ0I4cEIsTTs7Ozs7Ozs7Ozs7O0FDRnJCOztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCTSxjOzs7QUFFbkIsNkRBQWdEO0FBQUE7O0FBQUEsbURBQzlDLDhDQUQ4QyxLQUM5QyxDQUQ4Qzs7QUFHOUM7QUFDQSxvQkFBYSxJQUFiLEtBQWEsRUFBYjtBQUNBO0FBQ0EsOEJBQXVCLFlBQUs7QUFDMUIsc0JBQWEsWUFBYjtBQUNBLHVCQUFjLFlBQWQ7QUFDQSw0QkFBbUIsWUFBSztBQUN0Qiw0QkFBaUIsTUFBakI7QUFDQTtBQUZGO0FBSUE7QUFQRjtBQVNBLCtCQUF3QixZQUFLO0FBQzNCLDRCQUFtQixZQUFLO0FBQ3RCO0FBQ0E7QUFGRjtBQUlBO0FBTEY7QUFPQSxtQkFBRSxNQUFGLGtCQUF5QixZQUF6Qix1QkFBMkQsWUFBM0Q7QUFDQSx3QkFBaUIsNkJBQWpCLEdBQWlCLENBQWpCO0FBdkI4QztBQXdCL0M7OzBCQUVEcmdDLE8sc0JBQVU7QUFDUixtQkFBRSxLQUFGLG1CQUEwQixXQUExQix3QkFBNkQsV0FBN0Q7QUFDQTtBQUNBLGFBQU8sS0FBUDtBQUNBOzs7Ozs7b0JBaENpQnFnQyxXOzs7Ozs7Ozs7Ozs7QUNKckI7Ozs7Ozs7O01BRXFCQyxrQjtBQUNuQixxRkFBb0U7QUFBQTs7QUFFbEUsVUFBTXByQixVQUFVLElBQUksWUFBcEIsT0FBZ0IsRUFBaEI7QUFDQUEsMEJBQW9CLFlBQXBCQTtBQUNBQTtBQUNBQTs7QUFFRDtBQUNDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FBLHlCQUFtQixJQUFFLEtBQXJCQSxpQkFBMkMsSUFBRSxLQUE3Q0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7OEJBRURrQixNLG1CQUFPbXFCLFEsRUFBVTtBQUNmO0FBQ0EsYUFBTSwwQkFBMEIsS0FBaEMscUJBQTBEO0FBQ3hELG1DQUEyQixLQUEzQjtBQUNBLFVBQUUsS0FBRjtBQUNBLFlBQUcsb0JBQW9CLEtBQXZCLGVBQ0U7QUFDRixZQUFJQyxnQkFBZ0IsbUJBQWlCLEtBQXJDO0FBQ0EsZ0NBQXdCQSxnQkFBYyxLQUF0QztBQUNBLFlBQUlDLGFBQWFybUMsV0FBVyxtQkFBaUIsS0FBN0MsZUFBaUJBLENBQWpCO0FBQ0EsZ0NBQXdCcW1DLGFBQVcsS0FBbkM7QUFDRDs7OzhCQUdIemdDLE8sc0JBQVU7QUFDUixVQUFNMGdDLE1BQU0sYUFBWjtBQUNBQSxtQkFBYUEsWUFBYkE7QUFDQTs7Ozs7O29CQTdDaUJKLGU7Ozs7Ozs7Ozs7OztBQ0ZyQjs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BR3FCSywyQjs7O0FBRW5CLG1FQUF5QztBQUFBOztBQUFBLG1EQUN2QywwQ0FBZ0JDLFlBRHVCLE9BQ3ZDLENBRHVDOztBQUV2QyxxQ0FBb0IsK0NBQXBCLElBQW9CLENBQXBCO0FBRnVDO0FBR3hDOzt1Q0FFRHovQixXLHdCQUFZQyxNLEVBQVE7QUFDbEIsYUFBT0EsdUJBQVA7Ozt1Q0FHRmsyQixrQiwrQkFBbUJoMkIsQyxFQUFHO0FBQ3BCLFVBQU1pdkIsV0FBVyxhQUFFLEtBQW5CLE9BQWlCLENBQWpCO0FBQ0EsVUFBTTlwQixTQUFTOHBCLFNBQWYsTUFBZUEsRUFBZjtBQUNBLHNCQUFpQixDQUFDanZCLFVBQVFtRixPQUFULFFBQXNCOHBCLFNBQXZCLEtBQXVCQSxFQUF0QixHQUFELENBQUMsR0FBakI7QUFDQSxzQkFBZ0IsRUFBRSxDQUFDanZCLFVBQVFtRixPQUFULE9BQXFCOHBCLFNBQXZCLE1BQXVCQSxFQUF2QixRQUFoQjtBQUNBLGFBQU8sS0FBUDs7Ozs7O29CQWhCaUJvUSx3Qjs7Ozs7Ozs7Ozs7O0FDTnJCOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFHcUJFLDJCOzs7QUFFbkIsbUVBQXlDO0FBQUE7O0FBQUEsbURBQ3ZDLDBDQUFnQkQsWUFEdUIsT0FDdkMsQ0FEdUM7O0FBRXZDLHFDQUFvQiwrQ0FBcEIsSUFBb0IsQ0FBcEI7QUFGdUM7QUFHeEM7O3VDQUVEei9CLFcsd0JBQVlDLE0sRUFBUTtBQUNsQixhQUFPQSx1QkFBUDs7O3VDQUdGazJCLGtCLCtCQUFtQmgyQixDLEVBQUc7QUFDcEIsVUFBTWl2QixXQUFXLGFBQUUsS0FBbkIsT0FBaUIsQ0FBakI7QUFBQSxVQUFrQzlwQixTQUFTOHBCLFNBQTNDLE1BQTJDQSxFQUEzQztBQUFBLFVBQ0VvSCxVQUFVcjJCLGFBQWFBLGdCQUR6QjtBQUFBLFVBQ2tENGUsUUFBUXlYLGlCQUFnQkEsUUFBaEJBLENBQWdCQSxDQUFoQkEsR0FBNEIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFDcmhCLE9BQUQsR0FBV0MsT0FBakMsQ0FBc0IsRUFBRCxDQUFyQixFQUR0RixDQUNzRixDQUR0RjtBQUFBLFVBRUVELFFBQVE0SixNQUZWO0FBQUEsVUFFdUIzSixRQUFRMkosTUFGL0I7QUFHQSx5QkFBbUJ5WCwyQkFBeUIsS0FBNUM7QUFDQSxzQkFBaUIsQ0FBQ3JoQixRQUFNN1AsT0FBUCxRQUFvQjhwQixTQUFyQixLQUFxQkEsRUFBcEIsR0FBRCxDQUFDLEdBQWpCO0FBQ0Esc0JBQWdCLEVBQUUsQ0FBQ2hhLFFBQU05UCxPQUFQLE9BQW1COHBCLFNBQXJCLE1BQXFCQSxFQUFyQixRQUFoQjtBQUNBLGFBQU8sS0FBUDs7Ozs7O29CQWxCaUJzUSx3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ05yQjs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7TUFFcUJDLGE7QUFFbkIsaUVBQTZFO0FBQUE7O0FBQUEsVUFBeEJ0OEIsUUFBd0Isb0VBQWxCLEVBQUM4TyxPQUFPLE1BQVIsS0FBa0I7O0FBQUE7O0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQWMseUJBQWQsQ0FBYyxDQUFkO0FBQ0EsMEJBQW9CO0FBRWxCeFMsc0JBQWMsS0FGSTtBQUdsQkMseUJBQWlCO0FBSEMsU0FBcEI7QUFLQTtBQUNBLFdBQUksSUFBSXhHLElBQVIsR0FBYUEsSUFBYixNQUFxQixFQUFyQixHQUEwQjtBQUN4QixZQUFNd0ksT0FBTyxtQkFBYixDQUFhLENBQWI7QUFDQTtBQUVFNEksaUJBRkY7QUFHRWtGLGtCQUFROU4sY0FIVjtBQUlFZytCLG1CQUpGO0FBS0VDLHFCQUxGO0FBTUVsUyxpQkFBTy9yQixjQUFjeEk7QUFOdkI7QUFRRDs7QUFFRCxtQkFBYTtBQUNYNmIsZ0JBQVEsaUJBREcsSUFDSCxDQURHO0FBRVg0cEIsa0JBQVUscUJBQU07QUFDZDErQjtBQUNBLGNBQUcsTUFBSCxZQUFvQjtBQUNsQixnQkFBSStzQixPQUFPL3NCLEVBQVg7QUFDQSxtQkFBTStzQixRQUFRLENBQUNBLEtBQWYsZUFBbUM7QUFDakNBLHFCQUFPQSxLQUFQQTtBQUNEO0FBQ0QsNkJBQWdCQSxtQkFBaEI7QUFDRDtBQUNGO0FBWFUsT0FBYjtBQWFBLGtDQUE0QixXQUE1QjtBQUNEOzt5QkFFRGhwQixPLHNCQUFVO0FBQ1IsYUFBTyxLQUFQOzs7eUJBR0ZwRSxTLHNCQUFVK1UsTSxFQUFRO0FBQ2hCO0FBQ0E7Ozt5QkFHRmhXLE8sc0JBQVU7QUFDUiw0Q0FBc0MsV0FBdEM7QUFDQSxtQ0FBNkIsV0FBN0I7QUFDQTtBQUNBLDJCQUFxQixvQkFBckI7QUFDQSxhQUFPLEtBQVA7Ozt5QkFHRmdsQixJLGlCQUFLZ2MsUyxFQUFXO0FBQUE7O0FBQ2Q7QUFDQSxVQUFNOWIsVUFBVSxtQ0FBbUM4YixpQ0FBOEJBLFVBQTlCQSxRQUErQ0EsVUFBbEYsUUFBb0csZUFBcEcsS0FBaEIsR0FBZ0IsQ0FBaEI7QUFDQTliLHlCQUFtQixrQkFBVztBQUM1QixtQ0FBeUJtSyxpQkFBekIsV0FBeUJBLENBQXpCO0FBQ0EyUjtBQUNBOWI7QUFDQTtBQUNBeFgsK0JBQXVCO0FBQUEsaUJBQUssT0FBTCxNQUFLLEVBQUw7QUFBdkJBO0FBTEZ3WDs7O3lCQVNGK2IsUyx3QkFBWTtBQUNWLFVBQU0zOEIsUUFBUSxlQUFkLFNBQWMsRUFBZDtBQUFBLFVBQTBDQyxPQUFPRCxRQUFRLGVBQXpELE1BQXlELEVBQXpEO0FBQUEsVUFBa0Z4SCxNQUFsRjtBQUNBLDJCQUFxQixLQUFyQiw0SEFBc0M7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQTlCa2tDLFlBQThCOztBQUNwQyxZQUFHNW1DLFNBQVM0bUMsVUFBVDVtQyxnQkFBaUNBLFNBQVM0bUMsVUFBVDVtQyxNQUFwQyxJQUFvQ0EsQ0FBcEMsRUFBb0U7QUFDbEUwQztBQUNEO0FBQ0Y7QUFDRDs7O3lCQUdGc1osTSxxQkFBUztBQUNQLFVBQUcsQ0FBQyxLQUFELFdBQWlCLEtBQWpCLFVBQWdDLEtBQW5DLFFBQWdEO0FBQzlDLFlBQUcsQ0FBQyxLQUFKLE9BQWdCO0FBQ2Q7QUFDRDtBQUNELFlBQU1zSSxTQUFTLEtBQWYsU0FBZSxFQUFmO0FBQ0EsNkpBQTZCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUFyQnNpQixZQUFxQjs7QUFDM0IsY0FBRyxDQUFDQSxVQUFKLFFBQXNCO0FBQ3BCO0FBQ0E7QUFDRDtBQUNGO0FBQ0Y7Ozt5QkFHSEUsUSxxQkFBU0YsUyxFQUFXTixHLEVBQUs7QUFDdkJNO0FBQ0FBLGtEQUE0Qyw0QkFBNUNBLEVBQTRDLENBQTVDQTtBQUNBQTs7O3lCQUdGaEgsTSxxQkFBUztBQUNQLFVBQU1qdkIsV0FBVyxDQUFqQiwwQkFBaUIsQ0FBakI7QUFDQSxXQUFJLElBQUl4USxJQUFSLEdBQWFBLElBQUUsS0FBZixNQUEwQixFQUExQixHQUErQjtBQUM3QndRLHNCQUFjLG9IQUFvSHhRLElBQXBILFNBQThIQSxJQUE5SCw0QkFBZHdRLEVBQWMsQ0FBZEE7QUFDRDtBQUNEQTtBQUNBLDRCQUFzQkEsY0FBdEIsRUFBc0JBLENBQXRCO0FBQ0EsVUFBTTZqQixRQUFRLG9CQUFkLE9BQWMsQ0FBZDtBQUFBLFVBQTRDeHZCLE9BQU8sNENBQW5EO0FBQ0EsV0FBSSxJQUFJN0UsTUFBUixHQUFhQSxNQUFFcTBCLE1BQWYsUUFBNkIsRUFBN0IsS0FBa0M7QUFDaEMsWUFBTW5ILE9BQU8sYUFBRW1ILE1BQWYsR0FBZUEsQ0FBRixDQUFiO0FBQ0EsdUNBQTZCbkgsVUFBN0IsVUFBNkJBLENBQTdCO0FBQ0EseUNBQStCQSxVQUEvQixZQUErQkEsQ0FBL0I7QUFDQSxxQ0FBMkJBLG9CQUEzQjtBQUNBLG9DQUEwQiw2QkFBeUJBLEtBQW5ELE1BQW1EQSxFQUFuRDtBQUNBLFlBQUcscUJBQUgsUUFBOEI7QUFDNUIsd0JBQWMsZ0JBQWQsR0FBYyxDQUFkLEVBQWtDLHFCQUFsQztBQUNEO0FBQ0QsWUFBTTlYLEtBQUs4WCxVQUFYLEdBQVdBLENBQVg7QUFDQSxhQUFJLElBQUlqdEIsSUFBUixHQUFhQSxJQUFFbVYsR0FBZixRQUEwQixFQUExQixHQUErQjtBQUM3QixjQUFNalgsSUFBSWlYLEdBQVYsQ0FBVUEsQ0FBVjtBQUNBalgsNEJBQWtCLGdCQUFsQkEsR0FBa0IsQ0FBbEJBO0FBQ0Q7QUFDRjtBQUNELDJDQUFxQyxXQUFyQztBQUNBOzs7Ozs7b0JBOUhpQm9vQyxVOzs7Ozs7Ozs7Ozs7QUNIckI7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCSyxpQjs7O0FBRW5CLCtDQUErQjtBQUFBOztBQUFBLG1EQUM3QixnQ0FENkIsR0FDN0IsQ0FENkI7O0FBRzdCO0FBQ0Esb0JBQWE7QUFDWHYvQixpQkFBUztBQURFLE9BQWI7QUFHQSxtQkFBRSxNQUFGLG9DQUEyQyxZQUEzQztBQUNBLG1CQUFFLE1BQUYsb0JBQTJCLFlBQTNCO0FBUjZCO0FBUzlCOzs2QkFFRDVCLE8sc0JBQVU7QUFDUixtQkFBRSxLQUFGLHFDQUE0QyxXQUE1QztBQUNBLG1CQUFFLEtBQUYscUJBQTRCLFdBQTVCOzs7Ozs7b0JBZmlCbWhDLGM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNIckI7Ozs7Ozs7O01BRXFCQyxPO1NBeUJaQyxhLDBCQUFjQyxJLEVBQU16TyxTLEVBQVcza0IsSyxFQUFPO0FBQzNDLGlCQUFVO0FBQ1JvekI7QUFERixhQUdLO0FBQ0hBO0FBQ0Q7OztTQUdJQyxpQiw4QkFBa0JELEksRUFBTUUsYSxFQUFldHpCLEssRUFBTztBQUNuRCxpQkFBVTtBQUNSb3pCO0FBREYsYUFHSztBQUNIQTtBQUNEOzs7U0FHSXZhLFkseUJBQWF4RSxRLEVBQVV6VCxFLEVBQUl4TixDLEVBQUd6RyxJLEVBQU07QUFDekMscUpBQTZCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUFyQnNXLFVBQXFCOztBQUMzQixZQUFHQSxRQUFILEVBQUdBLENBQUgsRUFBZ0I7QUFDZEE7QUFERixlQUdLLElBQUdBLFFBQUgsZUFBMEI7QUFDN0JBO0FBQ0Q7QUFDRjs7O1NBR0k2VixXLHdCQUFZbFksRSxFQUFJd1QsVyxFQUFhaGhCLEMsRUFBR3pHLEksRUFBTTtBQUMzQ3VtQyx3QkFBa0I5ZSxZQUFsQjhlLEVBQWtCOWUsQ0FBbEI4ZTs7O1NBR0tLLGUsNEJBQWdCbmdDLEMsRUFBRztBQUN4QkE7QUFDQSxVQUFHLENBQUMsbUJBQUosVUFBSSxDQUFKLEVBQW9DO0FBQ2xDOC9CLHlCQUFpQixLQUFqQkEsSUFBMEIsS0FBMUJBO0FBQ0Q7OztTQUdJTSxnQiw2QkFBaUJwZ0MsQyxFQUFHO0FBQ3pCOC9CLHVCQUFpQixLQUFqQkEsSUFBMEIsS0FBMUJBLGdCQUErQzkvQixTQUEvQzgvQjs7O1NBR0tPLGUsNEJBQWdCcmdDLEMsRUFBRztBQUN4QkE7QUFDQTgvQix1QkFBaUIsS0FBakJBLElBQTBCLEtBQTFCQTs7O0FBR0Y7OzttQkFDQXRlLFEsdUJBQVc7QUFDVDs7O21CQUdGQyxVLHlCQUFhO0FBQ1g7OzttQkFHRkMsUyx3QkFBWTtBQUNWOzs7bUJBR0ZDLFEsdUJBQVc7QUFDVDs7O21CQUdGQyxXLDBCQUFjO0FBQ1o7OzttQkFHRlosVyx3QkFBWXhULEUsRUFBSTtBQUNkLGFBQU8sS0FBUDs7QUFFRjs7bUJBRUE4eUIsUyxzQkFBVXJmLFEsRUFBVXpULEUsRUFBSXhOLEMsRUFBR3pHLEksRUFBTWduQyxFLEVBQUk7QUFBQTs7QUFDbkMsMEJBQW9CO0FBQ2xCejBCLG1CQUFXO0FBRE8sT0FBcEI7QUFHQUUsaUJBQVcsWUFBSztBQUNkLFlBQU1GLFlBQVksV0FBbEIsT0FBa0IsRUFBbEI7QUFBQSxZQUF3QzAwQixVQUFVLGVBQWxELEVBQWtELENBQWxEO0FBQ0EsWUFBR0EsV0FBVzEwQixZQUFVMDBCLFFBQVYxMEIsYUFBZCxJQUErQztBQUM3Q2cwQjtBQUNBLGlCQUFPLGVBQVAsRUFBTyxDQUFQO0FBQ0Q7QUFMSDl6Qjs7O0FBU0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzttQkFFQXkwQixTLHNCQUFVMUwsSSxFQUFNMkwsSyxFQUFPO0FBQ3JCLFVBQU1DLFFBQU47O0FBRHFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFHbkJEOztBQUhtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBS2pCQyxxQkFDRSxZQUFZLDJCQUFvQjtBQUM5Qiw2QkFBVyxnQkFBUztBQUNsQkQsK0JBQWlCLEVBQUM3aUMsS0FBRCxLQUFNdEUsTUFBdkJtbkMsSUFBaUIsRUFBakJBO0FBQ0F2MEI7QUFGRixvQkFHUSxlQUFRO0FBQ2RrVTtBQUpGO0FBRkpzZ0IsV0FDRSxDQURGQTtBQUxpQjs7QUFJbkIsOEJBQWU1TCxLQUFmLElBQWVBLENBQWYseUhBQTJCO0FBQUE7O0FBQUE7O0FBQUE7QUFXMUI7QUFma0I7O0FBRXJCLDRCQUFnQjN4QixZQUFoQixJQUFnQkEsQ0FBaEIseUhBQW1DO0FBQUE7O0FBQUE7O0FBQUE7QUFjbEM7QUFDRCxhQUFPZ0osWUFBUCxLQUFPQSxDQUFQOzs7bUJBR0Z3MEIsVyx3QkFBWS9MLE8sRUFBU2gzQixHLEVBQUs7QUFDeEJBLFlBQU1BLG1CQUFOQSxHQUFNQSxDQUFOQTtBQUNBLFVBQUdBLGtCQUFILEtBQXdCO0FBQ3RCZzNCLGtCQUFVQSx1QkFBVkEsR0FBVUEsQ0FBVkE7QUFDQSxZQUFNMTZCLElBQUkwNkIsb0JBQVYsR0FBVUEsQ0FBVjtBQUNBaDNCLGNBQU0sQ0FBQyxLQUFJZzNCLGtCQUFrQjE2QixJQUF0QixDQUFJMDZCLENBQUosR0FBRCxNQUFOaDNCOztBQUVBLFlBQU1nakMsUUFBUWhqQyxVQUFkLEdBQWNBLENBQWQ7QUFDQUE7QUFDQSw0SkFBdUI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLGNBQWZpakMsT0FBZTs7QUFDckIsY0FBR0EsU0FBSCxLQUFlLENBQWYsT0FFSyxJQUFHQSxTQUFILE1BQWdCO0FBQ25CLGdCQUFHampDLGNBQWMsRUFBRUEsb0JBQWtCQSxXQUFyQyxFQUFpQixDQUFqQixFQUFtRDtBQUNqREE7QUFDRDtBQUhFLGlCQUtBO0FBQ0hBO0FBQ0Q7QUFDRjtBQUNEQSxjQUFNQSxTQUFOQSxHQUFNQSxDQUFOQTtBQUNEOztBQUVEOzs7bUJBR0ZrakMsYSwwQkFBYzdqQyxDLEVBQUc7QUFDZixVQUFNMUIsTUFBTjtBQUNBLDRCQUFnQjRILFlBQWhCLENBQWdCQSxDQUFoQix5SEFBZ0M7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQXhCaUksUUFBd0I7O0FBQzlCN1AsaUJBQVMsY0FBYTBCLEVBQWIsS0FBYUEsQ0FBYixZQUFUMUIsRUFBUyxDQUFUQTtBQUNEO0FBQ0QsYUFBT0EsU0FBUCxHQUFPQSxDQUFQOzs7bUJBR0Z3bEMsZSw4QkFBa0I7QUFDaEIsVUFBRyxLQUFILE9BQWU7QUFDYixZQUFHbG9DLFNBQVMsbUJBQWlCLHFCQUExQkEsS0FBMEIsRUFBMUJBLFNBQTZEQSxTQUFTLG9CQUFrQixxQkFBM0JBLE1BQTJCLEVBQTNCQSxJQUFoRSxHQUE2SDtBQUMzSDtBQUNEO0FBQ0RrVCxtQkFBVywwQkFBWEEsSUFBVyxDQUFYQTtBQUNEOzs7bUJBR0hpMUIsUSx1QkFBVztBQUNULHlCQUFtQixxQkFBbkIsS0FBbUIsRUFBbkI7QUFDQSwwQkFBb0IscUJBQXBCLE1BQW9CLEVBQXBCOzs7bUJBR0ZDLFMsc0JBQVV6MUIsSSxFQUFNO0FBQ2QsYUFBTyxxQ0FBcUM7QUFBQSxlQUFVLGNBQVYsRUFBVSxDQUFWO0FBQTVDLE9BQU8sQ0FBUDs7O21CQUdGMDFCLG9CLG1DQUF1QjtBQUFBOztBQUNyQixVQUFHLHVCQUF1QixvQkFBMUIsWUFBMEQ7QUFDeEQsWUFBSTV4QixTQUFKOztBQUR3RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBR3RELGNBQU00USxPQUFPaWhCLE1BQWIsQ0FBYUEsQ0FBYjtBQUNBLGNBQU1oQyxNQUFNLElBQVosS0FBWSxFQUFaO0FBQ0FBLHdCQUFjO0FBQUEsbUJBQUssaUNBQUwsSUFBSyxDQUFMO0FBQWRBO0FBQ0FBLG9CQUFVamYsS0FBVmlmO0FBTnNEOztBQUV4RCw4QkFBaUIsS0FBakIsK0hBQThCO0FBQUE7O0FBQUE7O0FBQUE7QUFLN0I7QUFDRjs7O0FBR0gsMkNBQWtEO0FBQUE7O0FBQUEsVUFBYjdWLFdBQWEsb0VBQUosRUFBSTs7QUFBQTs7QUFDaEQ7QUFDQSxtQkFBYTtBQUNYMFgsa0JBQVU7QUFEQyxPQUFiO0FBR0EsNkJBQXVCLGFBQXZCLGVBQXVCLENBQXZCO0FBQ0EsbUJBQWEsd0JBQXdCNzNCLFVBQXhCLGNBQWdELENBQUNsVCxPQUE5RDtBQUNBLGdDQUEwQiwrQkFBNkIsa0JBQTdCLGdDQUExQjs7QUFFQSxtQkFBYSxvQ0FBYixDQUFhLENBQWI7QUFDQSxVQUFHLHlCQUFILE1BQWtDO0FBQ2hDO0FBQ0Q7QUFDRCxVQUFHLEtBQUgsT0FBZTtBQUNiLHFCQUFFLHNDQUFGLDBCQUFrRSxXQUFsRTtBQUNBO0FBQ0E4VixtQkFBVywwQkFBWEEsSUFBVyxDQUFYQTtBQUNEOztBQUVELHVCQUFpQixhQUFFLDJCQUFuQixJQUFpQixDQUFqQjtBQUNBO0FBQ0Esa0JBQVksYUFBRSwyQkFBZCxJQUFZLENBQVo7QUFDQTtBQUNBOztBQUVBLFVBQU0rVixTQUFTd0gsZ0JBQWVBLFNBQWZBLFNBQWdDLG1CQUEvQztBQUNBLFVBQU13TCxPQUFPO0FBQ1hsVCxnQkFBUTBILG1CQUFtQixtQkFEaEI7QUFFWDlkLGNBQU0sQ0FBQzhkLGlCQUFpQixtQkFGYixJQUVMLENBRks7QUFHWHhILGdCQUFRQSxTQUFRLENBQVJBLE1BQVEsQ0FBUkEsR0FBa0I7QUFIZixPQUFiO0FBQUEsVUFJRzJlLFFBSkg7QUFBQSxVQUlleGdCLFFBQVFxSixrQkFBa0IsbUJBSnpDOztBQU1BLHVDQUFpQyxZQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUVsQyxjQUFJOFgsVUFBVXY0QixNQUFkO0FBQUEsY0FBMEJqTCxNQUFNaUwsTUFBaEM7QUFDQXU0QixvQkFBVSx5Q0FBeUMsaUJBQVU7QUFDM0QsbUJBQU8sU0FBUyx3QkFBVCxFQUFTLENBQVQsWUFBUCxFQUFPLENBQVA7QUFERkEsV0FBVSxDQUFWQTtBQUdBLGtGQUF3RCxPQUF4RDtBQU5rQzs7QUFDcEMsOEJBQWlCWCxNQUFqQiwrSEFBK0I7QUFBQTs7QUFBQTs7QUFBQTtBQU05Qjs7QUFFRCw4QkFBb0IsaUJBQWVBLGNBQW5DLElBQW9CLENBQXBCOztBQUVBO0FBQ0EsNEpBQXVCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUFmdmdCLFFBQWU7O0FBQ3JCLDZCQUFpQixhQUFFLFdBQVcscUJBQVgsS0FBVyxDQUFYLFlBQUYsRUFBRSxDQUFGLFdBQStELE9BQWhGLElBQWlCLENBQWpCO0FBQ0Q7O0FBRUQsWUFBR3VnQixhQUFILENBQUdBLENBQUgsRUFBb0I7QUFDbEIsY0FBTTMxQixPQUFPWSxLQUFLKzBCLGdCQUFsQixJQUFhLzBCLENBQWI7QUFDQSxrQ0FBc0JaLEtBQUssT0FBM0IsU0FBc0JBLENBQXRCO0FBRkYsZUFJSztBQUNIO0FBQ0Q7O0FBRUQ7QUFDQSw4QkFBYyxPQUFkLFFBQWMsRUFBZCx5SEFBK0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLGNBQXZCeUMsS0FBdUI7O0FBQzdCLG9DQUF3QixzQkFBb0IsTUFBNUMsRUFBd0IsQ0FBeEI7QUFDQSw2QkFBaUJzeUIsMEJBQTBCLEVBQUM5ZSxhQUFhLHdCQUFkLE1BQWMsQ0FBZCxFQUEyQ3hULElBQTNDLElBQStDd3lCLE1BQU0sb0JBQWhHLEVBQWdHLENBQXJELEVBQTFCRixDQUFqQjtBQUNBLDhDQUFrQyxhQUFsQyxFQUFrQyxDQUFsQztBQUNEOztBQUVEO0FBQ0EsK0JBQWMsT0FBZCxVQUFjLEVBQWQsZ0lBQWlDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUF6QnR5QixNQUF5Qjs7QUFDL0IsdUNBQTBCLHNCQUFvQixNQUE5QyxHQUEwQixDQUExQjtBQUNEOztBQUVEO0FBQ0EsK0JBQWMsT0FBZCxTQUFjLEVBQWQsZ0lBQWdDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUF4QkEsT0FBd0I7O0FBQzlCLHVDQUF5QixzQkFBb0IsTUFBN0MsSUFBeUIsQ0FBekI7QUFDQSwrQkFBaUJzeUIsMkJBQTJCLEVBQUM5ZSxhQUFhLHdCQUFkLE1BQWMsQ0FBZCxFQUEyQ3hULElBQTNDLE1BQStDd3lCLE1BQU0scUJBQWpHLElBQWlHLENBQXJELEVBQTNCRixDQUFqQjtBQUNBLGlEQUFtQyxhQUFuQyxJQUFtQyxDQUFuQztBQUNEOztBQUVEO0FBQ0EsK0JBQWMsT0FBZCxRQUFjLEVBQWQsZ0lBQStCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxjQUF2QnR5QixPQUF1Qjs7QUFDN0Isc0NBQXdCLHNCQUFvQixNQUE1QyxJQUF3QixDQUF4QjtBQUNBLCtCQUFpQnN5QiwwQkFBMEIsRUFBQzllLGFBQWEsd0JBQWQsTUFBYyxDQUFkLEVBQTJDeFQsSUFBM0MsTUFBK0N3eUIsTUFBTSxvQkFBaEcsSUFBZ0csQ0FBckQsRUFBMUJGLENBQWpCO0FBQ0EsaURBQW1DLGFBQW5DLElBQW1DLENBQW5DO0FBQ0Q7O0FBRUQ7QUFDQSwrQkFBYyxPQUFkLFFBQWMsRUFBZCxnSUFBK0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLGNBQXZCdHlCLE9BQXVCOztBQUM3QixzQ0FBd0Isc0JBQW9CLE1BQTVDLElBQXdCLENBQXhCO0FBQ0Q7O0FBRUQsOEJBQW9CLENBQ2xCO0FBQ0VuSyxlQUFLLE9BRFA7QUFFRWkrQixrQkFBUTtBQUZWLFNBRGtCLEVBS2xCO0FBQ0VqK0IsZUFBSyxPQURQO0FBRUVpK0Isa0JBQVE7QUFGVixTQUxrQixFQVNsQjtBQUNFaitCLGVBQUssT0FEUDtBQUVFaStCLGtCQUFRO0FBRlYsU0FUa0IsRUFhbEI7QUFDRWorQixlQUFLLE9BRFA7QUFFRWkrQixrQkFBUTtBQUZWLFNBYmtCLENBQXBCOztBQW1CQTs7QUFFQSxZQUFHLE9BQUgsUUFBZ0I7QUFDZDtBQUNEOztBQUVEO0FBaEZGLGVBa0ZNO0FBQUEsZUFBUTdtQyxjQUFSLEdBQVFBLENBQVI7QUFsRk47QUFtRkQ7O21CQUVEaUUsTyxzQkFBVTtBQUNSLGFBQU8sS0FBUDtBQUNBLDZCQUFjLEtBQWQsUUFBYyxFQUFkLGdJQUErQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBdkI4TyxLQUF1Qjs7QUFDN0IsMkNBQW1DLFdBQW5DLEVBQW1DLENBQW5DO0FBQ0Q7QUFDRCxhQUFPLEtBQVA7QUFDQSxhQUFPLEtBQVA7QUFDQSw2QkFBYyxLQUFkLFNBQWMsRUFBZCxnSUFBZ0M7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQXhCQSxPQUF3Qjs7QUFDOUIsOENBQW9DLFdBQXBDLElBQW9DLENBQXBDO0FBQ0Q7QUFDRCxhQUFPLEtBQVA7QUFDQSw2QkFBYyxLQUFkLFFBQWMsRUFBZCxnSUFBK0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFlBQXZCQSxPQUF1Qjs7QUFDN0IsOENBQW9DLFdBQXBDLElBQW9DLENBQXBDO0FBQ0Q7QUFDRCxhQUFPLEtBQVA7O0FBRUEsT0FBQyxvQkFBRCxXQUFnQyxvQkFBaEMsT0FBZ0MsRUFBaEM7QUFDQSxhQUFPLEtBQVA7O0FBRUEsVUFBRyxLQUFILE9BQWU7QUFDYixxQkFBRSxzQ0FBRiwyQkFBbUUsV0FBbkU7QUFDRDtBQUNEO0FBQ0EsYUFBTyxLQUFQOzs7bUJBR0YrekIsWSwyQkFBZTtBQUNiLGFBQU8sZUFBUCxDQUFPLENBQVA7OzttQkFHRkMsa0IsaUNBQXFCO0FBQ25CLGFBQU8scUJBQVAsQ0FBTyxDQUFQOzs7bUJBR0ZDLFUsdUJBQVc1eEIsTyxFQUFTO0FBQ2xCOzs7bUJBR0ZrUixRLHVCQUFXLEM7O1NBSUoyZ0IsZSw0QkFBZ0IxQixJLEVBQU05d0IsUSxFQUFVbk0sSyxFQUFPNCtCLGEsRUFBZTtBQUMzRCxnQkFBUztBQUNQLFlBQU1DLDRCQUFOLEtBQU1BLENBQU47QUFJQSxhQUFJLElBQUosY0FBb0I7QUFDbEIsY0FBR0EsNkJBQTJCRCxjQUE5QixNQUE4QkEsQ0FBOUIsRUFBbUQ7QUFDakRBLHdDQUEwQkMsR0FBMUJELE1BQTBCQyxDQUExQkQ7QUFDRDtBQUNGO0FBQ0Y7OzttQkFHSEUsbUIsZ0NBQW9CcjBCLEUsRUFBSXpLLEssRUFBTztBQUM3Qis4QiwyQkFDRSxrQkFERkEsRUFDRSxDQURGQSxFQUVFO0FBQ0V2bEIsaUJBREY7QUFFRTZDLGdCQUZGO0FBR0UxSSxnQkFBUTtBQUhWLE9BRkZvckIsU0FRRUEsS0FSRkE7OzttQkFZRmdDLHFCLGtDQUFzQnQwQixFLEVBQUl6SyxLLEVBQU87QUFDL0IrOEIsMkJBQ0Usb0JBREZBLEVBQ0UsQ0FERkEsRUFFRTtBQUNFdmxCLGlCQURGO0FBRUU2QyxnQkFGRjtBQUdFMUksZ0JBQVE7QUFIVixPQUZGb3JCLFNBUUVBLEtBUkZBOzs7bUJBWUZpQyxvQixpQ0FBcUJ2MEIsRSxFQUFJekssSyxFQUFPO0FBQzlCKzhCLDJCQUNFLG1CQURGQSxFQUNFLENBREZBLEVBRUU7QUFDRXZsQixpQkFERjtBQUVFN0YsZ0JBRkY7QUFHRTlILGVBQU87QUFIVCxPQUZGa3pCLFNBUUVBLEtBUkZBOzs7bUJBWUZrQyxtQixnQ0FBb0J4MEIsRSxFQUFJekssSyxFQUFPO0FBQzdCKzhCLDJCQUNFLGtCQURGQSxFQUNFLENBREZBLEVBRUU7QUFDRXZsQixpQkFERjtBQUVFM04sZUFBTztBQUZULE9BRkZrekIsU0FPRUEsS0FQRkE7OzttQkFXRjVlLGtCLGlDQUFxQixDOzttQkFJckIrZ0IsUSxxQkFBU3owQixFLEVBQUl6SyxLLEVBQU87QUFDbEIsNkJBQWdCLEtBQWhCLDRJQUFtQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsWUFBM0JvakIsT0FBMkI7O0FBQ2pDLFlBQUdBLFNBQUgsRUFBR0EsQ0FBSCxFQUFpQjtBQUNmQTtBQUNBO0FBQ0E7QUFDRDtBQUNGOzs7Ozs7QUF2Y2dCMlosT0FFWm9DLGlCQUZZcEMsR0FFUTtBQUN6QnZsQixhQUFTO0FBQUEsYUFBZ0J1bEIsbUNBQW1DLENBQW5ELEtBQWdCQSxDQUFoQjtBQURnQjtBQUV6QjFpQixZQUFRO0FBQUEsYUFBZ0IwaUIsbUNBQWhCLEtBQWdCQSxDQUFoQjtBQUZpQjtBQUd6QnByQixZQUFRO0FBQUEsYUFBZ0JvckIscUNBQXFDLENBQXJELEtBQWdCQSxDQUFoQjtBQUFBO0FBSGlCLEdBRlJBO0FBQUFBLE9BUVpxQyxtQkFSWXJDLEdBUVU7QUFDM0J2bEIsYUFBUztBQUFBLGFBQWdCdWxCLG1DQUFtQyxDQUFuRCxLQUFnQkEsQ0FBaEI7QUFEa0I7QUFFM0IxaUIsWUFBUTtBQUFBLGFBQWdCMGlCLG1DQUFoQixLQUFnQkEsQ0FBaEI7QUFGbUI7QUFHM0JwckIsWUFBUTtBQUFBLGFBQWdCb3JCLHFDQUFxQyxDQUFyRCxLQUFnQkEsQ0FBaEI7QUFBQTtBQUhtQixHQVJWQTtBQUFBQSxPQWNac0Msa0JBZFl0QyxHQWNTO0FBQzFCdmxCLGFBQVM7QUFBQSxhQUFnQnVsQixtQ0FBbUMsQ0FBbkQsS0FBZ0JBLENBQWhCO0FBRGlCO0FBRTFCbHpCLFdBQU87QUFBQSxhQUFnQm96QixnQkFBaEI7QUFGbUI7QUFHMUJ0ckIsWUFBUTtBQUFBLGFBQWdCb3JCLHlDQUF5QyxDQUF6RCxLQUFnQkEsQ0FBaEI7QUFBQTtBQUhrQixHQWRUQTtBQUFBQSxPQW9CWnVDLGlCQXBCWXZDLEdBb0JRO0FBQ3pCdmxCLGFBQVM7QUFBQSxhQUFnQnVsQixtQ0FBbUMsQ0FBbkQsS0FBZ0JBLENBQWhCO0FBRGdCO0FBRXpCbHpCLFdBQU87QUFBQSxhQUFnQm96QixVQUFoQixPQUFnQkEsQ0FBaEI7QUFBQTtBQUZrQixHQXBCUkY7b0JBQUFBLEk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGckI7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFFcUJ3QyxjOzs7QUFFbkIsOENBQW1EO0FBQUEsVUFBbEJDLGFBQWtCLG9FQUFQLEtBQU87O0FBQUE7O0FBQUEsbURBQ2pELDJCQURpRCxJQUNqRCxDQURpRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQWEsSUFBSSxZQUFqQixLQUFhLEVBQWI7O0FBRUEsd0JBQWlCLElBQUksWUFBckIsU0FBaUIsRUFBakI7O0FBRUEsb0JBQWEsSUFBSSxZQUFqQixLQUFhLEVBQWI7QUFDQSx1QkFBZ0IsSUFBSSxZQUFwQixLQUFnQixFQUFoQjs7QUFFQSxxQkFBYyxJQUFJLFlBQUosc0JBQWdDLGdCQUFhLE1BQTdDLE1BQTZDLEVBQTdDLE9BQWQsSUFBYyxDQUFkO0FBQ0EsVUFBTXRnQyxRQUFOOztBQUVBO0FBQ0EsZ0NBQXlCLE1BQXpCO0FBQ0E7O0FBRUEsdUJBQWdCLElBQUksWUFBSixjQUF3QixFQUFDdWdDLE9BQUQsTUFBY0MsV0FBdEQsSUFBd0MsRUFBeEIsQ0FBaEI7QUFDQTtBQUNBLG1DQUE0QixVQUE1QjtBQUNBLDZCQUFzQixNQUF0QixLQUFzQixFQUF0QixFQUFvQyxNQUFwQyxNQUFvQyxFQUFwQzs7QUFFQSw4QkFBdUIsZUFBdkI7O0FBRUEsMEJBQW1CLG9CQUFuQixPQUFtQixFQUFuQjtBQUNBLGdDQUF5QixNQUF6QixLQUF5QixFQUF6QixFQUF1QyxNQUF2QyxNQUF1QyxFQUF2QztBQUNBLG1CQUFFLGtCQUFGLGdCQUFtQztBQUNuQzNHLGtCQURtQztBQUVuQzFYLGFBRm1DO0FBR25DOEMsZ0JBSG1DO0FBSW5DM2UsaUJBQVM7QUFKMEIsT0FBbkM7QUFNQSw4QkFBdUIsa0JBQXZCOztBQUVBLHNCQUFlLGtCQUFmOztBQUlBLHVCQUFnQixvQkFBVSxNQUFWLFFBQXVCLE1BQXZDLE9BQWdCLENBQWhCO0FBQ0E7O0FBRUEsVUFBTW02QixXQUFXLGFBQUUsa0JBQUYsaUJBQWpCLEtBQWlCLENBQWpCO0FBQUEsVUFBNkRDLFlBQVksSUFBSSxZQUE3RSxPQUF5RSxFQUF6RTtBQUNBLGdEQUF5QyxZQUFLO0FBQzVDO0FBQ0FELGdDQUF3QkMsY0FBWSxzQkFBWkEsaUJBQXhCRDtBQUZGOztBQUtBLDRCQUFxQixJQUFJLFlBQXpCLGFBQXFCLEVBQXJCOztBQUVBLHNCQUFlLElBQUksWUFBSixhQXJEa0MsUUFxRGxDLENBQWYsRUFyRGlELENBcURBOztBQUVqRCxvQkFBYSxJQUFJLFlBQUosMkJBQWIsQ0FBYSxDQUFiO0FBQ0Esa0NBQTJCLElBQTNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBZSxNQUFmOztBQUVBLHNCQUFlO0FBQ2Isd0JBQWUsSUFBSSxZQUFKLFdBQWYsQ0FBZSxDQUFmO0FBQ0Q7O0FBRUQsb0JBQWE7QUFDWEUsd0JBQWdCLDBCQURMLEtBQ0ssQ0FETDtBQUVYQyxpQkFBUztBQUZFLE9BQWI7O0FBS0EsbUJBQUUsTUFBRixrQkFBeUIsWUFBekI7O0FBRUEsMEJBQW1CLHVDQUE2QixNQUE3QixLQUF1QyxNQUF2QyxLQUFuQixLQUFtQixDQUFuQjtBQUNBLDBCQUFtQix1Q0FBNkIsTUFBN0IsS0FBdUMsTUFBdkMsS0FBbkIsS0FBbUIsQ0FBbkI7QUFDQSxVQUFNQyxhQUFhLEVBQUM3aUMsTUFBcEIsV0FBbUIsRUFBbkI7QUFDQSxpQ0FBMEIsc0JBQWU7QUFDdkMsWUFBTThpQyxRQUFRLDBDQUFkLFVBQWMsQ0FBZDtBQUFBLFlBQXFFQyxXQUFXLFNBQVhBLFFBQVc7QUFBQSxpQkFBUzdvQyxXQUFTLG9CQUFsQixDQUFrQixDQUFsQjtBQUFoRjtBQUNBLFlBQUc2RixXQUFILGFBQXlCO0FBQ3ZCOGlDLDZCQUFtQjlpQyxFQUFuQjhpQztBQUNBQSw2QkFBbUI5aUMsRUFBbkI4aUM7QUFDRDtBQUNELGVBQU85aUMsbUJBQW1CLENBQUMraUMsY0FBYy9pQyxFQUFsQ0EsSUFBb0IraUMsQ0FBcEIvaUMsSUFBNkNnakMsa0JBQWtCaGpDLEVBQS9EQSxNQUE2Q2dqQyxDQUE3Q2hqQyxJQUE0RWdqQyxrQkFBa0JoakMsRUFBOUZBLGFBQTRFZ2pDLENBQTVFaGpDLGlDQUFQO0FBTkY7QUFRQSxtQkFBWSxtQkFBUyxNQUFULEtBQW1CLE1BQW5CLEtBQVosS0FBWSxDQUFaOztBQUVBO0FBN0ZpRDtBQThGbEQ7OzBCQUVEdEIsTyxzQkFBVTtBQUNSLGFBQU8sV0FBUDtBQUNBLG1CQUFFLEtBQUYsbUJBQTBCLFdBQTFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OzswQkFHRnNELEssb0JBQVE7QUFDTixhQUFPLGdCQUFQLEtBQU8sRUFBUDs7OzBCQUdGakQsTSxxQkFBUztBQUNQLGFBQU8sZ0JBQVAsTUFBTyxFQUFQOzs7MEJBR0Zra0MsZ0IsNkJBQWlCN29DLEMsRUFBRztBQUNsQjs7OzBCQUdGOG9DLFEsdUJBQVc7QUFDVCxhQUFPLEtBQVA7OzswQkFHRkMsZ0IsNkJBQWlCcGdDLEssRUFBTztBQUN0Qjs7OzBCQUdGcWdDLGdCLCtCQUFtQjtBQUNqQixhQUFPLGNBQVA7OzswQkFHRlIsYyw2QkFBaUI7QUFBQTs7QUFDZixVQUFNUyxlQUFlLFNBQWZBLFlBQWUsU0FBVztBQUM5Qno2Qix3QkFBZ0IsaUJBQWEsT0FBN0JBLE1BQTZCLEVBQTdCQTtBQUNBQTtBQUZGO0FBQUEsVUFJQTA2QixpQkFBaUIsU0FBakJBLGNBQWlCLFdBQWE7QUFDNUJDLHlCQUFpQixPQUFqQkEsS0FBaUIsRUFBakJBLEVBQStCLE9BQS9CQSxNQUErQixFQUEvQkE7QUFMRjs7QUFRQUYsbUJBQWEsS0FBYkE7QUFDQUMscUJBQWUsS0FBZkE7QUFDQUEscUJBQWUsS0FBZkE7O0FBRUEseUJBQW1CLEVBQUNyakMsTUFBcEIsUUFBbUIsRUFBbkI7OzswQkFHRnFuQixTLHNCQUFVeG5CLE0sRUFBUTtBQUNoQjs7OzBCQUdGMGpDLFkseUJBQWExakMsTSxFQUFRO0FBQ25COzs7MEJBR0YyakMsZSw0QkFBZ0IzakMsTSxFQUFRO0FBQ3RCOzs7MEJBR0Y0akMsWSx5QkFBYTVqQyxNLEVBQVE7QUFDbkI7OzswQkFHRitpQyxPLHNCQUFVO0FBQ1IsVUFBRyxXQUFILFNBQXVCO0FBQ3JCYyw4QkFBc0IsV0FBdEJBO0FBQ0Q7QUFDRDs7OzBCQUdGQyxpQiw4QkFBa0IvM0IsRyxFQUFLO0FBQ3JCOzs7MEJBR0ZnNEIsb0IsaUNBQXFCaDRCLEcsRUFBSztBQUN4QixVQUFNNVMsSUFBSSw2QkFBVixHQUFVLENBQVY7QUFDQSxVQUFHLENBQUgsR0FBTztBQUNMO0FBQ0Q7OzswQkFHSHkvQixNLHFCQUFTO0FBQ1AsVUFBTW9MLFlBQVksV0FBbEIsUUFBa0IsRUFBbEI7QUFDQTtBQUNBLDJCQUFlLEtBQWYsaUlBQXFDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxZQUE3Qmo0QixNQUE2Qjs7QUFDbkNBO0FBQ0Q7QUFDRCw4QkFBd0IsS0FBeEIsVUFBdUMsS0FBdkM7QUFDQSwyQkFBcUIsS0FBckIsT0FBaUMsS0FBakM7OzswQkFHRms0QixlLDRCQUFnQkMsVyxFQUFhQyxJLEVBQU07QUFDakNBO0FBQ0E7QUFDQSxVQUFNL3lCLFdBQVcsSUFBSSxZQUFKLDhCQUFqQixXQUFpQixDQUFqQjtBQUNBO0FBQ0FBO0FBQ0E7QUFDQSxVQUFNZ3pCLG9CQUFvQiw2Q0FBMUIsUUFBMEIsQ0FBMUI7QUFDQTtBQUNBLGFBQU8sNkJBQVAsaUJBQU8sQ0FBUDs7OzBCQUdGQyx1QyxvREFBd0NqekIsUSxFQUFVO0FBQ2hELFVBQU1rekIsY0FBY2x6QixrQkFBcEI7QUFDQSxVQUFNbXpCLFdBQVduekIsZUFBakI7O0FBRUEsVUFBTW96QixhQUFhLElBQUksWUFBdkIsY0FBbUIsRUFBbkI7QUFDQSxVQUFNenpCLFdBQVcsaUJBQWlCdXpCLGNBQWxDLENBQWlCLENBQWpCO0FBQ0EsVUFBTUcsVUFBVSxLQUFLRixxQ0FBTCxhQUF1REEsV0FBdkUsQ0FBZ0IsQ0FBaEI7O0FBRUEsV0FBSSxJQUFJcHJDLElBQVIsR0FBZUEsSUFBZixrQkFBcUM7QUFDbkMsWUFBTWtCLElBQUkrVyxrQkFBVixDQUFVQSxDQUFWO0FBQ0EsWUFBTXN6QixLQUFLdnJDLElBQVg7QUFDQTRYLHVCQUFlMVcsRUFBZjBXO0FBQ0FBLGlCQUFTMnpCLEtBQVQzekIsS0FBbUIxVyxFQUFuQjBXO0FBQ0FBLGlCQUFTMnpCLEtBQVQzekIsS0FBbUIxVyxFQUFuQjBXO0FBQ0Q7O0FBRUQsV0FBSSxJQUFJNVgsTUFBUixHQUFlQSxNQUFmLGlCQUFrQztBQUNoQyxZQUFNNkIsSUFBSW9XLGVBQVYsR0FBVUEsQ0FBVjtBQUNBLFlBQU1zekIsTUFBS3ZyQyxNQUFYO0FBQ0FzckMsdUJBQWN6cEMsRUFBZHlwQztBQUNBQSxnQkFBUUMsTUFBUkQsS0FBa0J6cEMsRUFBbEJ5cEM7QUFDQUEsZ0JBQVFDLE1BQVJELEtBQWtCenBDLEVBQWxCeXBDO0FBQ0Q7O0FBRURELDBCQUFvQixJQUFJLFlBQUoseUJBQXBCQSxDQUFvQixDQUFwQkE7QUFDQUEsMENBQW9DLElBQUksWUFBSiwwQkFBcENBLENBQW9DLENBQXBDQTs7QUFFQTs7OzBCQUdGRyxPLG9CQUFRQyxFLEVBQUkvakMsRSxFQUFJZ2tDLEUsRUFBSUMsRSxFQUFJaGtDLEUsRUFBSWlrQyxFLEVBQUk7QUFDOUIsVUFBTUMsUUFBTjtBQUNBLGFBQU9oc0MsU0FBUzhyQyxLQUFUOXJDLGVBQ1BBLFNBQVM4SCxLQUFUOUgsTUFET0EsU0FFUEEsU0FBUytyQyxLQUFUL3JDLE1BRkE7OzswQkFLRmlzQyxVLHVCQUFXZixXLEVBQWFFLGlCLEVBQW1CO0FBQ3pDO0FBQ0EsVUFBTXJ6QixXQUFXbXpCLGdDQUFqQjtBQUNBLFVBQU1nQixjQUFjZCxzQ0FBcEI7QUFDQSxVQUFNSyxVQUFVTCx3QkFBaEI7O0FBRUEsVUFBTWUsaUJBQWlCRCxxQkFBdkI7QUFDQSxVQUFNWixjQUFjdnpCLGtCQUFwQjs7QUFFQW16QjtBQUNBQTtBQUNBQTs7QUFFQSxXQUFJLElBQUkvcUMsSUFBUixHQUFlQSxJQUFmLHFCQUF3QztBQUN0QyxZQUFNaXNDLGNBQU47QUFDQWxCO0FBQ0EsWUFBTVEsS0FBS3ZyQyxJQUFYO0FBQ0EsYUFBSSxJQUFJQyxJQUFSLEdBQWVBLElBQWYsa0JBQXFDO0FBQ25DLGNBQU1pc0MsS0FBS2pzQyxJQUFYO0FBQ0EsY0FBSSxhQUFhOHJDLFlBQWIsRUFBYUEsQ0FBYixFQUE4QkEsWUFBWVIsS0FBMUMsQ0FBOEJRLENBQTlCLEVBQW1EQSxZQUFZUixLQUEvRCxDQUFtRFEsQ0FBbkQsRUFDSm4wQixTQURJLEVBQ0pBLENBREksRUFDVUEsU0FBU3MwQixLQURuQixDQUNVdDBCLENBRFYsRUFDNEJBLFNBQVNzMEIsS0FEekMsQ0FDZ0N0MEIsQ0FENUIsQ0FBSixFQUNtRDtBQUNqRHEwQjtBQUNEO0FBQ0Y7QUFDRjtBQUNELGFBQU8sRUFBQ3IwQixVQUFVbXpCLFlBQVgsZ0JBQXVDTyxTQUFTUCxZQUF2RCxhQUFPLEVBQVA7OzswQkFHRm9CLHVCLG9DQUF3QmpyQyxDLEVBQUdtSyxDLEVBQUc7QUFDNUIsd0JBQWtCbkssRUFBbEIsR0FBdUJBLEVBQXZCLEdBQTRCQSxFQUE1QjtBQUNBLDBCQUFvQm1LLEVBQXBCLEdBQXlCQSxFQUF6QixHQUE4QkEsRUFBOUIsR0FBbUNBLEVBQW5DOzs7MEJBR0YrZ0MseUIsc0NBQTBCdFksSSxFQUFNNXlCLEMsRUFBR1UsQyxFQUFHO0FBQ3BDLFVBQU1xVyxXQUFXLEtBQWpCO0FBQ0EsVUFBTW8wQixrQkFBa0JwMEIsNkJBQXhCO0FBQ0EsVUFBTXEwQixnQkFBZ0JyMEIsMkJBQXRCO0FBQ0EsVUFBTXMwQixjQUFjdDBCLDJCQUFwQixJQUFvQkEsQ0FBcEI7O0FBRUEsV0FBSSxJQUFJL1gsSUFBUixHQUFlQSxJQUFJcXNDLFlBQW5CLGFBQTRDO0FBQ3hDLFlBQUlDLGNBQWNELFlBQWxCLENBQWtCQSxDQUFsQjtBQUNBRix1Q0FBK0JuckMsRUFBL0JtckM7QUFDQUMscUNBQTZCMXFDLEVBQTdCMHFDO0FBQ0E7QUFDQUQsdUNBQStCbnJDLEVBQS9CbXJDO0FBQ0FDLHFDQUE2QjFxQyxFQUE3QjBxQztBQUNBO0FBQ0FELHVDQUErQm5yQyxFQUEvQm1yQztBQUNBQyxxQ0FBNkIxcUMsRUFBN0IwcUM7QUFDSDs7OzBCQUdIRyw2Qiw0Q0FBZ0M7QUFDOUIsVUFBTXgwQixXQUFXLEtBQWpCO0FBQ0FBO0FBQ0FBOzs7MEJBR0Z5MEIsb0IsaUNBQXFCNVksSSxFQUFNNXlCLEMsRUFBRztBQUM1QixVQUFNeXJDLFlBQVksa0NBQWxCO0FBQ0YsVUFBSTNzQyxJQUFJLElBQVI7QUFDQTJzQyx1QkFBaUJ6ckMsRUFBakJ5ckM7QUFDQUEsdUJBQWlCenJDLEVBQWpCeXJDO0FBQ0FBLHFCQUFlenJDLEVBQWZ5ckM7OzswQkFHQUMsd0IsdUNBQTJCO0FBQ3pCLFVBQU0zMEIsV0FBVyxLQUFqQjtBQUNBQTtBQUNBQTtBQUNBQTs7OztJQXRUcUMsWUFBTXhELGU7O29CQUExQjQwQixXOzs7Ozs7Ozs7Ozs7QUNQckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCd0QsbUI7OztBQUVuQixvQ0FBa0I7QUFBQTs7QUFBQSxtREFDaEIsaUJBRGdCLElBQ2hCLENBRGdCOztBQUVoQjtBQUNBO0FBSGdCO0FBSWpCOzsrQkFFRHJjLEssb0JBQVE7QUFDTixxQkFBZSxDQUFDLEtBQWhCO0FBQ0E7OzsrQkFHRnZkLEksbUJBQU87QUFDTDtBQUNBOzs7K0JBR0Y2NUIsVSx5QkFBYTtBQUNYLFVBQUcsS0FBSCxVQUFrQjtBQUNoQjtBQUNEO0FBQ0Q7OzsrQkFHRnZvQixVLHlCQUFhO0FBQ1gsVUFBRyxLQUFILE1BQWM7QUFDWiwwQ0FBa0M7QUFDaEM5SSxrQkFEZ0M7QUFFaEM2RixtQkFBUyxLQUZ1QjtBQUdoQzZDLGtCQUFRO0FBSHdCLFNBQWxDO0FBS0Q7Ozs7OztvQkFoQ2dCMG9CLGdCOzs7Ozs7Ozs7Ozs7QUNGckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BRXFCRSxlOzs7QUFFbkIsbUNBQXFCO0FBQUE7O0FBQUEsbURBQ25CLGFBRG1CLElBQ25CLENBRG1COztBQUVuQixnQkFBUztBQUNQM3RDLFdBRE87QUFFUFAsV0FGTztBQUdQa0I7QUFITyxPQUFUO0FBRm1CO0FBT3BCOzsyQkFFRGl0QyxnQiw2QkFBaUJqbUMsQyxFQUFHekcsSSxFQUFNO0FBQ3hCLFVBQUlpQyxXQUFKO0FBRHdCO0FBQUE7QUFBQSxjQUVDLEtBRkQ7O0FBR3hCLFVBQUcsQ0FBQ25ELElBQUU4QixFQUFILE1BQVM5QixJQUFFOEIsRUFBWCxLQUFnQixDQUFDckMsSUFBRXFDLEVBQUgsTUFBU3JDLElBQUVxQyxFQUEzQixDQUFnQixDQUFoQixJQUFpQ0EsTUFBSUEsRUFBeEMsR0FBNkM7QUFDM0NxQixjQUFNO0FBQ0p1YyxrQkFESTtBQUVKeGU7QUFGSSxTQUFOaUM7QUFJRDtBQUNEOzs7Ozs7b0JBcEJpQndxQyxZOzs7Ozs7Ozs7Ozs7QUNGckI7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFFcUJFLGE7OztBQUVuQiw4QkFBa0I7QUFBQTs7QUFBQSxtREFDaEIsYUFEZ0IsSUFDaEIsQ0FEZ0I7O0FBRWhCO0FBRmdCO0FBR2pCOzt5QkFFREQsZ0IsNkJBQWlCam1DLEMsRUFBRzdGLEMsRUFBRztBQUNyQixhQUFPLHFDQUEyQixLQUEzQixXQUEwQztBQUMvQzRkLGdCQUQrQztBQUUvQ3hlLGNBQU1ZO0FBRnlDLE9BQTFDLEdBQVA7Ozs7OztvQkFSaUIrckMsVTs7Ozs7OztBQ0hyQjtBQUNBO0FBQWU7QUFBdUksR0FBdEosRUFBc0osSUFBdEosRUFBc0o7QUFBa0I7QUFBaUI7QUFBYyw2QkFBcUI7QUFBUztBQUFjLHdCQUFZLHFCQUFaLEVBQWdDLEdBQWhDO0FBQWdDO0FBQWhDLFNBQXFGO0FBQUk7QUFBQSw0Q0FBd0MseUZBQXVGO0FBQXVDO0FBQ2xmO0FBQXlCLE9BRGtiLEVBQ2xiLEVBRGtiLEVBQzdhO0FBQUE7QUFBQTtBQUFBO0FBQUEsbURBQW1ILDhGQUFzRixLQUFLLFNBQU8sWUFBUCxFQUFPLE1BQVAsRUFBTyxXQUFQLEVBQU8sWUFBUCxFQUFPO0FBQTBEO0FBQTRCLFNBQTdGLEVBQTZGO0FBQWdCLGNBQUksb0NBQWdDLHFCQUFrQjtBQUFtRCx1Q0FBeUIsNEJBQzNkLE9BRDJkLEVBQzNkLDJCQUQyZDtBQUN4YjtBQUFTLFNBRGdNLEVBQ2hNO0FBQW1CO0FBQWEsU0FEZ0ssRUFDaEssYUFEZ0ssRUFDaEssVUFEZ0s7QUFDaEssS0FGNEYsQ0FFbEU7QUFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0NBQXdKLFlBQVUsYUFBVywyQ0FBeUMsMkJBQXlCLDJEQUFtRCx1QkFBcUIsZ0JBQWMsdUJBQW9CLGdCQUFjO0FBQ3JlLDZCQUFvQixnQkFBYyxtQkFBaUIsdUJBQW9CLFNBQU8sTUFBUCxFQUFPO0FBQTJCLDZCQUFnQixtQkFBZ0IsZ0JBQWMsa0JBQWdCLHVCQUFvQixnQkFBYyxrRUFBa0QsbURBQXFDLCtCQUF3QixnQkFBYyxtQkFBaUI7QUFBQSxTQUFoUjtBQUFnUixLQURqUCxDQUN1UjtBQUFTLEdBSHRZOzs7Ozs7O0FDREE7QUFDQTs7QUFFQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNLLEtBSEwsTUFHSztBQUNMO0FBQ0E7QUFDSyxLQUhBLE1BR0E7QUFDTDtBQUNBO0FBQ0E7QUFDQyxHQVhELEVBV0M7O0FBRUQ7QUFBQSxRQUNBLCtEQUNBLFNBREEsR0FDQSx1REFGQTtBQUFBLFFBR0EsNkJBSEE7QUFBQSxRQUlBLHNCQUpBO0FBQUEsUUFJQSxXQUpBOztBQU1BO0FBQ0EsaUNBQW1DLENBQW5DLEdBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQURBOztBQUdBO0FBQ0E7QUFDQSxzQ0FBNEMsQ0FBNUMsR0FBK0M7QUFDL0M7QUFDQTtBQUNhLFNBSmIsTUFJYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDUyxPQWRUOztBQWdCQTtBQUNBO0FBQ0Esc0NBQTRDLENBQTVDLEdBQStDO0FBQy9DO0FBQ0E7QUFDYSxTQUpiLE1BSWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1MsT0EzQlQ7O0FBNkJBO0FBQ0E7QUFBQSxZQUNBLHFFQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDUyxPQXBDVDs7QUFzQ0E7QUFDQTtBQUNTLE9BeENUOztBQTBDQTtBQUNBLDZCQURBLEVBQ0E7QUFDQSw2QkFGQSxDQUVBO0FBRkE7QUExQ0E7O0FBZ0RBO0FBQ0E7QUFDQTtBQUNTLE9BSFQ7O0FBS0E7QUFDQTtBQUNBO0FBUEE7O0FBV0E7QUFDQTtBQUFBLFVBQ0EsK0JBREE7QUFBQSxVQUVBLFNBRkE7QUFBQSxVQUdBLFVBSEE7QUFBQSxVQUlBLFVBSkE7QUFBQSxVQUtBLFlBTEE7QUFBQSxVQU1BLFdBTkE7QUFBQSxVQU9BLFdBUEE7QUFRQTtBQUNBOztBQUVBO0FBQ0E7QUFBMEM7QUFBK0I7QUFDekU7QUFBMEM7QUFBOEI7QUFDeEU7QUFBMEM7QUFBK0I7QUFDekU7QUFBMEM7QUFBb0M7O0FBRTlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQWlDO0FBQXNCO0FBQ3ZEOztBQUVBO0FBQ0E7QUFBNkM7QUFBUTs7QUFFckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDUyxPQUxULE1BS1M7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBcUM7QUFBc0M7QUFDM0U7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQyxHQXBORDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1hBLElBQU1qd0MsS0FBSyxRQUFvQkMsT0FBT2l3QyxNQUEzQixHQUFtQ253QyxRQUFRLFFBQVIsQ0FBOUM7QUFBQSxJQUNNRyxlQUFlLFFBQXlCRCxPQUFPUSxXQUFoQyxHQUE2Q1YsUUFBUSxhQUFSLENBRGxFO0FBQUEsSUFFTUksU0FBUyxRQUFtQkYsT0FBT1MsS0FBMUIsR0FBaUNYLFFBQVEsT0FBUixDQUZoRDtBQUFBLElBR01PLFNBQVMsUUFBbUJMLE9BQU9ZLEtBQTFCLEdBQWlDZCxRQUFRLE9BQVIsQ0FIaEQ7O1FBTVFTLEMsR0FBTlIsRTtRQUNnQlMsVyxHQUFoQlAsWTtRQUNVUSxLLEdBQVZQLE07UUFDVVUsSyxHQUFWUCxNIiwiZmlsZSI6Ii4vZGlzdC9mbGlwLWJvb2suanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDMpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGU5ZWYwYzU3ZDRjOThiOTg4MTg1IiwiaW1wb3J0IHskLCBodG1sMmNhbnZhcywgVEhSRUUsIFBERkpTfSBmcm9tICcuL3NyYy9saWJzJztcclxucmVxdWlyZSgnLi9zcmMvJysoRU5WSVJPTUVOVC5kZWJ1Zz8gJzNkZmxpcGJvb2suanMnOiAnM2RmbGlwYm9vay5taW4uanMnKSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCAkO1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9pbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDcyKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA3MjRlNThkZjU4YzY1YzQ4MDhiNFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi93ZWJwYWNrL2Jvb3RzdHJhcCA3MjRlNThkZjU4YzY1YzQ4MDhiNCIsImNvbnN0IF8kID0gR0xPQkFMX0xJQlMualF1ZXJ5PyB3aW5kb3cualF1ZXJ5OiByZXF1aXJlKCdqcXVlcnknKSxcclxuICAgICAgX2h0bWwyY2FudmFzID0gR0xPQkFMX0xJQlMuaHRtbDJjYW52YXM/IHdpbmRvdy5odG1sMmNhbnZhczogcmVxdWlyZSgnaHRtbDJjYW52YXMnKSxcclxuICAgICAgX1RIUkVFID0gR0xPQkFMX0xJQlMuVEhSRUU/IHdpbmRvdy5USFJFRTogcmVxdWlyZSgndGhyZWUnKSxcclxuICAgICAgX1JlYWN0ID0gR0xPQkFMX0xJQlMuUmVhY3Q/IHdpbmRvdy5SZWFjdDogcmVxdWlyZSgncmVhY3QnKSxcclxuICAgICAgX1JlYWN0RE9NID0gR0xPQkFMX0xJQlMuUmVhY3Q/IHdpbmRvdy5SZWFjdERPTTogcmVxdWlyZSgncmVhY3QtZG9tJyksXHJcbiAgICAgIF9QREZKUyA9IEdMT0JBTF9MSUJTLlBERkpTPyB3aW5kb3cuUERGSlM6IHJlcXVpcmUoJ3BkZmpzJyksXHJcbiAgICAgIF90ciA9IChzKT0+ICh3aW5kb3cuaWJlcmV6YW5za3kgfHwge30pLnRyICYmIHdpbmRvdy5pYmVyZXphbnNreS50cihzKSB8fCBzO1xyXG5cclxuZXhwb3J0IHtcclxuICBfJCBhcyAkLFxyXG4gIF9odG1sMmNhbnZhcyBhcyBodG1sMmNhbnZhcyxcclxuICBfVEhSRUUgYXMgVEhSRUUsXHJcbiAgX1JlYWN0IGFzIFJlYWN0LFxyXG4gIF9SZWFjdERPTSBhcyBSZWFjdERPTSxcclxuICBfUERGSlMgYXMgUERGSlMsXHJcbiAgX3RyIGFzIHRyXHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9saWJzLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2xpYnMuanMiLCJjb25zdCBfJCA9IEdMT0JBTF9MSUJTLmpRdWVyeT8gd2luZG93LmpRdWVyeTogcmVxdWlyZSgnanF1ZXJ5JyksXHJcbiAgICAgIF9odG1sMmNhbnZhcyA9IEdMT0JBTF9MSUJTLmh0bWwyY2FudmFzPyB3aW5kb3cuaHRtbDJjYW52YXM6IHJlcXVpcmUoJ2h0bWwyY2FudmFzJyksXHJcbiAgICAgIF9USFJFRSA9IEdMT0JBTF9MSUJTLlRIUkVFPyB3aW5kb3cuVEhSRUU6IHJlcXVpcmUoJ3RocmVlJyksXHJcbiAgICAgIF9QREZKUyA9IEdMT0JBTF9MSUJTLlBERkpTPyB3aW5kb3cuUERGSlM6IHJlcXVpcmUoJ3BkZmpzJyksXHJcbiAgICAgIF90ciA9IChzKT0+ICh3aW5kb3cuaWJlcmV6YW5za3kgfHwge30pLnRyICYmIHdpbmRvdy5pYmVyZXphbnNreS50cihzKSB8fCBzO1xyXG5cclxuaWYod2luZG93LkZCM0RfTE9DQUxFKSB7XHJcbiAgd2luZG93LmliZXJlemFuc2t5ID0ge1xyXG4gICAgLi4ud2luZG93LmliZXJlemFuc2t5LFxyXG4gICAgdHI6IChzKT0+IChGQjNEX0xPQ0FMRS5kaWN0aW9uYXJ5IHx8IHt9KVtzXSB8fCBzXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICBfJCBhcyAkLFxyXG4gIF9odG1sMmNhbnZhcyBhcyBodG1sMmNhbnZhcyxcclxuICBfVEhSRUUgYXMgVEhSRUUsXHJcbiAgX1BERkpTIGFzIFBERkpTLFxyXG4gIF90ciBhcyB0clxyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9saWJzLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvbGlicy5qcyIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VNYXRoVXRpbHMge1xyXG4gIHN0YXRpYyBzdW0gPSBbQmFzZU1hdGhVdGlscy5zdW0xLCBCYXNlTWF0aFV0aWxzLnN1bTIsIEJhc2VNYXRoVXRpbHMuc3VtMywgQmFzZU1hdGhVdGlscy5zdW00XTtcclxuICBzdGF0aWMgZXBzID0gMWUtNDtcclxuXHJcbiAgc3RhdGljIHN1bTEoa2EsYSxrYixiKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBrYSphWzBdK2tiKmJbMF1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc3VtMihrYSxhLGtiLGIpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIGthKmFbMF0ra2IqYlswXSxcclxuICAgICAga2EqYVsxXStrYipiWzFdXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHN1bTMoa2EsYSxrYixiKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBrYSphWzBdK2tiKmJbMF0sXHJcbiAgICAgIGthKmFbMV0ra2IqYlsxXSxcclxuICAgICAga2EqYVsyXStrYipiWzJdXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHN1bTQoa2EsYSxrYixiKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBrYSphWzBdK2tiKmJbMF0sXHJcbiAgICAgIGthKmFbMV0ra2IqYlsxXSxcclxuICAgICAga2EqYVsyXStrYipiWzJdLFxyXG4gICAgICBrYSphWzNdK2tiKmJbM11cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcms0KGR5LCB0LCBkdCwgeSwgc3VtPUJhc2VNYXRoVXRpbHMuc3VtW3kubGVuZ3RoLTFdKSB7XHJcbiAgICBjb25zdCBrMT1keSh0LHkpLFxyXG4gICAgICAgICAgazI9ZHkodCtkdC8yLHN1bSgxLHksZHQvMixrMSkpLFxyXG4gICAgICAgICAgazM9ZHkodCtkdC8yLHN1bSgxLHksZHQvMixrMikpLFxyXG4gICAgICAgICAgazQ9ZHkodCtkdCxzdW0oMSx5LGR0LGszKSk7XHJcbiAgICByZXR1cm4gc3VtKDEseSxkdC82LHN1bSgxLHN1bSgxLGsxLDIsazIpLDEsc3VtKDIsazMsMSxrNCkpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBleHRyYXBvbGF0ZUxpbmVhcih4LHkseGkpIHtcclxuICAgIHJldHVybiB5WzBdKyh5WzFdLXlbMF0pLyh4WzFdLXhbMF0pKih4aS14WzBdKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpbnRlcnBvbGF0ZUxpbmVhcih4LHkseGkpIHtcclxuICAgIGxldCB5aTtcclxuICAgIGlmKHhbMF0+eFsxXSkge1xyXG4gICAgICB4PXgucmV2ZXJzZSgpO1xyXG4gICAgICB5PXkucmV2ZXJzZSgpO1xyXG4gICAgfVxyXG4gICAgaWYoeGk8eFswXSkge1xyXG4gICAgICB5aT15WzBdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih4aT54WzFdKSB7XHJcbiAgICAgIHlpPXlbMV07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgeWk9QmFzZU1hdGhVdGlscy5leHRyYXBvbGF0ZUxpbmVhcih4LHkseGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHlpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNhbGNTY2FsZShzcmNXLCBzcmNILCBkc3RXLCBkc3RIKSB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4oZHN0Vy9zcmNXLCBkc3RIL3NyY0gpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG11bE0oYSwgYikge1xyXG4gICAgY29uc3Qgcj1bXTtcclxuICAgIGZvcihsZXQgaT0wO2k8YS5sZW5ndGg7KytpKSB7XHJcbiAgICAgIHIucHVzaChbXSk7XHJcbiAgICAgIGZvcihsZXQgaj0wO2o8YlswXS5sZW5ndGg7KytqKSB7XHJcbiAgICAgICAgcltpXVtqXSA9IDA7XHJcbiAgICAgICAgZm9yKGxldCBrPTA7azxiLmxlbmd0aDsrK2spIHtcclxuICAgICAgICAgIHJbaV1bal0rPWFbaV1ba10qYltrXVtqXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHRyYW5zTShtKSB7XHJcbiAgICBjb25zdCByPVtdO1xyXG4gICAgZm9yKGxldCBpPTA7aTxtLmxlbmd0aDsrK2kpIHtcclxuICAgICAgZm9yKGxldCBqPTA7ajxtWzBdLmxlbmd0aDsrK2opIHtcclxuICAgICAgICBpZighcltqXSkge1xyXG4gICAgICAgICAgcltqXT1bXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcltqXVtpXT1tW2ldW2pdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtYXQoZGF0YSkge1xyXG4gICAgbGV0IHM9MDtcclxuICAgIGZvcihsZXQgeCBvZiBkYXRhKSB7XHJcbiAgICAgIHMrPXg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy9kYXRhLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkaXNwKGRhdGEpIHtcclxuICAgIGNvbnN0IE09QmFzZU1hdGhVdGlscy5tYXQoZGF0YSk7XHJcbiAgICBsZXQgcz0wO1xyXG4gICAgZm9yKGxldCB4IG9mIGRhdGEpIHtcclxuICAgICAgcys9KHgtTSkqKHgtTSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy9kYXRhLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBwcmVkaWN0KGRhdGEsIG51bSkge1xyXG4gICAgY29uc3Qgcj1bXSwgbD1kYXRhLmxlbmd0aCwgRD1CYXNlTWF0aFV0aWxzLmRpc3AoZGF0YSk7XHJcbiAgICBpZihEPGwgJiYgbD4xKSB7XHJcbiAgICAgIGNvbnN0IGFtPVtdLCBibT1bXTtcclxuICAgICAgZm9yKGxldCBpPTA7aTxsOysraSkge1xyXG4gICAgICAgIGFtLnB1c2goW2ksMV0pO1xyXG4gICAgICAgIGJtLnB1c2goW2RhdGFbaV1dKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB0YT1CYXNlTWF0aFV0aWxzLnRyYW5zTShhbSksIGE9QmFzZU1hdGhVdGlscy5tdWxNKHRhLGFtKSwgYj1CYXNlTWF0aFV0aWxzLm11bE0odGEsYm0pLFxyXG4gICAgICBkPShhWzBdWzBdKmFbMV1bMV0tYVsxXVswXSphWzBdWzFdKSxcclxuICAgICAgcD1bXHJcbiAgICAgICAgLShhWzBdWzFdKmJbMV1bMF0tYlswXVswXSphWzFdWzFdKS9kLFxyXG4gICAgICAgIChhWzBdWzBdKmJbMV1bMF0tYVsxXVswXSpiWzBdWzBdKS9kXHJcbiAgICAgIF07XHJcbiAgICAgIGZvcihsZXQgaT0wO2k8bnVtOysraSkge1xyXG4gICAgICAgIGNvbnN0IHYgPSBNYXRoLnJvdW5kKHBbMF0qKGkrbCkrcFsxXSk7XHJcbiAgICAgICAgaWYoci5pbmRleE9mKHYpPT09LTEpIHtcclxuICAgICAgICAgIHIucHVzaCh2KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFVuaXF1ZSgpIHtcclxuICAgIHJldHVybiBNYXRoLmNlaWwoMWU5Kk1hdGgucmFuZG9tKCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHNldFNwbGluZVBvaW50cyhzcGxpbmUsIHBzKSB7XHJcbiAgICBpZihzcGxpbmUucG9pbnRzLmxlbmd0aCE9PXBzLngubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnNvbGUud2Fybignc2V0U3BsaW5lUG9pbnRzOiBiYWQgcG9pbnRzJyk7XHJcbiAgICB9XHJcbiAgICBmb3IobGV0IGk9MDsgaTxzcGxpbmUucG9pbnRzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHNwbGluZS5wb2ludHNbaV0uc2V0KHBzLnhbaV0sIHBzLnlbaV0sIHBzLno/IHBzLnpbaV06IDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1hcGwyTChscywgbGVuLCBuLCBmKSB7XHJcbiAgICBjb25zdCBkTCA9IGxlbi8obi0xKTtcclxuICAgIGxldCBMPTA7XHJcbiAgICBmb3IobGV0IGk9MCwgZD1sc1swXTsgaTxscy5sZW5ndGgtMSAmJiBMPGxlbiswLjEqZEw7ICsraSwgZCs9bHNbaV0pIHtcclxuICAgICAgaWYoTWF0aC5hYnMoTC1kKTxNYXRoLmFicyhMLWQtbHNbaSsxXSkpIHtcclxuICAgICAgICBmKGksIEwpO1xyXG4gICAgICAgIEwrPWRMO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihMPGxlbiswLjEqZEwpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdtYXBsMkw6IGxzIGlzIG5vdCBlbm91Z2h0Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGV0MihhLGIsYyxkKSB7XHJcbiAgICByZXR1cm4gYSpkLWIqYztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzb2x2ZTJMaW4oYTEsYjEsYTIsYjIpIHtcclxuICAgIGxldCByZXM7XHJcbiAgICBjb25zdCBkPUJhc2VNYXRoVXRpbHMuZGV0MihhMVswXSxhMVsxXSxhMlswXSxhMlsxXSk7XHJcbiAgICBpZihNYXRoLmFicyhkKT5CYXNlTWF0aFV0aWxzLmVwcykge1xyXG4gICAgICBjb25zdCBkeD1CYXNlTWF0aFV0aWxzLmRldDIoYjEsYTFbMV0sYjIsYTJbMV0pLCBkeT1CYXNlTWF0aFV0aWxzLmRldDIoYTFbMF0sYjEsYTJbMF0sYjIpO1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgeDogZHgvZCxcclxuICAgICAgICB5OiBkeS9kXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzSW5zaWRlUG9seShwcywgcCkge1xyXG4gICAgbGV0IGRvbmUgPSBmYWxzZSwgY3Q7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBpZihCYXNlTWF0aFV0aWxzLnYyZGlzdChwLCBwc1tpXSk8QmFzZU1hdGhVdGlscy5lcHMpIHtcclxuICAgICAgICBjdD0xO1xyXG4gICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB3aGlsZSghZG9uZSkge1xyXG4gICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgY3QgPSAwO1xyXG4gICAgICBsZXQgbnAgPSB7eDogcC54K01hdGgucmFuZG9tKCktMC41LCB5OiBwLnkrTWF0aC5yYW5kb20oKS0wLjV9LCBybiA9IHt4OiBucC54LXAueCwgeTogbnAueS1wLnl9LCBhMT1bcm4ueSwgLXJuLnhdLCBiMT1wLngqcm4ueS1wLnkqcm4ueDtcclxuICAgICAgZm9yKGxldCBpPTA7IGk8cHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICBjb25zdCBwMD1wc1tpXSwgcDE9cHNbKGkrMSklcHMubGVuZ3RoXSwgbiA9IHt4OiBwMS54LXAwLngsIHk6IHAxLnktcDAueX0sIGEyPVtuLnksIC1uLnhdLCBiMj1wMC54Km4ueS1wMC55Km4ueCxcclxuICAgICAgICAgIGlwID0gQmFzZU1hdGhVdGlscy5zb2x2ZTJMaW4oYTEsYjEsYTIsYjIpO1xyXG4gICAgICAgIGlmKGlwKSB7XHJcbiAgICAgICAgICBpZihCYXNlTWF0aFV0aWxzLnYyZGlzdChpcCwgcDApPEJhc2VNYXRoVXRpbHMuZXBzIHx8IEJhc2VNYXRoVXRpbHMudjJkaXN0KGlwLCBwMSk8QmFzZU1hdGhVdGlscy5lcHMpIHtcclxuICAgICAgICAgICAgZG9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYoaXAueD5NYXRoLm1pbihwMC54LHAxLngpLUJhc2VNYXRoVXRpbHMuZXBzJiZpcC54PE1hdGgubWF4KHAwLngscDEueCkrQmFzZU1hdGhVdGlscy5lcHMgJiZcclxuICAgICAgICAgICAgICAgICAgaXAueT5NYXRoLm1pbihwMC55LHAxLnkpLUJhc2VNYXRoVXRpbHMuZXBzJiZpcC55PE1hdGgubWF4KHAwLnkscDEueSkrQmFzZU1hdGhVdGlscy5lcHMpIHtcclxuICAgICAgICAgICAgaWYoQmFzZU1hdGhVdGlscy52MmRpc3QoaXAsIHApPEJhc2VNYXRoVXRpbHMuZXBzKSB7XHJcbiAgICAgICAgICAgICAgY3Q9MTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCB0bj17eDogaXAueC1wLngsIHk6IGlwLnktcC55fTtcclxuICAgICAgICAgICAgICBjdCArPSB0bi54KnJuLngrdG4ueSpybi55PjA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdCUyO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzSW5zaWRlQ29udlBvbHkocHMsIHApIHtcclxuICAgIGxldCBzZyA9IFswLCAwXTtcclxuICAgIGZvcihsZXQgaT0wOyBpPHBzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHAwPXBzW2ldLCBwMT1wc1soaSsxKSVwcy5sZW5ndGhdLCBhPXt4OiBwMC54LXAueCwgeTogcDAueS1wLnl9LCBiPXt4OiBwMS54LXAueCwgeTogcDEueS1wLnl9O1xyXG4gICAgICArK3NnWyhhLngqYi55LWEueSpiLng8MCkrMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gfnNnLmluZGV4T2YocHMubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB2Mmxlbih2Mikge1xyXG4gICAgcmV0dXJuIE1hdGguc3FydCh2Mi54KnYyLngrdjIueSp2Mi55KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB2MmRpc3QodjIxLCB2MjIpIHtcclxuICAgIHJldHVybiBCYXNlTWF0aFV0aWxzLnYybGVuKHtcclxuICAgICAgeDogdjIyLngtdjIxLngsXHJcbiAgICAgIHk6IHYyMi55LXYyMS55XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjb21wdXRlU3F1YXJlKHBzKSB7XHJcbiAgICBjb25zdCBhID0gW107XHJcbiAgICBsZXQgcCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBhLnB1c2goQmFzZU1hdGhVdGlscy52MmRpc3QocHNbaV0sIHBzWyhpKzEpJXBzLmxlbmd0aF0pKTtcclxuICAgICAgcCArPSAwLjUqYVtpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLnNxcnQocCoocC1hWzBdKSoocC1hWzFdKSoocC1hWzJdKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY29tcHV0ZUludGVycENvZWZzKHRyaSwgcCkge1xyXG4gICAgY29uc3QgcyA9IEJhc2VNYXRoVXRpbHMuY29tcHV0ZVNxdWFyZSh0cmkpLCBjb2Vmcz1bXSwgbCA9IHRyaS5sZW5ndGg7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxsOyArK2kpIHtcclxuICAgICAgY29lZnNbaV0gPSBCYXNlTWF0aFV0aWxzLmNvbXB1dGVTcXVhcmUoW3AsIHRyaVsoaSsxKSVsXSwgdHJpWyhpKzIpJWxdXSkvcztcclxuICAgIH1cclxuICAgIHJldHVybiBjb2VmcztcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0Jhc2VNYXRoVXRpbHMuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9CYXNlTWF0aFV0aWxzLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJy4vQmFzZU1hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXRoVXRpbHMgZXh0ZW5kcyBCYXNlTWF0aFV0aWxzIHtcclxuICBzdGF0aWMgdjEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG5cclxuICBzdGF0aWMgc3BsaXRTcGxpbmUoc3BsaW5lLCBOKSB7XHJcbiAgICBjb25zdCBvID0ge2xlbjogMCwgbHM6IFswXX0sIGRsPTEvTjtcclxuICAgIGZvcihsZXQgaT0wOyBpPD1OOyArK2kpIHtcclxuICAgICAgY29uc3QgcCA9IHNwbGluZS5nZXRQb2ludChpKmRsKTtcclxuICAgICAgaWYoaSkge1xyXG4gICAgICAgIGNvbnN0IGQgPSBNYXRoVXRpbHMudjEuZGlzdGFuY2VUbyhwKTtcclxuICAgICAgICBvLmxlbiArPSBkO1xyXG4gICAgICAgIG8ubHMucHVzaChkKTtcclxuICAgICAgfVxyXG4gICAgICBNYXRoVXRpbHMudjEuY29weShwKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldExpbmVhckluZGVjZXMoc3BsaW5lLCBuKSB7XHJcbiAgICBjb25zdCBkZWwgPSA1MDAwLCBkRGVsID0gMS9kZWw7XHJcbiAgICBjb25zdCBscz1bMF07XHJcbiAgICBsZXQgbCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTw9ZGVsOyArK2kpIHtcclxuICAgICAgY29uc3QgcCA9IHNwbGluZS5nZXRQb2ludChpKmREZWwpO1xyXG4gICAgICBpZihpKSB7XHJcbiAgICAgICAgY29uc3QgZD1NYXRoVXRpbHMudjEuZGlzdGFuY2VUbyhwKTtcclxuICAgICAgICBsICs9IGQ7XHJcbiAgICAgICAgbHMucHVzaChkKTtcclxuICAgICAgfVxyXG4gICAgICBNYXRoVXRpbHMudjEuY29weShwKTtcclxuICAgIH1cclxuICAgIGxzLnB1c2goMWU3KTtcclxuXHJcbiAgICBjb25zdCByZXMgPSBbXSwgZGwgPSBsLyhuLTEpO1xyXG4gICAgZm9yKGxldCBpPTAsIEw9MCwgZD1sc1swXTsgaTxscy5sZW5ndGgtMTsgKytpLCBkKz1sc1tpXSkge1xyXG4gICAgICBpZihNYXRoLmFicyhMLWQpPE1hdGguYWJzKEwtZC1sc1tpKzFdKSkge1xyXG4gICAgICAgIHJlcy5wdXNoKGkqZERlbCk7XHJcbiAgICAgICAgTCs9ZGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlZmluZVBvbHkocG9seSwgbWF4RGwpIHtcclxuICAgIGNvbnN0IHJlcyA9IFtdO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8cG9seS5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCBwMCA9IHBvbHlbaV0sIHAxID0gcG9seVsoaSsxKSVwb2x5Lmxlbmd0aF0sIGwgPSBCYXNlTWF0aFV0aWxzLnYyZGlzdChwMCwgcDEpLCBuID0gTWF0aC5jZWlsKGwvbWF4RGwpLCBkbCA9IGwvbjtcclxuICAgICAgcmVzLnB1c2gocDApO1xyXG4gICAgICBmb3IobGV0IGo9MTsgajxuOyArK2opIHtcclxuICAgICAgICByZXMucHVzaChuZXcgVEhSRUUuVmVjdG9yMihcclxuICAgICAgICAgIHAwLngraipkbCoocDEueC1wMC54KS9sLFxyXG4gICAgICAgICAgcDAueStqKmRsKihwMS55LXAwLnkpL2xcclxuICAgICAgICApKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL01hdGhVdGlscy5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL01hdGhVdGlscy5qcyIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzIHtcclxuXHJcbiAgc3RhdGljIG5vcm1hbGl6ZVVybCh1cmwpIHtcclxuICAgIGZ1bmN0aW9uIHNwbGl0KHMpIHtcclxuICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXFxcXC9nLCAnLycpLnNwbGl0KCcvJyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBiYXNlID0gc3BsaXQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgdXJsID0gc3BsaXQodXJsKTtcclxuICAgIGlmKGJhc2VbMl09PT11cmxbMl0pIHtcclxuICAgICAgdXJsWzBdID0gYmFzZVswXTtcclxuICAgIH1cclxuICAgIHJldHVybiB1cmwuam9pbignLycpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGV4dGVuZHMoZGVyLCBiYXNlKSB7XHJcbiAgICBmb3IobGV0IG5hbWUgaW4gYmFzZSkge1xyXG4gICAgICBpZighZGVyLmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgZGVyW25hbWVdID0gYmFzZVtuYW1lXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRlZmF1bHRDbXAoYSwgYikge1xyXG4gICAgcmV0dXJuIGEtYjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBsb3dlckJvdW5kKGEsIHgsIGNtcCkge1xyXG4gICAgY21wID0gY21wIHx8IFV0aWxzLmRlZmF1bHRDbXA7XHJcbiAgICBsZXQgbCA9IDAsIGggPSBhLmxlbmd0aC0xO1xyXG4gICAgd2hpbGUoaC1sPjEpIHtcclxuICAgICAgbGV0IG1pZCA9IE1hdGguZmxvb3IoKGwgKyBoKSAvIDIpO1xyXG4gICAgICBpZihjbXAoeCwgYVttaWRdKTwwKSB7XHJcbiAgICAgICAgaCA9IG1pZDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsID0gbWlkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY21wKHgsIGFbaF0pPj0wPyBoOiBsO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVXRpbHMuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9VdGlscy5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBHcmFwaFV0aWxzIGZyb20gJy4vR3JhcGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUJhc2Uge1xyXG5cclxuICBzdGF0aWMgcmVuZGVyQ2FudmFzID0gICQoJzxjYW52YXM+JylbMF07XHJcbiAgc3RhdGljIHJlbmRlckNhbnZhc0N0eCA9IEltYWdlQmFzZS5yZW5kZXJDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLnduZCA9IGNvbnRleHQud25kO1xyXG4gICAgdGhpcy5kb2MgPSBjb250ZXh0LmRvYztcclxuICAgIHRoaXMuZWxlbWVudCA9IGNvbnRleHQuZWxlbWVudCB8fCBjb250ZXh0LmRvYy5ib2R5O1xyXG4gICAgdGhpcy5jID0gY29udGV4dC5yZW5kZXJDYW52YXMgfHwgSW1hZ2VCYXNlLnJlbmRlckNhbnZhcztcclxuICAgIHRoaXMuY3R4ID0gY29udGV4dC5yZW5kZXJDYW52YXNDdHggfHwgSW1hZ2VCYXNlLnJlbmRlckNhbnZhc0N0eDtcclxuICAgIHRoaXMucmVzVyA9IHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgIHRoaXMucmVzSCA9IHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgdGhpcy5jb2xvciA9IGNvbG9yO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVzb2x1dGlvbihyZXMpIHtcclxuICAgIHRoaXMucmVzVyA9IHJlcy53aWR0aDtcclxuICAgIHRoaXMucmVzSCA9IHJlcy5oZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG5cclxuICB9XHJcblxyXG4gIHJlbmRlckJsYW5rUGFnZSgpIHtcclxuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKHRoaXMuY29sb3IsIDEpO1xyXG4gICAgdGhpcy5jdHgucmVjdCgwLCAwLCB0aGlzLmMud2lkdGgsIHRoaXMuYy5oZWlnaHQpO1xyXG4gICAgdGhpcy5jdHguZmlsbCgpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVySW1hZ2UoaW1hZ2UpIHtcclxuICAgIHRoaXMucHVzaEN0eCgpO1xyXG4gICAgdGhpcy5jdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcclxuICAgIHRoaXMucG9wQ3R4KCk7XHJcbiAgfVxyXG5cclxuICBub3JtVG9Db252KHApIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHg6IHAueCp0aGlzLmMud2lkdGgsXHJcbiAgICAgIHk6ICgxLXAueSkqdGhpcy5jLmhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlbmRlckhpdChwb2x5KSB7XHJcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcclxuICAgIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsMjU1LDAsMC40KSc7XHJcbiAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICBsZXQgcCA9IHRoaXMubm9ybVRvQ29udihwb2x5WzBdKTtcclxuICAgIGN0eC5tb3ZlVG8ocC54LCBwLnkpO1xyXG4gICAgZm9yKGxldCBpPTE7IGk8cG9seS5sZW5ndGg7ICsraSkge1xyXG4gICAgICBwID0gdGhpcy5ub3JtVG9Db252KHBvbHlbaV0pO1xyXG4gICAgICBjdHgubGluZVRvKHAueCwgcC55KTtcclxuICAgIH1cclxuICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgIGN0eC5maWxsKCk7XHJcbiAgfVxyXG5cclxuICBwdXNoQ3R4KCkge1xyXG4gICAgaWYodGhpcy5yZXNXIT10aGlzLmMud2lkdGgpIHtcclxuICAgICAgdGhpcy5jLndpZHRoID0gdGhpcy5yZXNXO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5yZXNIIT10aGlzLmMuaGVpZ2h0KSB7XHJcbiAgICAgIHRoaXMuYy5oZWlnaHQgPSB0aGlzLnJlc0g7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN0eC5zYXZlKCk7XHJcbiAgICB0aGlzLmN0eC5zY2FsZSh0aGlzLmMud2lkdGgvdGhpcy53aWR0aCwgdGhpcy5jLmhlaWdodC90aGlzLmhlaWdodCk7XHJcbiAgICByZXR1cm4gdGhpcy5jdHg7XHJcbiAgfVxyXG5cclxuICBwb3BDdHgoKSB7XHJcbiAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJOb3RGb3VuZFBhZ2UoKSB7XHJcbiAgICB0aGlzLnJlbmRlckJsYW5rUGFnZSgpO1xyXG4gIH1cclxuXHJcbiAgZmluaXNoUmVuZGVyKCkge1xyXG4gICAgaWYodGhpcy5vbkNoYW5nZSkge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuYyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmaW5pc2hMb2FkKCkge1xyXG4gICAgaWYodGhpcy5vbkxvYWQpIHtcclxuICAgICAgdGhpcy5vbkxvYWQoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXJ0UmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTaW11bGF0ZWREb2MoKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvSW1hZ2VCYXNlLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvSW1hZ2VCYXNlLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50Q29udmVydGVyIHtcclxuXHJcbiAgLy8gdmlydHVhbHNcclxuICAvLyBnZXRPYmplY3QoZSwgZGF0YSk7XHJcbiAgLy8gZ2V0Q2FsbGJhY2sob2JqZWN0KTtcclxuICAvLyB0ZXN0KG9iamVjdDEsIG9iamVjdDEpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYykge1xyXG4gICAgdGhpcy53bmQgPSB3bmQ7XHJcbiAgICB0aGlzLmRvYyA9IGRvYztcclxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZXRFbmFibGUodmwpIHtcclxuICAgIGlmKCF2bCkge1xyXG4gICAgICBpZih0aGlzLm1DYXBPYmplY3QpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLm1DYXBPYmplY3QsICQuRXZlbnQoJ21vdXNldXAnKSwgJ21vdXNldXAnKTtcclxuICAgICAgICB0aGlzLm1DYXBPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYodGhpcy5tSG92T2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZnkodGhpcy5tSG92T2JqZWN0LCAkLkV2ZW50KCdtb3VzZW91dCcpLCAnbW91c2VvdXQnKTtcclxuICAgICAgICB0aGlzLm1Ib3ZPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZW5hYmxlZCA9IHZsO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2FsbGJhY2sob2JqZWN0KSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgbm90aWZ5KG9iamVjdCwgZSwgdHlwZSkge1xyXG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmdldENhbGxiYWNrKG9iamVjdCk7XHJcbiAgICBpZihjYWxsYmFjaykge1xyXG4gICAgICBjb25zdCBwcm9wcyA9IHtcclxuICAgICAgICAuLi5lLFxyXG4gICAgICAgIHR5cGUsXHJcbiAgICAgICAgdmlldzogdGhpcy53bmRcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgakUgPSAkLkV2ZW50KHR5cGUsIHByb3BzKTtcclxuICAgICAgY2FsbGJhY2soakUsIG9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0KGUsIGRhdGEpIHtcclxuICAgIGlmKCF0aGlzLmVuYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBpZih0aGlzLmZpbHRlcikge1xyXG4gICAgICBlID0gdGhpcy5maWx0ZXIodGhpcy5lbGVtZW50LCBlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvYmplY3QgPSB0aGlzLmdldE9iamVjdChlLCBkYXRhKSxcclxuICAgICAgbm90aWZ5ID0gfmUudHlwZS5pbmRleE9mKCd0b3VjaCcpPyB0aGlzLmNvbnZlcnRUb3VjaChlLCBkYXRhLCBvYmplY3QpOiB0aGlzLmNvbnZlcnRNb3VzZShlLCBkYXRhLCBvYmplY3QpO1xyXG4gICAgaWYobm90aWZ5ICYmIG9iamVjdCkge1xyXG4gICAgICB0aGlzLm5vdGlmeShvYmplY3QsIGUsIGUudHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0VG91Y2goZSwgZGF0YSwgb2JqZWN0KSB7XHJcbiAgICBsZXQgbm90aWZ5ID0gdHJ1ZTtcclxuICAgIHN3aXRjaChlLnR5cGUpIHtcclxuICAgICAgY2FzZSAndG91Y2hzdGFydCc6IHtcclxuICAgICAgICBpZih0aGlzLnRDYXBPYmplY3QpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMudENhcE9iamVjdCwgZSwgJ3RvdWNoZW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudENhcE9iamVjdCA9IG9iamVjdDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICd0b3VjaGVuZCc6IHtcclxuICAgICAgICBpZih0aGlzLnRDYXBPYmplY3QgJiYgIXRoaXMudGVzdCh0aGlzLnRDYXBPYmplY3QsIG9iamVjdCkpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMudENhcE9iamVjdCwgZSwgJ3RvdWNoZW5kJyk7XHJcbiAgICAgICAgICBub3RpZnkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihvYmplY3QgJiYgdGhpcy50ZXN0KHRoaXMudENhcE9iamVjdCwgb2JqZWN0KSkge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZnkob2JqZWN0LCBlLCAndG91Y2h0YXAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50Q2FwT2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ3RvdWNodGFwJzoge1xyXG4gICAgICAgIG5vdGlmeSA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm90aWZ5O1xyXG4gIH1cclxuXHJcbiAgY29udmVydE1vdXNlKGUsIGRhdGEsIG9iamVjdCkge1xyXG4gICAgbGV0IG5vdGlmeSA9IHRydWU7XHJcbiAgICBzd2l0Y2goZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ21vdXNlZG93bic6IHtcclxuICAgICAgICBpZih0aGlzLm1DYXBPYmplY3QpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMubUNhcE9iamVjdCwgZSwgJ21vdXNldXAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tQ2FwT2JqZWN0ID0gb2JqZWN0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ21vdXNldXAnOiB7XHJcbiAgICAgICAgaWYodGhpcy5tQ2FwT2JqZWN0ICYmICF0aGlzLnRlc3QodGhpcy5tQ2FwT2JqZWN0LCBvYmplY3QpKSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLm1DYXBPYmplY3QsIGUsICdtb3VzZXVwJyk7XHJcbiAgICAgICAgICBub3RpZnkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnY2xpY2snOiB7XHJcbiAgICAgICAgbm90aWZ5ID0gdGhpcy50ZXN0KHRoaXMubUNhcE9iamVjdCwgb2JqZWN0KTtcclxuICAgICAgICB0aGlzLm1DYXBPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbW91c2VlbnRlcic6XHJcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XHJcbiAgICAgIGNhc2UgJ21vdXNlbW92ZSc6IHtcclxuICAgICAgICBpZighdGhpcy50ZXN0KHRoaXMubUhvdk9iamVjdCwgb2JqZWN0KSAmJiB0aGlzLm1Ib3ZPYmplY3QpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMubUhvdk9iamVjdCwgZSwgJ21vdXNlb3V0Jyk7XHJcbiAgICAgICAgICB0aGlzLm1Ib3ZPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLm1Ib3ZPYmplY3QgJiYgb2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeShvYmplY3QsIGUsICdtb3VzZW92ZXInKTtcclxuICAgICAgICAgIHRoaXMubUhvdk9iamVjdCA9IG9iamVjdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm90aWZ5ID0gZS50eXBlID09PSAnbW91c2Vtb3ZlJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdtb3VzZWxlYXZlJzpcclxuICAgICAgY2FzZSAnbW91c2VvdXQnOiB7XHJcbiAgICAgICAgaWYodGhpcy5tSG92T2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLm1Ib3ZPYmplY3QsIGUsICdtb3VzZW91dCcpO1xyXG4gICAgICAgICAgdGhpcy5tSG92T2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBub3RpZnkgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vdGlmeTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0V2ZW50Q29udmVydGVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvRXZlbnRDb252ZXJ0ZXIuanMiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHcmFwaFV0aWxzIHtcclxuXHJcbiAgc3RhdGljIGV4dHJhcG9sYXRlTGluZWFyKHgseSx4aSkge1xyXG4gICAgcmV0dXJuIHlbMF0rKHlbMV0teVswXSkvKHhbMV0teFswXSkqKHhpLXhbMF0pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGludGVycG9sYXRlMDEoeTEseTIsdCkge1xyXG4gICAgcmV0dXJuIEdyYXBoVXRpbHMuZXh0cmFwb2xhdGVMaW5lYXIoWzAsMV0sW3kxLHkyXSx0KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRDb2xvckJ5dGVzKGNvbG9yKSB7XHJcbiAgICByZXR1cm4gWyhjb2xvcj4+MTYpJjB4RkYsIChjb2xvcj4+OCkmMHhGRiwgY29sb3ImMHhGRl07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaW52ZXJzZUNvbG9yKGNvbG9yLCB0PTEpIHtcclxuICAgIGNvbnN0IGJzPUdyYXBoVXRpbHMuZ2V0Q29sb3JCeXRlcyhjb2xvciksXHJcbiAgICAgICAgICBpYnM9WzB4RkYtYnNbMF0sMHhGRi1ic1sxXSwweEZGLWJzWzJdXSxcclxuICAgICAgICAgIG5icz1bTWF0aC5yb3VuZChHcmFwaFV0aWxzLmludGVycG9sYXRlMDEoYnNbMF0saWJzWzBdLHQpKSxNYXRoLnJvdW5kKEdyYXBoVXRpbHMuaW50ZXJwb2xhdGUwMShic1sxXSxpYnNbMV0sdCkpLE1hdGgucm91bmQoR3JhcGhVdGlscy5pbnRlcnBvbGF0ZTAxKGJzWzJdLGlic1syXSx0KSldO1xyXG4gICAgcmV0dXJuIEdyYXBoVXRpbHMuYnl0ZXMyQ29sb3IobmJzKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjb2xvcjJSZ2JhKGNvbG9yLCBhKSB7XHJcbiAgICByZXR1cm4gR3JhcGhVdGlscy5ieXRlczJSZ2JhKEdyYXBoVXRpbHMuZ2V0Q29sb3JCeXRlcyhjb2xvciksIGEpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGJ5dGVzMlJnYmEoYnMsIGEpIHtcclxuICAgIHJldHVybiAncmdiYSgnK2JzLmpvaW4oJywnKSsnLCcrYSsnKSc7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYnl0ZXMyQ29sb3IoYnMpIHtcclxuICAgIHJldHVybiBic1syXXwoYnNbMV08PDgpfChic1swXTw8MTYpXHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0dyYXBoVXRpbHMuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9HcmFwaFV0aWxzLmpzIiwiaW1wb3J0IENhY2hlIGZyb20gJy4vQ2FjaGUnO1xyXG5pbXBvcnQgQmxhbmtJbWFnZSBmcm9tICcuL0JsYW5rSW1hZ2UnO1xyXG5pbXBvcnQgU3RhdGljSW1hZ2UgZnJvbSAnLi9TdGF0aWNJbWFnZSc7XHJcbmltcG9ydCBQZGZJbWFnZSBmcm9tICcuL1BkZkltYWdlJztcclxuaW1wb3J0IEludGVyYWN0aXZlSW1hZ2UgZnJvbSAnLi9JbnRlcmFjdGl2ZUltYWdlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlRmFjdG9yeSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNhY2hlKSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlIHx8IG5ldyBDYWNoZSgpO1xyXG4gIH1cclxuXHJcbiAgYnVpbGQoaW5mbywgbj0wLCB3aWR0aFRleGVscz0yMTAsIGhlaWdodFRleGVscz0yOTcsIGNvbG9yPTB4RkZGRkZGLCBpbmplY3Rvcj11bmRlZmluZWQpIHtcclxuICAgIGxldCBpbWFnZTtcclxuICAgIHN3aXRjaChpbmZvLnR5cGUpIHtcclxuICAgICAgY2FzZSAnaHRtbCc6IHtcclxuICAgICAgICBpbWFnZSA9IG5ldyBJbnRlcmFjdGl2ZUltYWdlKHRoaXMuY29udGV4dCwgd2lkdGhUZXhlbHMsIGhlaWdodFRleGVscywgY29sb3IsIGluZm8uc3JjLCB0aGlzLmNhY2hlLCBpbmplY3Rvcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnaW1hZ2UnOiB7XHJcbiAgICAgICAgaW1hZ2UgPSBuZXcgU3RhdGljSW1hZ2UodGhpcy5jb250ZXh0LCB3aWR0aFRleGVscywgaGVpZ2h0VGV4ZWxzLCBjb2xvciwgaW5mby5zcmMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ3BkZic6IHtcclxuICAgICAgICBpbWFnZSA9IG5ldyBQZGZJbWFnZSh0aGlzLmNvbnRleHQsIHdpZHRoVGV4ZWxzLCBoZWlnaHRUZXhlbHMsIGNvbG9yLCBpbmZvLnNyYywgbik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnYmxhbmsnOlxyXG4gICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgaW1hZ2UgPSBuZXcgQmxhbmtJbWFnZSh0aGlzLmNvbnRleHQsIHdpZHRoVGV4ZWxzLCBoZWlnaHRUZXhlbHMsIGNvbG9yKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGltYWdlO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9JbWFnZUZhY3RvcnkuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9JbWFnZUZhY3RvcnkuanMiLCJpbXBvcnQge3Byb3BzIGFzICBib29rUHJvcHN9IGZyb20gJy4uL3Byb3BzL2Jvb2snO1xyXG5pbXBvcnQgQmFzZU1hdGhVdGlscyBmcm9tICdCYXNlTWF0aFV0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvb2tQcm9wc0J1aWxkZXIge1xyXG4gIGNvbnN0cnVjdG9yKG9uUmVhZHkpIHtcclxuICAgIHRoaXMub25SZWFkeSA9IG9uUmVhZHk7XHJcbiAgICB0aGlzLmRlZmF1bHRzID0gYm9va1Byb3BzKCk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG5cclxuICB9XHJcblxyXG4gIGNhbGNTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuICAgIGNvbnN0IHNjYWxlID0gQmFzZU1hdGhVdGlscy5jYWxjU2NhbGUod2lkdGgsIGhlaWdodCwgdGhpcy5kZWZhdWx0cy53aWR0aCwgdGhpcy5kZWZhdWx0cy5oZWlnaHQpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkdGg6IHNjYWxlKndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHNjYWxlKmhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNhbGNUZXhlbHMod2lkdGgsIGhlaWdodCkge1xyXG4gICAgY29uc3Qgc2hlZXQgPSB0aGlzLmRlZmF1bHRzLnNoZWV0LCBzY2FsZSA9IEJhc2VNYXRoVXRpbHMuY2FsY1NjYWxlKHdpZHRoLCBoZWlnaHQsIHNoZWV0LndpZHRoVGV4ZWxzLCBzaGVldC5oZWlnaHRUZXhlbHMpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkdGhUZXhlbHM6IHNjYWxlKndpZHRoLFxyXG4gICAgICBoZWlnaHRUZXhlbHM6IHNjYWxlKmhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNhbGNQcm9wcyh3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICAuLi50aGlzLmRlZmF1bHRzLFxyXG4gICAgICAuLi50aGlzLmNhbGNTaXplKHdpZHRoLCBoZWlnaHQpLFxyXG4gICAgICBzaGVldDoge1xyXG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdHMuc2hlZXQsXHJcbiAgICAgICAgLi4udGhpcy5jYWxjVGV4ZWxzKHdpZHRoLCBoZWlnaHQpXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvdmVyOiB7XHJcbiAgICAgICAgLi4udGhpcy5kZWZhdWx0cy5jb3ZlcixcclxuICAgICAgfSxcclxuICAgICAgcGFnZToge1xyXG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdHMucGFnZSxcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNhbGNTaGVldHMocGFnZXMpIHtcclxuICAgIHJldHVybiB0aGlzLnNoZWV0cyA9IE1hdGguY2VpbChNYXRoLm1heCgwLCBwYWdlcy00KS8yKTtcclxuICB9XHJcblxyXG4gIGdldFNoZWV0cygpIHtcclxuICAgIHJldHVybiB0aGlzLnNoZWV0cztcclxuICB9XHJcblxyXG4gIGdldFByb3BzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvcHM7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlQ2FsbGJhY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5iaW5kcy5wYWdlQ2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICByZWFkeSgpIHtcclxuICAgIGlmKHRoaXMub25SZWFkeSkge1xyXG4gICAgICB0aGlzLm9uUmVhZHkodGhpcy5nZXRQcm9wcygpLCB0aGlzLmdldFNoZWV0cygpLCB0aGlzLmdldFBhZ2VDYWxsYmFjaygpKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9Cb29rUHJvcHNCdWlsZGVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9Cb29rUHJvcHNCdWlsZGVyLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBzaGVldEJsb2NrIGZyb20gJy4uL21vZGVscy9zaGVldEJsb2NrJztcclxuaW1wb3J0IE1hdGhVdGlscyBmcm9tICdNYXRoVXRpbHMnO1xyXG5pbXBvcnQgVGhyZWVVdGlscyBmcm9tICdUaHJlZVV0aWxzJztcclxuLy8gaW1wb3J0IFRocmVlTWFya3VwIGZyb20gJy4vVGhyZWVNYXJrdXAnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlZXRCbG9jayB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgcCwgZmlyc3QsIGxhc3QsIGFuZ2xlPTAsIHN0YXRlPSdjbG9zZWQnLCBoZWlnaHQ9MCkge1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWw7XHJcbiAgICB0aGlzLnAgPSB7XHJcbiAgICAgIC4uLnAsXHJcbiAgICAgIGZpcnN0LFxyXG4gICAgICBsYXN0XHJcbiAgICB9O1xyXG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKCk7XHJcblxyXG4gICAgY29uc3QgbG9hZGVkUG9pbnRzID0gdGhpcy5sb2FkUG9pbnRzKCk7XHJcbiAgICBPYmplY3Qua2V5cyhsb2FkZWRQb2ludHMpLm1hcCgoayk9PiB7XHJcbiAgICAgIHRoaXNba10gPSBsb2FkZWRQb2ludHNba11bcHJvcHMuc2hhcGVdIHx8IGxvYWRlZFBvaW50c1trXVswXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucFNwbGluZSA9IG5ldyBUSFJFRS5TcGxpbmUoW10pO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8dGhpcy5pbnRlcnBvbGF0aW9uUG9pbnRzLnhbMF0ubGVuZ3RoOyArK2kpIHtcclxuICAgIFx0dGhpcy5wU3BsaW5lLnBvaW50cy5wdXNoKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaVNwbGluZSA9IG5ldyBUSFJFRS5TcGxpbmUoW10pO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8c2hlZXRCbG9jay5yZXNYOyArK2kpIHtcclxuICAgIFx0dGhpcy5pU3BsaW5lLnBvaW50cy5wdXNoKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYVNwbGluZXMgPSBbXTtcclxuXHJcbiAgICAvL3RoaXMudGhyZWUgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuXHJcbiAgICB0aGlzLmdlb21ldHJ5ID0gc2hlZXRCbG9jay5nZW9tZXRyeS5jbG9uZSgpO1xyXG5cclxuICAgIHRoaXMucC5zaWRlRmFjZXMgPSBbe1xyXG4gICAgICAgIGZpcnN0OiAwLFxyXG4gICAgICAgIGxhc3Q6IHNoZWV0QmxvY2suZmFjZXNbMF1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGZpcnN0OiBzaGVldEJsb2NrLmZhY2VzWzBdLFxyXG4gICAgICAgIGxhc3Q6IHNoZWV0QmxvY2suZmFjZXNbMV1cclxuICAgICAgfVxyXG4gICAgXTtcclxuXHJcbiAgICB0aGlzLnNpZGVUZXh0dXJlID0gbmV3IFRIUkVFLlRleHR1cmUoKTtcclxuICAgIHRoaXMuc2lkZVRleHR1cmUud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZztcclxuICAgIHRoaXMuc2lkZVRleHR1cmUucmVwZWF0LnNldCgwLCBsYXN0LWZpcnN0KTtcclxuICAgIHRoaXMuc2lkZVRleHR1cmUuaW1hZ2UgPSBwcm9wcy5zaWRlVGV4dHVyZTtcclxuICAgIHRoaXMuc2lkZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMubWF0ZXJpYWxzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7bWFwOiB0aGlzLnNpZGVUZXh0dXJlfSksXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHttYXA6IHRoaXMuc2lkZVRleHR1cmV9KSxcclxuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe21hcDogdGhpcy5zaWRlVGV4dHVyZX0pLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7bWFwOiB0aGlzLnNpZGVUZXh0dXJlfSlcclxuICAgICAgICAgICAgICAgICAgXTtcclxuXHJcbiAgICB0aGlzLnAuc2V0VGV4dHVyZSh0aGlzLm1hdGVyaWFsc1swXSwgMipmaXJzdCk7XHJcbiAgICB0aGlzLnAuc2V0VGV4dHVyZSh0aGlzLm1hdGVyaWFsc1sxXSwgMipsYXN0LTEpO1xyXG5cclxuICAgIHRoaXMubWVzaCA9IG5ldyBUSFJFRS5NZXNoKHRoaXMuZ2VvbWV0cnksIG5ldyBUSFJFRS5NZXNoRmFjZU1hdGVyaWFsKHRoaXMubWF0ZXJpYWxzKSk7XHJcbiAgICB0aGlzLm1lc2guY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG4gICAgdGhpcy5tZXNoLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcclxuICAgIC8vIHRoaXMubWVzaC5mcnVzdHVtQ3VsbGVkID0gdHJ1ZTtcclxuXHJcbiAgICAvL3RoaXMudGhyZWUuYWRkKHRoaXMubWVzaCk7XHJcbiAgICB0aGlzLnRocmVlID0gdGhpcy5tZXNoO1xyXG4gICAgdGhpcy50aHJlZS51c2VyRGF0YS5zZWxmID0gdGhpcztcclxuXHJcbiAgICB0aGlzLm1hcmtlcnMgPSBbXTtcclxuICAgIGlmKHRoaXMucC5tYXJrZXIudXNlKSB7XHJcbiAgICAgIGNvbnN0IGw9dGhpcy5nZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICAgIGxldCBpcztcclxuICAgICAgLy8gaXMgPSBbMCwgc2hlZXRCbG9jay5yZXNYLTEsIChzaGVldEJsb2NrLnJlc1otMSkqc2hlZXRCbG9jay5yZXNYLCBzaGVldEJsb2NrLnJlc1oqc2hlZXRCbG9jay5yZXNYLTFdO1xyXG4gICAgICBpcyA9IEFycmF5LmFwcGx5KDAsIEFycmF5KGwpKS5tYXAoKF8sIGkpPT4gaSk7XHJcblxyXG4gICAgICBmb3IobGV0IGkgb2YgaXMpIHtcclxuICAgICAgICBjb25zdCBtYXJrZXIgPSBUaHJlZVV0aWxzLmNyZWF0ZU1hcmtlcih0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW2ldLCBpPGwvMj8weEZGMDAwMDoweDAwRkYwMCwgdGhpcy5wLm1hcmtlci5zaXplKTtcclxuICAgICAgICB0aGlzLm1hcmtlcnMucHVzaCh7XHJcbiAgICAgICAgICBtYXJrZXIsXHJcbiAgICAgICAgICB2ZXJ0ZXg6IGlcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnRocmVlLmFkZChtYXJrZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb3JuZXIgPSB7XHJcbiAgICAgIHVzZTogdHJ1ZSxcclxuICAgICAgaGVpZ2h0OiAwLFxyXG4gICAgICBtYXhEaXN0YW5jZTogMCxcclxuICAgICAgcG9pbnRzOiBbXSxcclxuICAgICAgT1o6IG5ldyBUSFJFRS5WZWN0b3IzKDAsMCwxKSxcclxuICAgICAgYXhpczogbmV3IFRIUkVFLlZlY3RvcjMoKVxyXG4gICAgfTtcclxuICAgIHRoaXMuc2V0KDAsICdjbG9zZWQnLCBoZWlnaHQsIGZpcnN0LCBsYXN0KTsgLy8gY2FsY3VsYXRlIGNvcm5lciBwb2ludHNcclxuXHJcbiAgICB0aGlzLnNldChhbmdsZSwgc3RhdGUsIGhlaWdodCwgZmlyc3QsIGxhc3QpOyAvLyBpbml0IHBvc2l0aW9uXHJcblxyXG4gICAgLy8gaWYoIVNoZWV0QmxvY2subWFya3VwKSB7XHJcbiAgICAvLyAgIFNoZWV0QmxvY2subWFya3VwPXRydWU7XHJcbiAgICAvLyAgIHRoaXMubWFya3VwID0gbmV3IFRocmVlTWFya3VwKHRoaXMsIDAsIFt7XHJcbiAgICAvLyAgICAgeDogMCxcclxuICAgIC8vICAgICB5OiAwLFxyXG4gICAgLy8gICB9LCB7XHJcbiAgICAvLyAgICAgeDogMC41LFxyXG4gICAgLy8gICAgIHk6IDFcclxuICAgIC8vICAgfSwge1xyXG4gICAgLy8gICAgIHg6IDEsXHJcbiAgICAvLyAgICAgeTogMFxyXG4gICAgLy8gICB9XS5tYXAoKHApPT5uZXcgVEhSRUUuVmVjdG9yMihwLngsIHAueSkpLCB7fSk7XHJcbiAgICAvLyB9XHJcblxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGZvcihsZXQgbSBvZiB0aGlzLm1hdGVyaWFscykge1xyXG4gICAgICBpZihtLm1hcCkge1xyXG4gICAgICAgIG0ubWFwID0gbnVsbDtcclxuICAgICAgICBtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBtLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLm1hdGVyaWFscztcclxuICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnAubGFzdC10aGlzLnAuZmlyc3Q7XHJcbiAgfVxyXG5cclxuICBnZXRQcm9wcygpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLnRoaXMucC5wYWdlLFxyXG4gICAgICBzaGVldHM6IHRoaXMucC5zaGVldHNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRUb3BDZXJuZXJzKCkge1xyXG4gICAgY29uc3Qgb2ZmID0gdGhpcy5hbmdsZT5NYXRoLlBJLzI/IHRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoLzI6IDA7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbb2ZmXSxcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW3NoZWV0QmxvY2sucmVzWC0xK29mZl0sXHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1soc2hlZXRCbG9jay5yZXNaLTEpKnNoZWV0QmxvY2sucmVzWCtvZmZdLFxyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbc2hlZXRCbG9jay5yZXNaKnNoZWV0QmxvY2sucmVzWC0xK29mZl1cclxuICAgICAgXTtcclxuICB9XHJcblxyXG4gIGdldFRvcFNpemUoKSB7XHJcbiAgICAvLyBjb25zdCBsPXRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoLCBvZmYgPSB0aGlzLmFuZ2xlPk1hdGguUEkvMj8gbC8yOiAwLFxyXG4gICAgLy8gICB2MCA9IHRoaXMuZ2VvbWV0cnkudmVydGljZXNbb2ZmXSwgdjEgPSB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW3NoZWV0QmxvY2sucmVzWipzaGVldEJsb2NrLnJlc1gtMStvZmZdO1xyXG4gICAgLy8gLy8gaXMgPSBbMCwgc2hlZXRCbG9jay5yZXNYLTEsIChzaGVldEJsb2NrLnJlc1otMSkqc2hlZXRCbG9jay5yZXNYLCBzaGVldEJsb2NrLnJlc1oqc2hlZXRCbG9jay5yZXNYLTFdO1xyXG4gICAgLy8gcmV0dXJuIHtcclxuICAgIC8vICAgd2lkdGg6IE1hdGguYWJzKHYxLngtdjAueCksXHJcbiAgICAvLyAgIGhlaWdodDogTWF0aC5hYnModjEuei12MC56KVxyXG4gICAgLy8gfTtcclxuICAgIGNvbnN0IHZzID0gdGhpcy5nZXRUb3BDZXJuZXJzKCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogdnNbMF0uZGlzdGFuY2VUbyh2c1sxXSksXHJcbiAgICAgIGhlaWdodDogdnNbMF0uZGlzdGFuY2VUbyh2c1syXSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRUb3BXb3JsZFJvdGF0aW9uKHEpIHtcclxuICAgIHEueCA9IC1NYXRoLlBJLzI7XHJcbiAgICByZXR1cm4gcTtcclxuICB9XHJcblxyXG4gIGdldFRvcFdvcmxkUG9zaXRpb24odikge1xyXG4gICAgY29uc3QgbD10aGlzLmdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCwgb2ZmID0gdGhpcy5hbmdsZT5NYXRoLlBJLzI/IGwvMjogMCwgdnMgPSBbXHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tvZmZdLFxyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbc2hlZXRCbG9jay5yZXNYLTErb2ZmXSxcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzWyhzaGVldEJsb2NrLnJlc1otMSkqc2hlZXRCbG9jay5yZXNYK29mZl0sXHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tzaGVldEJsb2NrLnJlc1oqc2hlZXRCbG9jay5yZXNYLTErb2ZmXVxyXG4gICAgICBdO1xyXG4gICAgdi5zZXQoMCwgMCwgMCk7XHJcbiAgICBmb3IobGV0IHZpIG9mIHZzKSB7XHJcbiAgICAgIHYueCArPSAwLjI1KnZpLng7XHJcbiAgICAgIHYueSArPSAwLjI1KnZpLnk7XHJcbiAgICAgIHYueiArPSAwLjI1KnZpLno7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRocmVlLmxvY2FsVG9Xb3JsZCh2KTtcclxuICAgIHJldHVybiB2O1xyXG4gIH1cclxuXHJcbiAgZ2V0SW50ZXJwb2xhdGlvblBvaW50cyhpbmRzLCBtb2QpIHtcclxuICAgIGNvbnN0IHBzID0ge3g6IFtdLCB5OiBbXX0sIEsgPSB0aGlzLmdldFByb3BzKCkud2F2ZTtcclxuICAgIGZvcihsZXQgaSBvZiBpbmRzKSB7XHJcbiAgICAgIHBzLngucHVzaChbLi4udGhpcy5pbnRlcnBvbGF0aW9uUG9pbnRzLnhbaV1dKTtcclxuICAgICAgcHMueS5wdXNoKH5tb2QuaW5kZXhPZihpKT8gdGhpcy5pbnRlcnBvbGF0aW9uUG9pbnRzLnlbaV0ubWFwKChuKT0+IEsqbik6IFsuLi50aGlzLmludGVycG9sYXRpb25Qb2ludHMueVtpXV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBzO1xyXG4gIH1cclxuXHJcbiAgc2V0KGFuZ2xlLCBzdGF0ZT10aGlzLnN0YXRlLCBoZWlnaHQ9dGhpcy5jb3JuZXIuaGVpZ2h0LCBmaXJzdD10aGlzLnAuZmlyc3QsIGxhc3Q9dGhpcy5wLmxhc3QpIHtcclxuICAgIGNvbnN0IFBJID0gTWF0aC5QSTtcclxuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcclxuICAgIGxldCBjbG9zZWRBbmdsZSwgYmluZGVyVHVybjtcclxuICAgIGlmKHR5cGVvZiBhbmdsZT09PSdvYmplY3QnKSB7XHJcbiAgICAgIHRoaXMuYW5nbGUgPSBhbmdsZS5vcGVuZWRBbmdsZTtcclxuICAgICAgY2xvc2VkQW5nbGUgPSBhbmdsZS5jbG9zZWRBbmdsZTtcclxuICAgICAgYmluZGVyVHVybiA9IGFuZ2xlLmJpbmRlclR1cm4+UEkvMj9QSS1hbmdsZS5iaW5kZXJUdXJuOmFuZ2xlLmJpbmRlclR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb3JuZXIuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgaWYodGhpcy5wLmZpcnN0IT09Zmlyc3QgfHwgdGhpcy5wLmxhc3QhPT1sYXN0KSB7XHJcbiAgICAgIHRoaXMuc2lkZVRleHR1cmUucmVwZWF0LnNldCgwLCBsYXN0LWZpcnN0KTtcclxuICAgICAgdGhpcy5zaWRlVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIGlmKHRoaXMucC5maXJzdCE9PWZpcnN0KSB7XHJcbiAgICAgICAgdGhpcy5wLnNldFRleHR1cmUodGhpcy5tYXRlcmlhbHNbMF0sIDIqZmlyc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHRoaXMucC5sYXN0IT09bGFzdCkge1xyXG4gICAgICAgIHRoaXMucC5zZXRUZXh0dXJlKHRoaXMubWF0ZXJpYWxzWzFdLCAyKmxhc3QtMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucC5maXJzdCA9IGZpcnN0O1xyXG4gICAgdGhpcy5wLmxhc3QgPSBsYXN0O1xyXG4gICAgbGV0IHBvaW50cztcclxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcygpO1xyXG4gICAgaWYodGhpcy5zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcclxuICAgICAgcG9pbnRzID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uUG9pbnRzKHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMsIHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLnN0YXRlID09PSAnb3BlbmVkJykge1xyXG4gICAgICBpZihjbG9zZWRBbmdsZSE9PXVuZGVmaW5lZCAmJiBNYXRoLmFicyhjbG9zZWRBbmdsZS1QSS8yKT4xZS0yKSB7XHJcbiAgICAgICAgcG9pbnRzID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uUG9pbnRzKHRoaXMuZmxhdEludGVycG9sYXRpb25JbmRlY2VzLCBbXSk7XHJcbiAgICAgICAgY29uc3QgcHMgPSB0aGlzLmdldFBvaW50c0F0QW5nbGUodGhpcy5nZXRJbnRlcnBvbGF0aW9uUG9pbnRzKHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMsIHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMpLCBjbG9zZWRBbmdsZT5QSS8yP1BJLWNsb3NlZEFuZ2xlOmNsb3NlZEFuZ2xlKTtcclxuICAgICAgICBwb2ludHMueCA9IFtwcy54LC4uLnBvaW50cy54XTtcclxuICAgICAgICBwb2ludHMueSA9IFtwcy55LC4uLnBvaW50cy55XTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhwcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcG9pbnRzID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uUG9pbnRzKHRoaXMub3BlbmVkSW50ZXJwb2xhdGlvbkluZGVjZXMsIHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgaGwsIGhyLCBvZmZzZXQgPSAwLjUqcHJvcHMuc2hlZXRzKnByb3BzLmRlcHRoO1xyXG4gICAgaWYodGhpcy5zdGF0ZT09PSdjbG9zZWQnKSB7XHJcbiAgICAgIG9mZnNldCAtPSA3ZS02KnRoaXMucC5zY2FsZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuYW5nbGU8PVBJLzIpIHtcclxuICAgICAgaGwgPSAocHJvcHMuc2hlZXRzLWZpcnN0KSpwcm9wcy5kZXB0aDtcclxuICAgICAgaHIgPSAocHJvcHMuc2hlZXRzLWxhc3QpKnByb3BzLmRlcHRoO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGhsID0gZmlyc3QqcHJvcHMuZGVwdGg7XHJcbiAgICAgIGhyID0gbGFzdCpwcm9wcy5kZXB0aDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbkFuZ2xlID0gdGhpcy5hbmdsZT5QSS8yP1BJLXRoaXMuYW5nbGU6dGhpcy5hbmdsZSwgaEFuZ2xlID0gdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NlZCc/IGluQW5nbGU6IChiaW5kZXJUdXJuPT09dW5kZWZpbmVkPyBQSS8yOiBiaW5kZXJUdXJuKTtcclxuICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSB0aGlzLmdldFBvaW50c0F0QW5nbGVBbmRIcyhwb2ludHMsIGluQW5nbGUsIGhBbmdsZSwgW2hsL3Byb3BzLndpZHRoLCBoci9wcm9wcy53aWR0aF0pO1xyXG4gICAgaWYodGhpcy5hbmdsZT5QSS8yKSB7XHJcbiAgICAgIHRoaXMuaW52ZXJzZShsZWZ0KTtcclxuICAgICAgdGhpcy5pbnZlcnNlKHJpZ2h0KTtcclxuICAgICAgb2Zmc2V0ID0gLW9mZnNldDtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0UG9pbnRzKGxlZnQsIHJpZ2h0LCBvZmZzZXQpO1xyXG4gIH1cclxuXHJcbiAgc2V0UG9pbnRzKGxlZnQsIHJpZ2h0LCBvZmZzZXQpIHtcclxuICAgIGNvbnN0IHAgPSB0aGlzLmdldFByb3BzKCk7XHJcbiAgICBsZXQgaSA9IDA7XHJcblxyXG4gICAgY29uc3QgeXMgPSBbcmlnaHQsIGxlZnRdO1xyXG4gICAgZm9yKGxldCB5ID0gMDsgeTxzaGVldEJsb2NrLnJlc1k7ICsreSkge1xyXG4gICAgICBmb3IobGV0IHogPSAwOyB6PHNoZWV0QmxvY2sucmVzWjsgKyt6KSB7XHJcbiAgICAgICAgZm9yKGxldCB4ID0gMDsgeDxzaGVldEJsb2NrLnJlc1g7ICsreCkge1xyXG4gICAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tpKytdLnNldChcclxuICAgICAgICAgICAgeXNbeV0ueFt4XSpwLndpZHRoK29mZnNldCxcclxuICAgICAgICAgICAgeXNbeV0ueVt4XSpwLndpZHRoLFxyXG4gICAgICAgICAgICB6KnAuaGVpZ2h0LyhzaGVldEJsb2NrLnJlc1otMSktMC41KnAuaGVpZ2h0XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoaSE9PXRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnNvbGUud2Fybignc2V0UG9pbnRzOiBiYWQgbWFwcGluZyEnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmNvcm5lci51c2UgJiYgIXRoaXMuY29ybmVyLnBvaW50cy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgcGxhbmUgPSBuZXcgVEhSRUUuUGxhbmUoKSwgbm9ybWFsID0gcGxhbmUubm9ybWFsLCBwbGFuZU9mZnNldCA9ICgxLXRoaXMuZ2V0UHJvcHMoKS5mbGV4aWJsZUNvcm5lcikqTWF0aC5taW4ocC53aWR0aCwgcC5oZWlnaHQpLCBwcm9qID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgICAgcGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQobmV3IFRIUkVFLlZlY3RvcjMoLTEsMCwtMSkubm9ybWFsaXplKCksIG5ldyBUSFJFRS5WZWN0b3IzKHBsYW5lT2Zmc2V0K29mZnNldCwgMCwgMC41KnAuaGVpZ2h0KSk7XHJcbiAgICAgIGZvcihsZXQgaT0wLCBsPXRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoO2k8bDsrK2kpIHtcclxuICAgICAgICBwbGFuZS5wcm9qZWN0UG9pbnQodGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tpXSwgcHJvaik7XHJcbiAgICAgICAgcHJvai5zdWIodGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tpXSk7XHJcbiAgICAgICAgaWYocHJvai54Km5vcm1hbC54K3Byb2oueSpub3JtYWwueStwcm9qLnoqbm9ybWFsLno+MCkge1xyXG4gICAgICAgICAgY29uc3QgZCA9IHByb2oubGVuZ3RoKCkvcGxhbmVPZmZzZXQ7XHJcbiAgICAgICAgICB0aGlzLmNvcm5lci5tYXhEaXN0YW5jZSA9IE1hdGgubWF4KHRoaXMuY29ybmVyLm1heERpc3RhbmNlLCBkKTtcclxuICAgICAgICAgIHRoaXMuY29ybmVyLnBvaW50cy5wdXNoKHt2ZXJ0ZXg6IGksIGRpc3RhbmNlOiBkfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5jb3JuZXIudXNlICYmIE1hdGguYWJzKHRoaXMuY29ybmVyLmhlaWdodCk+MWUtMykge1xyXG4gICAgICBjb25zdCBkMkFuZ2xlID0gKGQpPT4gcC5jb3JuZXJEZXZpYXRpb24qdGhpcy5jb3JuZXIuaGVpZ2h0LygxK01hdGguZXhwKC1wLmJlbmRpbmcqKGQtMC41KnRoaXMuY29ybmVyLm1heERpc3RhbmNlKSkpO1xyXG4gICAgICB0aGlzLmNvcm5lci5heGlzLnNldCgtMSwwLDEpLm5vcm1hbGl6ZSgpO1xyXG4gICAgICB0aGlzLmNvcm5lci5heGlzLmFwcGx5QXhpc0FuZ2xlKHRoaXMuY29ybmVyLk9aLCB0aGlzLmFuZ2xlKTtcclxuICAgICAgZm9yKGxldCBwb2ludCBvZiB0aGlzLmNvcm5lci5wb2ludHMpIHtcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW3BvaW50LnZlcnRleF0uYXBwbHlBeGlzQW5nbGUodGhpcy5jb3JuZXIuYXhpcywgZDJBbmdsZShwb2ludC5kaXN0YW5jZSkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IobGV0IG0gb2YgdGhpcy5tYXJrZXJzKSB7XHJcbiAgICAgIG0ubWFya2VyLnBvc2l0aW9uLmNvcHkodGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1ttLnZlcnRleF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuICAgIC8vdGhpcy5nZW9tZXRyeS5jb21wdXRlRmFjZU5vcm1hbHMoKTtcclxuICAgIHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcbiAgICAvL3RoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgaWYodGhpcy5tYXJrdXApIHtcclxuICAgICAgdGhpcy5tYXJrdXAuY29tcHV0ZVZlcnRpY2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnZlcnNlKHBzKSB7XHJcbiAgICBmb3IobGV0IGkgPSAwO2k8cHMueC5sZW5ndGg7ICsraSkge1xyXG4gICAgICBwcy54W2ldPS1wcy54W2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBzO1xyXG4gIH1cclxuXHJcbiAgZ2V0UG9pbnRzQXRIcyhwcywgYW5nbGUsIGhzKSB7XHJcbiAgICBjb25zdCBOID0gMTAwMDtcclxuICAgIE1hdGhVdGlscy5zZXRTcGxpbmVQb2ludHModGhpcy5wU3BsaW5lLCBwcyk7XHJcbiAgICBsZXQgYmwgPSBNYXRoVXRpbHMuc3BsaXRTcGxpbmUodGhpcy5wU3BsaW5lLCBOKSwgcj1bXTtcclxuICAgIHtcclxuICAgICAgY29uc3QgcDEgPSB7Li4udGhpcy5wU3BsaW5lLmdldFBvaW50KChOLTEpL04pfSwgcDIgPSB7Li4udGhpcy5wU3BsaW5lLmdldFBvaW50KDEpfSxcclxuICAgICAgICBkcCA9IHt4OiBwMi54LXAxLngsIHk6IHAyLnktcDEueX0sIGxuID0gTWF0aC5zcXJ0KGRwLngqZHAueCtkcC55KmRwLnkpLFxyXG4gICAgICAgIHNwID0gdGhpcy5wU3BsaW5lLnBvaW50c1t0aGlzLnBTcGxpbmUucG9pbnRzLmxlbmd0aC0xXTtcclxuICAgICAgc3Auc2V0KHNwLngrMC4xKmRwLngvbG4sIHNwLnkrMC4xKmRwLnkvbG4sIDApO1xyXG4gICAgICBibCA9IE1hdGhVdGlscy5zcGxpdFNwbGluZSh0aGlzLnBTcGxpbmUsIE4pO1xyXG4gICAgfVxyXG4gICAgYmwubHMucHVzaCgxZTcpO1xyXG4gICAgTWF0aFV0aWxzLm1hcGwyTChibC5scywgYmwubGVuLCBzaGVldEJsb2NrLnJlc1gsIChpKT0+IHtcclxuICAgICAgZm9yKGxldCBqPTA7IGo8aHMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBpZighaSkge1xyXG4gICAgICAgICAgcltqXSA9IHt4OiBbLWhzW2pdKk1hdGguc2luKGFuZ2xlKV0sIHk6IFtoc1tqXSpNYXRoLmNvcyhhbmdsZSldfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBwMCA9IHsuLi50aGlzLnBTcGxpbmUuZ2V0UG9pbnQoKGktMSkvTil9LFxyXG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLnBTcGxpbmUuZ2V0UG9pbnQoaS9OKSxcclxuICAgICAgICAgICAgICAgIHg9LShwMS55LXAwLnkpLCB5PShwMS54LXAwLngpLCBsPU1hdGguc3FydCh4KngreSp5KTtcclxuICAgICAgICAgIHJbal0ueC5wdXNoKHAxLngreC9sKmhzW2pdKTtcclxuICAgICAgICAgIHJbal0ueS5wdXNoKHAxLnkreS9sKmhzW2pdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG5wcz1bXTtcclxuICAgIGZvcihsZXQgaj0wOyBqPGhzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIG5wc1tqXT17eDpbXSx5OltdfTtcclxuICAgICAgTWF0aFV0aWxzLnNldFNwbGluZVBvaW50cyh0aGlzLmlTcGxpbmUsIHJbal0pO1xyXG4gICAgICBjb25zdCBsID0gTWF0aFV0aWxzLnNwbGl0U3BsaW5lKHRoaXMuaVNwbGluZSwgTik7XHJcbiAgICAgIGwubHMucHVzaCgxZTcpO1xyXG4gICAgICBNYXRoVXRpbHMubWFwbDJMKGwubHMsIDEsIHNoZWV0QmxvY2sucmVzWCwgKGkpPT4ge1xyXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmlTcGxpbmUuZ2V0UG9pbnQoaS9OKTtcclxuICAgICAgICBucHNbal0ueC5wdXNoKHAueCk7XHJcbiAgICAgICAgbnBzW2pdLnkucHVzaChwLnkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBucHM7XHJcbiAgfVxyXG5cclxuICBnZXRQb2ludHNBdEFuZ2xlQW5kSHMocG9pbnRzLCBhbmdsZSwgaEFuZ2xlLCBocykge1xyXG4gICAgY29uc3QgcHMgPSB0aGlzLmdldFBvaW50c0F0QW5nbGUocG9pbnRzLCBhbmdsZSk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQb2ludHNBdEhzKHBzLCBoQW5nbGUsIGhzKTtcclxuICB9XHJcblxyXG4gIGdldFBvaW50c0F0QW5nbGUocG9pbnRzLCBhbmdsZSkge1xyXG4gICAgY29uc3QgcHM9e3g6IFtdLCB5OltdfSwgYW5nbGVzPVtdO1xyXG4gICAgYW5nbGUvPU1hdGguUEkvMjtcclxuICAgIGZvcihsZXQgaiA9IDA7IGo8cG9pbnRzLngubGVuZ3RoOyArK2opIHtcclxuICAgICAgYW5nbGVzLnB1c2goai8ocG9pbnRzLngubGVuZ3RoLTEpKTtcclxuICAgIH1cclxuICAgIGZvcihsZXQgaSA9IDA7IGk8cG9pbnRzLnhbMF0ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgeHBzID0gW10sIHlwcyA9IFtdO1xyXG4gICAgICBmb3IobGV0IGogPSAwOyBqPHBvaW50cy54Lmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgeHBzLnB1c2gocG9pbnRzLnhbal1baV0pO1xyXG4gICAgICAgIHlwcy5wdXNoKHBvaW50cy55W2pdW2ldKTtcclxuICAgICAgfVxyXG4gICAgICBwcy54LnB1c2godGhpcy5pbnRlcnBvbGF0ZShhbmdsZXMseHBzLGFuZ2xlKSk7XHJcbiAgICAgIHBzLnkucHVzaCh0aGlzLmludGVycG9sYXRlKGFuZ2xlcyx5cHMsYW5nbGUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcztcclxuICB9XHJcblxyXG4gIGludGVycG9sYXRlKHgseSx4aSkge1xyXG4gICAgaWYoIXRoaXMuYVNwbGluZXNbeC5sZW5ndGhdKSB7XHJcbiAgICAgIHRoaXMuYVNwbGluZXNbeC5sZW5ndGhdID0gbmV3IFRIUkVFLlNwbGluZShbXSk7XHJcbiAgICAgIGNvbnN0IHBzID0gdGhpcy5hU3BsaW5lc1t4Lmxlbmd0aF0ucG9pbnRzO1xyXG4gICAgICBmb3IobGV0IGk9MDtpPHgubGVuZ3RoOysraSkge1xyXG4gICAgICAgIHBzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHNwbGluZSA9IHRoaXMuYVNwbGluZXNbeC5sZW5ndGhdO1xyXG4gICAgZm9yKGxldCBpPTA7aTx4Lmxlbmd0aDsrK2kpIHtcclxuICAgICAgc3BsaW5lLnBvaW50c1tpXS5zZXQoeFtpXSwgeVtpXSwgMCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3BsaW5lLmdldFBvaW50KE1hdGgubWluKDEsIE1hdGgubWF4KHhpLCAwKSkpLnk7XHJcbiAgfVxyXG5cclxuICBsb2FkUG9pbnRzKCkge1xyXG4gICAgY29uc3QgeD1bXSx5PVtdO1xyXG4gICAgZm9yKGxldCByIG9mIFswLCAwLjI4NzcsIDAuNjM0NywgMC44MTc0LCAxLjAwMDBdKSB7XHJcbiAgICAgIHgucHVzaChyKk1hdGguY29zKDAuOSpNYXRoLlBJLzQpKTtcclxuICAgICAgeS5wdXNoKHIqTWF0aC5zaW4oMC45Kk1hdGguUEkvNCkpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3BlbmVkSW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFsyLDMsNF0sXHJcbiAgICAgIFsyLDMsNCw1LDZdXHJcbiAgICBdLFxyXG4gICAgY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFswLDEsMl0sXHJcbiAgICAgIFswLDEsMl1cclxuICAgIF0sXHJcbiAgICBmbGF0SW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFs1LDRdLFxyXG4gICAgICBbNyw2XVxyXG4gICAgXSxcclxuICAgIGludGVycG9sYXRpb25Qb2ludHMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICB4OiBbXHJcbiAgICAgICAgICBbMCwwLjI4NzcsMC42MzQ3LDAuODE3NCwxLjAwMDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjg2LDAuNjMyLDAuODE1LDAuOTk3XSxcclxuICAgICAgICAgIFswLjAwMCwwLjI3OSwwLjYyMywwLjgwNiwwLjk4OF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4xMjYsMC40MTEsMC41OTMsMC43NzRdLFxyXG4gICAgICAgICAgWzAsMCwwLDAsMF0sXHJcbiAgICAgICAgICB4XHJcbiAgICAgICAgXSxcclxuICAgICAgICB5OiBbXHJcbiAgICAgICAgICBbMCwwLDAsMCwwXSxcclxuICAgICAgICAgIFswLjAwMCwwLjAzMCwwLjAxMCwwLjAwMiwwLjAwMF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4wNjAsMC4wMTcsMC4wMDQsMC4wMDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjU5LDAuNDQwLDAuNDQ2LDAuNDI5XSxcclxuICAgICAgICAgIFswLCAwLjI4NzcsIDAuNjM0NywgMC44MTc0LCAxLjAwMDBdLFxyXG4gICAgICAgICAgeVxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHg6IFtcclxuICAgICAgICAgIFswLDAuMjg3NywwLjYzNDcsMC44MTc0LDEuMDAwMF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4yODYsMC42MzIsMC44MTUsMC45OTddLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjc5LDAuNjIzLDAuODA2LDAuOTg4XSxcclxuICAgICAgICAgIFswLjAwMCwwLjIzMywwLjU2MywwLjc0NiwwLjkyN10sXHJcbiAgICAgICAgICBbMC4wMDAsMC4xNDQsMC40MzMsMC42MTMsMC43OTZdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMDcwLDAuMjg4LDAuNDU1LDAuNjI2XSxcclxuICAgICAgICAgIFswLDAsMCwwLDBdLFxyXG4gICAgICAgICAgeFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgeTogW1xyXG4gICAgICAgICAgWzAsMCwwLDAsMF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4wMzAsMC4wMTAsMC4wMDIsMC4wMDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMDYwLDAuMDE3LDAuMDA0LDAuMDAwXSxcclxuICAgICAgICAgIFswLjAwMCwwLjE2OCwwLjI2OSwwLjI3MCwwLjI1NV0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4yNDUsMC40MzUsMC40NTgsMC40NjBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjc4LDAuNTQ0LDAuNjE0LDAuNjczXSxcclxuICAgICAgICAgIFswLCAwLjI4NzcsIDAuNjM0NywgMC44MTc0LCAxLjAwMDBdLFxyXG4gICAgICAgICAgeVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpbnRlcnBvbGF0aW9uUG9pbnRzLFxyXG4gICAgICBvcGVuZWRJbnRlcnBvbGF0aW9uSW5kZWNlcyxcclxuICAgICAgY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMsXHJcbiAgICAgIGZsYXRJbnRlcnBvbGF0aW9uSW5kZWNlc1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9TaGVldEJsb2NrLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9TaGVldEJsb2NrLmpzIiwiXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9wcygpIHtcclxuICAvLyBjb25zdCBwcm9wcyA9IHtcclxuICAvLyAgIGhlaWdodCxcclxuICAvLyAgIHdpZHRoLFxyXG4gIC8vICAgZ3Jhdml0eSxcclxuICAvLyAgIGluamVjdG9yLFxyXG4gIC8vICAgY2FjaGVkUGFnZXMsXHJcbiAgLy8gICByZW5kZXJJbmFjdGl2ZVBhZ2VzLFxyXG4gIC8vICAgcmVuZGVyV2hpbGVGbGlwcGluZyxcclxuICAvLyAgIHBhZ2VzRm9yUHJlZGljdGluZyxcclxuICAvLyAgIHByZWxvYWRQYWdlcyxcclxuICAvLyAgIHNoZWV0OiB7XHJcbiAgLy8gICAgIHN0YXJ0VmVsb2NpdHksXHJcbiAgLy8gICAgIGNvcm5lckRldmlhdGlvbixcclxuICAvLyAgICAgZmxleGliaWxpdHksXHJcbiAgLy8gICAgIGZsZXhpYmxlQ29ybmVyLFxyXG4gIC8vICAgICBiZW5kaW5nLFxyXG4gIC8vICAgICB3YXZlLFxyXG4gIC8vICAgICBzaGFwZSxcclxuICAvLyAgICAgd2lkdGhUZXhlbHMsXHJcbiAgLy8gICAgIGhlaWdodFRleGVscyxcclxuICAvLyAgICAgY29sb3IsXHJcbiAgLy8gICAgIHNpZGVUZXh0dXJlXHJcbiAgLy8gICB9LFxyXG4gIC8vICAgY292ZXI6IHtcclxuICAvLyAgICAgLi4uc2hlZXQsXHJcbiAgLy8gICAgIHBhZGRpbmcsXHJcbiAgLy8gICAgIGJpbmRlclRleHR1cmUsXHJcbiAgLy8gICAgIGRlcHRoLFxyXG4gIC8vICAgICBtYXNzXHJcbiAgLy8gICB9LFxyXG4gIC8vICAgcGFnZToge1xyXG4gIC8vICAgICAuLi5zaGVldCxcclxuICAvLyAgICAgZGVwdGgsXHJcbiAgLy8gICAgIG1hc3NcclxuICAvLyAgIH1cclxuICAvLyB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgaGVpZ2h0OiAwLjI5NyxcclxuICAgIHdpZHRoOiAwLjIxLFxyXG4gICAgZ3Jhdml0eTogMSxcclxuICAgIGNhY2hlZFBhZ2VzOiA1MCxcclxuICAgIHJlbmRlckluYWN0aXZlUGFnZXM6IHRydWUsXHJcbiAgICByZW5kZXJJbmFjdGl2ZVBhZ2VzT25Nb2JpbGU6IGZhbHNlLFxyXG4gICAgcmVuZGVyV2hpbGVGbGlwcGluZzogZmFsc2UsXHJcbiAgICBwYWdlc0ZvclByZWRpY3Rpbmc6IDUsXHJcbiAgICBwcmVsb2FkUGFnZXM6IDUsXHJcbiAgICBydGw6IGZhbHNlLFxyXG4gICAgc2hlZXQ6IHtcclxuICAgICAgc3RhcnRWZWxvY2l0eTogMC45LFxyXG4gICAgICBjb3JuZXJEZXZpYXRpb246IDAuMjUsXHJcbiAgICAgIGZsZXhpYmlsaXR5OiAxMCxcclxuICAgICAgZmxleGlibGVDb3JuZXI6IDAuNSxcclxuICAgICAgYmVuZGluZzogMTEsXHJcbiAgICAgIHdhdmU6IDAuNSxcclxuICAgICAgc2hhcGU6IDAsXHJcbiAgICAgIHdpZHRoVGV4ZWxzOiA1KjIxMCxcclxuICAgICAgaGVpZ2h0VGV4ZWxzOiA1KjI5NyxcclxuICAgICAgY29sb3I6IDB4RkZGRkZGXHJcbiAgICB9LFxyXG4gICAgY292ZXI6IHtcclxuICAgICAgYmluZGVyVGV4dHVyZTogJycsXHJcbiAgICAgIGRlcHRoOiAwLjAwMDMsXHJcbiAgICAgIHBhZGRpbmc6IDAsXHJcbiAgICAgIG1hc3M6IDAuMDAzXHJcbiAgICB9LFxyXG4gICAgcGFnZToge1xyXG4gICAgICBkZXB0aDogMC4wMDAxLFxyXG4gICAgICBtYXNzOiAwLjAwMVxyXG4gICAgfSxcclxuICAgIGNzc0xheWVyUHJvcHM6IHtcclxuICAgICAgd2lkdGg6IDEwMjRcclxuICAgIH1cclxuICB9O1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9wcm9wcy9ib29rLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvcHJvcHMvYm9vay5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuVEhSRUUuQ1NTM0RPYmplY3QgPSBjbGFzcyBDU1MzRE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEIHtcclxuICBjb25zdHJ1Y3RvcihlbGVtZW50PXVuZGVmaW5lZCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIFxyXG4gICAgaWYoZWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNldChlbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldChlbGVtZW50KSB7XHJcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG4gIFx0dGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuXHJcbiAgXHR0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlbW92ZWQnLCBmdW5jdGlvbigpIHtcclxuICBcdFx0aWYgKHRoaXMuZWxlbWVudC5wYXJlbnROb2RlICE9PSBudWxsKSB7XHJcbiAgXHRcdFx0dGhpcy5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50KTtcclxuICBcdFx0fVxyXG4gIFx0fSk7XHJcbiAgfVxyXG59O1xyXG5cclxuVEhSRUUuQ1NTM0RTcHJpdGUgPSBjbGFzcyBDU1MzRFNwcml0ZSBleHRlbmRzIFRIUkVFLkNTUzNET2JqZWN0IHtcclxuICBjb25zdHJ1Y3RvcihlbGVtZW50KSB7XHJcbiAgICBzdXBlcihlbGVtZW50KTtcclxuICB9XHJcbn07XHJcblxyXG5USFJFRS5DU1MzRFJlbmRlcmVyID0gY2xhc3MgQ1NTM0RSZW5kZXJlciB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gIFx0dmFyIF93aWR0aCwgX2hlaWdodDtcclxuICBcdHZhciBfd2lkdGhIYWxmLCBfaGVpZ2h0SGFsZjtcclxuXHJcbiAgXHR2YXIgbWF0cml4ID0gbmV3IFRIUkVFLk1hdHJpeDQoKTtcclxuXHJcbiAgXHR2YXIgY2FjaGUgPSB7XHJcbiAgXHRcdGNhbWVyYTogeyBmb3Y6IDAsIHN0eWxlOiAnJyB9LFxyXG4gIFx0XHRvYmplY3RzOiB7fVxyXG4gIFx0fTtcclxuXHJcbiAgXHR2YXIgZG9tRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnKTtcclxuICBcdGRvbUVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuXHJcbiAgXHR0aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50O1xyXG5cclxuICBcdHZhciBjYW1lcmFFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicpO1xyXG5cclxuICBcdGNhbWVyYUVsZW1lbnQuc3R5bGUuV2Via2l0VHJhbnNmb3JtU3R5bGUgPSAncHJlc2VydmUtM2QnO1xyXG4gIFx0Y2FtZXJhRWxlbWVudC5zdHlsZS5Nb3pUcmFuc2Zvcm1TdHlsZSA9ICdwcmVzZXJ2ZS0zZCc7XHJcbiAgXHRjYW1lcmFFbGVtZW50LnN0eWxlLnRyYW5zZm9ybVN0eWxlID0gJ3ByZXNlcnZlLTNkJztcclxuXHJcbiAgXHRkb21FbGVtZW50LmFwcGVuZENoaWxkKCBjYW1lcmFFbGVtZW50KTtcclxuXHJcbiAgXHR2YXIgaXNJRSA9IC9UcmlkZW50L2kudGVzdCggbmF2aWdhdG9yLnVzZXJBZ2VudCk7XHJcblxyXG4gIFx0dGhpcy5zZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge307XHJcblxyXG4gIFx0dGhpcy5nZXRTaXplID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICBcdFx0cmV0dXJuIHtcclxuICBcdFx0XHR3aWR0aDogX3dpZHRoLFxyXG4gIFx0XHRcdGhlaWdodDogX2hlaWdodFxyXG4gIFx0XHR9O1xyXG5cclxuICBcdH07XHJcblxyXG4gIFx0dGhpcy5zZXRTaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkge1xyXG5cclxuICBcdFx0X3dpZHRoID0gd2lkdGg7XHJcbiAgXHRcdF9oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgXHRcdF93aWR0aEhhbGYgPSBfd2lkdGggLyAyO1xyXG4gIFx0XHRfaGVpZ2h0SGFsZiA9IF9oZWlnaHQgLyAyO1xyXG5cclxuICBcdFx0ZG9tRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICBcdFx0ZG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG5cclxuICBcdFx0Y2FtZXJhRWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICBcdFx0Y2FtZXJhRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG5cclxuICBcdH07XHJcblxyXG4gIFx0ZnVuY3Rpb24gZXBzaWxvbiggdmFsdWUpIHtcclxuXHJcbiAgXHRcdHJldHVybiBNYXRoLmFicyggdmFsdWUpIDwgMWUtMTAgPyAwIDogdmFsdWU7XHJcblxyXG4gIFx0fVxyXG5cclxuICBcdGZ1bmN0aW9uIGdldENhbWVyYUNTU01hdHJpeCggbWF0cml4KSB7XHJcblxyXG4gIFx0XHR2YXIgZWxlbWVudHMgPSBtYXRyaXguZWxlbWVudHM7XHJcblxyXG4gIFx0XHRyZXR1cm4gJ21hdHJpeDNkKCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAwIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCAtIGVsZW1lbnRzWyAxIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMiBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDMgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyA0IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCAtIGVsZW1lbnRzWyA1IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgNiBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDcgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyA4IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCAtIGVsZW1lbnRzWyA5IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTAgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxMSBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDEyIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCAtIGVsZW1lbnRzWyAxMyBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDE0IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTUgXSkgK1xyXG4gIFx0XHQnKSc7XHJcblxyXG4gIFx0fVxyXG5cclxuICBcdGZ1bmN0aW9uIGdldE9iamVjdENTU01hdHJpeCggbWF0cml4LCBjYW1lcmFDU1NNYXRyaXgpIHtcclxuXHJcbiAgXHRcdHZhciBlbGVtZW50cyA9IG1hdHJpeC5lbGVtZW50cztcclxuICBcdFx0dmFyIG1hdHJpeDNkID0gJ21hdHJpeDNkKCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAwIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMSBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDIgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAzIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCAtIGVsZW1lbnRzWyA0IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCAtIGVsZW1lbnRzWyA1IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCAtIGVsZW1lbnRzWyA2IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCAtIGVsZW1lbnRzWyA3IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgOCBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDkgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxMCBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDExIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTIgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxMyBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDE0IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTUgXSkgK1xyXG4gIFx0XHQnKSc7XHJcblxyXG4gIFx0XHRpZihpc0lFKSB7XHJcblxyXG4gIFx0XHRcdHJldHVybiAndHJhbnNsYXRlKC01MCUsLTUwJSknICtcclxuICBcdFx0XHRcdCd0cmFuc2xhdGUoJyArIF93aWR0aEhhbGYgKyAncHgsJyArIF9oZWlnaHRIYWxmICsgJ3B4KScgK1xyXG4gIFx0XHRcdFx0Y2FtZXJhQ1NTTWF0cml4ICtcclxuICBcdFx0XHRcdG1hdHJpeDNkO1xyXG5cclxuICBcdFx0fVxyXG5cclxuICBcdFx0cmV0dXJuICd0cmFuc2xhdGUoLTUwJSwtNTAlKScgKyBtYXRyaXgzZDtcclxuXHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgY2FtZXJhQ1NTTWF0cml4KSB7XHJcblxyXG4gIFx0XHRpZihvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5DU1MzRE9iamVjdCkge1xyXG5cclxuICBcdFx0XHR2YXIgc3R5bGU7XHJcblxyXG4gIFx0XHRcdGlmKG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLkNTUzNEU3ByaXRlKSB7XHJcbiAgXHRcdFx0XHRtYXRyaXguY29weSggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSk7XHJcbiAgXHRcdFx0XHRtYXRyaXgudHJhbnNwb3NlKCk7XHJcbiAgXHRcdFx0XHRtYXRyaXguY29weVBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQpO1xyXG4gIFx0XHRcdFx0bWF0cml4LnNjYWxlKCBvYmplY3Quc2NhbGUpO1xyXG5cclxuICBcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMyBdID0gMDtcclxuICBcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNyBdID0gMDtcclxuICBcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMTEgXSA9IDA7XHJcbiAgXHRcdFx0XHRtYXRyaXguZWxlbWVudHNbIDE1IF0gPSAxO1xyXG5cclxuICBcdFx0XHRcdHN0eWxlID0gZ2V0T2JqZWN0Q1NTTWF0cml4KCBtYXRyaXgsIGNhbWVyYUNTU01hdHJpeCk7XHJcblxyXG4gIFx0XHRcdH0gZWxzZSB7XHJcblxyXG4gIFx0XHRcdFx0c3R5bGUgPSBnZXRPYmplY3RDU1NNYXRyaXgoIG9iamVjdC5tYXRyaXhXb3JsZCwgY2FtZXJhQ1NTTWF0cml4KTtcclxuXHJcbiAgXHRcdFx0fVxyXG5cclxuICBcdFx0XHR2YXIgZWxlbWVudCA9IG9iamVjdC5lbGVtZW50O1xyXG4gIFx0XHRcdHZhciBjYWNoZWRTdHlsZSA9IGNhY2hlLm9iamVjdHNbIG9iamVjdC5pZCBdICYmIGNhY2hlLm9iamVjdHNbIG9iamVjdC5pZCBdLnN0eWxlO1xyXG5cclxuICBcdFx0XHRpZihjYWNoZWRTdHlsZSA9PT0gdW5kZWZpbmVkIHx8IGNhY2hlZFN0eWxlICE9PSBzdHlsZSkge1xyXG4gIFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICBcdFx0XHRcdGVsZW1lbnQuc3R5bGUuTW96VHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgXHRcdFx0XHRlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlO1xyXG5cclxuICBcdFx0XHRcdGNhY2hlLm9iamVjdHNbIG9iamVjdC5pZCBdID0geyBzdHlsZTogc3R5bGUgfTtcclxuICBcdFx0XHRcdGlmKGlzSUUpIHtcclxuICBcdFx0XHRcdFx0Y2FjaGUub2JqZWN0c1sgb2JqZWN0LmlkIF0uZGlzdGFuY2VUb0NhbWVyYVNxdWFyZWQgPSBnZXREaXN0YW5jZVRvU3F1YXJlZCggY2FtZXJhLCBvYmplY3QpO1xyXG4gIFx0XHRcdFx0fVxyXG4gIFx0XHRcdH1cclxuXHJcbiAgXHRcdFx0aWYoZWxlbWVudC5wYXJlbnROb2RlICE9PSBjYW1lcmFFbGVtZW50KSB7XHJcbiAgXHRcdFx0XHRjYW1lcmFFbGVtZW50LmFwcGVuZENoaWxkKCBlbGVtZW50KTtcclxuICBcdFx0XHR9XHJcbiAgXHRcdH1cclxuXHJcbiAgXHRcdGZvcih2YXIgaSA9IDAsIGwgPSBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKykge1xyXG5cclxuICBcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdC5jaGlsZHJlblsgaSBdLCBjYW1lcmEsIGNhbWVyYUNTU01hdHJpeCk7XHJcblxyXG4gIFx0XHR9XHJcblxyXG4gIFx0fVxyXG5cclxuICBcdHZhciBnZXREaXN0YW5jZVRvU3F1YXJlZCA9IGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgXHRcdHZhciBhID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICBcdFx0dmFyIGIgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG5cclxuICBcdFx0cmV0dXJuIGZ1bmN0aW9uKG9iamVjdDEsIG9iamVjdDIpIHtcclxuXHJcbiAgXHRcdFx0YS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdDEubWF0cml4V29ybGQpO1xyXG4gIFx0XHRcdGIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QyLm1hdHJpeFdvcmxkKTtcclxuXHJcbiAgXHRcdFx0cmV0dXJuIGEuZGlzdGFuY2VUb1NxdWFyZWQoIGIpO1xyXG5cclxuICBcdFx0fTtcclxuXHJcbiAgXHR9KCk7XHJcblxyXG4gIFx0ZnVuY3Rpb24gek9yZGVyKCBzY2VuZSkge1xyXG5cclxuICBcdFx0dmFyIG9yZGVyID0gT2JqZWN0LmtleXMoIGNhY2hlLm9iamVjdHMpLnNvcnQoIGZ1bmN0aW9uKGEsIGIpIHtcclxuXHJcbiAgXHRcdFx0cmV0dXJuIGNhY2hlLm9iamVjdHNbIGEgXS5kaXN0YW5jZVRvQ2FtZXJhU3F1YXJlZCAtIGNhY2hlLm9iamVjdHNbIGIgXS5kaXN0YW5jZVRvQ2FtZXJhU3F1YXJlZDtcclxuXHJcbiAgXHRcdH0pO1xyXG4gIFx0XHR2YXIgek1heCA9IG9yZGVyLmxlbmd0aDtcclxuXHJcbiAgXHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbihvYmplY3QpIHtcclxuXHJcbiAgXHRcdFx0dmFyIGluZGV4ID0gb3JkZXIuaW5kZXhPZiggb2JqZWN0LmlkICsgJycpO1xyXG5cclxuICBcdFx0XHRpZihpbmRleCAhPT0gLSAxKSB7XHJcblxyXG4gIFx0XHRcdFx0b2JqZWN0LmVsZW1lbnQuc3R5bGUuekluZGV4ID0gek1heCAtIGluZGV4O1xyXG5cclxuICBcdFx0XHR9XHJcblxyXG4gIFx0XHR9KTtcclxuXHJcbiAgXHR9XHJcblxyXG4gIFx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbihzY2VuZSwgY2FtZXJhKSB7XHJcblxyXG4gIFx0XHR2YXIgZm92ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDUgXSAqIF9oZWlnaHRIYWxmO1xyXG5cclxuICBcdFx0aWYoY2FjaGUuY2FtZXJhLmZvdiAhPT0gZm92KSB7XHJcblxyXG4gIFx0XHRcdGRvbUVsZW1lbnQuc3R5bGUuV2Via2l0UGVyc3BlY3RpdmUgPSBmb3YgKyAncHgnO1xyXG4gIFx0XHRcdGRvbUVsZW1lbnQuc3R5bGUuTW96UGVyc3BlY3RpdmUgPSBmb3YgKyAncHgnO1xyXG4gIFx0XHRcdGRvbUVsZW1lbnQuc3R5bGUucGVyc3BlY3RpdmUgPSBmb3YgKyAncHgnO1xyXG5cclxuICBcdFx0XHRjYWNoZS5jYW1lcmEuZm92ID0gZm92O1xyXG5cclxuICBcdFx0fVxyXG5cclxuICBcdFx0c2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcclxuXHJcbiAgXHRcdGlmKGNhbWVyYS5wYXJlbnQgPT09IG51bGwpIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuICBcdFx0dmFyIGNhbWVyYUNTU01hdHJpeCA9ICd0cmFuc2xhdGVaKCcgKyBmb3YgKyAncHgpJyArXHJcbiAgXHRcdFx0Z2V0Q2FtZXJhQ1NTTWF0cml4KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcclxuXHJcbiAgXHRcdHZhciBzdHlsZSA9IGNhbWVyYUNTU01hdHJpeCArXHJcbiAgXHRcdFx0J3RyYW5zbGF0ZSgnICsgX3dpZHRoSGFsZiArICdweCwnICsgX2hlaWdodEhhbGYgKyAncHgpJztcclxuXHJcbiAgXHRcdGlmKGNhY2hlLmNhbWVyYS5zdHlsZSAhPT0gc3R5bGUgJiYgISBpc0lFKSB7XHJcblxyXG4gIFx0XHRcdGNhbWVyYUVsZW1lbnQuc3R5bGUuV2Via2l0VHJhbnNmb3JtID0gc3R5bGU7XHJcbiAgXHRcdFx0Y2FtZXJhRWxlbWVudC5zdHlsZS5Nb3pUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICBcdFx0XHRjYW1lcmFFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlO1xyXG5cclxuICBcdFx0XHRjYWNoZS5jYW1lcmEuc3R5bGUgPSBzdHlsZTtcclxuXHJcbiAgXHRcdH1cclxuXHJcbiAgXHRcdHJlbmRlck9iamVjdCggc2NlbmUsIGNhbWVyYSwgY2FtZXJhQ1NTTWF0cml4KTtcclxuXHJcbiAgXHRcdGlmKGlzSUUpIHtcclxuXHJcbiAgXHRcdFx0Ly8gSUUxMCBhbmQgMTEgZG9lcyBub3Qgc3VwcG9ydCAncHJlc2VydmUtM2QnLlxyXG4gIFx0XHRcdC8vIFRodXMsIHotb3JkZXIgaW4gM0Qgd2lsbCBub3Qgd29yay5cclxuICBcdFx0XHQvLyBXZSBoYXZlIHRvIGNhbGMgei1vcmRlciBtYW51YWxseSBhbmQgc2V0IENTUyB6LWluZGV4IGZvciBJRS5cclxuICBcdFx0XHQvLyBGWUk6IHotaW5kZXggY2FuJ3QgaGFuZGxlIG9iamVjdCBpbnRlcnNlY3Rpb25cclxuICBcdFx0XHR6T3JkZXIoIHNjZW5lKTtcclxuXHJcbiAgXHRcdH1cclxuXHJcbiAgXHR9O1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFRIUkVFLkNTUzNEUmVuZGVyZXI7XHJcblxyXG5jb25zdCBfQ1NTM0RPYmplY3QgPSBUSFJFRS5DU1MzRE9iamVjdCwgX0NTUzNEU3ByaXRlID0gVEhSRUUuQ1NTM0RTcHJpdGU7XHJcbmV4cG9ydCB7XHJcbiAgX0NTUzNET2JqZWN0IGFzIENTUzNET2JqZWN0LFxyXG4gIF9DU1MzRFNwcml0ZSBhcyBDU1MzRFNwcml0ZVxyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9DU1MzRFJlbmRlcmVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvQ1NTM0RSZW5kZXJlci5qcyIsImltcG9ydCB7VEhSRUUsICR9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQge0NTUzNET2JqZWN0fSBmcm9tICcuL0NTUzNEUmVuZGVyZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ1NTTGF5ZXIgZXh0ZW5kcyBDU1MzRE9iamVjdCB7XHJcblxyXG4gIHN0YXRpYyBkZWxheTtcclxuICBzdGF0aWMgc3R5bGU7XHJcbiAgc3RhdGljIGluaXQoZG9jLCBkZWxheT0xNTApIHtcclxuICAgIENTU0xheWVyLmRlbGF5ID0gZGVsYXk7XHJcbiAgICBDU1NMYXllci5zdHlsZSA9ICQoYDxzdHlsZSB0eXBlPXRleHQvY3NzPlxyXG4gICAgICAuY3NzLWxheWVyIHtcclxuICAgIFx0XHRvcGFjaXR5OiAxO1xyXG4gICAgXHRcdHRyYW5zaXRpb246IG9wYWNpdHkgJHtkZWxheX1tcyBlYXNlLW91dDtcclxuICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBcdH1cclxuICAgIFx0LmNzcy1sYXllci5oaWRkZW4ge1xyXG4gICAgXHRcdHRyYW5zaXRpb246IG9wYWNpdHkgJHtkZWxheX1tcyBlYXNlLWluLCB2aXNpYmlsaXR5ICR7ZGVsYXl9bXMgc3RlcC1lbmQ7XHJcbiAgICBcdFx0b3BhY2l0eTogMDtcclxuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgICAgIH1cclxuICAgIDwvc3R5bGU+YCkuYXBwZW5kVG8oZG9jLmhlYWQpO1xyXG4gIH1cclxuICBzdGF0aWMgZGlzcG9zZSgpIHtcclxuICAgIENTU0xheWVyLnN0eWxlLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCwgcHJvcHMpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XHJcbiAgICB0aGlzLmpDb250YWluZXIgPSAkKCc8ZGl2IGNsYXNzPVwiaGlkZGVuIGNzcy1sYXllclwiPjwvZGl2PicpO1xyXG4gIFx0Y29uc3Qgd2lkdGhQeHMgPSBwcm9wcy53aWR0aCwgaGVpZ2h0UHhzID0gaGVpZ2h0L3dpZHRoKndpZHRoUHhzO1xyXG4gICAgdGhpcy5qQ29udGFpbmVyLndpZHRoKHdpZHRoUHhzKS5oZWlnaHQoaGVpZ2h0UHhzKTtcclxuICBcdHRoaXMuc2NhbGUueCAvPSB3aWR0aFB4cy93aWR0aDtcclxuICBcdHRoaXMuc2NhbGUueSAvPSB3aWR0aFB4cy93aWR0aDtcclxuXHJcbiAgICB0aGlzLnNldERhdGEoKTtcclxuICAgIHRoaXMuc2V0KHRoaXMuakNvbnRhaW5lclswXSk7XHJcbiAgfVxyXG5cclxuICBjYWxsSW50ZXJuYWwobmFtZSkge1xyXG4gICAgaWYodGhpcy5vYmplY3QgJiYgdGhpcy5vYmplY3RbbmFtZV0pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLm9iamVjdFtuYW1lXSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jbGVhckludGVybmFscygpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJJbnRlcm5hbHMoKSB7XHJcbiAgICB0aGlzLmNhbGxJbnRlcm5hbCgnZGlzcG9zZScpO1xyXG4gICAgIXRoaXMuY3NzIHx8IHRoaXMuY3NzLnJlbW92ZSgpO1xyXG4gICAgIXRoaXMuaHRtbCB8fCB0aGlzLmh0bWwucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICBzZXREYXRhKGNzcz0nJywgaHRtbD0nJywganM9JycpIHtcclxuICAgIHRoaXMuY2xlYXJJbnRlcm5hbHMoKTtcclxuXHJcbiAgICB0aGlzLmNzcyA9ICQoYDxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4ke2Nzc308L3N0eWxlPmApLmFwcGVuZFRvKHRoaXMuakNvbnRhaW5lcik7XHJcbiAgICB0aGlzLmh0bWwgPSAkKGh0bWwpLmFwcGVuZFRvKHRoaXMuakNvbnRhaW5lcik7XHJcbiAgICBjb25zdCBpbml0ID0gZXZhbChqcyk7XHJcbiAgICBpZihpbml0KSB7XHJcbiAgICAgIHRoaXMub2JqZWN0ID0gaW5pdCh0aGlzLmpDb250YWluZXIsIHRoaXMucHJvcHMpIHx8IHt9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcGVuZGVkQ2FsbChjbGIpIHtcclxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMudGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgIGlmKHRpbWVzdGFtcD09PXRoaXMudGltZXN0YW1wKSB7XHJcbiAgICAgICAgY2xiKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIENTU0xheWVyLmRlbGF5KTtcclxuICB9XHJcblxyXG4gIGlzSGlkZGVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuakNvbnRhaW5lci5oYXNDbGFzcygnaGlkZGVuJyk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgbGV0IHJlcztcclxuICAgIGlmKCF0aGlzLmlzSGlkZGVuKCkpIHtcclxuICAgICAgdGhpcy5qQ29udGFpbmVyLmFkZENsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgdGhpcy5jYWxsSW50ZXJuYWwoJ2hpZGUnKTtcclxuICAgICAgcmVzID0gbmV3IFByb21pc2UoKHJlc29sdmUpPT4ge1xyXG4gICAgICAgIHRoaXMucGVuZGVkQ2FsbCgoKT0+IHtcclxuICAgICAgICAgIHRoaXMuY2FsbEludGVybmFsKCdoaWRkZW4nKTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIGxldCByZXM7XHJcbiAgICBpZih0aGlzLmlzSGlkZGVuKCkpIHtcclxuICAgICAgdGhpcy5qQ29udGFpbmVyLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTtcclxuICAgICAgdGhpcy5jYWxsSW50ZXJuYWwoJ3Nob3cnKTtcclxuICAgICAgcmVzID0gbmV3IFByb21pc2UoKHJlc29sdmUpPT4ge1xyXG4gICAgICAgIHRoaXMucGVuZGVkQ2FsbCgoKT0+IHtcclxuICAgICAgICAgIHRoaXMuY2FsbEludGVybmFsKCdzaG93bicpO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXMgPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9DU1NMYXllci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0NTU0xheWVyLmpzIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FjaGUge1xyXG5cclxuICBjb25zdHJ1Y3RvcihtYXhTaXplPUluZmluaXR5LCBzaXplb2Y9Q2FjaGUuY291bnRTaXplb2YpIHtcclxuICAgIHRoaXMub3MgPSBuZXcgTWFwKCk7XHJcbiAgICB0aGlzLnNpemVvZiA9IHNpemVvZjtcclxuICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemU7XHJcbiAgICB0aGlzLnNpemUgPSAwO1xyXG4gIH1cclxuXHJcbiAgZm9yRWFjaChjbGIpIHtcclxuICAgIHRoaXMub3MuZm9yRWFjaCgodiwgayk9PiBjbGIoW2ssdl0pKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjb3VudFNpemVvZih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIDE7XHJcbiAgfVxyXG5cclxuICByZW1vdmUoaykge1xyXG4gICAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gICAgY29uc3QgdiA9IHRoaXMub3MuZ2V0KGspO1xyXG4gICAgaWYoIXYubG9ja2VkIHx8ICF2LmxvY2tlZChrKSkge1xyXG4gICAgICB0aGlzLnNpemUgLT0gdGhpcy5zaXplb2Yodik7XHJcbiAgICAgIGlmKHYuZGlzcG9zZSkge1xyXG4gICAgICAgIHYuZGlzcG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub3MuZGVsZXRlKGspO1xyXG4gICAgICByZXMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIGZyZWVTcGFjZSgpIHtcclxuICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgZm9yKGxldCBwIG9mIHRoaXMub3MpIHtcclxuICAgICAgYXJyLnB1c2goe3RpbWVzdGFtcDogcFsxXS50aW1lc3RhbXAsIGtleTogcFswXX0pO1xyXG4gICAgfVxyXG4gICAgYXJyLnNvcnQoKGEsIGIpPT4gYS50aW1lc3RhbXAtYi50aW1lc3RhbXApO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8YXJyLmxlbmd0aCAmJiB0aGlzLnNpemU+Myp0aGlzLm1heFNpemUvNDsgKytpKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlKGFycltpXS5rZXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGNvbnN0IGFyciA9IFtdO1xyXG4gICAgZm9yKGxldCBwIG9mIHRoaXMub3MpIHtcclxuICAgICAgYXJyLnB1c2goe3Y6IHBbMV0sIGs6IHBbMF19KTtcclxuICAgIH1cclxuICAgIGZvcihsZXQgbyBvZiBhcnIpIHtcclxuICAgICAgaWYoby52LmRpc3Bvc2UpIHtcclxuICAgICAgICBvLnYuZGlzcG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub3MuZGVsZXRlKG8uayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVjdXJzaW9uU2l6ZW9mKHZhbHVlKSB7XHJcbiAgICBsZXQgc2l6ZSA9IDA7XHJcbiAgICBpZih2YWx1ZSkge1xyXG4gICAgICArK3NpemU7XHJcbiAgICAgIGNvbnN0IGxlbiA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgaWYobGVuPT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZm9yIChsZXQgcCBpbiB2YWx1ZSkge1xyXG4gICAgICAgICAgaWYodmFsdWUuaGFzT3duUHJvcGVydHkocCkpIHtcclxuICAgICAgICAgICAgc2l6ZSs9Q2FjaGUucmVjdXJzaW9uU2l6ZW9mKHZhbHVlW3BdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2l6ZSs9bGVuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzaXplO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGltZXN0YW1wKCkge1xyXG4gICAgcmV0dXJuIERhdGUubm93KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0KGtleSkge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm9zLmdldChrZXkpO1xyXG4gICAgaWYodmFsdWUpIHtcclxuICAgICAgdmFsdWUudGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1dChrZXksIHZhbHVlKSB7XHJcbiAgICB2YWx1ZS50aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xyXG4gICAgdGhpcy5vcy5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgICB0aGlzLnNpemUrPXRoaXMuc2l6ZW9mKHZhbHVlKTtcclxuICAgIGlmKHRoaXMuc2l6ZT50aGlzLm1heFNpemUpIHtcclxuICAgICAgdGhpcy5mcmVlU3BhY2UoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvQ2FjaGUuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9DYWNoZS5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG4gIGhhbmRsZURlZmF1bHQoaWQsIGUsIGRhdGEpIHtcclxuICAgIC8vY29uc29sZS5sb2coaWQrJy0nK2UudHlwZSsnLScrZGF0YSk7XHJcbiAgfVxyXG5cclxuICBkaXNwYXRjaEFzeW5jKGUpIHtcclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB0aGlzLmRpc3BhdGNoRXZlbnQoZSkpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Db250cm9sbGVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvQ29udHJvbGxlci5qcyIsImltcG9ydCBFdmVudENvbnZlcnRlciBmcm9tICcuL0V2ZW50Q29udmVydGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN1c3RvbUV2ZW50Q29udmVydGVyIGV4dGVuZHMgRXZlbnRDb252ZXJ0ZXIge1xyXG5cclxuICAvLyBjdXN0b21cclxuICAvLyB0ZXN0SW50ZXJzZWN0aW9uKGUsIGRhdGEpO1xyXG4gIC8vIGN1c3RvbS5vYmplY3RcclxuICAvLyB0ZXN0KG9iamVjdCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHduZCwgZG9jLCBjdXN0b21UZXN0PSgpPT4gZmFsc2UsIGVEb2MpIHtcclxuICAgIHN1cGVyKHduZCwgZG9jKTtcclxuXHJcbiAgICB0aGlzLmVEb2MgPSBlRG9jO1xyXG4gICAgdGhpcy5jdXN0b21UZXN0ID0gY3VzdG9tVGVzdDtcclxuICAgIHRoaXMuY3VzdG9tcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgdGVzdChvYmplY3QxLCBvYmplY3QyKSB7XHJcbiAgICByZXR1cm4gb2JqZWN0MSAmJiBvYmplY3QyPyB0aGlzLmN1c3RvbVRlc3Qob2JqZWN0MSwgb2JqZWN0Mik6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2FsbGJhY2sob2JqZWN0KSB7XHJcbiAgICByZXR1cm4gb2JqZWN0LnRhcmdldC5jYWxsYmFjaztcclxuICB9XHJcblxyXG4gIGFkZEN1c3RvbShjdXN0b20pIHtcclxuICAgIHRoaXMuY3VzdG9tcy5wdXNoKGN1c3RvbSk7XHJcbiAgfVxyXG5cclxuICBnZXRPYmplY3QoZSwgZGF0YSkge1xyXG4gICAgbGV0IG9iamVjdDtcclxuICAgIGlmKGRhdGEuZG9jPT09dGhpcy5lRG9jKSB7XHJcbiAgICAgIGZvcihsZXQgY3VzdG9tIG9mIHRoaXMuY3VzdG9tcykge1xyXG4gICAgICAgIG9iamVjdCA9IGN1c3RvbS50ZXN0SW50ZXJzZWN0aW9uKGUsIGRhdGEpO1xyXG4gICAgICAgIGlmKG9iamVjdCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqZWN0O1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvQ3VzdG9tRXZlbnRDb252ZXJ0ZXIuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9DdXN0b21FdmVudENvbnZlcnRlci5qcyIsImltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbmRlciB7XHJcblxyXG4gIHN0YXRpYyBERUxJTUlURVIgPSAnICc7XHJcblxyXG4gIHN0YXRpYyBpc0RlbGltZXRyKHMpIHtcclxuICAgIHJldHVybiBzPT09RmluZGVyLkRFTElNSVRFUjtcclxuICB9XHJcblxyXG4gIG1lcmdlKCkge1xyXG4gICAgY29uc3QgYXMgPSBbXSwgbWFwID0gW10sIHN0cnMgPSB0aGlzLnN0cnM7XHJcbiAgICBsZXQgcCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxzdHJzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGlmKHN0cnNbaV0ubGVuZ3RoKSB7XHJcbiAgICAgICAgbWFwLnB1c2goe1xyXG4gICAgICAgICAgYmFzZTogaSxcclxuICAgICAgICAgIG9mZnNldDogcFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFzLnB1c2goc3Ryc1tpXSk7XHJcbiAgICAgICAgcCArPSBzdHJzW2ldLmxlbmd0aDtcclxuICAgICAgICBpZihpPHN0cnMubGVuZ3RoLTEgJiYgIUZpbmRlci5pc0RlbGltZXRyKHN0cnNbaV0uY2hhckF0KHN0cnNbaV0ubGVuZ3RoLTEpKSAmJiAhRmluZGVyLmlzRGVsaW1ldHIoc3Ryc1tpKzFdLmNoYXJBdCgwKSkpIHtcclxuICAgICAgICAgIGFzLnB1c2goRmluZGVyLkRFTElNSVRFUik7XHJcbiAgICAgICAgICArK3A7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hcCA9IG1hcDtcclxuICAgIHRoaXMuc3RyID0gYXMuam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBhZGRIaXRzKHApIHtcclxuICAgIGNvbnN0IGluZm8gPSB0aGlzLm1hcFtVdGlscy5sb3dlckJvdW5kKHRoaXMubWFwLCB7b2Zmc2V0OiBwfSwgKGEsIGIpPT4gYS5vZmZzZXQtYi5vZmZzZXQpXTtcclxuICAgIGxldCBjaGFycyA9IHRoaXMucGF0dGVybi5sZW5ndGgsIGkgPSBpbmZvLmJhc2U7XHJcbiAgICBwIC09IGluZm8ub2Zmc2V0O1xyXG4gICAgd2hpbGUoY2hhcnMpIHtcclxuICAgICAgaWYodGhpcy5zdHJzW2ldLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGRlbGltZXRlciA9IGk8dGhpcy5zdHJzLmxlbmd0aC0xICYmICFGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cnNbaV0uY2hhckF0KHRoaXMuc3Ryc1tpXS5sZW5ndGgtMSkpICYmICFGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cnNbaSsxXS5jaGFyQXQoMCkpLFxyXG4gICAgICAgICAgICAgIGxlbmd0aCA9IE1hdGgubWluKHRoaXMuc3Ryc1tpXS5sZW5ndGgrKGRlbGltZXRlcj8gMTogMCktcCwgY2hhcnMpO1xyXG4gICAgICAgIGlmKHA8dGhpcy5zdHJzW2ldLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5oaXRzLnB1c2goe1xyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgb2Zmc2V0OiBwLFxyXG4gICAgICAgICAgICBsZW5ndGg6IE1hdGgubWluKGxlbmd0aCwgdGhpcy5zdHJzW2ldLmxlbmd0aC1wKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGFycyAtPSBsZW5ndGg7XHJcbiAgICAgICAgKytpO1xyXG4gICAgICAgIHAgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRDb250ZXh0KHApIHtcclxuICAgIGxldCBmID0gcCwgbCA9IHArdGhpcy5wYXR0ZXJuLmxlbmd0aC0xLCBkZWxzID0gdGhpcy5wcm9wcy5jb250ZXh0TGVuZ3RoLCBwcmV2RGVscyA9IGRlbHMrMTtcclxuICAgIHdoaWxlKGRlbHMgJiYgcHJldkRlbHMtZGVscykge1xyXG4gICAgICBwcmV2RGVscyA9IGRlbHM7XHJcbiAgICAgIGlmKGRlbHMlMikge1xyXG4gICAgICAgIGZvcihsZXQgaT1mLTI7IGk+PTA7IC0taSkge1xyXG4gICAgICAgICAgaWYoRmluZGVyLmlzRGVsaW1ldHIodGhpcy5zdHJbaV0pIHx8IGk9PT0wKSB7XHJcbiAgICAgICAgICAgIGYgPSBpPT09MD8gMDogaSsxO1xyXG4gICAgICAgICAgICAtLWRlbHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBmb3IobGV0IGk9bCsyOyBpPHRoaXMuc3RyLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICBpZihGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cltpXSkgfHwgaT09PXRoaXMuc3RyLmxlbmd0aC0xKSB7XHJcbiAgICAgICAgICAgIGwgPSBpPT09dGhpcy5zdHIubGVuZ3RoLTE/IGk9PT10aGlzLnN0ci5sZW5ndGgtMTogaS0xO1xyXG4gICAgICAgICAgICAtLWRlbHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jb250ZXh0cy5wdXNoKHRoaXMuc3RyLnN1YnN0cihmLCBsLWYrMSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SGl0cygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpdHM7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0cygpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRleHRzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRlZmF1bHRzID0ge1xyXG4gICAgY29udGV4dExlbmd0aDogNyxcclxuICAgIGhpdHM6IHRydWUsXHJcbiAgICBjb250ZXh0czogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHN0cnMsIHBhdHRlcm4sIHByb3BzKSB7XHJcbiAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICAuLi5GaW5kZXIuZGVmYXVsdHMsXHJcbiAgICAgIC4uLnByb3BzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdHJzID0gc3RycztcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLm1lcmdlKHN0cnMpO1xyXG4gICAgdGhpcy5oaXRzID0gW107XHJcbiAgICB0aGlzLmNvbnRleHRzID0gW107XHJcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLmxzdHIgPSB0aGlzLnN0ci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgd2hpbGUodHJ1ZSkge1xyXG4gICAgICBwID0gdGhpcy5sc3RyLmluZGV4T2YodGhpcy5wYXR0ZXJuLCBwKTtcclxuICAgICAgaWYocD09PS0xKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRIaXRzKHApO1xyXG4gICAgICAgIHRoaXMuYWRkQ29udGV4dChwKTtcclxuICAgICAgICBwICs9IHRoaXMucGF0dGVybi5sZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvRmluZGVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvRmluZGVyLmpzIiwiaW1wb3J0IHtQREZKU30gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcblBERkpTLndvcmtlclNyYyA9ICh3aW5kb3cuUERGSlNfTE9DQUxFPyBQREZKU19MT0NBTEU6IEdMT0JBTF9QQVRIUykucGRmSnNXb3JrZXI7XHJcblBERkpTLmNNYXBVcmwgPSAod2luZG93LlBERkpTX0xPQ0FMRT8gUERGSlNfTE9DQUxFOiBHTE9CQUxfUEFUSFMpLnBkZkpzQ01hcFVybDtcclxuUERGSlMuY01hcFBhY2tlZCA9IHRydWU7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZGYge1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcmMsIGxvYWRpbmdQcm9ncmVzcykge1xyXG4gICAgdGhpcy5zcmMgPSBVdGlscy5ub3JtYWxpemVVcmwoc3JjKTtcclxuICAgIHRoaXMuaGFuZGxlclF1ZXVlID0gW107XHJcbiAgICB0aGlzLnByb2dyZXNEYXRhID0ge2xvYWRlZDogLTEsIHRvdGFsOiAxfTtcclxuICAgIHRoaXMubG9hZGluZ1Byb2dyZXNzID0gbG9hZGluZ1Byb2dyZXNzO1xyXG5cclxuICAgIFBERkpTLmdldERvY3VtZW50KHtcclxuICAgICAgdXJsOiB0aGlzLnNyYyxcclxuICAgICAgcmFuZ2VDaHVua1NpemU6IDUxMioxMDI0XHJcbiAgICB9LCBudWxsLCBudWxsLCAoZGF0YSk9PiB7XHJcbiAgICAgIGlmKHRoaXMubG9hZGluZ1Byb2dyZXNzKSB7XHJcbiAgICAgICAgbGV0IGN1ciA9IE1hdGguZmxvb3IoMTAwKmRhdGEubG9hZGVkL2RhdGEudG90YWwpLFxyXG4gICAgICAgICAgICAgIG9sZCA9IE1hdGguZmxvb3IoMTAwKnRoaXMucHJvZ3Jlc0RhdGEubG9hZGVkL3RoaXMucHJvZ3Jlc0RhdGEudG90YWwpO1xyXG4gICAgICAgIGlmKGN1ciE9PW9sZCkge1xyXG4gICAgICAgICAgY3VyID0gaXNOYU4oY3VyKT8gMDogY3VyO1xyXG4gICAgICAgICAgY3VyID0gY3VyPjEwMD8gMTAwOiBjdXI7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdQcm9ncmVzcyhjdXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnByb2dyZXNEYXRhID0gZGF0YTtcclxuICAgIH0pLlxyXG4gICAgdGhlbigoaGFuZGxlcik9PiB7XHJcbiAgICAgIGlmKGhhbmRsZXIubnVtUGFnZXM+MSkge1xyXG4gICAgICAgIFByb21pc2UuYWxsKFtoYW5kbGVyLmdldFBhZ2UoMSksIGhhbmRsZXIuZ2V0UGFnZSgyKV0pLlxyXG4gICAgICAgIHRoZW4oKHBhZ2VzKT0+IHtcclxuICAgICAgICAgIHRoaXMuaW5pdChoYW5kbGVyLCBwYWdlcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pbml0KGhhbmRsZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXQoaGFuZGxlciwgcGFnZXMpIHtcclxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XHJcbiAgICB0aGlzLmRvdWJsZWRQYWdlcyA9IHBhZ2VzPyAoTWF0aC5hYnMoMipQZGYuZ2V0UGFnZVNpemUocGFnZXNbMF0pLndpZHRoLVBkZi5nZXRQYWdlU2l6ZShwYWdlc1sxXSkud2lkdGgpL1BkZi5nZXRQYWdlU2l6ZShwYWdlc1swXSkud2lkdGg8MWUtNCk6IGZhbHNlO1xyXG4gICAgbGV0IGRvbmUgPSBQcm9taXNlLnJlc29sdmUoaGFuZGxlcik7XHJcbiAgICBmb3IobGV0IGNsYiBvZiB0aGlzLmhhbmRsZXJRdWV1ZS5yZXZlcnNlKCkpIHtcclxuICAgICAgZG9uZSA9IGRvbmUudGhlbigoaGFuZGxlcik9PiB7XHJcbiAgICAgICAgY2xiKGhhbmRsZXIpO1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVyO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFBhZ2VUeXBlKG4pIHtcclxuICAgIHJldHVybiAhdGhpcy5kb3VibGVkUGFnZXMgfHwgbj09PTAgfHwgbj09PXRoaXMuZ2V0UGFnZXNOdW0oKS0xPyAnZnVsbCc6IChuJjE/ICdsZWZ0JzogJ3JpZ2h0Jyk7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlKG4pIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIuZ2V0UGFnZSh0aGlzLmRvdWJsZWRQYWdlcz8gTWF0aC5jZWlsKG4vMikrMTogbisxKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmhhbmRsZXJRdWV1ZS5zcGxpY2UoMCwgdGhpcy5oYW5kbGVyUXVldWUubGVuZ3RoKTtcclxuICAgIGRlbGV0ZSB0aGlzLmhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICBzZXRMb2FkaW5nUHJvZ3Jlc3NDbGIoY2xiKSB7XHJcbiAgICB0aGlzLmxvYWRpbmdQcm9ncmVzcyA9IGNsYjtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VzTnVtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcj8gKHRoaXMuZG91YmxlZFBhZ2VzPyAyKih0aGlzLmhhbmRsZXIubnVtUGFnZXMtMSk6IHRoaXMuaGFuZGxlci5udW1QYWdlcyk6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRQYWdlU2l6ZShwYWdlKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogcGFnZS52aWV3WzJdLXBhZ2Uudmlld1swXSxcclxuICAgICAgaGVpZ2h0OiBwYWdlLnZpZXdbM10tcGFnZS52aWV3WzFdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbi8vICAgaWYocGFnZXM+MSkge1xyXG4vLyAgIGhhbmRsZXIuZ2V0UGFnZSgyKS5cclxuLy8gICB0aGVuKChwYWdlKT0+IHtcclxuLy8gICAgIGNvbnN0IHNpemUxID0gUGRmLmdldFBhZ2VTaXplKHBhZ2UpO1xyXG4vLyAgICAgdGhpcy5wcm9wcy5kb3VibGVkUGFnZXMgPSAyKnNpemUwLndpZHRoPT09c2l6ZTEud2lkdGg7XHJcbi8vICAgICB0aGlzLnJlYWR5KCk7XHJcbi8vICAgfSkuXHJcbi8vICAgY2F0Y2goKCk9PiB0aGlzLnJlYWR5KCkpO1xyXG4vLyB9XHJcbi8vIGVsc2Uge1xyXG5cclxuICBnZXRIYW5kbGVyKGNsYikge1xyXG4gICAgaWYodGhpcy5oYW5kbGVyKSB7XHJcbiAgICAgIGNsYih0aGlzLmhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlclF1ZXVlLnB1c2goY2xiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1BkZi5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL1BkZi5qcyIsImltcG9ydCB7VEhSRUUsICR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGhyZWVFdmVudENvbnZlcnRlckZzIHtcclxuXHJcbiAgc3RhdGljIG9iamVjdHNUZXN0KG9iamVjdDEsIG9iamVjdDIpIHtcclxuICAgIHJldHVybiBvYmplY3QxICYmIG9iamVjdDI/IG9iamVjdDEub2JqZWN0PT09b2JqZWN0Mi5vYmplY3Q6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG9iamVjdHNBbmRGYWNlc1Rlc3Qob2JqZWN0MSwgb2JqZWN0Mikge1xyXG4gICAgcmV0dXJuIG9iamVjdDEgJiYgb2JqZWN0Mj8gb2JqZWN0MS5vYmplY3Q9PT1vYmplY3QyLm9iamVjdCAmJiBvYmplY3QxLmZhY2UubWF0ZXJpYWxJbmRleD09PW9iamVjdDIuZmFjZS5tYXRlcmlhbEluZGV4OiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbFdvcmxkLCB0ZXN0PVRocmVlRXZlbnRDb252ZXJ0ZXJGcy5vYmplY3RzQW5kRmFjZXNUZXN0KSB7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbFdvcmxkO1xyXG4gICAgdGhpcy5jb29yZHMgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIgPSB0aGlzLnZpc3VhbC5yYXljYXN0ZXI7XHJcbiAgICB0aGlzLmNhbWVyYSA9IHRoaXMudmlzdWFsLmNhbWVyYTtcclxuICAgIHRoaXMudGhyZWVzID0gW107XHJcbiAgICB0aGlzLnRlc3QgPSB0ZXN0O1xyXG4gIH1cclxuXHJcbiAgYWRkVGhyZWUodGhyZWUpIHtcclxuICAgIHRoaXMudGhyZWVzLnB1c2godGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGhyZWUodGhyZWUpIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnRocmVlcy5pbmRleE9mKHRocmVlKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMudGhyZWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE9iamVjdChlKSB7XHJcbiAgICB0aGlzLnNldENvb3Jkc0Zyb21FdmVudChlKTtcclxuICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5jb29yZHMsIHRoaXMuY2FtZXJhKTtcclxuICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMudGhyZWVzKTtcclxuICAgIHJldHVybiBpbnRlcnNlY3RzWzBdO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVFdmVudENvbnZlcnRlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL1RocmVlRXZlbnRDb252ZXJ0ZXIuanMiLCJpbXBvcnQgQmFzZU1hdGhVdGlscyBmcm9tICcuL0Jhc2VNYXRoVXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGhyZWVVdGlscyB7XHJcblxyXG4gIHN0YXRpYyB2ZXJ0aWNlczJVVnModmVydGljZXMsIGluZGVjZXMsIGZpcnN0LCBsYXN0LCBjb252ZXJDbGIpIHtcclxuICAgIGNvbnN0IHIgPSBbXTtcclxuICAgIGZvcihsZXQgaSA9IGZpcnN0OyBpPGxhc3Q7ICsraSkge1xyXG4gICAgICBjb25zdCB2aXMgPSBbaW5kZWNlc1tpXS5hLGluZGVjZXNbaV0uYixpbmRlY2VzW2ldLmNdO1xyXG4gICAgICBmb3IobGV0IGogPSAwOyBqPHZpcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGlmKCFyW3Zpc1tqXV0pIHtcclxuICAgICAgICAgIHJbdmlzW2pdXSA9IGNvbnZlckNsYih2ZXJ0aWNlc1t2aXNbal1dKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvbXB1dGVGYWNlVmVydGV4VXZzKGdlb21ldHJ5LCBmYWNlcykge1xyXG4gICAgY29uc3QgdXZzID0gW1xyXG4gICAgICAgICAgICAgICAgVGhyZWVVdGlscy52ZXJ0aWNlczJVVnMoZ2VvbWV0cnkudmVydGljZXMsIGdlb21ldHJ5LmZhY2VzLCAwLCBmYWNlc1swXSwgKHApPT5uZXcgVEhSRUUuVmVjdG9yMihwLngsIDEtcC56KSksXHJcbiAgICAgICAgICAgICAgICBUaHJlZVV0aWxzLnZlcnRpY2VzMlVWcyhnZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkuZmFjZXMsIGZhY2VzWzBdLCBmYWNlc1sxXSwgKHApPT5uZXcgVEhSRUUuVmVjdG9yMigxLXAueCwgMS1wLnopKSxcclxuICAgICAgICAgICAgICAgIFRocmVlVXRpbHMudmVydGljZXMyVVZzKGdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS5mYWNlcywgZmFjZXNbMV0sIGZhY2VzWzJdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKHAueCwgcC55KSksXHJcbiAgICAgICAgICAgICAgICBUaHJlZVV0aWxzLnZlcnRpY2VzMlVWcyhnZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkuZmFjZXMsIGZhY2VzWzJdLCBmYWNlc1szXSwgKHApPT5uZXcgVEhSRUUuVmVjdG9yMigxLXAueCwgcC55KSksXHJcbiAgICAgICAgICAgICAgICBUaHJlZVV0aWxzLnZlcnRpY2VzMlVWcyhnZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkuZmFjZXMsIGZhY2VzWzNdLCBmYWNlc1s0XSwgKHApPT5uZXcgVEhSRUUuVmVjdG9yMihwLnosIHAueSkpLFxyXG4gICAgICAgICAgICAgICAgVGhyZWVVdGlscy52ZXJ0aWNlczJVVnMoZ2VvbWV0cnkudmVydGljZXMsIGdlb21ldHJ5LmZhY2VzLCBmYWNlc1s0XSwgZ2VvbWV0cnkuZmFjZXMubGVuZ3RoLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKDEtcC56LCBwLnkpKVxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgdXZzaSA9IDA7XHJcbiAgICBmb3IobGV0IGkgPSAwOyBpPGdlb21ldHJ5LmZhY2VzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHV2c2kgKz0gZmFjZXNbdXZzaV0gPT09IGk7XHJcbiAgICAgIGNvbnN0IGYgPSBnZW9tZXRyeS5mYWNlc1tpXTtcclxuICAgICAgZi5tYXRlcmlhbEluZGV4ID0gdXZzaTtcclxuICAgICAgZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1swXVtpXSA9IFt1dnNbdXZzaV1bZi5hXSwgdXZzW3V2c2ldW2YuYl0sIHV2c1t1dnNpXVtmLmNdXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVNYXJrZXIocCwgYywgc2l6ZSkge1xyXG4gICAgY29uc3QgbWFya2VyID0gbmV3IFRIUkVFLk1lc2gobmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KHNpemUpLCBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoeyBjb2xvcjogYyB9KSk7XHJcbiAgICBtYXJrZXIucG9zaXRpb24uc2V0KHAueCxwLnkscC56KTtcclxuICAgIHJldHVybiBtYXJrZXI7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZmluZFV2VHJpcyhnZW9tZXRyeSwgcHMsIGZpcnN0LCBsYXN0KSB7XHJcbiAgICBjb25zdCByZXMgPSBbXTtcclxuICAgIGZvcihsZXQgcCBvZiBwcykge1xyXG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcclxuICAgICAgZm9yKGxldCBpPWZpcnN0OyBpPGxhc3QgJiYgIWZvdW5kOyArK2kpIHtcclxuICAgICAgICBjb25zdCB0cmkgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWzBdW2ldO1xyXG4gICAgICAgIGlmKEJhc2VNYXRoVXRpbHMuaXNJbnNpZGVDb252UG9seSh0cmksIHApKSB7XHJcbiAgICAgICAgICByZXMucHVzaCh7XHJcbiAgICAgICAgICAgIGNvZWZzOiBCYXNlTWF0aFV0aWxzLmNvbXB1dGVJbnRlcnBDb2Vmcyh0cmksIHApLFxyXG4gICAgICAgICAgICBpXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoIWZvdW5kKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignQmFkIHBvaW50Jyk7XHJcbiAgICAgICAgcmVzLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmaW5kSW50ZXJuYWxWZXJ0aWNlcyhnZW9tZXRyeSwgcHMsIGZpcnN0LCBsYXN0KSB7XHJcbiAgICBjb25zdCByZXMgPSB7fTtcclxuICAgIGZvcihsZXQgaT1maXJzdDsgaTxsYXN0OyArK2kpIHtcclxuICAgICAgY29uc3QgdHJpID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1swXVtpXSwgZiA9IGdlb21ldHJ5LmZhY2VzW2ldLCB2cyA9IFtmLmEsIGYuYiwgZi5jXTtcclxuICAgICAgZm9yKGxldCBqPTA7IGo8dHJpLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYocmVzW3ZzW2pdXT09PXVuZGVmaW5lZCAmJiBCYXNlTWF0aFV0aWxzLmlzSW5zaWRlUG9seShwcywgdHJpW2pdKSkge1xyXG4gICAgICAgICAgcmVzW3ZzW2pdXSA9IHtcclxuICAgICAgICAgICAgcDogdHJpW2pdLFxyXG4gICAgICAgICAgICBpOiB2c1tqXSxcclxuICAgICAgICAgICAgbjogZi52ZXJ0ZXhOb3JtYWxzW2pdXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVzKTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlVXRpbHMuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9UaHJlZVV0aWxzLmpzIiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRhcmdldCB7XHJcblxyXG4gIHN0YXRpYyB0ZXN0KG9iamVjdDEsIG9iamVjdDIpIHtcclxuICAgIHJldHVybiBvYmplY3QxLnRhcmdldD09PW9iamVjdDIudGFyZ2V0O1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvdGFyZ2V0cy9UYXJnZXQuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy90YXJnZXRzL1RhcmdldC5qcyIsImltcG9ydCB7JCwgdHJ9IGZyb20gJy4vanMvbGlicyc7XHJcbmltcG9ydCBEZXRlY3RvciBmcm9tICdEZXRlY3Rvcic7XHJcbmltcG9ydCBWaXN1YWxXb3JsZCBmcm9tICdWaXN1YWxXb3JsZCc7XHJcbmltcG9ydCBQZGZMaW5rc0hhbmRsZXIgZnJvbSAnLi9qcy9jbGFzc2VzL1BkZkxpbmtzSGFuZGxlcic7XHJcbmltcG9ydCBCb29rIGZyb20gJy4vanMvY2xhc3Nlcy9Cb29rJztcclxuaW1wb3J0IEJvb2tWaWV3IGZyb20gJy4vanMvY2xhc3Nlcy9Cb29rVmlldyc7XHJcbmltcG9ydCBCb29rQ29udHJvbGxlciBmcm9tICcuL2pzL2NsYXNzZXMvQm9va0NvbnRyb2xsZXInO1xyXG5pbXBvcnQgUGRmQm9va1Byb3BzQnVpbGRlciBmcm9tICcuL2pzL2NsYXNzZXMvUGRmQm9va1Byb3BzQnVpbGRlcic7XHJcbmltcG9ydCBDbGJCb29rUHJvcHNCdWlsZGVyIGZyb20gJy4vanMvY2xhc3Nlcy9DbGJCb29rUHJvcHNCdWlsZGVyJztcclxuaW1wb3J0IExvYWRpbmdDb250cm9sbGVyIGZyb20gJ0xvYWRpbmdDb250cm9sbGVyJztcclxuaW1wb3J0IFNlYXJjaCBmcm9tICdTZWFyY2gnO1xyXG5pbXBvcnQgQm9va21hcmtzIGZyb20gJ0Jvb2ttYXJrcyc7XHJcbmltcG9ydCBUaHVtYm5haWxzIGZyb20gJ1RodW1ibmFpbHMnO1xyXG5pbXBvcnQgVG9jQ29udHJvbGxlciBmcm9tICcuL2pzL2NsYXNzZXMvVG9jQ29udHJvbGxlcic7XHJcbmltcG9ydCBCb29rUHJpbnRlciBmcm9tICcuL2pzL2NsYXNzZXMvQm9va1ByaW50ZXInO1xyXG5pbXBvcnQgQXV0b05hdmlnYXRvciBmcm9tICcuL2pzL2NsYXNzZXMvQXV0b05hdmlnYXRvcic7XHJcbmltcG9ydCBTb3VuZHNFbnZpcm9tZW50IGZyb20gJy4vanMvY2xhc3Nlcy9Tb3VuZHNFbnZpcm9tZW50JztcclxuXHJcbiQuZm4uRmxpcEJvb2sgPSBmdW5jdGlvbihvcHRpb25zKSB7XHJcbiAgY29uc3Qgc2NlbmUgPSB7XHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICBpZih0aGlzLnJlYWR5KSB7XHJcbiAgICAgICAgIXNjZW5lLnBkZkxpbmtzSGFuZGxlciB8fCBzY2VuZS5wZGZMaW5rc0hhbmRsZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5wZGZMaW5rc0hhbmRsZXI7XHJcbiAgICAgICAgc2NlbmUuc291bmRzLmRpc3Bvc2UoKTtcclxuICAgICAgICBkZWxldGUgc2NlbmUuc291bmRzO1xyXG4gICAgICAgIHNjZW5lLnRvY0N0cmwuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS50b2NDdHJsO1xyXG4gICAgICAgIHNjZW5lLnRodW1ibmFpbHMuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS50aHVtYm5haWxzO1xyXG4gICAgICAgICFzY2VuZS5ib29rbWFya3MgfHwgc2NlbmUuYm9va21hcmtzLmRpc3Bvc2UoKTtcclxuICAgICAgICBkZWxldGUgc2NlbmUuYm9va21hcmtzO1xyXG4gICAgICAgIHNjZW5lLmN0cmwuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5jdHJsO1xyXG4gICAgICAgIHNjZW5lLmJvb2tQcmludGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICBkZWxldGUgc2NlbmUuYm9va1ByaW50ZXI7XHJcbiAgICAgICAgc2NlbmUuYm9vay5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLmJvb2s7XHJcbiAgICAgICAgc2NlbmUucHJvcHNCdWlsZGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICBkZWxldGUgc2NlbmUucHJvcHNCdWlsZGVyO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5ib29rQnVpbGRlcjtcclxuICAgICAgICBzY2VuZS52aXN1YWwuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS52aXN1YWw7XHJcbiAgICAgICAgc2NlbmUudmlldy5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnZpZXc7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLmRpc3Bvc2U7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlzcG9zZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG4gIG9wdGlvbnMgPSB7Li4ub3B0aW9uc307XHJcbiAgc2NlbmUudmlldyA9IG5ldyBCb29rVmlldyh0aGlzLmxlbmd0aD8gdGhpc1swXTogJCgnPGRpdj4nKS5hcHBlbmRUbygnYm9keScpLCAoKT0+IHtcclxuICAgIGlmKCFEZXRlY3Rvci53ZWJnbCkge1xyXG4gICAgICBEZXRlY3Rvci5hZGRHZXRXZWJHTE1lc3NhZ2Uoe3BhcmVudDogc2NlbmUudmlldy5nZXRWaWV3KCl9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzY2VuZS5sb2FkaW5nQ3RybCA9IG5ldyBMb2FkaW5nQ29udHJvbGxlcihzY2VuZS52aWV3LCB0cnVlLCAocHJvZ3Jlc3MpPT4gcHJvZ3Jlc3M9PT0wPyB0cignUGxlYXNlIHdhaXQuLi4gdGhlIEFwcGxpY2F0aW9uIGlzIExvYWRpbmcnKTogdHIoJ1BERiBpcyBMb2FkaW5nOicpKycgJytwcm9ncmVzcysnJScpO1xyXG4gICAgICBzY2VuZS52aXN1YWwgPSBuZXcgVmlzdWFsV29ybGQoc2NlbmUudmlldy5nZXRDb250YWluZXIoKS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LCBzY2VuZS52aWV3LmdldENvbnRhaW5lcigpLm93bmVyRG9jdW1lbnQsIHNjZW5lLnZpZXcuZ2V0VmlldygpKTtcclxuICAgICAgc2NlbmUuYm9va0J1aWxkZXIgPSAocHJvcHMsIHNoZWV0cywgcGFnZUNhbGxiYWNrKT0+IHtcclxuICAgICAgICBwcm9wcy5jc3NMYXllclByb3BzID0ge1xyXG4gICAgICAgICAgLi4ucHJvcHMuY3NzTGF5ZXJQcm9wcyxcclxuICAgICAgICAgIHNjZW5lXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZihvcHRpb25zLnByb3BlcnRpZXNDYWxsYmFjaykge1xyXG4gICAgICAgICAgcHJvcHMgPSBvcHRpb25zLnByb3BlcnRpZXNDYWxsYmFjayhwcm9wcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNjZW5lLmJvb2sgPSBuZXcgQm9vayhzY2VuZS52aXN1YWwsIHNoZWV0cywgcGFnZUNhbGxiYWNrLCBwcm9wcyk7XHJcbiAgICAgICAgc2NlbmUuYm9va1ByaW50ZXIgPSBuZXcgQm9va1ByaW50ZXIoc2NlbmUudmlzdWFsLCBzY2VuZS5ib29rLCAob3B0aW9ucy50ZW1wbGF0ZSB8fCB7fSkucHJpbnRTdHlsZSk7XHJcbiAgICAgICAgc2NlbmUubG9hZGluZ0N0cmwuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5sb2FkaW5nQ3RybDtcclxuICAgICAgICBzY2VuZS5jdHJsID0gbmV3IEJvb2tDb250cm9sbGVyKHNjZW5lLmJvb2ssIHNjZW5lLnZpZXcsIG9wdGlvbnMuY29udHJvbHNQcm9wcyk7XHJcbiAgICAgICAgc2NlbmUuYm9vay5zZXRJbmplY3Rvcigodyk9PiB7XHJcbiAgICAgICAgICB3LmpRdWVyeSA9IHcuJCA9ICQ7XHJcbiAgICAgICAgICB3LmJvb2sgPSBzY2VuZS5ib29rO1xyXG4gICAgICAgICAgdy5ib29rQ3RybCA9IHNjZW5lLmN0cmw7XHJcbiAgICAgICAgICBpZihwcm9wcy5pbmplY3Rvcikge1xyXG4gICAgICAgICAgICBwcm9wcy5pbmplY3Rvcih3KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBzY2VuZS52aWV3LmFkZEhhbmRsZXIoc2NlbmUuY3RybCk7XHJcbiAgICAgICAgc2NlbmUuY3RybC5zZXRQcmludGVyKHNjZW5lLmJvb2tQcmludGVyKTtcclxuICAgICAgICBjb25zdCB0ZXN0ID0gcGFnZUNhbGxiYWNrKDApO1xyXG5cclxuICAgICAgICBzY2VuZS5zZWFyY2ggPSBuZXcgU2VhcmNoKHNjZW5lLnZpZXcuZ2V0U2VhcmNoVmlldygpLCBzY2VuZS5ib29rLmdldFBhZ2VzKCkpO1xyXG4gICAgICAgIHNjZW5lLnNlYXJjaC5vblF1ZXJ5ID0gc2NlbmUuYm9vay5zZXRRdWVyeS5iaW5kKHNjZW5lLmJvb2spO1xyXG4gICAgICAgIHNjZW5lLmJvb2suYWRkRXZlbnRMaXN0ZW5lcignc2VhcmNoUmVzdWx0cycsIChlKT0+IHtcclxuICAgICAgICAgIHNjZW5lLnNlYXJjaC5zZXRSZXN1bHRzKGUucmVzdWx0cywgZS5sYXN0UGFnZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNjZW5lLnRodW1ibmFpbHMgPSBuZXcgVGh1bWJuYWlscyhzY2VuZS52aXN1YWwsIHNjZW5lLnZpZXcuZ2V0VGh1bWJuYWlsc1ZpZXcoKSwgcGFnZUNhbGxiYWNrLCAyKihzaGVldHMrMiksIHtrV3RvSDogcHJvcHMud2lkdGgvcHJvcHMuaGVpZ2h0fSk7XHJcbiAgICAgICAgc2NlbmUudG9jQ3RybCA9IG5ldyBUb2NDb250cm9sbGVyKHNjZW5lLnZpZXcsIHNjZW5lLmN0cmwpO1xyXG4gICAgICAgIHNjZW5lLnRvY0N0cmwuc2V0VGh1bWJuYWlscyhzY2VuZS50aHVtYm5haWxzKTtcclxuICAgICAgICBzY2VuZS50b2NDdHJsLnNldFNlYXJjaChzY2VuZS5zZWFyY2gpO1xyXG4gICAgICAgIHNjZW5lLmN0cmwuc2V0VG9jQ3RybChzY2VuZS50b2NDdHJsKTtcclxuICAgICAgICBzY2VuZS52aWV3LmFkZEhhbmRsZXIoc2NlbmUudG9jQ3RybCk7XHJcblxyXG4gICAgICAgIGlmKHRlc3QudHlwZT09PSdwZGYnKSB7XHJcbiAgICAgICAgICBzY2VuZS5wZGZMaW5rc0hhbmRsZXIgPSBuZXcgUGRmTGlua3NIYW5kbGVyKHRlc3Quc3JjLCBzY2VuZS5jdHJsLCBzY2VuZS52aXN1YWwuZWxlbWVudCk7XHJcbiAgICAgICAgICBzY2VuZS5ib29rLmFkZEV2ZW50TGlzdGVuZXIoJ3BkZkFubm90YXRpb24nLCBzY2VuZS5wZGZMaW5rc0hhbmRsZXIuaGFuZGxlRXZlbnQuYmluZChzY2VuZS5wZGZMaW5rc0hhbmRsZXIpKTtcclxuICAgICAgICAgIHRlc3Quc3JjLmdldEhhbmRsZXIoKGhhbmRsZXIpPT4ge1xyXG4gICAgICAgICAgICBoYW5kbGVyLmdldE91dGxpbmUoKS5cclxuICAgICAgICAgICAgICB0aGVuKChvdXRsaW5lKT0+IHtcclxuICAgICAgICAgICAgICAgIHNjZW5lLmJvb2ttYXJrcyA9IG5ldyBCb29rbWFya3Moc2NlbmUudmlldy5nZXRCb29rbWFya3NWaWV3KCksIG91dGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgc2NlbmUudG9jQ3RybC5zZXRCb29rbWFya3Moc2NlbmUuYm9va21hcmtzLCB0ZXN0LnNyYyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmKG9wdGlvbnMucGRmTGlua3MgJiYgb3B0aW9ucy5wZGZMaW5rcy5oYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIHNjZW5lLnBkZkxpbmtzSGFuZGxlci5zZXRIYW5kbGVyKG9wdGlvbnMucGRmTGlua3MuaGFuZGxlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzY2VuZS5zb3VuZHMgPSBuZXcgU291bmRzRW52aXJvbWVudChvcHRpb25zLnRlbXBsYXRlKTtcclxuICAgICAgICBzY2VuZS5jdHJsLnNldFNvdW5kcyhzY2VuZS5zb3VuZHMpO1xyXG4gICAgICAgIHNjZW5lLnNvdW5kcy5zdWJzY3JpYmVGbGlwcyhzY2VuZS5jdHJsKTtcclxuXHJcbiAgICAgICAgc2NlbmUucmVhZHkgPSB0cnVlO1xyXG4gICAgICAgIG5ldyBBdXRvTmF2aWdhdG9yKHNjZW5lLnZpc3VhbCwgc2NlbmUuY3RybCwgb3B0aW9ucy5hdXRvTmF2aWdhdGlvbikuZGlzcG9zZSgpO1xyXG4gICAgICAgIGlmKG9wdGlvbnMucmVhZHkpIHtcclxuICAgICAgICAgIG9wdGlvbnMucmVhZHkoc2NlbmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihzY2VuZS5wZW5kaW5nRGlzcG9zZSkge1xyXG4gICAgICAgICAgc2NlbmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgaWYob3B0aW9ucy5wZGYpIHtcclxuICAgICAgICBzY2VuZS5wcm9wc0J1aWxkZXIgPSBuZXcgUGRmQm9va1Byb3BzQnVpbGRlcihvcHRpb25zLnBkZiwgc2NlbmUuYm9va0J1aWxkZXIpO1xyXG4gICAgICAgIHNjZW5lLnByb3BzQnVpbGRlci5wZGYuc2V0TG9hZGluZ1Byb2dyZXNzQ2xiKHNjZW5lLmxvYWRpbmdDdHJsLnNldFByb2dyZXNzLmJpbmQoc2NlbmUubG9hZGluZ0N0cmwpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKG9wdGlvbnMucGFnZUNhbGxiYWNrKSB7XHJcbiAgICAgICAgc2NlbmUucHJvcHNCdWlsZGVyID0gbmV3IENsYkJvb2tQcm9wc0J1aWxkZXIoc2NlbmUudmlzdWFsLCBvcHRpb25zLnBhZ2VDYWxsYmFjaywgb3B0aW9ucy5wYWdlcywgc2NlbmUuYm9va0J1aWxkZXIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNjZW5lLnByb3BzQnVpbGRlciA9IG5ldyBDbGJCb29rUHJvcHNCdWlsZGVyKHNjZW5lLnZpc3VhbCwgQm9vay5wYWdlQ2FsbGJhY2ssIDYsIHNjZW5lLmJvb2tCdWlsZGVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sIG9wdGlvbnMudGVtcGxhdGUpO1xyXG4gIHJldHVybiBzY2VuZTtcclxufVxyXG5cclxuJCgoKT0+IHtcclxuICBsZXQgY29udGFpbmVycyA9ICQoJy5mbGlwLWJvb2stY29udGFpbmVyJyk7XHJcbiAgZm9yKGxldCBpID0gMDsgaTxjb250YWluZXJzLmxlbmd0aDsgKytpKSB7XHJcbiAgICBjb25zdCBqQ29udGFpbmVyID0gJChjb250YWluZXJzW2ldKSwgc3JjID0gakNvbnRhaW5lci5hdHRyKCdzcmMnKTtcclxuICAgIGlmKCEhc3JjKSB7XHJcbiAgICAgIGpDb250YWluZXIuRmxpcEJvb2soe3BkZjogc3JjfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuXHJcbndpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9ICQ7XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2luZGV4LmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vaW5kZXguanMiLCJpZiAoIUFycmF5LnByb3RvdHlwZS5maWxsKSB7XHJcbiAgQXJyYXkucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG5cclxuICAgIC8vINCo0LDQs9C4IDEtMi5cclxuICAgIGlmICh0aGlzID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBudWxsIG9yIG5vdCBkZWZpbmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIE8gPSBPYmplY3QodGhpcyk7XHJcblxyXG4gICAgLy8g0KjQsNCz0LggMy01LlxyXG4gICAgdmFyIGxlbiA9IE8ubGVuZ3RoID4+PiAwO1xyXG5cclxuICAgIC8vINCo0LDQs9C4IDYtNy5cclxuICAgIHZhciBzdGFydCA9IGFyZ3VtZW50c1sxXTtcclxuICAgIHZhciByZWxhdGl2ZVN0YXJ0ID0gc3RhcnQgPj4gMDtcclxuXHJcbiAgICAvLyDQqNCw0LMgOC5cclxuICAgIHZhciBrID0gcmVsYXRpdmVTdGFydCA8IDAgP1xyXG4gICAgICBNYXRoLm1heChsZW4gKyByZWxhdGl2ZVN0YXJ0LCAwKSA6XHJcbiAgICAgIE1hdGgubWluKHJlbGF0aXZlU3RhcnQsIGxlbik7XHJcblxyXG4gICAgLy8g0KjQsNCz0LggOS0xMC5cclxuICAgIHZhciBlbmQgPSBhcmd1bWVudHNbMl07XHJcbiAgICB2YXIgcmVsYXRpdmVFbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/XHJcbiAgICAgIGxlbiA6IGVuZCA+PiAwO1xyXG5cclxuICAgIC8vINCo0LDQsyAxMS5cclxuICAgIHZhciBmaW5hbCA9IHJlbGF0aXZlRW5kIDwgMCA/XHJcbiAgICAgIE1hdGgubWF4KGxlbiArIHJlbGF0aXZlRW5kLCAwKSA6XHJcbiAgICAgIE1hdGgubWluKHJlbGF0aXZlRW5kLCBsZW4pO1xyXG5cclxuICAgIC8vINCo0LDQsyAxMi5cclxuICAgIHdoaWxlIChrIDwgZmluYWwpIHtcclxuICAgICAgT1trXSA9IHZhbHVlO1xyXG4gICAgICBrKys7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g0KjQsNCzIDEzLlxyXG4gICAgcmV0dXJuIE87XHJcbiAgfTtcclxufVxyXG5cclxuaWYgKCFBcnJheS5wcm90b3R5cGUuZmluZCkge1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICdmaW5kJywge1xyXG4gICAgdmFsdWU6IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xyXG4gICAgICd1c2Ugc3RyaWN0JztcclxuICAgICBpZiAodGhpcyA9PSBudWxsKSB7XHJcbiAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcclxuICAgICB9XHJcbiAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgICB9XHJcbiAgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XHJcbiAgICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xyXG4gICAgIHZhciB0aGlzQXJnID0gYXJndW1lbnRzWzFdO1xyXG4gICAgIHZhciB2YWx1ZTtcclxuXHJcbiAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgdmFsdWUgPSBsaXN0W2ldO1xyXG4gICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xyXG4gICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICB9XHJcbiAgICAgfVxyXG4gICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmlmICghQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCkge1xyXG4gIEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXggPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcclxuICAgIGlmICh0aGlzID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgIH1cclxuICAgIHZhciBsaXN0ID0gT2JqZWN0KHRoaXMpO1xyXG4gICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xyXG4gICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XHJcbiAgICB2YXIgdmFsdWU7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICB2YWx1ZSA9IGxpc3RbaV07XHJcbiAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaSwgbGlzdCkpIHtcclxuICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH07XHJcbn1cclxuXHJcbmlmICghT2JqZWN0LnZhbHVlcykge1xyXG5cdE9iamVjdC52YWx1ZXMgPSBmdW5jdGlvbiB2YWx1ZXMoTykge1xyXG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKE8pLm1hcCgobmFtZSk9Pk9bbmFtZV0pIHx8IFtdO1xyXG5cdH07XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL3BvbHlmaWxsLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL3BvbHlmaWxsLmpzIiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dG9OYXZpZ2F0b3Ige1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBib29rQ3RybCwgcHJvcHM9e30pIHtcclxuICAgIHByb3BzID0ge1xyXG4gICAgICAuLi5wcm9wcyxcclxuICAgICAgdXJsUGFyYW06IHByb3BzLnVybFBhcmFtIHx8ICdmYjNkLXBhZ2UnLFxyXG4gICAgICBuYXZpZ2F0ZXM6IHByb3BzLm5hdmlnYXRlcz09PXVuZGVmaW5lZD8gMTogcHJvcHMubmF2aWdhdGVzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuYm9va0N0cmwgPSBib29rQ3RybDtcclxuICAgIHRoaXMudXJsUGFyYW0gPSBwcm9wcy51cmxQYXJhbTtcclxuICAgIHRoaXMud25kID0gY29udGV4dC53bmQ7XHJcblxyXG4gICAgdGhpcy53bmQuZmIzZCA9IHtcclxuICAgICAgLi4udGhpcy53bmQuZmIzZFxyXG4gICAgfTtcclxuICAgIHRoaXMud25kLmZiM2QubmF2aWdhdG9yID0ge1xyXG4gICAgICAuLi50aGlzLnduZC5mYjNkLm5hdmlnYXRvclxyXG4gICAgfTtcclxuICAgIHRoaXMubmF2aWdhdG9yID0gdGhpcy53bmQuZmIzZC5uYXZpZ2F0b3JbdGhpcy51cmxQYXJhbV0gPSB7XHJcbiAgICAgIC4uLnRoaXMud25kLmZiM2QubmF2aWdhdG9yW3RoaXMudXJsUGFyYW1dXHJcbiAgICB9O1xyXG4gICAgdGhpcy5uYXZpZ2F0b3IuaW5zdGFuY2VzID0gKHRoaXMubmF2aWdhdG9yLmluc3RhbmNlcyB8fCAwKSsxO1xyXG5cclxuICAgIGlmKHRoaXMubmF2aWdhdG9yLmluc3RhbmNlczw9dGhpcy5wcm9wcy5uYXZpZ2F0ZXMpIHtcclxuICAgICAgdGhpcy5ib29rQ3RybC5nb1RvUGFnZSh0aGlzLmdldFBhZ2VOdW1iZXIoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG5cclxuICB9XHJcblxyXG4gIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lLCB1cmwpIHtcclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgfVxyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW1xcXV0vZywgJ1xcXFwkJicpO1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCdbPyZdJyArIG5hbWUgKyAnKD0oW15dKil8JnwjfCQpJyksXHJcbiAgICByZXN1bHRzID0gcmVnZXguZXhlYyh1cmwpO1xyXG4gICAgaWYgKCFyZXN1bHRzKSByZXR1cm4gbnVsbDtcclxuICAgIGlmICghcmVzdWx0c1syXSkgcmV0dXJuICcnO1xyXG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzJdLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VOdW1iZXIoKSB7XHJcbiAgICBsZXQgbnVtYmVyID0gdGhpcy5nZXRQYXJhbWV0ZXJCeU5hbWUodGhpcy51cmxQYXJhbSk7XHJcbiAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIpO1xyXG4gICAgaWYoaXNOYU4obnVtYmVyKSkge1xyXG4gICAgICBudW1iZXIgPSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bWJlci0xO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9BdXRvTmF2aWdhdG9yLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9BdXRvTmF2aWdhdG9yLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBNYXRoVXRpbHMgZnJvbSAnTWF0aFV0aWxzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmluZGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3IodmlzdWFsLCBwKSB7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbDtcclxuICAgIHRoaXMucCA9IHtcclxuICAgICAgLi4ucCxcclxuICAgICAgYmFja1NpemU6IDIqcC5jb3Zlci5kZXB0aCtwLnNoZWV0cypwLnBhZ2UuZGVwdGhcclxuICAgIH07XHJcbiAgICB0aGlzLk9aID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwwLDEpO1xyXG5cclxuICAgIHRoaXMuYmFja0cgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkocC5jb3Zlci5kZXB0aCwgdGhpcy5wLmJhY2tTaXplLCBwLmNvdmVyLmhlaWdodCk7XHJcblxyXG4gICAgdGhpcy5tYXRlcmlhbHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSlcclxuICAgICAgICAgICAgICAgICAgICAgXTtcclxuXHJcbiAgICBjb25zdCBiYWNrTSA9IG5ldyBUSFJFRS5NZXNoKHRoaXMuYmFja0csIG5ldyBUSFJFRS5NZXNoRmFjZU1hdGVyaWFsKHRoaXMubWF0ZXJpYWxzKSk7XHJcblxyXG4gICAgaWYocC5jb3Zlci5iaW5kZXJUZXh0dXJlIT09JycpIHtcclxuICAgICAgdGhpcy52aXN1YWwudGV4dHVyZUxvYWRlci5sb2FkKHAuY292ZXIuYmluZGVyVGV4dHVyZSwgKHRleHR1cmUpPT4ge1xyXG4gICAgICAgIHRoaXMubWF0ZXJpYWxzWzFdLmNvbG9yLnNldEhleCgweEZGRkZGRik7XHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbHNbMV0ubWFwID0gdGV4dHVyZTtcclxuICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1hdGVyaWFsc1sxXS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGhyZWUgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMuYmFjayA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgdGhpcy5iYWNrUlQgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMuYmFja1JSID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICB0aGlzLmJhY2tMVCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgdGhpcy5iYWNrTFIgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMubGVmdFBpdm90ID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICB0aGlzLnJpZ2h0UGl2b3QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuXHJcbiAgICB0aGlzLmJhY2suYWRkKGJhY2tNKTtcclxuICAgIHRoaXMuYmFjay5hZGQodGhpcy5sZWZ0UGl2b3QpO1xyXG4gICAgdGhpcy5iYWNrLmFkZCh0aGlzLnJpZ2h0UGl2b3QpO1xyXG4gICAgdGhpcy5iYWNrUlQuYWRkKHRoaXMuYmFjayk7XHJcbiAgICB0aGlzLmJhY2tSUi5hZGQodGhpcy5iYWNrUlQpO1xyXG4gICAgdGhpcy5iYWNrTFQuYWRkKHRoaXMuYmFja1JSKTtcclxuICAgIHRoaXMuYmFja0xSLmFkZCh0aGlzLmJhY2tMVCk7XHJcbiAgICB0aGlzLnRocmVlLmFkZCh0aGlzLmJhY2tMUik7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgZm9yKGxldCBtIG9mIHRoaXMubWF0ZXJpYWxzKSB7XHJcbiAgICAgIGlmKG0ubWFwKSB7XHJcbiAgICAgICAgbS5tYXAgPSBudWxsO1xyXG4gICAgICAgIG0ubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIG0uZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlIHRoaXMubWF0ZXJpYWxzO1xyXG4gICAgdGhpcy5iYWNrRy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICBzZXQoYW5nbGUpIHtcclxuICAgIGxldCByaWdodCwgbGVmdDtcclxuICAgIGlmKGFuZ2xlPk1hdGguUEkvMikge1xyXG4gICAgICByaWdodCA9IE1hdGguUEkvMjtcclxuICAgICAgbGVmdCA9IGFuZ2xlLU1hdGguUEkvMjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByaWdodCA9IGFuZ2xlO1xyXG4gICAgICBsZWZ0ID0gMDtcclxuICAgIH1cclxuICAgIGNvbnN0IHAgPSB0aGlzLnAsdHIxPXt4Oi0wLjUqcC5jb3Zlci5kZXB0aCx5OjAuNSpwLmJhY2tTaXplLXAuY292ZXIuZGVwdGh9O1xyXG4gICAgdGhpcy5iYWNrUlQucG9zaXRpb24uc2V0KHRyMS54LHRyMS55LDApO1xyXG4gICAgdGhpcy5iYWNrUlIucG9zaXRpb24uc2V0KC10cjEueCwtdHIxLnksMCk7XHJcbiAgICB0aGlzLmJhY2tSUi5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodGhpcy5PWiwgcmlnaHQpO1xyXG5cclxuICAgIGNvbnN0IHRyMj17eDpwLmJhY2tTaXplLTIqcC5jb3Zlci5kZXB0aC0wLjUqcC5jb3Zlci5kZXB0aCx5OjAuNSpwLmJhY2tTaXplLXAuY292ZXIuZGVwdGh9O1xyXG4gICAgdGhpcy5iYWNrTFQucG9zaXRpb24uc2V0KHRyMi54LHRyMi55LDApO1xyXG4gICAgdGhpcy5iYWNrTFIucG9zaXRpb24uc2V0KC10cjIueCwtdHIyLnksMCk7XHJcbiAgICB0aGlzLmJhY2tMUi5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodGhpcy5PWiwgbGVmdCk7XHJcbiAgfVxyXG5cclxuICBzZXRMZWZ0KGFuZ2xlKSB7XHJcbiAgICBjb25zdCBQSSA9IE1hdGguUEk7XHJcbiAgICB0aGlzLmxlZnRQaXZvdC5wb3NpdGlvbi5zZXQoTWF0aFV0aWxzLmludGVycG9sYXRlTGluZWFyKFstUEksLVBJLzJdLFswLHRoaXMucC5jb3Zlci5kZXB0aF0sYW5nbGUpLDAuNSp0aGlzLnAuYmFja1NpemUtMC41KnRoaXMucC5jb3Zlci5kZXB0aCwwKTtcclxuICAgIHRoaXMubGVmdFBpdm90LnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0aGlzLk9aLCBhbmdsZSk7XHJcbiAgfVxyXG5cclxuICBzZXRSaWdodChhbmdsZSkge1xyXG4gICAgY29uc3QgUEkgPSBNYXRoLlBJO1xyXG4gICAgICB0aGlzLnJpZ2h0UGl2b3QucG9zaXRpb24uc2V0KE1hdGhVdGlscy5pbnRlcnBvbGF0ZUxpbmVhcihbLVBJLzIsMF0sW3RoaXMucC5jb3Zlci5kZXB0aCwwXSxhbmdsZSksLTAuNSp0aGlzLnAuYmFja1NpemUrMC41KnRoaXMucC5jb3Zlci5kZXB0aCwwKTtcclxuICAgICAgdGhpcy5yaWdodFBpdm90LnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0aGlzLk9aLCBhbmdsZSk7XHJcbiAgfVxyXG5cclxuICBqb2luTGVmdENvdmVyKGNvdmVyKSB7XHJcbiAgICBjb3Zlci50aHJlZS5wb3NpdGlvbi5zZXQoMCwtMC41KnRoaXMucC5jb3Zlci5kZXB0aCwwKTtcclxuICAgIHRoaXMubGVmdFBpdm90LmFkZChjb3Zlci50aHJlZSk7XHJcbiAgfVxyXG5cclxuICBkaXNjb25uZWN0TGVmdENvdmVyKGNvdmVyKSB7XHJcbiAgICB0aGlzLmxlZnRQaXZvdC5yZW1vdmUoY292ZXIudGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgam9pblJpZ2h0Q292ZXIoY292ZXIpIHtcclxuICAgIGNvdmVyLnRocmVlLnBvc2l0aW9uLnNldCgwLC0wLjUqdGhpcy5wLmNvdmVyLmRlcHRoLDApO1xyXG4gICAgdGhpcy5yaWdodFBpdm90LmFkZChjb3Zlci50aHJlZSk7XHJcbiAgfVxyXG5cclxuICBkaXNjb25uZWN0UmlnaHRDb3Zlcihjb3Zlcikge1xyXG4gICAgdGhpcy5yaWdodFBpdm90LnJlbW92ZShjb3Zlci50aHJlZSk7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9CaW5kZXIuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9qcy9jbGFzc2VzL0JpbmRlci5qcyIsImltcG9ydCB7JCwgVEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQge3Byb3BzIGFzICBib29rUHJvcHN9IGZyb20gJy4uL3Byb3BzL2Jvb2snO1xyXG5pbXBvcnQgR3JhcGhVdGlscyBmcm9tICdHcmFwaFV0aWxzJztcclxuaW1wb3J0IEJpbmRlciBmcm9tICcuL0JpbmRlcic7XHJcbmltcG9ydCBDb3ZlciBmcm9tICcuL0NvdmVyJztcclxuaW1wb3J0IFNoZWV0QmxvY2sgZnJvbSAnLi9TaGVldEJsb2NrJztcclxuaW1wb3J0IFNoZWV0UGh5c2ljcyBmcm9tICcuL1NoZWV0UGh5c2ljcyc7XHJcbmltcG9ydCBQYWdlTWFuYWdlciBmcm9tICcuL1BhZ2VNYW5hZ2VyJztcclxuaW1wb3J0IENTU0xheWVyIGZyb20gJ0NTU0xheWVyJztcclxuaW1wb3J0IENzc0xheWVyc01hbmFnZXIgZnJvbSAnLi9Dc3NMYXllcnNNYW5hZ2VyJztcclxuaW1wb3J0IFNlYXJjaEVuZ2luZSBmcm9tICcuL1NlYXJjaEVuZ2luZSc7XHJcbmltcG9ydCBDdXN0b21FdmVudENvbnZlcnRlciBmcm9tICdDdXN0b21FdmVudENvbnZlcnRlcic7XHJcbmltcG9ydCBDaXJjbGVUYXJnZXQgZnJvbSAndGFyZ2V0cy9DaXJjbGVUYXJnZXQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9vayBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlciB7XHJcbiAgLy8gcGFnZUNhbGxiYWNrIHNhbXBsZXNcclxuXHJcbiAgLy8gKG4pPT4gKHtcclxuICAvLyAgIHR5cGU6ICdpbWFnZScsXHJcbiAgLy8gICBzcmM6ICdzYW1wbGUucG5nJyxcclxuICAvLyAgIGludGVyYWN0aXZlOiBmYWxzZVxyXG4gIC8vIH0pO1xyXG4gIC8vXHJcbiAgLy8gKG4pPT4gKHtcclxuICAvLyAgIHR5cGU6ICdodG1sJyxcclxuICAvLyAgIHNyYzogJ3NhbXBsZS5odG1sJyxcclxuICAvLyAgIGludGVyYWN0aXZlOiB0cnVlXHJcbiAgLy8gfSk7XHJcbiAgLy9cclxuICAvLyBjb25zdCBwZGYgPSBuZXcgUGRmKCdzYW1wbGUucGRmJyk7XHJcbiAgLy8gKG4pPT4gKHtcclxuICAvLyAgIHR5cGU6ICdwZGYnLFxyXG4gIC8vICAgc3JjOiBwZGYsXHJcbiAgLy8gICBpbnRlcmFjdGl2ZTogZmFsc2VcclxuICAvLyB9KTtcclxuXHJcbiAgY29uc3RydWN0b3IodmlzdWFsLCBzaGVldHMsIHBhZ2VDYWxsYmFjaywgcHJvcHMpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBzaGVldHMgPSBNYXRoLm1pbigzLCBzaGVldHMpO1xyXG4gICAgdmlzdWFsLmpDb250YWluZXIuYXBwZW5kKGBcclxuICAgICAgPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPlxyXG4gICAgICAgIC5kZW1vLW1zZyB7XHJcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgICB0b3A6IDEwcHg7XHJcbiAgICAgICAgICByaWdodDogMTBweDtcclxuICAgICAgICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlNGUxO1xyXG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgICAgIH1cclxuICAgICAgPC9zdHlsZT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRlbW8tbXNnXCI+XHJcbiAgICAgICAgVGhpcyBpcyB0aGUgZGVtbyB2ZXJzaW9uLCBvbmx5IDEwIHBhZ2VzIGFyZSBhdmFpbGFibGUuIFVzZSB0aGUgPGEgaHJlZj1cImh0dHBzOi8vZ29vLmdsL2J0M1poaFwiIHRhcmdldD1cIl9ibGFua1wiPmZ1bGwgdmVyc2lvbjwvYT4uXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgYCk7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbDtcclxuICAgIHRoaXMubW91c2VDb250cm9sbGVyID0gdHJ1ZTtcclxuICAgIHRoaXMucCA9IHtcclxuICAgICAgLi4uQm9vay5wcmVwYXJlUHJvcHMocHJvcHMpLFxyXG4gICAgICBzaGVldHMsXHJcbiAgICAgIHBhZ2VDYWxsYmFjayxcclxuICAgICAgem9vbTogMSxcclxuICAgICAgc2luZ2xlUGFnZTogZmFsc2UsXHJcbiAgICAgIGF1dG9SZXNvbHV0aW9uOiB7XHJcbiAgICAgICAgZW5hYmxlOiBmYWxzZSxcclxuICAgICAgICBrOiAxLjVcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRoaXMucGFnZU1hbmFnZXIgPSBuZXcgUGFnZU1hbmFnZXIodmlzdWFsLCB0aGlzLCB0aGlzLnApO1xyXG4gICAgQ1NTTGF5ZXIuaW5pdCh2aXN1YWwuZG9jKTtcclxuICAgIHRoaXMubGF5ZXJNYW5hZ2VyID0gbmV3IENzc0xheWVyc01hbmFnZXIodGhpcyk7XHJcbiAgICB0aGlzLnNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUocGFnZUNhbGxiYWNrLCAyKihzaGVldHMrMikpO1xyXG4gICAgdGhpcy5zZWFyY2hFbmdpbmUub25QYWdlSGl0c0NoYW5nZWQgPSAocGFnZSwgcXVlcnkpPT4ge1xyXG4gICAgICB0aGlzLnBhZ2VNYW5hZ2VyLnJlZnJlc2hQYWdlUXVlcnkocGFnZSwgcXVlcnkpO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoe1xyXG4gICAgICAgIHR5cGU6ICdzZWFyY2hSZXN1bHRzJyxcclxuICAgICAgICByZXN1bHRzOiB0aGlzLnNlYXJjaEVuZ2luZS5yZXN1bHRzLFxyXG4gICAgICAgIGxhc3RQYWdlOiBwYWdlLFxyXG4gICAgICAgIHF1ZXJ5XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnRocmVlID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcblxyXG4gICAgdGhpcy5iaW5kZXIgPSBuZXcgQmluZGVyKHZpc3VhbCwgdGhpcy5wKTtcclxuICAgIHRoaXMudGhyZWUuYWRkKHRoaXMuYmluZGVyLnRocmVlKTtcclxuXHJcbiAgICB0aGlzLmxlZnRDb3ZlciA9IG5ldyBDb3Zlcih2aXN1YWwsIHsuLi50aGlzLnAsIHNldFRleHR1cmU6IHRoaXMuc2V0TGVmdENvdmVyVGV4dHVyZS5iaW5kKHRoaXMpfSwgTWF0aC5QSS8yLCAnb3BlbmVkJyk7XHJcbiAgICB0aGlzLmJpbmRlci5qb2luTGVmdENvdmVyKHRoaXMubGVmdENvdmVyKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlU2hlZXRCbG9jayh0aGlzLmxlZnRDb3ZlciwgMCk7XHJcbiAgICB0aGlzLnJpZ2h0Q292ZXIgPSBuZXcgQ292ZXIodmlzdWFsLCB7Li4udGhpcy5wLCBzZXRUZXh0dXJlOiB0aGlzLnNldFJpZ2h0Q292ZXJUZXh0dXJlLmJpbmQodGhpcyl9LCAwLCAnY2xvc2VkJyk7XHJcbiAgICB0aGlzLmJpbmRlci5qb2luUmlnaHRDb3Zlcih0aGlzLnJpZ2h0Q292ZXIpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVTaGVldEJsb2NrKHRoaXMucmlnaHRDb3ZlciwgMioodGhpcy5wLnNoZWV0cysxKSk7XHJcblxyXG4gICAgdGhpcy50aHJlZVNoZWV0QmxvY2tzID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICB0aGlzLnRocmVlLmFkZCh0aGlzLnRocmVlU2hlZXRCbG9ja3MpO1xyXG4gICAgdGhpcy50aHJlZVNoZWV0QmxvY2tzLnBvc2l0aW9uLnNldCgwLjUqdGhpcy5wLmNvdmVyLmRlcHRoLTAuNSpzaGVldHMqdGhpcy5wLnBhZ2UuZGVwdGgsLTAuNSpzaGVldHMqdGhpcy5wLnBhZ2UuZGVwdGgsMCk7XHJcblxyXG4gICAgdGhpcy5zaGVldEJsb2NrcyA9IFtdO1xyXG4gICAgaWYoc2hlZXRzPjApIHtcclxuICAgICAgdGhpcy5hZGRTaGVldEJsb2NrKDAsIG5ldyBTaGVldEJsb2NrKHZpc3VhbCwgey4uLnRoaXMucCwgc2V0VGV4dHVyZTogdGhpcy5zZXRQYWdlVGV4dHVyZS5iaW5kKHRoaXMpfSwgMCwgc2hlZXRzLCAwLCAnY2xvc2VkJykpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYW5nbGUgPSB0aGlzLnAucnRsPyBNYXRoLlBJOiAwO1xyXG4gICAgdGhpcy5jbG9zZWRBbmdsZSA9IDA7XHJcbiAgICB0aGlzLnNldCh0aGlzLmFuZ2xlLDApO1xyXG4gICAgdGhpcy5sYXN0TW91c2VQb3MgPSB7XHJcbiAgICAgIHQ6IDBcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy50aHJlZS5wb3NpdGlvbi5zZXQoLTAuNSp0aGlzLnAuY292ZXIuZGVwdGgrMC41KnNoZWV0cyp0aGlzLnAucGFnZS5kZXB0aCwwLDApO1xyXG4gICAgdGhpcy5zaGVldFBoeXNpY3MgPSBuZXcgU2hlZXRQaHlzaWNzKHRoaXMucC5wYWdlLndpZHRoL3RoaXMucC5zY2FsZSwgdGhpcy5wLmdyYXZpdHksIHRoaXMucC5wYWdlLmNvcm5lckRldmlhdGlvbik7XHJcblxyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgdXBkYXRlOiB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICBsYXN0TW91c2VQb3M6IChlKT0+IHtcclxuICAgICAgICB0aGlzLmxhc3RNb3VzZVBvcyA9IHtcclxuICAgICAgICAgIC4uLnRoaXMubGFzdE1vdXNlUG9zLFxyXG4gICAgICAgICAgcGFnZVg6IGUucGFnZVgsXHJcbiAgICAgICAgICBwYWdlWTogZS5wYWdlWVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aGlzLnZpc3VhbC5hZGRSZW5kZXJDYWxsYmFjayh0aGlzLmJpbmRzLnVwZGF0ZSk7XHJcbiAgICAkKHRoaXMudmlzdWFsLmVsZW1lbnQpLm9uKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRzLmxhc3RNb3VzZVBvcyk7XHJcblxyXG4gICAgdGhpcy5iaW5kcy5vblBpY2tDYWxsYmFjayA9IHRoaXMub25QaWNrQ2FsbGJhY2suYmluZCh0aGlzKVxyXG4gICAgdGhpcy52aXN1YWwuZHJhZy5vblBpY2tDYWxsYmFjayA9IHRoaXMuYmluZHMub25QaWNrQ2FsbGJhY2s7XHJcbiAgICB0aGlzLmJpbmRzLm9uRHJhZ0NhbGxiYWNrID0gdGhpcy5vbkRyYWdDYWxsYmFjay5iaW5kKHRoaXMpXHJcbiAgICB0aGlzLnZpc3VhbC5kcmFnLm9uRHJhZ0NhbGxiYWNrID0gdGhpcy5iaW5kcy5vbkRyYWdDYWxsYmFjaztcclxuICAgIHRoaXMuYmluZHMub25SZWxlYXNlQ2FsbGJhY2sgPSB0aGlzLm9uUmVsZWFzZUNhbGxiYWNrLmJpbmQodGhpcylcclxuICAgIHRoaXMudmlzdWFsLmRyYWcub25SZWxlYXNlQ2FsbGJhY2sgPSB0aGlzLmJpbmRzLm9uUmVsZWFzZUNhbGxiYWNrO1xyXG5cclxuICAgIHRoaXMuZHJhZ0FuZ2xlID0gMC4wNTtcclxuICAgIHRoaXMudG1wID0ge1xyXG4gICAgICBib3hzOiBbXHJcbiAgICAgICAgbmV3IFRIUkVFLkJveDMoKSxcclxuICAgICAgICBuZXcgVEhSRUUuQm94MygpXHJcbiAgICAgIF1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy52aXN1YWwuYWRkT2JqZWN0KHRoaXMudGhyZWUpO1xyXG4gICAgdGhpcy52aXN1YWwuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5wYWdlTWFuYWdlci5yZWZyZXNoWm9vbS5iaW5kKHRoaXMucGFnZU1hbmFnZXIpKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICB0aGlzLm5vdGlmeUJlZm9yZUFuaW1hdGlvbigpO1xyXG4gICAgICB0aGlzLm5vdGlmeUFmdGVyQW5pbWF0aW9uKCk7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMudmlzdWFsLnJlbW92ZU9iamVjdCh0aGlzLnRocmVlKTtcclxuICAgIHRoaXMuc2hlZXRQaHlzaWNzLmRpc3Bvc2UoKTtcclxuICAgIGRlbGV0ZSB0aGlzLnZpc3VhbC5kcmFnLm9uUGlja0NhbGxiYWNrO1xyXG4gICAgZGVsZXRlIHRoaXMudmlzdWFsLmRyYWcub25EcmFnQ2FsbGJhY2s7XHJcbiAgICBkZWxldGUgdGhpcy52aXN1YWwuZHJhZy5vblJlbGVhc2VDYWxsYmFjaztcclxuICAgICQodGhpcy52aXN1YWwuZWxlbWVudCkub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRzLmxhc3RNb3VzZVBvcyk7XHJcbiAgICB0aGlzLnZpc3VhbC5yZW1vdmVSZW5kZXJDYWxsYmFjayh0aGlzLmJpbmRzLnVwZGF0ZSk7XHJcbiAgICB0aGlzLnJlbW92ZVNoZWV0QmxvY2tzKDAsIHRoaXMuc2hlZXRCbG9ja3MubGVuZ3RoKTtcclxuICAgIHRoaXMuYmluZGVyLmRpc2Nvbm5lY3RMZWZ0Q292ZXIodGhpcy5sZWZ0Q292ZXIpO1xyXG4gICAgdGhpcy5yZW1vdmVTaGVldEJsb2NrKHRoaXMubGVmdENvdmVyKTtcclxuICAgIHRoaXMuYmluZGVyLmRpc2Nvbm5lY3RSaWdodENvdmVyKHRoaXMucmlnaHRDb3Zlcik7XHJcbiAgICB0aGlzLnJlbW92ZVNoZWV0QmxvY2sodGhpcy5yaWdodENvdmVyKTtcclxuICAgIHRoaXMuYmluZGVyLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMubGF5ZXJNYW5hZ2VyLmRpc3Bvc2UoKTtcclxuICAgIENTU0xheWVyLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGFnZU1hbmFnZXIuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljcyB7XHJcblxyXG4gIHNldEF1dG9SZXNvbHV0aW9uKGVuYWJsZSwgaz0xLjUpIHtcclxuICAgIHRoaXMucC5hdXRvUmVzb2x1dGlvbiA9IHtcclxuICAgICAgLi4udGhpcy5wLmF1dG9SZXNvbHV0aW9uLFxyXG4gICAgICBlbmFibGUsXHJcbiAgICAgIGtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzZXRab29tKHpvb20sIHNpbmdsZVBhZ2UpIHtcclxuICAgIGlmKE1hdGguYWJzKHRoaXMucC56b29tLXpvb20pPjFlLTMgfHwgc2luZ2xlUGFnZSE9PXRoaXMucC5zaW5nbGVQYWdlKSB7XHJcbiAgICAgIHRoaXMucC56b29tID0gem9vbTtcclxuICAgICAgdGhpcy5wLnNpbmdsZVBhZ2UgPSBzaW5nbGVQYWdlO1xyXG4gICAgICB0aGlzLnBhZ2VNYW5hZ2VyLnJlZnJlc2hab29tKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlQ2FsbGJhY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wLnBhZ2VDYWxsYmFjaztcclxuICB9XHJcblxyXG4gIHNldFF1ZXJ5KHF1ZXJ5KSB7XHJcbiAgICB0aGlzLnNlYXJjaEVuZ2luZS5zZXRRdWVyeShxdWVyeSk7XHJcbiAgfVxyXG5cclxuICBpc1Byb2Nlc3NpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGVldFBoeXNpY3MuZ2V0U2l6ZSgpIT09MDtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VzKCkge1xyXG4gICAgcmV0dXJuIDQrMip0aGlzLnAuc2hlZXRzO1xyXG4gIH1cclxuXHJcbiAgc2V0RmxpcFByb2dyZXNzQ2xiKGNsYikge1xyXG4gICAgdGhpcy5wLmZsaXBQcm9ncmVzc0NsYiA9IGNsYjtcclxuICB9XHJcblxyXG4gIHNldEluamVjdG9yKGluamVjdG9yKSB7XHJcbiAgICB0aGlzLnAuaW5qZWN0b3IgPSBpbmplY3RvcjtcclxuICB9XHJcblxyXG4gIGlzQWN0aXZlUGFnZShuKSB7XHJcbiAgICBsZXQgcmVzID0gdHJ1ZTtcclxuICAgIGlmKG4+MSAmJiBuPHRoaXMuZ2V0UGFnZXMoKS0yKSB7XHJcbiAgICAgIGZvcihsZXQgYiBvZiB0aGlzLnNoZWV0QmxvY2tzKSB7XHJcbiAgICAgICAgaWYobi0yPjIqYi5wLmZpcnN0ICYmIG4tMjwyKmIucC5sYXN0LTEpIHtcclxuICAgICAgICAgIHJlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBnZXRCbG9ja0J5UGFnZShuKSB7XHJcbiAgICBsZXQgYmxvY2s7XHJcbiAgICBpZihuPDIpIHtcclxuICAgICAgYmxvY2sgPSB0aGlzLmxlZnRDb3ZlcjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYobjwyKih0aGlzLnAuc2hlZXRzKzEpKSB7XHJcbiAgICAgIGZvcihsZXQgYiBvZiB0aGlzLnNoZWV0QmxvY2tzKSB7XHJcbiAgICAgICAgaWYobi0yPj0yKmIucC5maXJzdCAmJiBuLTI8MipiLnAubGFzdCkge1xyXG4gICAgICAgICAgYmxvY2sgPSBiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgYmxvY2sgPSB0aGlzLnJpZ2h0Q292ZXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmxvY2s7XHJcbiAgfVxyXG5cclxuICBnZXRCbG9ja1BhZ2VzKGJsb2NrKSB7XHJcbiAgICBsZXQgcmFuZ2U7XHJcbiAgICBzd2l0Y2ggKGJsb2NrKSB7XHJcbiAgICAgIGNhc2UgdGhpcy5sZWZ0Q292ZXI6IHtcclxuICAgICAgICAgIHJhbmdlID0gWzAsIDFdO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgdGhpcy5yaWdodENvdmVyOiB7XHJcbiAgICAgICAgcmFuZ2UgPSBbMioodGhpcy5wLnNoZWV0cysxKSwgMioodGhpcy5wLnNoZWV0cysxKSsxXTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgcmFuZ2UgPSBibG9jaz8gWzIqKGJsb2NrLnAuZmlyc3QrMSksIDIqKGJsb2NrLnAubGFzdCsxKS0xXTogdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmFuZ2U7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlKCkge1xyXG4gICAgY29uc3QgUEkgPSBNYXRoLlBJO1xyXG4gICAgbGV0IHA7XHJcbiAgICBpZih0aGlzLmFuZ2xlID09PSBQSS8yIHx8IHRoaXMuYW5nbGUgPT09IDMqUEkvMikge1xyXG4gICAgICBmb3IobGV0IGJsb2NrIG9mIHRoaXMuc2hlZXRCbG9ja3MpIHtcclxuICAgICAgICBpZihibG9jay5hbmdsZTw9UEkvMikge1xyXG4gICAgICAgICAgcCA9IHRoaXMuZ2V0QmxvY2tQYWdlcyhibG9jaylbMF0tMTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZighcCkge1xyXG4gICAgICAgIHAgPSB0aGlzLmdldFBhZ2VzKCktMztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLmFuZ2xlPFBJLzIpIHtcclxuICAgICAgcCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHRoaXMuYW5nbGU+MypQSS8yKSB7XHJcbiAgICAgIHAgPSAxO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLmFuZ2xlPFBJKSB7XHJcbiAgICAgIHAgPSB0aGlzLmdldFBhZ2VzKCktMztcclxuICAgIH1cclxuICAgIGVsc2UgaWYodGhpcy5hbmdsZT49UEkpIHtcclxuICAgICAgcCA9IHRoaXMuZ2V0UGFnZXMoKS0xO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHA7XHJcbiAgfVxyXG5cclxuICBnZXRUb3BQYWdlcygpIHtcclxuICAgIGNvbnN0IHAgPSB0aGlzLmdldFBhZ2UoKTtcclxuICAgIHJldHVybiBwPT09MCB8fCBwPT09dGhpcy5nZXRQYWdlcygpLTE/IFtwXTogW3AsIHArMV07XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlU3RhdGUobikge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZU1hbmFnZXIuZ2V0UGFnZVN0YXRlKG4pO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlTG9hZGluZ0FuaW1hdGlvbihlbmFibGUpIHtcclxuICAgIHRoaXMucGFnZU1hbmFnZXIuZW5hYmxlTG9hZGluZ0FuaW1hdGlvbihlbmFibGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGVmdEZsaXBwaW5nKCkge1xyXG4gICAgbGV0IGJsb2NrO1xyXG4gICAgY29uc3QgbGVmdCA9IHRoaXMuc2hlZXRCbG9ja3NbMF0sIFBJID0gTWF0aC5QSTtcclxuICAgIGlmKHRoaXMuYW5nbGU9PT1QSSkge1xyXG4gICAgICBibG9jayA9IHRoaXMucmlnaHRDb3ZlcjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZihsZWZ0ICYmIGxlZnQuc3RhdGU9PT0nY2xvc2VkJyAmJiBsZWZ0LmFuZ2xlPlBJLzIpIHtcclxuICAgICAgICBibG9jayA9IGxlZnQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZih0aGlzLmFuZ2xlID09PSBQSS8yIHx8IHRoaXMuYW5nbGUgPT09IDMqUEkvMikge1xyXG4gICAgICAgIGJsb2NrID0gdGhpcy5sZWZ0Q292ZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBibG9jaztcclxuICB9XHJcblxyXG4gIGdldFJpZ2h0RmxpcHBpbmcoKSB7XHJcbiAgICBsZXQgYmxvY2s7XHJcbiAgICBjb25zdCByaWdodCA9IHRoaXMuc2hlZXRCbG9ja3NbdGhpcy5zaGVldEJsb2Nrcy5sZW5ndGgtMV0sIFBJID0gTWF0aC5QSTtcclxuICAgIGlmKHRoaXMuYW5nbGU9PT0wKSB7XHJcbiAgICAgIGJsb2NrID0gdGhpcy5sZWZ0Q292ZXI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYocmlnaHQgJiYgcmlnaHQuc3RhdGU9PT0nY2xvc2VkJyAmJiByaWdodC5hbmdsZTw9UEkvMikge1xyXG4gICAgICAgIGJsb2NrID0gcmlnaHQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZih0aGlzLmFuZ2xlPT09UEkvMiB8fCB0aGlzLmFuZ2xlID09PSAzKlBJLzIpIHtcclxuICAgICAgICBibG9jayA9IHRoaXMucmlnaHRDb3ZlcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJsb2NrO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvc2VkQmxvY2tBbmdsZShhbmdsZSkge1xyXG4gICAgbGV0IGNsb3NlZEFuZ2xlLCB7UEl9ID0gTWF0aDtcclxuXHJcbiAgICBpZih0aGlzLmxlZnRDb3Zlci5waHlzaWNJZCkge1xyXG4gICAgICBsZXQgdGVzdDtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0ZXN0ID0gTWF0aC5hYnModGhpcy5zaGVldFBoeXNpY3MuZ2V0UGFyYW1ldHIodGhpcy5sZWZ0Q292ZXIucGh5c2ljSWQsICdhbmdsZScpLWFuZ2xlKVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICB0ZXN0ID0gMDtcclxuICAgICAgfVxyXG4gICAgICBjbG9zZWRBbmdsZSA9IGFuZ2xlPlBJLzIgfHwgdGVzdD5QSS82PyBQSS8yOiB0aGlzLmNsb3NlZEFuZ2xlO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLnJpZ2h0Q292ZXIucGh5c2ljSWQpIHtcclxuICAgICAgbGV0IHRlc3Q7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGVzdCA9IE1hdGguYWJzKHRoaXMuc2hlZXRQaHlzaWNzLmdldFBhcmFtZXRyKHRoaXMucmlnaHRDb3Zlci5waHlzaWNJZCwgJ2FuZ2xlJyktYW5nbGUpXHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2goZSkge1xyXG4gICAgICAgIHRlc3QgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGNsb3NlZEFuZ2xlID0gYW5nbGU8UEkvMiB8fCB0ZXN0PlBJLzY/IFBJLzIrMWUtNzogdGhpcy5jbG9zZWRBbmdsZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjbG9zZWRBbmdsZSA9IFBJLzIrKGFuZ2xlIT09MCkqMWUtNztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBvcGVuZWRBbmdsZTogYW5nbGUsXHJcbiAgICAgIGNsb3NlZEFuZ2xlLFxyXG4gICAgICBiaW5kZXJUdXJuOiB0aGlzLmNsb3NlZEFuZ2xlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZmxpcExlZnQoc2l6ZT0xLCBwcm9ncmVzc0NsYj10aGlzLnAuZmxpcFByb2dyZXNzQ2xiKSB7XHJcbiAgICBsZXQgYmxvY2ssIHJlcztcclxuICAgIGlmKHRoaXMuc2hlZXRQaHlzaWNzLmdldFNpemUoKTwyNSkge1xyXG4gICAgICBjb25zdCBsZWZ0ID0gdGhpcy5zaGVldEJsb2Nrc1swXSwgUEkgPSBNYXRoLlBJO1xyXG4gICAgICBpZih0aGlzLmFuZ2xlPT09UEkpIHtcclxuICAgICAgICByZXMgPSB0aGlzLmNvbm5lY3RQaHlzaWNzKFxyXG4gICAgICAgICAgYmxvY2s9dGhpcy5yaWdodENvdmVyLFxyXG4gICAgICAgICAgdGhpcy5wLmNvdmVyLm1hc3MsXHJcbiAgICAgICAgICBQSSxcclxuICAgICAgICAgIC10aGlzLnAuY292ZXIuc3RhcnRWZWxvY2l0eSxcclxuICAgICAgICAgIHRoaXMucC5jb3Zlci5mbGV4aWJpbGl0eSxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+dGhpcy5zZXQoMypQSS8yLWFuZ2xlLzIsaGVpZ2h0KSxcclxuICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldCgzKlBJLzItYW5nbGUvMiwwKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhhbmdsZT8gUEk6IFBJLzIrMWUtNywnY2xvc2VkJyk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcHJvZ3Jlc3NDbGJcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmKGxlZnQgJiYgbGVmdC5zdGF0ZT09PSdjbG9zZWQnICYmIGxlZnQuYW5nbGU+UEkvMikge1xyXG4gICAgICAgICAgYmxvY2sgPSBzaXplPGxlZnQuZ2V0U2l6ZSgpPyB0aGlzLnNwbGl0U2hlZXRCbG9jaygwLCBsZWZ0LmdldFNpemUoKS1zaXplKVsxXTogbGVmdDtcclxuICAgICAgICAgIHJlcyA9IHRoaXMuY29ubmVjdFBoeXNpY3MoXHJcbiAgICAgICAgICAgIGJsb2NrLFxyXG4gICAgICAgICAgICB0aGlzLnAucGFnZS5tYXNzKmJsb2NrLmdldFNpemUoKSxcclxuICAgICAgICAgICAgUEksXHJcbiAgICAgICAgICAgIC10aGlzLnAucGFnZS5zdGFydFZlbG9jaXR5LFxyXG4gICAgICAgICAgICB0aGlzLnAucGFnZS5mbGV4aWJpbGl0eSxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PmJsb2NrLnNldCh0aGlzLmdldENsb3NlZEJsb2NrQW5nbGUoYW5nbGUpLCdvcGVuZWQnLGhlaWdodCksXHJcbiAgICAgICAgICAgIEJvb2suZmluaXNoQW5pbWF0aW9uQ2xiLmJpbmQoe2Jvb2s6IHRoaXMsIGJsb2NrfSksXHJcbiAgICAgICAgICAgIHByb2dyZXNzQ2xiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHRoaXMuYW5nbGUgPT09IFBJLzIgfHwgdGhpcy5hbmdsZSA9PT0gMypQSS8yKSB7XHJcbiAgICAgICAgICByZXMgPSB0aGlzLmNvbm5lY3RQaHlzaWNzKFxyXG4gICAgICAgICAgICBibG9jaz10aGlzLmxlZnRDb3ZlcixcclxuICAgICAgICAgICAgdGhpcy5wLmNvdmVyLm1hc3MsXHJcbiAgICAgICAgICAgIFBJLFxyXG4gICAgICAgICAgICAtdGhpcy5wLmNvdmVyLnN0YXJ0VmVsb2NpdHksXHJcbiAgICAgICAgICAgIHRoaXMucC5jb3Zlci5mbGV4aWJpbGl0eSxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXQoMipQSS1hbmdsZS8yLGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgaWYoYW5nbGU+UEkvMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhhbmdsZT8gUEkvMjogMCwnY2xvc2VkJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+IHRoaXMuc2V0KGFuZ2xlPT09MD8gMDogMipQSS1hbmdsZS8yLDApLFxyXG4gICAgICAgICAgICBwcm9ncmVzc0NsYlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBmbGlwUmlnaHQoc2l6ZT0xLCBwcm9ncmVzc0NsYj10aGlzLnAuZmxpcFByb2dyZXNzQ2xiKSB7XHJcbiAgICBsZXQgYmxvY2ssIHJlcztcclxuICAgIGlmKHRoaXMuc2hlZXRQaHlzaWNzLmdldFNpemUoKTwyNSkge1xyXG4gICAgICBjb25zdCByaWdodCA9IHRoaXMuc2hlZXRCbG9ja3NbdGhpcy5zaGVldEJsb2Nrcy5sZW5ndGgtMV0sIFBJID0gTWF0aC5QSTtcclxuICAgICAgaWYodGhpcy5hbmdsZT09PTApIHtcclxuICAgICAgICByZXMgPSB0aGlzLmNvbm5lY3RQaHlzaWNzKFxyXG4gICAgICAgICAgYmxvY2s9dGhpcy5sZWZ0Q292ZXIsXHJcbiAgICAgICAgICB0aGlzLnAuY292ZXIubWFzcyxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICB0aGlzLnAuY292ZXIuc3RhcnRWZWxvY2l0eSxcclxuICAgICAgICAgIHRoaXMucC5jb3Zlci5mbGV4aWJpbGl0eSxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+dGhpcy5zZXQoYW5nbGUvMixoZWlnaHQpLFxyXG4gICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0KGFuZ2xlLzIsMCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoYW5nbGU/IFBJLzI6IDAsJ2Nsb3NlZCcpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHByb2dyZXNzQ2xiXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZihyaWdodCAmJiByaWdodC5zdGF0ZT09PSdjbG9zZWQnICYmIHJpZ2h0LmFuZ2xlPD1QSS8yKSB7XHJcbiAgICAgICAgICBibG9jayA9IHNpemU8cmlnaHQuZ2V0U2l6ZSgpPyB0aGlzLnNwbGl0U2hlZXRCbG9jayh0aGlzLnNoZWV0QmxvY2tzLmxlbmd0aC0xLCBzaXplKVswXTogcmlnaHQ7XHJcbiAgICAgICAgICByZXMgPSB0aGlzLmNvbm5lY3RQaHlzaWNzKFxyXG4gICAgICAgICAgICBibG9jayxcclxuICAgICAgICAgICAgdGhpcy5wLnBhZ2UubWFzcypibG9jay5nZXRTaXplKCksXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIHRoaXMucC5wYWdlLnN0YXJ0VmVsb2NpdHksXHJcbiAgICAgICAgICAgIHRoaXMucC5wYWdlLmZsZXhpYmlsaXR5LFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+YmxvY2suc2V0KHRoaXMuZ2V0Q2xvc2VkQmxvY2tBbmdsZShhbmdsZSksJ29wZW5lZCcsaGVpZ2h0KSxcclxuICAgICAgICAgICAgQm9vay5maW5pc2hBbmltYXRpb25DbGIuYmluZCh7Ym9vazogdGhpcywgYmxvY2t9KSxcclxuICAgICAgICAgICAgcHJvZ3Jlc3NDbGJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYodGhpcy5hbmdsZT09PVBJLzIgfHwgdGhpcy5hbmdsZSA9PT0gMypQSS8yKSB7XHJcbiAgICAgICAgICByZXMgPSB0aGlzLmNvbm5lY3RQaHlzaWNzKFxyXG4gICAgICAgICAgICBibG9jaz10aGlzLnJpZ2h0Q292ZXIsXHJcbiAgICAgICAgICAgIHRoaXMucC5jb3Zlci5tYXNzLFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICB0aGlzLnAuY292ZXIuc3RhcnRWZWxvY2l0eSxcclxuICAgICAgICAgICAgdGhpcy5wLmNvdmVyLmZsZXhpYmlsaXR5LFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnNldChQSS8yK2FuZ2xlLzIsaGVpZ2h0KTtcclxuICAgICAgICAgICAgICBpZihhbmdsZTxQSS8yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKFBJLzIrMWUtNywnY2xvc2VkJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+dGhpcy5zZXQoUEkvMithbmdsZS8yLDApLFxyXG4gICAgICAgICAgICBwcm9ncmVzc0NsYlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICAvLyB9XHJcblxyXG4gIGNsZWFySG92ZXJJbmZvKCkge1xyXG4gICAgdGhpcy5wYWdlTWFuYWdlci50dXJuT25FdmVudHMoKTtcclxuICAgIGRlbGV0ZSB0aGlzLmhvdmVySW5mby5ibG9jay5mb3JjZTtcclxuICAgIGRlbGV0ZSB0aGlzLmhvdmVySW5mby5ibG9jay5jb3JuZXJGb3JjZTtcclxuICAgIGRlbGV0ZSB0aGlzLmhvdmVySW5mbztcclxuICB9XHJcblxyXG4gIHhTZWdtZW50KCkge1xyXG4gICAgY29uc3QgYm94cyA9IHRoaXMudG1wLmJveHMsIHJlcyA9IHt9O1xyXG4gICAgaWYodGhpcy5sZWZ0Q292ZXIucGh5c2ljSWQpIHtcclxuICAgICAgYm94c1swXS5zZXRGcm9tT2JqZWN0KHRoaXMucmlnaHRDb3Zlci50aHJlZSk7XHJcbiAgICAgIHJlcy5taW4gPSAtKHJlcy5tYXggPSBib3hzWzBdLm1heC54KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYodGhpcy5yaWdodENvdmVyLnBoeXNpY0lkKSB7XHJcbiAgICAgIGJveHNbMF0uc2V0RnJvbU9iamVjdCh0aGlzLmxlZnRDb3Zlci50aHJlZSk7XHJcbiAgICAgIHJlcy5tYXggPSAtKHJlcy5taW4gPSBib3hzWzBdLm1pbi54KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBib3hzWzBdLnNldEZyb21PYmplY3QodGhpcy5sZWZ0Q292ZXIudGhyZWUpO1xyXG4gICAgICBib3hzWzFdLnNldEZyb21PYmplY3QodGhpcy5yaWdodENvdmVyLnRocmVlKTtcclxuICAgICAgYm94c1swXS51bmlvbihib3hzWzFdKTtcclxuICAgICAgcmVzLm1pbiA9IGJveHNbMF0ubWluLng7XHJcbiAgICAgIHJlcy5tYXggPSBib3hzWzBdLm1heC54O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIGNvbXB1dGVUYXJnZXQocG9pbnQpIHtcclxuICAgIGxldCB7eCwgeX0gPSBwb2ludCwgc2VnID0gdGhpcy54U2VnbWVudCgpLCBhbmdsZTtcclxuICAgIGFuZ2xlID0gKHNlZy5tYXgteCkvKHNlZy5tYXgtc2VnLm1pbikqTWF0aC5QSTtcclxuICAgIC8vIGFuZ2xlID0gTWF0aC5hY29zKHgvTWF0aC5zcXJ0KHgqeCt5KnkpKTtcclxuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmRyYWdBbmdsZSwgTWF0aC5taW4oTWF0aC5QSS10aGlzLmRyYWdBbmdsZSwgYW5nbGUpKTtcclxuICB9XHJcblxyXG4gIG9uUGlja0NhbGxiYWNrKG9iamVjdCkge1xyXG4gICAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gICAgY29uc3QgYmxvY2sgPSBvYmplY3Qub2JqZWN0LnVzZXJEYXRhLnNlbGYsXHJcbiAgICAgICAgICBwID0gey4uLm9iamVjdC51dn0sIGkgPSBvYmplY3QuZmFjZS5tYXRlcmlhbEluZGV4O1xyXG4gICAgaWYoaTwyKSB7XHJcbiAgICAgIHAueCA9IGk9PT0wPyBwLng6IDEtcC54O1xyXG4gICAgICBpZihibG9jay5jb3JuZXJUYXJnZXQudGVzdEludGVyc2VjdGlvbihudWxsLCBwKSAmJiBibG9jay5waHlzaWNJZCkge1xyXG4gICAgICAgIGlmKHRoaXMuaG92ZXJJbmZvKSB7XHJcbiAgICAgICAgICB0aGlzLmNsZWFySG92ZXJJbmZvKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJsb2NrLmZvcmNlID0gU2hlZXRQaHlzaWNzLmRyYWdGb3JjZUNsYjtcclxuICAgICAgICBibG9jay5jb3JuZXJGb3JjZSA9IFNoZWV0UGh5c2ljcy5nZXREcmFnQ29ybmVyRm9yY2VDbGIodGhpcy5jb21wdXRlVGFyZ2V0KG9iamVjdC5wb2ludCkpO1xyXG4gICAgICAgIHRoaXMuZHJhZ0luZm8gPSB7XHJcbiAgICAgICAgICBvYmplY3QsXHJcbiAgICAgICAgICBibG9ja1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBhZ2VNYW5hZ2VyLnR1cm5PZmZFdmVudHMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIG9uRHJhZ0NhbGxiYWNrKHBvaW50KSB7XHJcbiAgICBjb25zdCBibG9jayA9IHRoaXMuZHJhZ0luZm8uYmxvY2ssIHAgPSBibG9jay5nZXRQcm9wcygpO1xyXG4gICAgYmxvY2suZm9yY2UgPSBTaGVldFBoeXNpY3MuZHJhZ0ZvcmNlQ2xiO1xyXG4gICAgYmxvY2suY29ybmVyRm9yY2UgPSBTaGVldFBoeXNpY3MuZ2V0RHJhZ0Nvcm5lckZvcmNlQ2xiKHRoaXMuY29tcHV0ZVRhcmdldChwb2ludCkpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBvblJlbGVhc2VDYWxsYmFjaygpIHtcclxuICAgIGRlbGV0ZSB0aGlzLmRyYWdJbmZvLmJsb2NrLmZvcmNlO1xyXG4gICAgZGVsZXRlIHRoaXMuZHJhZ0luZm8uYmxvY2suY29ybmVyRm9yY2U7XHJcbiAgICBkZWxldGUgdGhpcy5kcmFnSW5mbztcclxuICAgIHRoaXMucGFnZU1hbmFnZXIudHVybk9uRXZlbnRzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRGbGlwcGluZyhpKSB7XHJcbiAgICByZXR1cm4gaT8gdGhpcy5nZXRMZWZ0RmxpcHBpbmcoKTogdGhpcy5nZXRSaWdodEZsaXBwaW5nKCk7XHJcbiAgfVxyXG5cclxuICBmbGlwKGksIHNpemU9MSkge1xyXG4gICAgcmV0dXJuIGk/IHRoaXMuZmxpcExlZnQoc2l6ZSk6IHRoaXMuZmxpcFJpZ2h0KHNpemUpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlTW91c2UoZW5hYmxlKSB7XHJcbiAgICB0aGlzLm1vdXNlQ29udHJvbGxlciA9IGVuYWJsZTtcclxuICB9XHJcblxyXG4gIGNvcm5lckNhbGxiYWNrKGUsIGRhdGEpIHtcclxuICAgIGlmKHRoaXMubW91c2VDb250cm9sbGVyKSB7XHJcbiAgICAgIGNvbnN0IHtpLCBufSA9IGRhdGEuZGF0YTtcclxuICAgICAgaWYoZS50eXBlPT09J21vdXNlb3ZlcicpIHtcclxuICAgICAgICBpZih0aGlzLmhvdmVySW5mbyAmJiB0aGlzLmhvdmVySW5mby5wZW5kaW5ncyE9PXVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgKyt0aGlzLmhvdmVySW5mby5wZW5kaW5ncztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZih0aGlzLmhvdmVySW5mbykge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dyb25nIHN0YXRlOiBlbGVtZW50IGlzIGFscmVhZHkgaG92ZXInKTtcclxuICAgICAgICAgICAgaWYodGhpcy5ob3ZlckluZm8ubiE9PW4pIHtcclxuICAgICAgICAgICAgICB0aGlzLmNsZWFySG92ZXJJbmZvKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKCF0aGlzLmhvdmVySW5mbyAmJiAhdGhpcy5kcmFnSW5mbykge1xyXG4gICAgICAgICAgICBsZXQgcmVzID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGhvdmVyQW5nbGUgPSAwLjAyLFxyXG4gICAgICAgICAgICAgICAgICBob3ZlciA9IHRoaXMuZ2V0QmxvY2tCeVBhZ2UobiksXHJcbiAgICAgICAgICAgICAgICAgIHBvc3NpYmxlID0gdGhpcy5nZXRGbGlwcGluZyhpKTtcclxuICAgICAgICAgICAgaWYobj4xICYmIG48MioodGhpcy5wLnNoZWV0cysxKSAmJiBob3Zlci5waHlzaWNJZCAmJiAoaG92ZXIuYW5nbGU8aG92ZXJBbmdsZSB8fCBob3Zlci5hbmdsZT5NYXRoLlBJLWhvdmVyQW5nbGUpKSB7XHJcbiAgICAgICAgICAgICAgcmVzID0gUHJvbWlzZS5yZXNvbHZlKGhvdmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKGhvdmVyPT09cG9zc2libGUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBzaGVldEJsb2NrcyA9IFtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdENvdmVyLFxyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5zaGVldEJsb2NrcyxcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHRDb3ZlclxyXG4gICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgY29uc3QgaiA9IHNoZWV0QmxvY2tzLmluZGV4T2YoaG92ZXIpLCBuZXh0QmxvY2sgPSB+aj8gc2hlZXRCbG9ja3NbaisyKmktMV06IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICBpZighbmV4dEJsb2NrIHx8ICFuZXh0QmxvY2sucGh5c2ljSWQgfHwgbmV4dEJsb2NrLmFuZ2xlPmhvdmVyQW5nbGUgJiYgbmV4dEJsb2NrLmFuZ2xlPE1hdGguUEktaG92ZXJBbmdsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzID0gdGhpcy5mbGlwKGksIDEpLnRoZW4oKGJsb2NrKT0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuaG92ZXJJbmZvO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hlZXRQaHlzaWNzLnNldFBhcmFtZXRyKGJsb2NrLnBoeXNpY0lkLCAndmVsb2NpdHknLCAwKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaG92ZXJJbmZvID0ge1xyXG4gICAgICAgICAgICAgICAgICBwZW5kaW5nczogMVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzLnRoZW4oKGJsb2NrKT0+IHtcclxuICAgICAgICAgICAgICBpZih0aGlzLmhvdmVySW5mbyAmJiB0aGlzLmhvdmVySW5mby5wZW5kaW5nczwxKSB7XHJcbiAgICAgICAgICAgICAgICBibG9jayA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmhvdmVySW5mbztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYoYmxvY2spIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnZU1hbmFnZXIudHVybk9mZkV2ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgIHAgPSBibG9jay5nZXRQcm9wcygpO1xyXG4gICAgICAgICAgICAgICAgYmxvY2suZm9yY2UgPSB0aGlzLnNoZWV0UGh5c2ljcy5nZXRUYXJnZXRGb3JjZUNsYihwLm1hc3MqYmxvY2suZ2V0U2l6ZSgpLCBpPyBNYXRoLlBJLWhvdmVyQW5nbGU6IGhvdmVyQW5nbGUpO1xyXG4gICAgICAgICAgICAgICAgYmxvY2suY29ybmVyRm9yY2UgPSAoKT0+IChpPyAtMTogMSkqU2hlZXRQaHlzaWNzLmhvdmVyQ29ybmVyRm9yY2VDbGIoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hlZXRQaHlzaWNzLnNldFBhcmFtZXRyKGJsb2NrLnBoeXNpY0lkLCAnYW5nbGUnLCBpPyBNYXRoLlBJLTAuNSpob3ZlckFuZ2xlOiAwLjUqaG92ZXJBbmdsZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvdmVySW5mbyA9IHtcclxuICAgICAgICAgICAgICAgICAgbixcclxuICAgICAgICAgICAgICAgICAgYmxvY2tcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgxLzMwKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZih0aGlzLmhvdmVySW5mbyAmJiBlLnR5cGU9PT0nbW91c2VvdXQnKSB7XHJcbiAgICAgICAgaWYodGhpcy5ob3ZlckluZm8ucGVuZGluZ3MhPT11bmRlZmluZWQpIHtcclxuICAgICAgICAgIC0tdGhpcy5ob3ZlckluZm8ucGVuZGluZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobj09PXRoaXMuaG92ZXJJbmZvLm4pIHtcclxuICAgICAgICAgIHRoaXMuY2xlYXJIb3ZlckluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihlLnR5cGU9PT0nbW91c2Vkb3duJykge1xyXG4gICAgICAgIHRoaXMuY29ybmVyQ2xpY2tEYXRhID0ge1xyXG4gICAgICAgICAgeDogZS5wYWdlWCxcclxuICAgICAgICAgIHk6IGUucGFnZVlcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYoZS50eXBlPT09J2NsaWNrJykge1xyXG4gICAgICAgIGlmKE1hdGguc3FydChNYXRoLnBvdyh0aGlzLmNvcm5lckNsaWNrRGF0YS54LWUucGFnZVgsMikrTWF0aC5wb3codGhpcy5jb3JuZXJDbGlja0RhdGEueS1lLnBhZ2VZLDIpKTw1KSB7XHJcbiAgICAgICAgICBjb25zdCBob3ZlciA9IHRoaXMuZ2V0QmxvY2tCeVBhZ2Uobik7XHJcbiAgICAgICAgICBpZihob3Zlci5waHlzaWNJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBpZCA9IGhvdmVyLnBoeXNpY0lkLFxyXG4gICAgICAgICAgICAgICAgICBwcm9wcyA9IGhvdmVyLmdldFByb3BzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hlZXRQaHlzaWNzLnNldFBhcmFtZXRyKGlkLCAndmVsb2NpdHknLCAoaT8gLTE6IDEpKnByb3BzLnN0YXJ0VmVsb2NpdHkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkZWxldGUgdGhpcy5jb3JuZXJDbGlja0RhdGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFNoZWV0QmxvY2socCwgYmxvY2spIHtcclxuICAgIHRoaXMuc2hlZXRCbG9ja3Muc3BsaWNlKHAsIDAsIGJsb2NrKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlU2hlZXRCbG9jayhibG9jaywgMik7XHJcbiAgICB0aGlzLnRocmVlU2hlZXRCbG9ja3MuYWRkKGJsb2NrLnRocmVlKTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVNoZWV0QmxvY2soYmxvY2ssIG9mZnNldCkge1xyXG4gICAgY29uc3QgZXZlbnRDb252ZXJ0ZXIgPSBuZXcgQ3VzdG9tRXZlbnRDb252ZXJ0ZXIodGhpcy52aXN1YWwud25kLCB0aGlzLnZpc3VhbC5kb2MsIENpcmNsZVRhcmdldC50ZXN0KSxcclxuICAgICAgICAgIHIgPSAwLjE1LFxyXG4gICAgICAgICAgdGFyZ2V0ID0gbmV3IENpcmNsZVRhcmdldCgxLTAuNSpyLCAwLjUqciwgcik7XHJcbiAgICB0YXJnZXQuYmxvY2sgPSBibG9jaztcclxuICAgIHRhcmdldC5jYWxsYmFjayA9IHRoaXMuY29ybmVyQ2FsbGJhY2suYmluZCh0aGlzKTtcclxuICAgIGV2ZW50Q29udmVydGVyLmFkZEN1c3RvbSh0YXJnZXQpO1xyXG4gICAgYmxvY2suY29ybmVyVGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgYmxvY2sudGhyZWUudXNlckRhdGEubW91c2VDYWxsYmFjayA9IChlLCBkYXRhKT0+IHtcclxuICAgICAgY29uc3QgaSA9IGRhdGEuZmFjZS5tYXRlcmlhbEluZGV4O1xyXG4gICAgICBpZihpPDIpIHtcclxuICAgICAgICBjb25zdCBuID0gaT09PTA/IG9mZnNldCsyKmJsb2NrLnAuZmlyc3Q6IG9mZnNldCsyKmJsb2NrLnAubGFzdC0xO1xyXG4gICAgICAgIGV2ZW50Q29udmVydGVyLmNvbnZlcnQoZSwge3g6IGk9PT0wPyBkYXRhLnV2Lng6IDEtZGF0YS51di54LCB5OiBkYXRhLnV2LnksIGksIG59KTtcclxuICAgICAgICB0aGlzLnBhZ2VNYW5hZ2VyLnRyYW5zZmVyRXZlbnRUb1RleHR1cmUobiwgZSwgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBibG9jay50aHJlZS51c2VyRGF0YS50b3VjaENhbGxiYWNrID0gKGUsIGRhdGEpPT4ge1xyXG4gICAgICBjb25zdCBpID0gZGF0YS5mYWNlLm1hdGVyaWFsSW5kZXg7XHJcbiAgICAgIGlmKGk8Mikge1xyXG4gICAgICAgIGNvbnN0IG4gPSBpPT09MD8gb2Zmc2V0KzIqYmxvY2sucC5maXJzdDogb2Zmc2V0KzIqYmxvY2sucC5sYXN0LTE7XHJcbiAgICAgICAgdGhpcy5wYWdlTWFuYWdlci50cmFuc2ZlckV2ZW50VG9UZXh0dXJlKG4sIGUsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy52aXN1YWwuZHJhZy5hZGRUaHJlZShibG9jay50aHJlZSk7XHJcbiAgICB0aGlzLnZpc3VhbC5tb3VzZUV2ZW50cy5hZGRUaHJlZShibG9jay50aHJlZSk7XHJcbiAgICB0aGlzLnZpc3VhbC50b3VjaEV2ZW50cy5hZGRUaHJlZShibG9jay50aHJlZSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTaGVldEJsb2NrKGJsb2NrKSB7XHJcbiAgICB0aGlzLnZpc3VhbC5tb3VzZUV2ZW50cy5yZW1vdmVUaHJlZShibG9jay50aHJlZSk7XHJcbiAgICB0aGlzLnZpc3VhbC50b3VjaEV2ZW50cy5yZW1vdmVUaHJlZShibG9jay50aHJlZSk7XHJcbiAgICB0aGlzLnZpc3VhbC5kcmFnLnJlbW92ZVRocmVlKGJsb2NrLnRocmVlKTtcclxuICAgIHRoaXMudGhyZWVTaGVldEJsb2Nrcy5yZW1vdmUoYmxvY2sudGhyZWUpO1xyXG4gICAgYmxvY2suZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2hlZXRCbG9ja3MoZmlyc3QsIHNpemUpIHtcclxuICAgIGNvbnN0IGJsb2NrcyA9IHRoaXMuc2hlZXRCbG9ja3Muc3BsaWNlKGZpcnN0LCBzaXplKTtcclxuICAgIGZvcihsZXQgYmxvY2sgb2YgYmxvY2tzKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlU2hlZXRCbG9jayhibG9jayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRUZXh0dXJlKG1hdGVyaWFsLCBuKSB7XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyLnNldFRleHR1cmUobWF0ZXJpYWwsIG4pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZVRleHR1cmUobWF0ZXJpYWwsIG4pIHtcclxuICAgIHRoaXMuc2V0VGV4dHVyZShtYXRlcmlhbCwgbisyKTtcclxuICB9XHJcblxyXG4gIHNldExlZnRDb3ZlclRleHR1cmUobWF0ZXJpYWwsIG4pIHtcclxuICAgIHRoaXMuc2V0VGV4dHVyZShtYXRlcmlhbCwgbik7XHJcbiAgfVxyXG5cclxuICBzZXRSaWdodENvdmVyVGV4dHVyZShtYXRlcmlhbCwgbikge1xyXG4gICAgdGhpcy5zZXRUZXh0dXJlKG1hdGVyaWFsLCBuKzIqKHRoaXMucC5zaGVldHMrMSkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZpbmlzaEFuaW1hdGlvbkNsYihhbmdsZSkge1xyXG4gICAgdGhpcy5ibG9jay5zZXQodGhpcy5ib29rLmdldENsb3NlZEJsb2NrQW5nbGUoYW5nbGUpLmNsb3NlZEFuZ2xlLCdjbG9zZWQnLDApO1xyXG4gICAgY29uc3QgaSA9IHRoaXMuYm9vay5zaGVldEJsb2Nrcy5pbmRleE9mKHRoaXMuYmxvY2spO1xyXG4gICAgaWYofmkpIHtcclxuICAgICAgaWYoYW5nbGU9PT0wKSB7XHJcbiAgICAgICAgdGhpcy5ib29rLm1lcmdlU2hlZXRCbG9ja3MoaSwgdGhpcy5ib29rLnNoZWV0QmxvY2tzLmxlbmd0aC1pKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmJvb2subWVyZ2VTaGVldEJsb2NrcygwLCBpKzEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxjQmxvY2tGb3JjZShibG9jaywgb2JqZWN0LCBhbmdsZSwgdmVsb2NpdHksIGNvcm5lckhlaWdodCkge1xyXG4gICAgcmV0dXJuIGJsb2NrLmZvcmNlPyBibG9jay5mb3JjZShvYmplY3QsIGFuZ2xlLCB2ZWxvY2l0eSwgY29ybmVySGVpZ2h0KTogMDtcclxuICB9XHJcblxyXG4gIGNhbGNCbG9ja0Nvcm5lckZvcmNlKGJsb2NrLCBvYmplY3QsIGFuZ2xlLCB2ZWxvY2l0eSwgY29ybmVySGVpZ2h0KSB7XHJcbiAgICByZXR1cm4gYmxvY2suY29ybmVyRm9yY2U/IGJsb2NrLmNvcm5lckZvcmNlKG9iamVjdCwgYW5nbGUsIHZlbG9jaXR5LCBjb3JuZXJIZWlnaHQpOiAwO1xyXG4gIH1cclxuXHJcbiAgbm90aWZ5QmVmb3JlQW5pbWF0aW9uKCkge1xyXG4gICAgbGV0IHJlcztcclxuICAgIGlmKHRoaXMuYW5pbWF0aW9uTm90aWZpY2F0aW9uKSB7XHJcbiAgICAgIHJlcyA9IFByb21pc2UucmVqZWN0KCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5hbmltYXRpb25Ob3RpZmljYXRpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoe1xyXG4gICAgICAgIHR5cGU6ICdiZWZvcmVBbmltYXRpb24nXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXMgPSB0aGlzLmxheWVyTWFuYWdlci5oaWRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgbm90aWZ5QWZ0ZXJBbmltYXRpb24oKSB7XHJcbiAgICBpZih0aGlzLmFuaW1hdGlvbk5vdGlmaWNhdGlvbikge1xyXG4gICAgICBkZWxldGUgdGhpcy5hbmltYXRpb25Ob3RpZmljYXRpb247XHJcbiAgICAgIHRoaXMubGF5ZXJNYW5hZ2VyLnNob3coKTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgICB0eXBlOiAnYWZ0ZXJBbmltYXRpb24nXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29ubmVjdFBoeXNpY3MoYmxvY2ssIG1hc3MsIGFuZ2xlLCB2ZWxvY2l0eSwgZmxleGliaWxpdHksIGNvdmVySGVpZ2h0LCBzaW11bGF0ZUNsYiwgcmVtb3ZlQ2xiLCBwcm9ncmVzc0NsYikge1xyXG4gICAgY29uc3QgdHlwZSA9ICgpPT4gdGhpcy5ob3ZlckluZm8/ICdob3Zlcic6ICh0aGlzLmRyYWdJbmZvPyAnZHJhZyc6ICdmcmVlJyksXHJcbiAgICAgIHJlcyA9IHRoaXMuc2hlZXRQaHlzaWNzLmdldFNpemUoKT8gUHJvbWlzZS5yZXNvbHZlKCk6IHRoaXMubm90aWZ5QmVmb3JlQW5pbWF0aW9uKCk7XHJcbiAgICByZXR1cm4gcmVzLnRoZW4oKCk9PiB7XHJcbiAgICAgIGJsb2NrLnBoeXNpY0lkID0gdGhpcy5zaGVldFBoeXNpY3MuYWRkT2JqZWN0KFxyXG4gICAgICAgIG1hc3MsXHJcbiAgICAgICAgYW5nbGUsXHJcbiAgICAgICAgdmVsb2NpdHksXHJcbiAgICAgICAgZmxleGliaWxpdHksXHJcbiAgICAgICAgY292ZXJIZWlnaHQsXHJcbiAgICAgICAgKGFuZ2wsIGNoKT0+IHtcclxuICAgICAgICAgIHNpbXVsYXRlQ2xiKGFuZ2wsIGNoKTtcclxuICAgICAgICAgIHByb2dyZXNzQ2xiKGJsb2NrLCBNYXRoLmFicyhhbmdsZS1hbmdsKS9NYXRoLlBJLCAncHJvY2VzcycsIHR5cGUoKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoYW5nbCwgY2gpPT4ge1xyXG4gICAgICAgICAgcmVtb3ZlQ2xiKGFuZ2wsIGNoKTtcclxuICAgICAgICAgIGRlbGV0ZSBibG9jay5waHlzaWNJZDtcclxuICAgICAgICAgIHByb2dyZXNzQ2xiKGJsb2NrLCBNYXRoLmFicyhhbmdsZS1hbmdsKS9NYXRoLlBJLCAnZmluaXNoJywgdHlwZSgpKTtcclxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLnNoZWV0UGh5c2ljcy5nZXRTaXplKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5vdGlmeUFmdGVyQW5pbWF0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKG9iamVjdCwgYW5nbGUsIHZlbG9jaXR5LCBjb3JuZXJIZWlnaHQpPT4gdGhpcy5jYWxjQmxvY2tGb3JjZShibG9jaywgb2JqZWN0LCBhbmdsZSwgdmVsb2NpdHksIGNvcm5lckhlaWdodCksXHJcbiAgICAgICAgKG9iamVjdCwgYW5nbGUsIHZlbG9jaXR5LCBjb3JuZXJIZWlnaHQpPT4gdGhpcy5jYWxjQmxvY2tDb3JuZXJGb3JjZShibG9jaywgb2JqZWN0LCBhbmdsZSwgdmVsb2NpdHksIGNvcm5lckhlaWdodClcclxuICAgICAgKTtcclxuICAgICAgcHJvZ3Jlc3NDbGIoYmxvY2ssIDAsICdpbml0JywgdHlwZSgpKTtcclxuICAgICAgcmV0dXJuIGJsb2NrO1xyXG4gICAgfSkuY2F0Y2goKCk9PiB1bmRlZmluZWQpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGR0KSB7XHJcbiAgICB0aGlzLmxhc3RNb3VzZVBvcy50Kz1kdDtcclxuICAgIGlmKHRoaXMuaXNQcm9jZXNzaW5nKCkgJiYgdGhpcy5sYXN0TW91c2VQb3MucGFnZVghPT11bmRlZmluZWQgJiYgdGhpcy5sYXN0TW91c2VQb3MudC0odGhpcy5sYXN0TW91c2VQb3MubGFzdFQgfHwgMCk+MC4yNSAmJiAhdGhpcy5ob3ZlckluZm8gJiYgIXRoaXMuZHJhZ0luZm8pIHtcclxuICAgICAgdGhpcy5sYXN0TW91c2VQb3MubGFzdFQgPSB0aGlzLmxhc3RNb3VzZVBvcy50O1xyXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4ge1xyXG4gICAgICAgICQodGhpcy52aXN1YWwuZWxlbWVudCkudHJpZ2dlcigkLkV2ZW50KCdtb3VzZW1vdmUnLCB0aGlzLmxhc3RNb3VzZVBvcykpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hlZXRQaHlzaWNzLnNpbXVsYXRlKGR0KTtcclxuICB9XHJcblxyXG4gIHNwbGl0U2hlZXRCbG9jayhpLCBsZWZ0U2l6ZSkge1xyXG4gICAgY29uc3QgYmxvY2sgPSB0aGlzLnNoZWV0QmxvY2tzW2ldO1xyXG4gICAgaWYoYmxvY2sgJiYgbGVmdFNpemU8YmxvY2suZ2V0U2l6ZSgpKSB7XHJcbiAgICAgIGNvbnN0IG5ld0Jsb2NrID0gbmV3IFNoZWV0QmxvY2sodGhpcy52aXN1YWwsIHsuLi50aGlzLnAsIHNldFRleHR1cmU6IHRoaXMuc2V0UGFnZVRleHR1cmUuYmluZCh0aGlzKX0sIGJsb2NrLnAuZmlyc3QsIGJsb2NrLnAuZmlyc3QrbGVmdFNpemUsIGJsb2NrLmFuZ2xlLCBibG9jay5zdGF0ZSk7XHJcbiAgICAgIGJsb2NrLnNldChibG9jay5hbmdsZSwgYmxvY2suc3RhdGUsIGJsb2NrLmNvcm5lci5oZWlnaHQsIGJsb2NrLnAuZmlyc3QrbGVmdFNpemUsIGJsb2NrLnAubGFzdCk7XHJcbiAgICAgIHRoaXMuYWRkU2hlZXRCbG9jayhpLCBuZXdCbG9jayk7XHJcbiAgICAgIHJldHVybiBbbmV3QmxvY2ssIGJsb2NrXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1lcmdlU2hlZXRCbG9ja3MoZmlyc3QsIHNpemUpIHtcclxuICAgIGlmKGZpcnN0PHRoaXMuc2hlZXRCbG9ja3MubGVuZ3RoKSB7XHJcbiAgICAgIHNpemUgPSBNYXRoLm1pbih0aGlzLnNoZWV0QmxvY2tzLmxlbmd0aC1maXJzdCwgc2l6ZSk7XHJcbiAgICAgIGNvbnN0IGZpcnN0QmxvY2sgPSB0aGlzLnNoZWV0QmxvY2tzW2ZpcnN0XSwgbGFzdEJsb2NrID0gdGhpcy5zaGVldEJsb2Nrc1tmaXJzdCtzaXplLTFdO1xyXG4gICAgICBmaXJzdEJsb2NrLnNldChmaXJzdEJsb2NrLmFuZ2xlLCBmaXJzdEJsb2NrLnN0YXRlLCBmaXJzdEJsb2NrLmNvcm5lci5oZWlnaHQsIGZpcnN0QmxvY2sucC5maXJzdCwgbGFzdEJsb2NrLnAubGFzdCk7XHJcbiAgICAgIHRoaXMucmVtb3ZlU2hlZXRCbG9ja3MoZmlyc3QrMSwgc2l6ZS0xKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFNoZWV0QmxvY2tzKGFuZ2xlLCBzdGF0ZSkge1xyXG4gICAgaWYoc3RhdGU9PT0nY2xvc2VkJykge1xyXG4gICAgICB0aGlzLmNsb3NlZEFuZ2xlID0gYW5nbGU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNoZWV0QmxvY2tzLmZvckVhY2goKHMpPT4ge1xyXG4gICAgICBpZighcy5waHlzaWNJZCkge1xyXG4gICAgICAgIHMuc2V0KGFuZ2xlLCBzdGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0KGFuZ2xlLCBoZWlnaHQ9MCkge1xyXG4gICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xyXG4gICAgY29uc3QgUEkgPSBNYXRoLlBJO1xyXG4gICAgaWYoYW5nbGU8UEkvNCkge1xyXG4gICAgICB0aGlzLmJpbmRlci5zZXQoMCk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRMZWZ0KC1QSS8yKzIqYW5nbGUpO1xyXG4gICAgICB0aGlzLmxlZnRDb3Zlci5zZXQoUEkvMiwnb3BlbmVkJyxoZWlnaHQpO1xyXG5cclxuICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcygwLCdjbG9zZWQnKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldFJpZ2h0KDApO1xyXG4gICAgICB0aGlzLnJpZ2h0Q292ZXIuc2V0KDAsJ2Nsb3NlZCcsMCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGFuZ2xlPDIqUEkvNCkge1xyXG4gICAgICBjb25zdCBhPTIqKGFuZ2xlLVBJLzQpO1xyXG4gICAgICB0aGlzLmJpbmRlci5zZXQoYSk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRMZWZ0KC1hKTtcclxuICAgICAgdGhpcy5sZWZ0Q292ZXIuc2V0KFBJLzIrYSwnb3BlbmVkJyxoZWlnaHQpO1xyXG5cclxuICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhhLCdjbG9zZWQnKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldFJpZ2h0KC1hKTtcclxuICAgICAgdGhpcy5yaWdodENvdmVyLnNldChhLCdjbG9zZWQnLDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihhbmdsZTwzKlBJLzQpIHtcclxuICAgICAgY29uc3QgYT0yKihhbmdsZS1QSS8yKTtcclxuICAgICAgdGhpcy5iaW5kZXIuc2V0KFBJLzIpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0TGVmdCgtUEkvMik7XHJcbiAgICAgIHRoaXMubGVmdENvdmVyLnNldChQSSwnb3BlbmVkJywwKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldFJpZ2h0KC1QSS8yKTtcclxuICAgICAgdGhpcy5yaWdodENvdmVyLnNldChhLCdvcGVuZWQnLGhlaWdodCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGFuZ2xlPDQqUEkvNCkge1xyXG4gICAgICBjb25zdCBhPTIqKGFuZ2xlLTMqUEkvNCkrUEkvMjtcclxuICAgICAgdGhpcy5iaW5kZXIuc2V0KGEpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0TGVmdCgtYSk7XHJcbiAgICAgIHRoaXMubGVmdENvdmVyLnNldChhLCdjbG9zZWQnLDApO1xyXG5cclxuICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhhLCdjbG9zZWQnKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldFJpZ2h0KC1QSS8yKTtcclxuICAgICAgdGhpcy5yaWdodENvdmVyLnNldChQSS8yLCdvcGVuZWQnLGhlaWdodCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGFuZ2xlPDUqUEkvNCkge1xyXG4gICAgICB0aGlzLmJpbmRlci5zZXQoUEkpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0TGVmdCgtUEkpO1xyXG4gICAgICB0aGlzLmxlZnRDb3Zlci5zZXQoUEksJ2Nsb3NlZCcsMCk7XHJcblxyXG4gICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKFBJLCdjbG9zZWQnKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldFJpZ2h0KC1QSS8yLTIqKGFuZ2xlLVBJKSk7XHJcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5zZXQoUEkvMiwnb3BlbmVkJyxoZWlnaHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihhbmdsZTw2KlBJLzQpIHtcclxuICAgICAgY29uc3QgYT0yKihhbmdsZS01KlBJLzQpO1xyXG4gICAgICB0aGlzLmJpbmRlci5zZXQoUEktYSk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRMZWZ0KC1QSSthKTtcclxuICAgICAgdGhpcy5sZWZ0Q292ZXIuc2V0KFBJLWEsJ2Nsb3NlZCcsMCk7XHJcblxyXG4gICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKFBJLWEsJ2Nsb3NlZCcpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0UmlnaHQoLVBJK2EpO1xyXG4gICAgICB0aGlzLnJpZ2h0Q292ZXIuc2V0KFBJLzItYSwnb3BlbmVkJyxoZWlnaHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihhbmdsZTw3KlBJLzQpIHtcclxuICAgICAgY29uc3QgYT0yKihhbmdsZS02KlBJLzQpO1xyXG4gICAgICB0aGlzLmJpbmRlci5zZXQoUEkvMik7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRMZWZ0KC1QSS8yKTtcclxuICAgICAgdGhpcy5sZWZ0Q292ZXIuc2V0KFBJLWEsJ29wZW5lZCcsaGVpZ2h0KTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldFJpZ2h0KC1QSS8yKTtcclxuICAgICAgdGhpcy5yaWdodENvdmVyLnNldCgwLCdvcGVuZWQnLDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihhbmdsZTw4KlBJLzQpIHtcclxuICAgICAgY29uc3QgYT0yKihhbmdsZS03KlBJLzQpO1xyXG4gICAgICB0aGlzLmJpbmRlci5zZXQoUEkvMi1hKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldExlZnQoLVBJLzIpO1xyXG4gICAgICB0aGlzLmxlZnRDb3Zlci5zZXQoUEkvMiwnb3BlbmVkJyxoZWlnaHQpO1xyXG5cclxuICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhQSS8yLWEsJ2Nsb3NlZCcpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0UmlnaHQoLVBJLzIrYSk7XHJcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5zZXQoUEkvMi1hLCdjbG9zZWQnLDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZVNpZGVUZXh0dXJlKGNvbG9yKSB7XHJcbiAgICBjb25zdCBqQyA9ICQoJzxjYW52YXMgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiOFwiPjwvY2FudmFzPicpO1xyXG4gICAgY29uc3QgY3R4ID0gakNbMF0uZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgIGN0eC5maWxsU3R5bGUgPSBHcmFwaFV0aWxzLmNvbG9yMlJnYmEoY29sb3IsIDEpO1xyXG4gICAgY3R4LnJlY3QoMCwgMCwgOCwgNyk7XHJcbiAgICBjdHguZmlsbCgpO1xyXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgY3R4LmZpbGxTdHlsZSA9IEdyYXBoVXRpbHMuY29sb3IyUmdiYShHcmFwaFV0aWxzLmludmVyc2VDb2xvcihjb2xvciwwLjUpLCAxKTtcclxuICAgIGN0eC5yZWN0KDAsIDcsIDgsIDEpO1xyXG4gICAgY3R4LmZpbGwoKTtcclxuICAgIHJldHVybiBqQ1swXTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBwcmVwYXJlUHJvcHMocHJvcHMpIHtcclxuICAgIHJldHVybiBCb29rLmNhbGNQcm9wcyhCb29rLm1lcmdlUHJvcHMoYm9va1Byb3BzKCksIHByb3BzKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbWVyZ2VQcm9wcyhmaXJzdCwgc2Vjb25kKSB7XHJcbiAgICBzZWNvbmQgPSBzZWNvbmQgfHwge307XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5maXJzdCxcclxuICAgICAgLi4uc2Vjb25kLFxyXG4gICAgICBzaGVldDoge1xyXG4gICAgICAgIC4uLmZpcnN0LnNoZWV0LFxyXG4gICAgICAgIC4uLnNlY29uZC5zaGVldCxcclxuICAgICAgfSxcclxuICAgICAgY292ZXI6IHtcclxuICAgICAgICAuLi5maXJzdC5jb3ZlcixcclxuICAgICAgICAuLi5zZWNvbmQuY292ZXIsXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2U6IHtcclxuICAgICAgICAuLi5maXJzdC5wYWdlLFxyXG4gICAgICAgIC4uLnNlY29uZC5wYWdlLFxyXG4gICAgICB9LFxyXG4gICAgICBjc3NMYXllclByb3BzOiB7XHJcbiAgICAgICAgLi4uZmlyc3QuY3NzTGF5ZXJQcm9wcyxcclxuICAgICAgICAuLi5zZWNvbmQuY3NzTGF5ZXJQcm9wcyxcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjYWxjUHJvcHMocHJvcHMpIHtcclxuICAgIGNvbnN0IHAgPSB7XHJcbiAgICAgIC4uLnByb3BzLFxyXG4gICAgICBzaGVldDoge1xyXG4gICAgICAgIC4uLnByb3BzLnNoZWV0XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvdmVyOiB7XHJcbiAgICAgICAgLi4ucHJvcHMuc2hlZXQsXHJcbiAgICAgICAgLi4ucHJvcHMuY292ZXJcclxuICAgICAgfSxcclxuICAgICAgcGFnZToge1xyXG4gICAgICAgIC4uLnByb3BzLnNoZWV0LFxyXG4gICAgICAgIC4uLnByb3BzLnBhZ2VcclxuICAgICAgfSxcclxuICAgICAgY3NzTGF5ZXJQcm9wczoge1xyXG4gICAgICAgIC4uLnByb3BzLmNzc0xheWVyUHJvcHMsXHJcbiAgICAgICAgJFxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgc2NhbGUgPSAxMCxcclxuICAgIGhlaWdodCA9IHNjYWxlKnAuaGVpZ2h0LFxyXG4gICAgd2lkdGggPSBzY2FsZSpwLndpZHRoLFxyXG4gICAgZmxpcFByb2dyZXNzQ2xiID0gKCk9PiB1bmRlZmluZWQsXHJcbiAgICBzaGVldCA9IHtcclxuICAgICAgc2lkZVRleHR1cmU6IHAuc2hlZXQuc2lkZVRleHR1cmUgfHwgQm9vay5jcmVhdGVTaWRlVGV4dHVyZShwLnNoZWV0LmNvbG9yKSxcclxuICAgIH0sXHJcbiAgICBjb3ZlciA9IHtcclxuICAgICAgLi4uc2hlZXQsXHJcbiAgICAgIC4uLnAuY292ZXIsXHJcbiAgICAgIGRlcHRoOiBzY2FsZSpwLmNvdmVyLmRlcHRoLFxyXG4gICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICBwYWRkaW5nOiBzY2FsZSpwLmNvdmVyLnBhZGRpbmdcclxuICAgIH0sXHJcbiAgICBwYWdlID0ge1xyXG4gICAgICAuLi5zaGVldCxcclxuICAgICAgLi4ucC5wYWdlLFxyXG4gICAgICBkZXB0aDogc2NhbGUqcC5wYWdlLmRlcHRoLFxyXG4gICAgICB3aWR0aDogY292ZXIud2lkdGggLSBjb3Zlci5wYWRkaW5nLFxyXG4gICAgICBoZWlnaHQ6IGNvdmVyLmhlaWdodCAtIDIqY292ZXIucGFkZGluZ1xyXG4gICAgfSxcclxuICAgIG1hcmtlciA9IHtcclxuICAgICAgdXNlOiBmYWxzZSxcclxuICAgICAgY29sb3I6IDBYRkYwMDAwLFxyXG4gICAgICBzaXplOiBzY2FsZSowLjAwMVxyXG4gICAgfTtcclxuICAgIGlmKGNvdmVyLmNvbG9yIT09c2hlZXQuY29sb3IgJiYgIXAuY292ZXIuc2lkZVRleHR1cmUpIHtcclxuICAgICAgY292ZXIuc2lkZVRleHR1cmUgPSBCb29rLmNyZWF0ZVNpZGVUZXh0dXJlKGNvdmVyLmNvbG9yKTtcclxuICAgIH1cclxuICAgIGlmKHBhZ2UuY29sb3IhPT1zaGVldC5jb2xvciAmJiAhcC5wYWdlLnNpZGVUZXh0dXJlKSB7XHJcbiAgICAgIHBhZ2Uuc2lkZVRleHR1cmUgPSBCb29rLmNyZWF0ZVNpZGVUZXh0dXJlKHBhZ2UuY29sb3IpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsuLi5wLCBzY2FsZSwgaGVpZ2h0LCB3aWR0aCwgZmxpcFByb2dyZXNzQ2xiLCBjb3ZlciwgcGFnZSwgbWFya2VyfTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQm9vay5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQm9vay5qcyIsImltcG9ydCB7JCwgVEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgQ29udHJvbGxlciBmcm9tICdDb250cm9sbGVyJztcclxuaW1wb3J0IHtwcm9wcyBhcyAgYm9va0NvbnRyb2xsZXJQcm9wc30gZnJvbSAnLi4vcHJvcHMvYm9va0NvbnRyb2xsZXInO1xyXG5pbXBvcnQgRXZlbnRzVG9BY3Rpb25zIGZyb20gJ0V2ZW50c1RvQWN0aW9ucyc7XHJcbmltcG9ydCBTdGF0cyBmcm9tICdzdGF0cy5qcyc7XHJcbmltcG9ydCBPYmplY3QzRFdhdGNoZXIgZnJvbSAnT2JqZWN0M0RXYXRjaGVyJztcclxuaW1wb3J0IEZ1bGxTY3JlZW4gZnJvbSAnRnVsbFNjcmVlbic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb29rQ29udHJvbGxlciBleHRlbmRzIENvbnRyb2xsZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihib29rLCB2aWV3LCBwcm9wcykge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMubmF2aWdhdGlvbkNvbnRyb2xzID0gdHJ1ZTtcclxuICAgIHRoaXMuYm9vayA9IGJvb2s7XHJcbiAgICB0aGlzLnZpc3VhbCA9IGJvb2sudmlzdWFsO1xyXG4gICAgdGhpcy5wID0gQm9va0NvbnRyb2xsZXIucHJlcGFyZVByb3BzKHByb3BzKTtcclxuICAgIHRoaXMucC5ydGwgPSBib29rLnAucnRsO1xyXG4gICAgdGhpcy5kZXZpY2VQaXhlbFJhdGlvID0gdGhpcy52aXN1YWwud25kLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcclxuXHJcbiAgICB0aGlzLm9yYml0ID0gYm9vay52aXN1YWwuZ2V0T3JiaXQoKTtcclxuICAgIGJvb2suc2V0RmxpcFByb2dyZXNzQ2xiKHRoaXMudXBkYXRlVmlld0lmU3RhdGUuYmluZCh0aGlzKSk7XHJcbiAgICB0aGlzLnZpZXcgPSB2aWV3O1xyXG4gICAgdGhpcy5iaW5kQWN0aW9ucygpO1xyXG5cclxuICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgIHNtYXJ0UGFuOiAhdGhpcy5hY3Rpb25zWydjbWRTbWFydFBhbiddLmFjdGl2ZSxcclxuICAgICAgc2luZ2xlUGFnZTogdGhpcy5hY3Rpb25zWydjbWRTaW5nbGVQYWdlJ10uYWN0aXZlIHx8IHRoaXMuYWN0aW9uc1snY21kU2luZ2xlUGFnZSddLmFjdGl2ZUZvck1vYmlsZSAmJiB0aGlzLmRldmljZVBpeGVsUmF0aW8+MSxcclxuICAgICAgc3RhdHM6IHRoaXMuYWN0aW9uc1snY21kU3RhdHMnXS5hY3RpdmUsXHJcbiAgICAgIGxpZ2h0aW5nOiB0aGlzLnAubGlnaHRpbmcuZGVmYXVsdCxcclxuICAgICAgYWN0aXZlU2lkZTogMVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmJveHMgPSBbbmV3IFRIUkVFLkJveDMoKSwgbmV3IFRIUkVFLkJveDMoKV07XHJcbiAgICB0aGlzLmJvb2tXYXRjaGVyID0gbmV3IE9iamVjdDNEV2F0Y2hlcih0aGlzLnZpc3VhbCwgKCk9PiB7XHJcbiAgICAgIGlmKHRoaXMuc3RhdGUuc2luZ2xlUGFnZSkge1xyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlU2lkZSkge1xyXG4gICAgICAgICAgdGhpcy5ib3hzWzBdLnNldEZyb21PYmplY3QoYm9vay5yaWdodENvdmVyLnRocmVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmJveHNbMF0uc2V0RnJvbU9iamVjdChib29rLmxlZnRDb3Zlci50aHJlZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYm94c1swXS5zZXRGcm9tT2JqZWN0KGJvb2subGVmdENvdmVyLnRocmVlKTtcclxuICAgICAgICB0aGlzLmJveHNbMV0uc2V0RnJvbU9iamVjdChib29rLnJpZ2h0Q292ZXIudGhyZWUpO1xyXG4gICAgICAgIHRoaXMuYm94c1swXS51bmlvbih0aGlzLmJveHNbMV0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmJveHNbMF07XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYm9va1dhdGNoZXIuc2NhbGUgPSB0aGlzLnAuc2NhbGUuZGVmYXVsdDtcclxuICAgIHRoaXMuYm9vay5zZXRab29tKHRoaXMuYm9va1dhdGNoZXIuc2NhbGUsIHRoaXMuc3RhdGUuc2luZ2xlUGFnZSk7XHJcblxyXG4gICAgdGhpcy5TdGF0cyA9IG5ldyBTdGF0cygpO1xyXG4gICAgdGhpcy5TdGF0cy5kb21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgIHRoaXMuU3RhdHMuZG9tRWxlbWVudC5zdHlsZS50b3AgPSAnMHB4JztcclxuXHJcbiAgICB0aGlzLnZpc3VhbC5zZXRFeHRyYUxpZ2h0aW5nKHRoaXMuc3RhdGUubGlnaHRpbmcpO1xyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgb25TY3JlZW5Nb2RlQ2hhbmdlZDogdGhpcy5vblNjcmVlbk1vZGVDaGFuZ2VkLmJpbmQodGhpcyksXHJcbiAgICAgIHN0YXRzOiB0aGlzLlN0YXRzLnVwZGF0ZS5iaW5kKHRoaXMuU3RhdHMpLFxyXG4gICAgICBvblVwZGF0ZVZpZXc6IHRoaXMudXBkYXRlVmlldy5iaW5kKHRoaXMpXHJcbiAgICB9XHJcbiAgICBGdWxsU2NyZWVuLmFkZEV2ZW50TGlzdGVuZXIodGhpcy52aWV3LmdldFBhcmVudENvbnRhaW5lcigpLm93bmVyRG9jdW1lbnQsIHRoaXMuYmluZHMub25TY3JlZW5Nb2RlQ2hhbmdlZCk7XHJcblxyXG4gICAgdGhpcy5jbWRTbWFydFBhbigpO1xyXG5cclxuICAgIGlmKHRoaXMudmlldy50ZW1wbGF0ZU9iamVjdC5hcHBMb2FkZWQpIHtcclxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbih0aGlzLnZpZXcudGVtcGxhdGVPYmplY3QuYXBwTG9hZGVkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJvb2suZW5hYmxlTG9hZGluZ0FuaW1hdGlvbih0aGlzLnAubG9hZGluZ0FuaW1hdGlvbi5ib29rKTtcclxuICAgIGlmKHRoaXMucC5sb2FkaW5nQW5pbWF0aW9uLnNraW4pIHtcclxuICAgICAgdGhpcy5pbml0TG9hZGluZ0FuaW1hdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYm9vay5lbmFibGVMb2FkaW5nQW5pbWF0aW9uKHRoaXMucC5sb2FkaW5nQW5pbWF0aW9uLmJvb2spO1xyXG4gICAgdGhpcy5ib29rLnNldEF1dG9SZXNvbHV0aW9uKHRoaXMucC5hdXRvUmVzb2x1dGlvbi5lbmFibGVkLCB0aGlzLnAuYXV0b1Jlc29sdXRpb24uY29lZmZpY2llbnQpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIEZ1bGxTY3JlZW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLnZpZXcuZ2V0UGFyZW50Q29udGFpbmVyKCkub3duZXJEb2N1bWVudCwgdGhpcy5iaW5kcy5vblNjcmVlbk1vZGVDaGFuZ2VkKTtcclxuICAgIGRlbGV0ZSB0aGlzLmJvb2s7XHJcbiAgICBkZWxldGUgdGhpcy52aWV3O1xyXG4gICAgZGVsZXRlIHRoaXMudmlzdWFsO1xyXG4gIH1cclxuXHJcbiAgaW5pdExvYWRpbmdBbmltYXRpb24oKSB7XHJcbiAgICBjb25zdCBoYW5kbGVyID0gKCk9PiB7XHJcbiAgICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5ib29rLmdldFRvcFBhZ2VzKCk7XHJcbiAgICAgIGxldCB2aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIGZvcihsZXQgbiBvZiBwYWdlcykge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ib29rLmdldFBhZ2VTdGF0ZShuKTtcclxuICAgICAgICB2aXNpYmxlID0gc3RhdGU9PT11bmRlZmluZWQgfHwgc3RhdGU9PT0nbG9hZGluZyc7XHJcbiAgICAgICAgaWYodmlzaWJsZSkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnd2lkTG9hZGluZycsIHtcclxuICAgICAgICB2aXNpYmxlXHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuICAgIHRoaXMuYm9vay5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVBbmltYXRpb24nLCBoYW5kbGVyKTtcclxuICAgIHRoaXMuYm9vay5hZGRFdmVudExpc3RlbmVyKCdhZnRlckFuaW1hdGlvbicsIGhhbmRsZXIpO1xyXG4gICAgdGhpcy5ib29rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRQYWdlJywgaGFuZGxlcik7XHJcbiAgICB0aGlzLmJvb2suYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkUGFnZScsIGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlTmF2aWdhdGlvbihlbmFibGUpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvbkNvbnRyb2xzID0gZW5hYmxlO1xyXG4gIH1cclxuXHJcbiAgc2V0VG9jQ3RybCh0b2NDdHJsKSB7XHJcbiAgICB0aGlzLnRvY0N0cmwgPSB0b2NDdHJsO1xyXG4gICAgdGhpcy50b2NDdHJsLm9uQ2hhbmdlID0gdGhpcy51cGRhdGVWaWV3LmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIHNldFByaW50ZXIocHJpbnRlcikge1xyXG4gICAgdGhpcy5wcmludGVyID0gcHJpbnRlcjtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgc2V0U291bmRzKHNvdW5kcykge1xyXG4gICAgdGhpcy5zb3VuZHMgPSBzb3VuZHM7XHJcbiAgICBzb3VuZHMuc2V0RW5hYmxlZCh0aGlzLmFjdGlvbnNbJ2NtZFNvdW5kcyddLmFjdGl2ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG5cclxuICBvblNjcmVlbk1vZGVDaGFuZ2VkKGUpIHtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY2FuWm9vbUluKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLnN0YXRlLnNtYXJ0UGFuIHx8IE1hdGguYWJzKHRoaXMuYm9va1dhdGNoZXIuc2NhbGUtdGhpcy5wLnNjYWxlLm1heCk+dGhpcy5wLmVwcztcclxuICB9XHJcblxyXG4gIGNhblpvb21PdXQoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuc3RhdGUuc21hcnRQYW4gfHwgTWF0aC5hYnModGhpcy5ib29rV2F0Y2hlci5zY2FsZS10aGlzLnAuc2NhbGUubWluKT50aGlzLnAuZXBzO1xyXG4gIH1cclxuXHJcbiAgY2FuRGVmYXVsdFpvb20oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zbWFydFBhbjtcclxuICB9XHJcblxyXG4gIHNldEJvb2tab29tKHNjYWxlKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICBpZih0aGlzLmJvb2tXYXRjaGVyLnNjYWxlPT09c2NhbGUpIHtcclxuICAgICAgICB0aGlzLmJvb2suc2V0Wm9vbShzY2FsZSwgdGhpcy5zdGF0ZS5zaW5nbGVQYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwMCk7XHJcbiAgfVxyXG5cclxuICBjbWRab29tSW4oKSB7XHJcbiAgICBpZih0aGlzLnN0YXRlLnNtYXJ0UGFuKSB7XHJcbiAgICAgIHRoaXMuYm9va1dhdGNoZXIuc2NhbGUgPSBNYXRoLm1pbih0aGlzLnAuc2NhbGUubWF4LCB0aGlzLmJvb2tXYXRjaGVyLnNjYWxlK3RoaXMucC5zY2FsZS5kZWx0YSk7XHJcbiAgICAgIHRoaXMuc2V0Qm9va1pvb20odGhpcy5ib29rV2F0Y2hlci5zY2FsZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vcmJpdC56b29tSW4oNi42KnRoaXMucC5zY2FsZS5kZWx0YS8wLjMyKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kWm9vbU91dCgpIHtcclxuICAgIGlmKHRoaXMuc3RhdGUuc21hcnRQYW4pIHtcclxuICAgICAgdGhpcy5ib29rV2F0Y2hlci5zY2FsZSA9IE1hdGgubWF4KHRoaXMucC5zY2FsZS5taW4sIHRoaXMuYm9va1dhdGNoZXIuc2NhbGUtdGhpcy5wLnNjYWxlLmRlbHRhKTtcclxuICAgICAgdGhpcy5zZXRCb29rWm9vbSh0aGlzLmJvb2tXYXRjaGVyLnNjYWxlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9yYml0Lnpvb21PdXQoNi42KnRoaXMucC5zY2FsZS5kZWx0YS8wLjMyKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kRGVmYXVsdFpvb20oKSB7XHJcbiAgICBpZih0aGlzLnN0YXRlLnNtYXJ0UGFuKSB7XHJcbiAgICAgIHRoaXMuYm9va1dhdGNoZXIuc2NhbGUgPSB0aGlzLnAuc2NhbGUuZGVmYXVsdDtcclxuICAgICAgdGhpcy5zZXRCb29rWm9vbSh0aGlzLmJvb2tXYXRjaGVyLnNjYWxlKTtcclxuICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbWRUb2MoKSB7XHJcbiAgICBpZih0aGlzLnRvY0N0cmwpIHtcclxuICAgICAgdGhpcy50b2NDdHJsLnRvZ2xlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbWRGYXN0QmFja3dhcmQoKSB7XHJcbiAgICB0aGlzLnN0YXJ0RmxpcCh0aGlzLmJvb2suZmxpcExlZnQoNSkpO1xyXG4gIH1cclxuXHJcbiAgY21kQmFja3dhcmQoKSB7XHJcbiAgICBpZih0aGlzLnN0YXRlLnNpbmdsZVBhZ2UpIHtcclxuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTaWRlID0gKHRoaXMuZ2V0UGFnZSgpKzEpJTI7XHJcbiAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlU2lkZSkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlU2lkZSA9IDA7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBMZWZ0KDEpKS50aGVuKChibG9jayk9PiB7XHJcbiAgICAgICAgICBpZihibG9jaykge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNpZGUgPSAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBMZWZ0KDEpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNtZEZvcndhcmQoKSB7XHJcbiAgICBpZih0aGlzLnN0YXRlLnNpbmdsZVBhZ2UpIHtcclxuICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTaWRlID0gKHRoaXMuZ2V0UGFnZSgpKzEpJTI7XHJcbiAgICAgIGlmKCF0aGlzLnN0YXRlLmFjdGl2ZVNpZGUpIHtcclxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNpZGUgPSAxO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhcnRGbGlwKHRoaXMuYm9vay5mbGlwUmlnaHQoMSkpLnRoZW4oKGJsb2NrKT0+IHtcclxuICAgICAgICAgIGlmKGJsb2NrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuYWN0aXZlU2lkZSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXJ0RmxpcCh0aGlzLmJvb2suZmxpcFJpZ2h0KDEpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNtZEZhc3RGb3J3YXJkKCkge1xyXG4gICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBSaWdodCg1KSk7XHJcbiAgfVxyXG5cclxuICBjbWRTYXZlKCkge1xyXG4gICAgd2luZG93Lm9wZW4odGhpcy5wLmRvd25sb2FkVVJMLCAnX2JsYW5rJyk7XHJcbiAgfVxyXG5cclxuICBjbWRQcmludCgpIHtcclxuICAgIHRoaXMucHJpbnRlci5wcmludCgpO1xyXG4gIH1cclxuXHJcbiAgY21kRnVsbFNjcmVlbigpIHtcclxuICAgIGlmKCFGdWxsU2NyZWVuLmFjdGl2YXRlZCgpKSB7XHJcbiAgICAgIEZ1bGxTY3JlZW4ucmVxdWVzdCh0aGlzLnZpZXcuZ2V0UGFyZW50Q29udGFpbmVyKCkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIEZ1bGxTY3JlZW4uY2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbWRTbWFydFBhbigpIHtcclxuICAgIHRoaXMuc3RhdGUuc21hcnRQYW4gPSAhdGhpcy5zdGF0ZS5zbWFydFBhbjtcclxuICAgIGlmKHRoaXMuc3RhdGUuc21hcnRQYW4pIHtcclxuICAgICAgdGhpcy5vcmJpdC5taW5BemltdXRoQW5nbGUgPSAwO1xyXG4gICAgICB0aGlzLm9yYml0Lm1heEF6aW11dGhBbmdsZSA9IDA7XHJcbiAgICAgIHRoaXMub3JiaXQubWluUG9sYXJBbmdsZSA9IDA7XHJcbiAgICBcdHRoaXMub3JiaXQubWF4UG9sYXJBbmdsZSA9IE1hdGguUEkvNDtcclxuICAgICAgdGhpcy5ib29rV2F0Y2hlci5lbmFibGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9yYml0Lm1pbkF6aW11dGhBbmdsZSA9IC1JbmZpbml0eTtcclxuICAgICAgdGhpcy5vcmJpdC5tYXhBemltdXRoQW5nbGUgPSBJbmZpbml0eTtcclxuICAgICAgdGhpcy5vcmJpdC5taW5Qb2xhckFuZ2xlID0gMDtcclxuICAgIFx0dGhpcy5vcmJpdC5tYXhQb2xhckFuZ2xlID0gTWF0aC5QSTtcclxuICAgICAgdGhpcy5ib29rV2F0Y2hlci5lbmFibGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGNtZFNpbmdsZVBhZ2UoKSB7XHJcbiAgICB0aGlzLnN0YXRlLnNpbmdsZVBhZ2UgPSAhdGhpcy5zdGF0ZS5zaW5nbGVQYWdlO1xyXG4gICAgdGhpcy5zZXRCb29rWm9vbSh0aGlzLmJvb2tXYXRjaGVyLnNjYWxlKTtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kU291bmRzKCkge1xyXG4gICAgaWYodGhpcy5zb3VuZHMpIHtcclxuICAgICAgdGhpcy5zb3VuZHMudG9nbGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kU3RhdHMoKSB7XHJcbiAgICB0aGlzLnN0YXRlLnN0YXRzID0gIXRoaXMuc3RhdGUuc3RhdHM7XHJcbiAgICBpZih0aGlzLnN0YXRlLnN0YXRzKSB7XHJcbiAgICAgICQodGhpcy52aWV3LmdldENvbnRhaW5lcigpKS5hcHBlbmQodGhpcy5TdGF0cy5kb21FbGVtZW50KTtcclxuICAgICAgdGhpcy52aXN1YWwuYWRkUmVuZGVyQ2FsbGJhY2sodGhpcy5iaW5kcy5zdGF0cyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgJCh0aGlzLnZpZXcuZ2V0Q29udGFpbmVyKCkpLmZpbmQodGhpcy5TdGF0cy5kb21FbGVtZW50KS5yZW1vdmUoKTtcclxuICAgICAgdGhpcy52aXN1YWwucmVtb3ZlUmVuZGVyQ2FsbGJhY2sodGhpcy5iaW5kcy5zdGF0cyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGNtZExpZ2h0aW5nVXAoKSB7XHJcbiAgICB0aGlzLnN0YXRlLmxpZ2h0aW5nID0gTWF0aC5taW4odGhpcy5zdGF0ZS5saWdodGluZyt0aGlzLnAubGlnaHRpbmcuZGVsdGEsIHRoaXMucC5saWdodGluZy5tYXgpO1xyXG4gICAgdGhpcy52aXN1YWwuc2V0RXh0cmFMaWdodGluZyh0aGlzLnN0YXRlLmxpZ2h0aW5nKTtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgY21kTGlnaHRpbmdEb3duKCkge1xyXG4gICAgdGhpcy5zdGF0ZS5saWdodGluZyA9IE1hdGgubWF4KHRoaXMuc3RhdGUubGlnaHRpbmctdGhpcy5wLmxpZ2h0aW5nLmRlbHRhLCB0aGlzLnAubGlnaHRpbmcubWluKTtcclxuICAgIHRoaXMudmlzdWFsLnNldEV4dHJhTGlnaHRpbmcodGhpcy5zdGF0ZS5saWdodGluZyk7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGdvVG9QYWdlKHBhZ2UpIHtcclxuICAgIGlmKHRoaXMucC5ydGwpIHtcclxuICAgICAgcGFnZSA9IHRoaXMuYm9vay5nZXRQYWdlcygpLTEtcGFnZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhZ2VOdW0gPSBNYXRoLm1heChNYXRoLm1pbihwYWdlLCB0aGlzLmJvb2suZ2V0UGFnZXMoKS0xKSwwKTtcclxuICAgIHRoaXMuc3RhdGUuYWN0aXZlU2lkZSA9IChwYWdlTnVtKzEpJTI7XHJcbiAgICBsZXQgdGFyZ2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ocGFnZS0xK3BhZ2UlMiwgdGhpcy5ib29rLmdldFBhZ2VzKCktMSksMCksIGN1cnJlbnQgPSB0aGlzLmJvb2suZ2V0UGFnZSgpLCBmbGlwcyA9IFtdLCBjb3ZzID0gMDs7XHJcbiAgICBpZih0YXJnZXQhPWN1cnJlbnQpIHtcclxuICAgICAgaWYoY3VycmVudD09PTApIHtcclxuICAgICAgICBmbGlwcy5wdXNoKDEpO1xyXG4gICAgICAgIGN1cnJlbnQrPTE7XHJcbiAgICAgICAgKytjb3ZzO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYoY3VycmVudD09PXRoaXMuYm9vay5nZXRQYWdlcygpLTEpIHtcclxuICAgICAgICBmbGlwcy5wdXNoKC0xKTtcclxuICAgICAgICBjdXJyZW50LT0yO1xyXG4gICAgICAgICsrY292cztcclxuICAgICAgfVxyXG4gICAgICBsZXQgY3YgPSAwO1xyXG4gICAgICBpZih0YXJnZXQ9PT0wKSB7XHJcbiAgICAgICAgY3YgPSAtMTtcclxuICAgICAgICB0YXJnZXQrPTE7XHJcbiAgICAgICAgKytjb3ZzO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYodGFyZ2V0PT09dGhpcy5ib29rLmdldFBhZ2VzKCktMSkge1xyXG4gICAgICAgIGN2ID0gMTtcclxuICAgICAgICB0YXJnZXQtPTI7XHJcbiAgICAgICAgKytjb3ZzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHRhcmdldC1jdXJyZW50KSB7XHJcbiAgICAgICAgZmxpcHMucHVzaChNYXRoLmNlaWwoKHRhcmdldC1jdXJyZW50KS8yKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoY3YpIHtcclxuICAgICAgICBmbGlwcy5wdXNoKGN2KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNldENsYiA9IChmbCwgdGltZSwgY2xiKT0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKT0+IHtcclxuICAgICAgICBpZihmbDwwKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0RmxpcCh0aGlzLmJvb2suZmxpcExlZnQoLWZsLCBjbGIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0RmxpcCh0aGlzLmJvb2suZmxpcFJpZ2h0KGZsLCBjbGIpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHRpbWUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZihjb3ZzPT09Mikge1xyXG4gICAgICBzZXRDbGIoZmxpcHNbMF0sIDAsIChibG9jaywgcHJvZ3Jlc3MsIHN0YXRlKT0+IHtcclxuICAgICAgICBpZihzdGF0ZT09J2ZpbmlzaCcgJiYgcHJvZ3Jlc3M9PTEpIHtcclxuICAgICAgICAgIHNldENsYihmbGlwc1tmbGlwcy5sZW5ndGgtMV0sIDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHNldENsYihmbGlwc1sxXSwgNTAwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgdGltZSA9IDA7XHJcbiAgICAgIGZvcihsZXQgZmwgb2YgZmxpcHMpIHtcclxuICAgICAgICBzZXRDbGIoZmwsIHRpbWUpO1xyXG4gICAgICAgIHRpbWUrPTI1MDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhcnRGbGlwKGZsaXBSZXMpIHtcclxuICAgIHJldHVybiBmbGlwUmVzPyBmbGlwUmVzLnRoZW4oKGJsb2NrKT0+IHtcclxuICAgICAgaWYoYmxvY2spIHtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoQXN5bmMoe1xyXG4gICAgICAgICAgdHlwZTogJ3N0YXJ0RmxpcCdcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYmxvY2s7XHJcbiAgICB9KTogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBlbmRGbGlwKGJsb2NrKSB7XHJcbiAgICB0aGlzLmRpc3BhdGNoQXN5bmMoe1xyXG4gICAgICB0eXBlOiAnZW5kRmxpcCdcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGJsb2NrO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZSgpIHtcclxuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmJvb2suZ2V0UGFnZSgpO1xyXG4gICAgcmV0dXJuIHBhZ2U/IE1hdGgubWluKHRoaXMuYm9vay5nZXRQYWdlKCkrdGhpcy5zdGF0ZS5hY3RpdmVTaWRlLCB0aGlzLmJvb2suZ2V0UGFnZXMoKS0xKTogMDtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VGb3JHVUkoKSB7XHJcbiAgICBsZXQgbiA9ICh0aGlzLnN0YXRlLnNpbmdsZVBhZ2U/IHRoaXMuZ2V0UGFnZSgpOiB0aGlzLmJvb2suZ2V0UGFnZSgpKSsxO1xyXG4gICAgaWYodGhpcy5wLnJ0bCkge1xyXG4gICAgICBuID0gdGhpcy5ib29rLmdldFBhZ2VzKCktbisxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG47XHJcbiAgfVxyXG5cclxuICBpbnBQYWdlKGUsIGRhdGEpIHtcclxuICAgIHRoaXMuZ29Ub1BhZ2UoZGF0YS0xKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVZpZXdJZlN0YXRlKGJsb2NrLCBwcm9ncmVzcywgc3RhdGUsIHR5cGUpIHtcclxuICAgIGlmKHN0YXRlPT09J2luaXQnIHx8IHN0YXRlPT09J2ZpbmlzaCcpIHtcclxuICAgICAgc2V0VGltZW91dCh0aGlzLnVwZGF0ZVZpZXcuYmluZCh0aGlzKSwgMTAwKTtcclxuICAgIH1cclxuICAgIGlmKHN0YXRlPT09J2ZpbmlzaCcpIHtcclxuICAgICAgdGhpcy5lbmRGbGlwKGJsb2NrKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVZpZXdTdGF0ZSgpIHtcclxuICAgIHRoaXMudmlld1N0YXRlID0ge1xyXG4gICAgICAnY21kWm9vbUluJzoge1xyXG4gICAgICAgIGVuYWJsZTogdGhpcy5jYW5ab29tSW4oKSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmFjdGlvbnNbJ2NtZFpvb21JbiddLmVuYWJsZWQsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICAnY21kWm9vbU91dCc6IHtcclxuICAgICAgICBlbmFibGU6IHRoaXMuY2FuWm9vbU91dCgpLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuYWN0aW9uc1snY21kWm9vbU91dCddLmVuYWJsZWQsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICAnY21kRGVmYXVsdFpvb20nOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0aGlzLmNhbkRlZmF1bHRab29tKCksXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWREZWZhdWx0Wm9vbSddLmVuYWJsZWQsXHJcbiAgICAgICAgYWN0aXZlOiB0aGlzLmNhbkRlZmF1bHRab29tKCkgJiYgTWF0aC5hYnModGhpcy5ib29rV2F0Y2hlci5zY2FsZS10aGlzLnAuc2NhbGUuZGVmYXVsdCk8dGhpcy5wLmVwc1xyXG4gICAgICB9LFxyXG4gICAgICAnY21kVG9jJzoge1xyXG4gICAgICAgIGVuYWJsZTogISF0aGlzLnRvY0N0cmwsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRUb2MnXS5lbmFibGVkICYmIHRoaXMudG9jQ3RybCxcclxuICAgICAgICBhY3RpdmU6IHRoaXMudG9jQ3RybCAmJiB0aGlzLnRvY0N0cmwudmlzaWJsZVxyXG4gICAgICB9LFxyXG4gICAgICAnaW5wUGFnZXMnOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICB2YWx1ZTogdGhpcy5ib29rLmdldFBhZ2VzKClcclxuICAgICAgfSxcclxuICAgICAgJ2lucFBhZ2UnOiB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBlbmFibGU6ICF0aGlzLmJvb2suaXNQcm9jZXNzaW5nKCkgJiYgdGhpcy5uYXZpZ2F0aW9uQ29udHJvbHMsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuZ2V0UGFnZUZvckdVSSgpXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRTYXZlJzoge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmFjdGlvbnNbJ2NtZFNhdmUnXS5lbmFibGVkICYmICEhdGhpcy5wLmRvd25sb2FkVVJMLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgJ2NtZFByaW50Jzoge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmFjdGlvbnNbJ2NtZFByaW50J10uZW5hYmxlZCAmJiAhIXRoaXMucHJpbnRlcixcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRGdWxsU2NyZWVuJzoge1xyXG4gICAgICAgIGVuYWJsZTogRnVsbFNjcmVlbi5hdmFpbGFibGUoKSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmFjdGlvbnNbJ2NtZEZ1bGxTY3JlZW4nXS5lbmFibGVkLFxyXG4gICAgICAgIGFjdGl2ZTogRnVsbFNjcmVlbi5hdmFpbGFibGUoKSAmJiBGdWxsU2NyZWVuLmFjdGl2YXRlZCgpXHJcbiAgICAgIH0sXHJcbiAgICAgICd3aWRTZXR0aW5ncyc6IHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWyd3aWRTZXR0aW5ncyddLmVuYWJsZWQsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICAnY21kU21hcnRQYW4nOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuYWN0aW9uc1snY21kU21hcnRQYW4nXS5lbmFibGVkLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy5zdGF0ZS5zbWFydFBhblxyXG4gICAgICB9LFxyXG4gICAgICAnY21kU2luZ2xlUGFnZSc6IHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRTaW5nbGVQYWdlJ10uZW5hYmxlZCxcclxuICAgICAgICBhY3RpdmU6IHRoaXMuc3RhdGUuc2luZ2xlUGFnZVxyXG4gICAgICB9LFxyXG4gICAgICAnY21kU291bmRzJzoge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiAgdGhpcy5hY3Rpb25zWydjbWRTb3VuZHMnXS5lbmFibGVkICYmICEhdGhpcy5zb3VuZHMsXHJcbiAgICAgICAgYWN0aXZlOiAhIXRoaXMuc291bmRzICYmIHRoaXMuc291bmRzLmVuYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgJ2NtZFN0YXRzJzoge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmFjdGlvbnNbJ2NtZFN0YXRzJ10uZW5hYmxlZCxcclxuICAgICAgICBhY3RpdmU6IHRoaXMuc3RhdGUuc3RhdHNcclxuICAgICAgfSxcclxuICAgICAgJ2NtZExpZ2h0aW5nVXAnOiB7XHJcbiAgICAgICAgZW5hYmxlOiBNYXRoLmFicyh0aGlzLnN0YXRlLmxpZ2h0aW5nLXRoaXMucC5saWdodGluZy5tYXgpPnRoaXMucC5lcHMsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRMaWdodGluZ1VwJ10uZW5hYmxlZCxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRMaWdodGluZ0Rvd24nOiB7XHJcbiAgICAgICAgZW5hYmxlOiBNYXRoLmFicyh0aGlzLnN0YXRlLmxpZ2h0aW5nLXRoaXMucC5saWdodGluZy5taW4pPnRoaXMucC5lcHMsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRMaWdodGluZ0Rvd24nXS5lbmFibGVkLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBsZWZ0ID0gdGhpcy5ib29rLmdldExlZnRGbGlwcGluZygpLFxyXG4gICAgICAgICAgcmlnaHQgPSB0aGlzLmJvb2suZ2V0UmlnaHRGbGlwcGluZygpO1xyXG4gICAgY29uc3QgZmxpcHBlcnNFbmFibGUgPSB7XHJcbiAgICAgIGNtZEZhc3RCYWNrd2FyZDogISFsZWZ0ICYmIHRoaXMubmF2aWdhdGlvbkNvbnRyb2xzLFxyXG4gICAgICBjbWRCYWNrd2FyZDogISFsZWZ0ICYmIHRoaXMubmF2aWdhdGlvbkNvbnRyb2xzLFxyXG4gICAgICBjbWRGb3J3YXJkOiAhIXJpZ2h0ICYmIHRoaXMubmF2aWdhdGlvbkNvbnRyb2xzLFxyXG4gICAgICBjbWRGYXN0Rm9yd2FyZDogISFyaWdodCAmJiB0aGlzLm5hdmlnYXRpb25Db250cm9sc1xyXG4gICAgfTtcclxuICAgIGZvcihsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyhmbGlwcGVyc0VuYWJsZSkpIHtcclxuICAgICAgdGhpcy52aWV3U3RhdGVbbmFtZV0gPSB7XHJcbiAgICAgICAgZW5hYmxlOiBmbGlwcGVyc0VuYWJsZVtuYW1lXSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmFjdGlvbnNbbmFtZV0uZW5hYmxlZCxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVmlldygpIHtcclxuICAgIGlmKHRoaXMudmlldykge1xyXG4gICAgICB0aGlzLnVwZGF0ZVZpZXdTdGF0ZSgpO1xyXG4gICAgICBmb3IobGV0IG5hbWUgb2YgT2JqZWN0LmtleXModGhpcy52aWV3U3RhdGUpKSB7XHJcbiAgICAgICAgdGhpcy52aWV3LnNldFN0YXRlKG5hbWUsIHRoaXMudmlld1N0YXRlW25hbWVdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QWN0aW9ucygpIHtcclxuICAgIGNvbnN0IGlzU3dpcHBpbmcgPSAobmFtZSk9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMudG91Y2hDbWRTd2lwZS5lbmFibGVkICYmIHRoaXMuYWN0aW9ucy50b3VjaENtZFN3aXBlLmNvZGU9PT10aGlzLmFjdGlvbnNbbmFtZV0uY29kZSAmJiB0aGlzLnN0YXRlLnNtYXJ0UGFuICYmIHRoaXMuYm9va1dhdGNoZXIuc2NhbGU8PTE7XHJcbiAgICB9LCBjbWRzID0ge307XHJcblxyXG4gICAgZm9yKGxldCBuYW1lIGluIHRoaXMpIHtcclxuICAgICAgaWYobmFtZS5pbmRleE9mKCdjbWQnKT09PTApIHtcclxuICAgICAgICBjbWRzW25hbWVdID0ge1xyXG4gICAgICAgICAgYWN0aXZhdGU6ICguLi5hcmdzKT0+IHtcclxuICAgICAgICAgICAgaWYodGhpcy52aWV3U3RhdGUgJiYgdGhpcy52aWV3U3RhdGVbbmFtZV0uZW5hYmxlKSB7XHJcbiAgICAgICAgICAgICAgdGhpc1tuYW1lXSguLi5hcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5jbWRzLFxyXG4gICAgICBjbWRQYW5MZWZ0OiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlKT0+IHRoaXMub3JiaXQuYWN0aW9ucy5wYW4oZSwge1xyXG4gICAgICAgICAgc3RhdGU6ICdtb3ZlJyxcclxuICAgICAgICAgIGR4OiAtdGhpcy5wLnBhbi5zcGVlZCxcclxuICAgICAgICAgIGR5OiAwXHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgY21kUGFuUmlnaHQ6IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUpPT4gdGhpcy5vcmJpdC5hY3Rpb25zLnBhbihlLCB7XHJcbiAgICAgICAgICBzdGF0ZTogJ21vdmUnLFxyXG4gICAgICAgICAgZHg6IHRoaXMucC5wYW4uc3BlZWQsXHJcbiAgICAgICAgICBkeTogMFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFBhblVwOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlKT0+IHRoaXMub3JiaXQuYWN0aW9ucy5wYW4oZSwge1xyXG4gICAgICAgICAgc3RhdGU6ICdtb3ZlJyxcclxuICAgICAgICAgIGR4OiAwLFxyXG4gICAgICAgICAgZHk6IC10aGlzLnAucGFuLnNwZWVkXHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgY21kUGFuRG93bjoge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSk9PiB0aGlzLm9yYml0LmFjdGlvbnMucGFuKGUsIHtcclxuICAgICAgICAgIHN0YXRlOiAnbW92ZScsXHJcbiAgICAgICAgICBkeDogMCxcclxuICAgICAgICAgIGR5OiB0aGlzLnAucGFuLnNwZWVkXHJcbiAgICAgICAgfSlcclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWRSb3RhdGU6IHtcclxuICAgICAgICBhY3RpdmF0ZTogdGhpcy5vcmJpdC5hY3Rpb25zLnJvdGF0ZVxyXG4gICAgICB9LFxyXG4gICAgICBtb3VzZUNtZERyYWdab29tOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlLCBkYXRhKT0+IHtcclxuICAgICAgICAgIGlmKGRhdGEuZHk+MCkge1xyXG4gICAgICAgICAgICB0aGlzLmNtZFpvb21PdXQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYoZGF0YS5keTwwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY21kWm9vbUluKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBtb3VzZUNtZFBhbjoge1xyXG4gICAgICAgIGFjdGl2YXRlOiB0aGlzLm9yYml0LmFjdGlvbnMucGFuXHJcbiAgICAgIH0sXHJcbiAgICAgIG1vdXNlQ21kV2hlZWxab29tOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlKT0+IHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIGlmKGUuZGVsdGFZPDApIHtcclxuICAgICAgICAgICAgdGhpcy5jbWRab29tT3V0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmKGUuZGVsdGFZPjApIHtcclxuICAgICAgICAgICAgdGhpcy5jbWRab29tSW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHRvdWNoQ21kUm90YXRlOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlLCBkYXRhKT0+IHtcclxuICAgICAgICAgIGlmKCFpc1N3aXBwaW5nKCd0b3VjaENtZFJvdGF0ZScpKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5vcmJpdC5hY3Rpb25zLnJvdGF0ZShlLCBkYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHRvdWNoQ21kWm9vbToge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSwgZGF0YSk9PiB7XHJcbiAgICAgICAgICBpZighaXNTd2lwcGluZygndG91Y2hDbWRab29tJykpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpZihkYXRhLmR5PjApIHtcclxuICAgICAgICAgICAgICB0aGlzLmNtZFpvb21PdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKGRhdGEuZHk8MCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY21kWm9vbUluKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHRvdWNoQ21kUGFuOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlLCBkYXRhKT0+IHtcclxuICAgICAgICAgIGlmKCFpc1N3aXBwaW5nKCd0b3VjaENtZFBhbicpKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5vcmJpdC5hY3Rpb25zLnBhbihlLCBkYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHRvdWNoQ21kU3dpcGU6IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUsIGRhdGEpPT4ge1xyXG4gICAgICAgICAgaWYoaXNTd2lwcGluZygndG91Y2hDbWRTd2lwZScpKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgaWYoZGF0YS5zdGF0ZT09PSdzdGFydCcpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b3VjaCA9IChlLnRvdWNoZXMgfHwgZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMpW3RoaXMuYWN0aW9ucy50b3VjaENtZFN3aXBlLmNvZGUtMV07XHJcbiAgICAgICAgICAgICAgdGhpcy5zd2lwZURhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHgwOiB0b3VjaC5wYWdlWCxcclxuICAgICAgICAgICAgICAgIHkwOiB0b3VjaC5wYWdlWSxcclxuICAgICAgICAgICAgICAgIHg6IHRvdWNoLnBhZ2VYLFxyXG4gICAgICAgICAgICAgICAgeTogdG91Y2gucGFnZVlcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoZGF0YS5zdGF0ZT09PSdtb3ZlJykge1xyXG4gICAgICAgICAgICAgIGlmKCF0aGlzLnN3aXBlRGF0YS5oYW5kbGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXBlRGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgLi4udGhpcy5zd2lwZURhdGEsXHJcbiAgICAgICAgICAgICAgICAgIHg6IHRoaXMuc3dpcGVEYXRhLngrZGF0YS5keCxcclxuICAgICAgICAgICAgICAgICAgeTogdGhpcy5zd2lwZURhdGEueStkYXRhLmR5XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZihNYXRoLmFicyh0aGlzLnN3aXBlRGF0YS54MC10aGlzLnN3aXBlRGF0YS54KT4xMDApIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zd2lwZURhdGEueDA+dGhpcy5zd2lwZURhdGEueD8gdGhpcy5jbWRGb3J3YXJkKCk6IHRoaXMuY21kQmFja3dhcmQoKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zd2lwZURhdGEuaGFuZGxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN3aXBlRGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgd2lkU2V0dGluZ3M6IHtcclxuICAgICAgICBhY3RpdmF0ZTogKCk9PiB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGJpbmRBY3Rpb25zKCkge1xyXG4gICAgdGhpcy5lVG9BID0gbmV3IEV2ZW50c1RvQWN0aW9ucygkKHRoaXMudmlzdWFsLmVsZW1lbnQpKTtcclxuICAgIHRoaXMuZVRvQS5hZGRBY3Rpb24oKGUpPT4gZS5wcmV2ZW50RGVmYXVsdCgpLCAnY29udGV4dG1lbnUnLCBFdmVudHNUb0FjdGlvbnMubW91c2VCdXR0b25zLlJpZ2h0LCAwKTtcclxuXHJcbiAgICB0aGlzLmFjdGlvbnMgPSB0aGlzLmdldEFjdGlvbnMoKTtcclxuICAgIGZvcihsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmFjdGlvbnMpKSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHtcclxuICAgICAgICAuLi50aGlzLmFjdGlvbnNbbmFtZV0sXHJcbiAgICAgICAgLi4udGhpcy5wLmFjdGlvbnNbbmFtZV1cclxuICAgICAgfTtcclxuICAgICAgdGhpcy5hY3Rpb25zW25hbWVdID0gYWN0aW9uO1xyXG4gICAgICBpZihhY3Rpb24uZW5hYmxlZCkge1xyXG4gICAgICAgIGNvbnN0IGZsYWdzID0gYWN0aW9uLmZsYWdzIHx8IDA7XHJcbiAgICAgICAgaWYoYWN0aW9uLnR5cGUpIHtcclxuICAgICAgICAgIHRoaXMuZVRvQS5hZGRBY3Rpb24oYWN0aW9uLmFjdGl2YXRlLCBhY3Rpb24udHlwZSwgYWN0aW9uLmNvZGUsIGZsYWdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihhY3Rpb24uY29kZSE9PXVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5lVG9BLmFkZEFjdGlvbihhY3Rpb24uYWN0aXZhdGUsICdrZXlkb3duJywgYWN0aW9uLmNvZGUsIGZsYWdzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBwcmVwYXJlUHJvcHMocHJvcHMpIHtcclxuICAgIHJldHVybiBCb29rQ29udHJvbGxlci5jYWxjUHJvcHMoQm9va0NvbnRyb2xsZXIubWVyZ2VQcm9wcyhib29rQ29udHJvbGxlclByb3BzKCksIHByb3BzKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0QWN0aW9ucyhwcm9wcywgYWN0aW9ucykge1xyXG4gICAgZm9yKGxldCBuYW1lIG9mIE9iamVjdC5rZXlzKGFjdGlvbnMgfHwge30pKSB7XHJcbiAgICAgIHByb3BzLmFjdGlvbnNbbmFtZV0gPSB7XHJcbiAgICAgICAgLi4ucHJvcHMuYWN0aW9uc1tuYW1lXSxcclxuICAgICAgICAuLi5hY3Rpb25zW25hbWVdXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbWVyZ2VQcm9wcyhmaXJzdCwgc2Vjb25kKSB7XHJcbiAgICBzZWNvbmQgPSBzZWNvbmQgfHwge307XHJcbiAgICBmdW5jdGlvbiBtZXJnZShmaXJzdCwgc2Vjb25kKSB7XHJcbiAgICAgIHNlY29uZCA9IHNlY29uZCB8fCB7fTtcclxuICAgICAgY29uc3QgcHJvcHMgPSB7XHJcbiAgICAgICAgLi4uZmlyc3QsXHJcbiAgICAgICAgLi4uc2Vjb25kXHJcbiAgICAgIH07XHJcbiAgICAgIGZvcihsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyhmaXJzdCkpIHtcclxuICAgICAgICBpZih0eXBlb2YgZmlyc3RbbmFtZV09PT0nb2JqZWN0Jykge1xyXG4gICAgICAgICAgcHJvcHNbbmFtZV0gPSBtZXJnZShmaXJzdFtuYW1lXSwgc2Vjb25kW25hbWVdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByb3BzO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcHJvcHMgPSBtZXJnZShmaXJzdCwgc2Vjb25kKTtcclxuICAgIEJvb2tDb250cm9sbGVyLnNldEFjdGlvbnMocHJvcHMsIGZpcnN0LmFjdGlvbnMpO1xyXG4gICAgQm9va0NvbnRyb2xsZXIuc2V0QWN0aW9ucyhwcm9wcywgc2Vjb25kLmFjdGlvbnMpO1xyXG4gICAgcmV0dXJuIHByb3BzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNhbGNQcm9wcyhwcm9wcykge1xyXG4gICAgcHJvcHMuc2NhbGUuZGVsdGEgPSAocHJvcHMuc2NhbGUubWF4LXByb3BzLnNjYWxlLm1pbikvcHJvcHMuc2NhbGUubGV2ZWxzO1xyXG4gICAgcHJvcHMubGlnaHRpbmcuZGVsdGEgPSAocHJvcHMubGlnaHRpbmcubWF4LXByb3BzLmxpZ2h0aW5nLm1pbikvcHJvcHMubGlnaHRpbmcubGV2ZWxzO1xyXG4gICAgcmV0dXJuIHByb3BzO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9Cb29rQ29udHJvbGxlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQm9va0NvbnRyb2xsZXIuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9va1ByaW50ZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBib29rLCBzdHlsZVNoZWV0KSB7XHJcbiAgICB0aGlzLmJvb2sgPSBib29rO1xyXG4gICAgdGhpcy5zdHlsZVNoZWV0ID0gc3R5bGVTaGVldDtcclxuICAgIHRoaXMud25kID0gY29udGV4dC53bmQ7XHJcbiAgICB0aGlzLmRvYyA9IGNvbnRleHQuZG9jO1xyXG4gICAgdGhpcy5wYWdlQ2FsbGJhY2sgPSBib29rLmdldFBhZ2VDYWxsYmFjaygpO1xyXG4gICAgY29uc3QgdGVzdCA9IHRoaXMucGFnZUNhbGxiYWNrKDApO1xyXG4gICAgdGhpcy50eXBlID0gdGVzdC50eXBlO1xyXG4gICAgaWYodGhpcy50eXBlPT09J3BkZicpIHtcclxuICAgICAgdGhpcy5wZGZTcmMgPSB0ZXN0LnNyYy5zcmM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWwoKSB7XHJcbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBpZih0aGlzLmZyYW1lKSB7XHJcbiAgICAgIHRoaXMuZnJhbWUucmVtb3ZlKCk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmZyYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpbnQoKSB7XHJcbiAgICBkZWxldGUgdGhpcy5jYW5jZWxlZDtcclxuICAgIGlmKHRoaXMudHlwZT09PSdwZGYnKSB7XHJcbiAgICAgIGxldCBwcmludFduZCwgY2FsbE1hbnVhbGx5ID0gZmFsc2U7XHJcbiAgICAgIGlmKHRoaXMudXNlSUZyYW1lKCkpIHtcclxuICAgICAgICBjYWxsTWFudWFsbHkgPSAhIXRoaXMuZnJhbWU7XHJcbiAgICAgICAgaWYoIXRoaXMuZnJhbWUpIHtcclxuICAgICAgICAgIHRoaXMuZnJhbWUgPSAkKCc8aWZyYW1lIHNyYz1cIicrdGhpcy5wZGZTcmMrJ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2lmcmFtZT4nKS5hcHBlbmRUbyh0aGlzLmRvYy5ib2R5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJpbnRXbmQgPSB0aGlzLmZyYW1lWzBdLmNvbnRlbnRXaW5kb3c7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcHJpbnRXbmQgPSB0aGlzLnduZC5vcGVuKHRoaXMucGRmU3JjKTtcclxuICAgICAgfVxyXG4gICAgICBpZihjYWxsTWFudWFsbHkpIHtcclxuICAgICAgICBwcmludFduZC5wcmludCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgICQocHJpbnRXbmQpLm9uKCdsb2FkJywgKCk9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwcmludFduZC5wcmludCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2goZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJDb250ZW50KCkuXHJcbiAgICAgICAgdGhlbigoY29udGVudCk9PiB7XHJcbiAgICAgICAgICBjb25zdCBwcmludFduZCA9IHRoaXMud25kLm9wZW4oKSxcclxuICAgICAgICAgIHByaW50RG9jID0gcHJpbnRXbmQuZG9jdW1lbnQsXHJcbiAgICAgICAgICBodG1sID0gYFxyXG4gICAgICAgICAgICA8IURPQ1RZUEUgaHRtbD5cclxuICAgICAgICAgICAgPGh0bWw+XHJcbiAgICAgICAgICAgICAgPGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cclxuICAgICAgICAgICAgICAgIDx0aXRsZT4zRCBGbGlwQm9vayAtIFByaW50aW5nPC90aXRsZT5cclxuICAgICAgICAgICAgICAgICR7Y29udGVudC5oZWFkfVxyXG4gICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+XHJcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHByaW50RG9jdW1lbnQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnByaW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHByaW50RG9jdW1lbnQsIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvc2NyaXB0PlxyXG4gICAgICAgICAgICAgIDwvaGVhZD5cclxuICAgICAgICAgICAgICA8Ym9keSBvbmxvYWQ9XCJpbml0KClcIj5cclxuICAgICAgICAgICAgICAgICR7Y29udGVudC5ib2R5fVxyXG4gICAgICAgICAgICAgIDwvYm9keT5cclxuICAgICAgICAgICAgPC9odG1sPlxyXG4gICAgICAgICAgYDtcclxuICAgICAgICAgIHByaW50RG9jLm9wZW4oKTtcclxuICAgICAgICAgIHByaW50RG9jLndyaXRlKGh0bWwpO1xyXG4gICAgICAgICAgcHJpbnREb2MuY2xvc2UoKTtcclxuICAgICAgICB9KS5cclxuICAgICAgICBjYXRjaCgoZSk9PiBjb25zb2xlLndhcm4oJzNEIEZsaXBCb29rIC0gUHJpbnRpbmcgd2FzIGNhbmNlbGVkJykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvZ3Jlc3Modikge1xyXG4gICAgaWYodGhpcy5jYW5jZWxlZCkge1xyXG4gICAgICB0aHJvdyAnQ2FuY2VsIFByaW50aW5nJztcclxuICAgIH1cclxuICAgIGlmKHRoaXMub25Qcm9ncmVzcykge1xyXG4gICAgICB0aGlzLm9uUHJvZ3Jlc3MoTWF0aC5mbG9vcih2KjEwMCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5ib29rLmdldFBhZ2VzKCksIGhlYWQgPSBuZXcgU2V0KCksIGJvZHkgPSBbXTtcclxuICAgIGxldCBkb25lID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICBmb3IobGV0IHBhZ2U9MDsgcGFnZTxwYWdlczsgKytwYWdlKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnBhZ2VDYWxsYmFjayhwYWdlKTtcclxuICAgICAgaWYoaW5mby50eXBlPT09J2ltYWdlJykge1xyXG4gICAgICAgIGRvbmUgPSBkb25lLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnByb2dyZXNzKHBhZ2UvcGFnZXMpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySW1hZ2UoaGVhZCwgYm9keSwgaW5mby5zcmMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYoaW5mby50eXBlPT09J2h0bWwnKSB7XHJcbiAgICAgICAgZG9uZSA9IGRvbmUudGhlbigoKT0+IHtcclxuICAgICAgICAgIHRoaXMucHJvZ3Jlc3MocGFnZS9wYWdlcyk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIdG1sKGhlYWQsIGJvZHksIGluZm8uc3JjKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRvbmUudGhlbigoKT0+IHtcclxuICAgICAgdGhpcy5wcm9ncmVzcygxKTtcclxuICAgICAgcmV0dXJuIHtoZWFkOiB0aGlzLnJlbmRlckhlYWQoaGVhZCksIGJvZHk6IGJvZHkuam9pbignXFxuJyl9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB3cmFwKGNvbnRlbnQpIHtcclxuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImZiM2QtcHJpbnRlci1wYWdlXCI+JHtjb250ZW50fTwvZGl2PmA7XHJcbiAgfVxyXG5cclxuICByZW5kZXJJbWFnZShoZWFkLCBib2R5LCBzcmMpIHtcclxuICAgIGJvZHkucHVzaChCb29rUHJpbnRlci53cmFwKGA8aW1nIHNyYz1cIiR7c3JjfVwiIC8+YCkpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVySHRtbChoZWFkLCBib2R5LCBzcmMpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+IHtcclxuICAgICAgJC5nZXQoc3JjLCAoaHRtbCk9PiB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBodG1sLm1hdGNoKC88bGluay4qPz4vaWcpIHx8IFtdO1xyXG4gICAgICAgIGZvcihsZXQgbGluayBvZiBsaW5rcykge1xyXG4gICAgICAgICAgaWYobGluay5tYXRjaCgvc3R5bGVzaGVldC9pKSkge1xyXG4gICAgICAgICAgICBjb25zdCBocmVmID0gbGluay5tYXRjaCgvaHJlZlxccyo9XFxzKlsnXCJdKC4qKVsnXCJdL2kpO1xyXG4gICAgICAgICAgICBpZihocmVmKSB7XHJcbiAgICAgICAgICAgICAgaGVhZC5hZGQoaHJlZlsxXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IGh0bWwubWF0Y2goLzxib2R5Lio/PihbXFxTXFxzXSopPFxcL2JvZHk+L2kpO1xyXG4gICAgICAgIGlmKGNvbnRlbnQpIHtcclxuICAgICAgICAgIGJvZHkucHVzaChCb29rUHJpbnRlci53cmFwKGNvbnRlbnRbMV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KS5mYWlsKChlKT0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICByZWplY3QoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmVuZGVySGVhZChoZWFkKSB7XHJcbiAgICBjb25zdCBjb250ZW50ID0gW107XHJcbiAgICBoZWFkLmZvckVhY2goKGspPT4gY29udGVudC5wdXNoKGA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIiR7a31cIj5gKSk7XHJcbiAgICBjb250ZW50LnB1c2godGhpcy5zdHlsZVNoZWV0PyBgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIke3RoaXMuc3R5bGVTaGVldH1cIj5gOiBCb29rUHJpbnRlci5kZWZhdWx0U3R5bGVTaGVldCgpKTtcclxuICAgIHJldHVybiBjb250ZW50LmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgdXNlSUZyYW1lKCkge1xyXG4gICAgY29uc3QgaXNDaHJvbWl1bSA9IHRoaXMud25kLmNocm9tZSxcclxuICAgICAgd2luTmF2ID0gdGhpcy53bmQubmF2aWdhdG9yLFxyXG4gICAgICB2ZW5kb3JOYW1lID0gd2luTmF2LnZlbmRvcixcclxuICAgICAgaXNJRWVkZ2UgPSB3aW5OYXYudXNlckFnZW50LmluZGV4T2YoXCJFZGdlXCIpPi0xLFxyXG4gICAgICBpc0lPU0Nocm9tZSA9IHdpbk5hdi51c2VyQWdlbnQubWF0Y2goXCJDcmlPU1wiKTtcclxuICAgIGxldCB1c2U7XHJcbiAgICBpZihpc0lPU0Nocm9tZSl7XHJcbiAgICAgIHVzZSA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYoaXNDaHJvbWl1bSAmJiB2ZW5kb3JOYW1lPT09J0dvb2dsZSBJbmMuJyAmJiAhaXNJRWVkZ2UpIHtcclxuICAgICAgdXNlID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVzZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWZhdWx0U3R5bGVTaGVldCgpIHtcclxuICAgIHJldHVybiBgXHJcbiAgICAgIDxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj5cclxuICAgICAgICBib2R5IHtcclxuICAgICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC5mYjNkLXByaW50ZXItcGFnZSB7XHJcbiAgICAgICAgICBwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7XHJcbiAgICAgICAgfVxyXG4gICAgICA8L3N0eWxlPlxyXG4gICAgYDtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQm9va1ByaW50ZXIuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9qcy9jbGFzc2VzL0Jvb2tQcmludGVyLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IFZpZXcgZnJvbSAnVmlldyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb29rVmlldyBleHRlbmRzIFZpZXcge1xyXG5cclxuICBzdGF0aWMgUEFHRV9IQU5ETEVSX0RFTEFZID0gMTAwMDtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCBvbkxvYWQsIHRlbXBsYXRlLCBoYW5kbGVyKSB7XHJcbiAgICBzdXBlcihjb250YWluZXIsIG9uTG9hZCwgdGVtcGxhdGUsIGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFZpZXcoKSB7XHJcbiAgICB0aGlzLnZpZXcgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcudmlldycpO1xyXG4gICAgdGhpcy5ib29rbWFya3NWaWV3ID0gdGhpcy5jb250YWluZXIuZmluZCgnLndpZEJvb2ttYXJrcycpO1xyXG4gICAgdGhpcy50aHVtYm5haWxzVmlldyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy53aWRUaHVtYm5haWxzJyk7XHJcbiAgICB0aGlzLnNlYXJjaFZpZXcgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcud2lkU2VhcmNoJyk7XHJcbiAgfVxyXG5cclxuICBnZXRIYW5kbGVycyhpZCkge1xyXG4gICAgbGV0IGhhbmRsZXJzO1xyXG4gICAgaWYoaWQ9PT0naW5wUGFnZScpIHtcclxuICAgICAgaGFuZGxlcnMgPSBbe1xyXG4gICAgICAgIGlucFBhZ2U6IChlLCBkYXRhKT0+IHRoaXMuY2FsbExhdGVyKHN1cGVyLmdldEhhbmRsZXJzKGlkKSwgaWQsIGUsIGRhdGEsIEJvb2tWaWV3LlBBR0VfSEFORExFUl9ERUxBWSlcclxuICAgICAgfV07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaGFuZGxlcnMgPSBzdXBlci5nZXRIYW5kbGVycyhpZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGFuZGxlcnM7XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1TdGF0ZUNoYW5nZWQoaWQsIHN0YXRlKSB7XHJcbiAgICBpZihpZD09PSdjbWRGdWxsU2NyZWVuJykge1xyXG4gICAgICBpZihzdGF0ZS5hY3RpdmUpIHtcclxuICAgICAgICB0aGlzLnBhcmVudENvbnRhaW5lci5hZGRDbGFzcygnZnVsbHNjcmVlbicpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGFyZW50Q29udGFpbmVyLnJlbW92ZUNsYXNzKCdmdWxsc2NyZWVuJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFZpZXcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3O1xyXG4gIH1cclxuXHJcbiAgZ2V0Qm9va21hcmtzVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLmJvb2ttYXJrc1ZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXRUaHVtYm5haWxzVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLnRodW1ibmFpbHNWaWV3O1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VhcmNoVmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLnNlYXJjaFZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtcygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGlua3MoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAnY21kWm9vbUluJyxcclxuICAgICAgJ2NtZFpvb21PdXQnLFxyXG4gICAgICAnY21kRGVmYXVsdFpvb20nLFxyXG4gICAgICAnY21kVG9jJyxcclxuICAgICAgJ2NtZEZhc3RCYWNrd2FyZCcsXHJcbiAgICAgICdjbWRCYWNrd2FyZCcsXHJcbiAgICAgICdjbWRGb3J3YXJkJyxcclxuICAgICAgJ2NtZEZhc3RGb3J3YXJkJyxcclxuICAgICAgJ2NtZFNhdmUnLFxyXG4gICAgICAnY21kUHJpbnQnLFxyXG4gICAgICAnY21kRnVsbFNjcmVlbicsXHJcbiAgICAgICdjbWRTbWFydFBhbicsXHJcbiAgICAgICdjbWRTaW5nbGVQYWdlJyxcclxuICAgICAgJ2NtZFNvdW5kcycsXHJcbiAgICAgICdjbWRTdGF0cycsXHJcbiAgICAgICdjbWRMaWdodGluZ1VwJyxcclxuICAgICAgJ2NtZExpZ2h0aW5nRG93bicsXHJcbiAgICAgICdjbWRDbG9zZVRvYycsXHJcbiAgICAgICdjbWRCb29rbWFya3MnLFxyXG4gICAgICAnY21kU2VhcmNoJyxcclxuICAgICAgJ2NtZFRodW1ibmFpbHMnXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lkZ2V0cygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICd3aWRMb2FkaW5nUHJvZ3Jlc3MnLFxyXG4gICAgICAnd2lkRmxvYXRXbmQnLFxyXG4gICAgICAnd2lkVG9jTWVudScsXHJcbiAgICAgICd3aWRCb29rbWFya3MnLFxyXG4gICAgICAnd2lkVGh1bWJuYWlscycsXHJcbiAgICAgICd3aWRTZWFyY2gnLFxyXG4gICAgICAnd2lkU2V0dGluZ3MnLFxyXG4gICAgICAnd2lkTG9hZGluZydcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXRJbnB1dHMoKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAnaW5wUGFnZScsXHJcbiAgICAgICdpbnBQYWdlcydcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXRUZXh0cygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICd0eHRMb2FkaW5nUHJvZ3Jlc3MnXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVtcGxhdGUoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBodG1sOiAndGVtcGxhdGVzL2RlZmF1bHQtYm9vay12aWV3Lmh0bWwnLFxyXG4gICAgICBzdHlsZXM6IFtcclxuICAgICAgICAnY3NzL2JsYWNrLWJvb2stdmlldy5jc3MnXHJcbiAgICAgIF0sXHJcbiAgICAgIGxpbmtzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcmVsOiAnc3R5bGVzaGVldCcsXHJcbiAgICAgICAgICBocmVmOiAnY3NzL2ZvbnQtYXdlc29tZS5taW4uY3NzJ1xyXG4gICAgICAgIH1cclxuICAgICAgXSxcclxuICAgICAgc2NyaXB0OiAnanMvZGVmYXVsdC1ib29rLXZpZXcuanMnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9Cb29rVmlldy5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQm9va1ZpZXcuanMiLCJpbXBvcnQgQm9va1Byb3BzQnVpbGRlciBmcm9tICcuL0Jvb2tQcm9wc0J1aWxkZXInO1xyXG5pbXBvcnQgSW1hZ2VGYWN0b3J5IGZyb20gJ0ltYWdlRmFjdG9yeSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGJCb29rUHJvcHNCdWlsZGVyIGV4dGVuZHMgQm9va1Byb3BzQnVpbGRlciB7XHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgcGFnZUNhbGxiYWNrLCBwYWdlcywgb25SZWFkeSkge1xyXG4gICAgc3VwZXIob25SZWFkeSk7XHJcbiAgICB0aGlzLmNhbGNTaGVldHMocGFnZXMpO1xyXG4gICAgdGhpcy5wYWdlQ2FsbGJhY2sgPSBwYWdlQ2FsbGJhY2s7XHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBwYWdlQ2FsbGJhY2s6IHBhZ2VDYWxsYmFjay5iaW5kKHRoaXMpXHJcbiAgICB9O1xyXG4gICAgdGhpcy5pbWFnZUZhY3RvcnkgPSBuZXcgSW1hZ2VGYWN0b3J5KGNvbnRleHQpO1xyXG5cclxuICAgIGlmKHBhZ2VzPjApIHtcclxuICAgICAgY29uc3QgdGVzdCA9IHRoaXMuaW1hZ2VGYWN0b3J5LmJ1aWxkKHBhZ2VDYWxsYmFjaygwKSwgMCwgdGhpcy5kZWZhdWx0cy5zaGVldC53aWR0aFRleGVscywgdGhpcy5kZWZhdWx0cy5zaGVldC5oZWlnaHRUZXhlbHMsIHRoaXMuZGVmYXVsdHMuc2hlZXQuY29sb3IpO1xyXG4gICAgICB0ZXN0Lm9uTG9hZCA9ICgpPT4ge1xyXG4gICAgICAgIHRoaXMuY2FsY1Byb3BzKHRlc3Qud2lkdGgsIHRlc3QuaGVpZ2h0KTtcclxuICAgICAgICB0ZXN0LmRpc3Bvc2UoKTtcclxuICAgICAgICB0aGlzLnJlYWR5KCk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5wcm9wcyA9IHRoaXMuZGVmYXVsdHM7XHJcbiAgICAgIHRoaXMucmVhZHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQ2xiQm9va1Byb3BzQnVpbGRlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQ2xiQm9va1Byb3BzQnVpbGRlci5qcyIsImltcG9ydCBTaGVldEJsb2NrIGZyb20gJy4vU2hlZXRCbG9jayc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb3ZlciBleHRlbmRzIFNoZWV0QmxvY2sge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aXN1YWwsIHAsIGFuZ2xlLCBzdGF0ZSkge1xyXG4gICAgc3VwZXIodmlzdWFsLCBwLCAwLCAxLCBhbmdsZSwgc3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJvcHMoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi50aGlzLnAuY292ZXIsXHJcbiAgICAgIHNoZWV0czogMVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGxvYWRQb2ludHMoKSB7XHJcbiAgICBjb25zdCBvcGVuZWRJbnRlcnBvbGF0aW9uSW5kZWNlcyA9IFtcclxuICAgICAgWzIsMyw0XSxcclxuICAgICAgWzIsMyw0LDUsNl1cclxuICAgIF0sXHJcbiAgICBjbG9zZWRJbnRlcnBvbGF0aW9uSW5kZWNlcyA9IFtcclxuICAgICAgWzAsMSwyXSxcclxuICAgICAgWzAsMSwyXVxyXG4gICAgXSxcclxuICAgIGludGVycG9sYXRpb25Qb2ludHMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICB4OiBbXHJcbiAgICAgICAgICAgICBbMCwwLjI4NzcsMC42MzQ3LDAuODE3NCwxLjAwMDBdLFxyXG4gICAgICAgICAgICAgWzAsMC4yODMxLDAuNjI1NiwwLjgwODIsMC45OTA5XSxcclxuICAgICAgICAgICAgIFswLDAuMjYwMywwLjU5MzYsMC43NzYzLDAuOTU4OV0sXHJcbiAgICAgICAgICAgICBbMCwwLjEzNzAsMC4zODgxLDAuNTM0MiwwLjY3NThdLFxyXG4gICAgICAgICAgICAgWzAsMCwwLDAsMF1cclxuICAgICAgICBdLFxyXG4gICAgICAgIHk6IFtcclxuICAgICAgICAgICAgIFswLDAsMCwwLDBdLFxyXG4gICAgICAgICAgICAgWzAsMC4wMiwwLjAwNSwtMC4wMDEsLTAuMDAyNV0sXHJcbiAgICAgICAgICAgICBbMCwwLjA0LDAuMDEsLTAuMDAyLC0wLjAwNV0sXHJcbiAgICAgICAgICAgICBbMCwgMC4yNDY2LCAwLjQ3OTUsIDAuNTcwOCwgMC42NzU4XSxcclxuICAgICAgICAgICAgIFswLCAwLjI4NzcsIDAuNjM0NywgMC44MTc0LCAxLjAwMDBdXHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgeDogW1xyXG4gICAgICAgICAgICAgWzAsMC4yODc3LDAuNjM0NywwLjgxNzQsMS4wMDAwXSxcclxuICAgICAgICAgICAgIFswLDAuMjgzMSwwLjYyNTYsMC44MDgyLDAuOTkwOV0sXHJcbiAgICAgICAgICAgICBbMCwwLjI2MDMsMC41OTM2LDAuNzc2MywwLjk1ODldLFxyXG4gICAgICAgICAgICAgWzAuMDAwLDAuMjMzLDAuNTYzLDAuNzQ2LDAuOTI3XSxcclxuICAgICAgICAgICAgIFswLjAwMCwwLjE0NCwwLjQzMywwLjYxMywwLjc5Nl0sXHJcbiAgICAgICAgICAgICBbMC4wMDAsMC4wNzAsMC4yODgsMC40NTUsMC42MjZdLFxyXG4gICAgICAgICAgICAgWzAsMCwwLDAsMF1cclxuICAgICAgICBdLFxyXG4gICAgICAgIHk6IFtcclxuICAgICAgICAgICAgIFswLDAsMCwwLDBdLFxyXG4gICAgICAgICAgICAgWzAsMC4wMiwwLjAwNSwtMC4wMDEsLTAuMDAyNV0sXHJcbiAgICAgICAgICAgICBbMCwwLjA0LDAuMDEsLTAuMDAyLC0wLjAwNV0sXHJcbiAgICAgICAgICAgICBbMC4wMDAsMC4xNjgsMC4yNjksMC4yNzAsMC4yNTVdLFxyXG4gICAgICAgICAgICAgWzAuMDAwLDAuMjQ1LDAuNDM1LDAuNDU4LDAuNDYwXSxcclxuICAgICAgICAgICAgIFswLjAwMCwwLjI3OCwwLjU0NCwwLjYxNCwwLjY3M10sXHJcbiAgICAgICAgICAgICBbMCwgMC4yODc3LCAwLjYzNDcsIDAuODE3NCwgMS4wMDAwXVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGludGVycG9sYXRpb25Qb2ludHMsXHJcbiAgICAgIG9wZW5lZEludGVycG9sYXRpb25JbmRlY2VzLFxyXG4gICAgICBjbG9zZWRJbnRlcnBvbGF0aW9uSW5kZWNlc1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9Db3Zlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQ292ZXIuanMiLCJpbXBvcnQgU2hlZXRDc3NMYXllciBmcm9tICcuL1NoZWV0Q3NzTGF5ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3NzTGF5ZXJzTWFuYWdlciB7XHJcbiAgY29uc3RydWN0b3IoYm9vaykge1xyXG4gICAgdGhpcy5ib29rID0gYm9vaztcclxuICAgIHRoaXMucHJvcHMgPSBib29rLnAuY3NzTGF5ZXJQcm9wcztcclxuICAgIHRoaXMudmlzdWFsID0gYm9vay52aXN1YWw7XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyID0gYm9vay5wYWdlTWFuYWdlcjtcclxuICAgIHRoaXMud3JhcHBlcnMgPSB7fTtcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZXMoKSB7XHJcbiAgICBjb25zdCBwYWdlID0gdGhpcy5ib29rLmdldFBhZ2UoKSwgcGFnZXMgPSB0aGlzLmJvb2suZ2V0UGFnZXMoKTtcclxuICAgIHJldHVybiBwYWdlPT09MCB8fCBwYWdlPT09cGFnZXMtMT8gW3BhZ2VdOiBbcGFnZSwgcGFnZSsxXTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBmb3IobGV0IHcgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLndyYXBwZXJzKSkge1xyXG4gICAgICB3LmxheWVycy5mb3JFYWNoKChsKT0+IGwuZGlzcG9zZSgpKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLndyYXBwZXJzO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XHJcbiAgICBmb3IobGV0IG4gb2YgdGhpcy5nZXRBY3RpdmVzKCkpIHtcclxuICAgICAgY29uc3QgdyA9IHRoaXMud3JhcHBlcnNbbl07XHJcbiAgICAgIGlmKHcpIHtcclxuICAgICAgICBpZih3LnN0YXRlPT09J3JlYWR5JyAmJiB3LmxheWVycy5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5ib29rLmdldEJsb2NrQnlQYWdlKG4pO1xyXG4gICAgICAgICAgdy5sYXllcnMuZm9yRWFjaCgobCk9PiB7XHJcbiAgICAgICAgICAgIGlmKGwuaXNIaWRkZW4oKSkge1xyXG4gICAgICAgICAgICAgIGwudXBkYXRlKGJsb2NrKTtcclxuICAgICAgICAgICAgICBsLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndyYXBwZXJzW25dID0ge1xyXG4gICAgICAgICAgc3RhdGU6ICdsb2FkaW5nJyxcclxuICAgICAgICAgIGxheWVyczogW11cclxuICAgICAgICB9O1xyXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VNYW5hZ2VyLmdldExheWVycyhuLCAobGF5ZXJzKT0+IHtcclxuICAgICAgICAgICAgaWYobGF5ZXJzLmxlbmd0aCAmJiB0aGlzLndyYXBwZXJzKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmJvb2suZ2V0QmxvY2tCeVBhZ2Uobik7XHJcbiAgICAgICAgICAgICAgZm9yKGxldCBsIG9mIGxheWVycykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2wgPSBuZXcgU2hlZXRDc3NMYXllcih0aGlzLnZpc3VhbCwgYmxvY2ssIHRoaXMucHJvcHMpO1xyXG4gICAgICAgICAgICAgICAgdy5sYXllcnMucHVzaChzbCk7XHJcbiAgICAgICAgICAgICAgICBzbC5zZXQobC5jc3MsIGwuaHRtbCwgbC5qcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgICAgICAgICBpZighdGhpcy5oaWRkZW4gJiYgfnRoaXMuZ2V0QWN0aXZlcygpLmluZGV4T2YobikpIHtcclxuICAgICAgICAgICAgICAgICAgdy5sYXllcnMuZm9yRWFjaCgobCk9PiBsLnNob3coKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHcuc3RhdGUgPSAncmVhZHknO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcclxuICAgIGNvbnN0IHdhaXQgPSBbXTtcclxuICAgIGZvcihsZXQgdyBvZiBPYmplY3QudmFsdWVzKHRoaXMud3JhcHBlcnMpKSB7XHJcbiAgICAgIHcubGF5ZXJzLmZvckVhY2goKGwpPT4gd2FpdC5wdXNoKGwuaGlkZSgpKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdCk7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQ3NzTGF5ZXJzTWFuYWdlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2pzL2NsYXNzZXMvQ3NzTGF5ZXJzTWFuYWdlci5qcyIsImltcG9ydCB7JCwgVEhSRUV9IGZyb20gJy4uL2xpYnMnXHJcbmltcG9ydCBDYWNoZSBmcm9tICdDYWNoZSc7XHJcbmltcG9ydCBMb2FkaW5nQW5pbWF0aW9uIGZyb20gJ0xvYWRpbmdBbmltYXRpb24nO1xyXG5pbXBvcnQgSW1hZ2VGYWN0b3J5IGZyb20gJ0ltYWdlRmFjdG9yeSc7XHJcbmltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJ0Jhc2VNYXRoVXRpbHMnO1xyXG5pbXBvcnQgVGV4dHVyZUFuaW1hdG9yIGZyb20gJ1RleHR1cmVBbmltYXRvcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlTWFuYWdlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgYm9vaywgcCkge1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWw7XHJcbiAgICB0aGlzLmJvb2sgPSBib29rO1xyXG4gICAgdGhpcy5wYWdlUXVlcnkgPSAnJztcclxuICAgIHRoaXMucCA9IHA7XHJcbiAgICB0aGlzLnBhZ2VDYWNoZSA9IG5ldyBDYWNoZShwLmNhY2hlZFBhZ2VzKTtcclxuICAgIHRoaXMucmVzb3VyY2VzQ2FjaGUgPSBuZXcgQ2FjaGUoKTtcclxuICAgIHRoaXMuY2FudmFzID0gJCgnPGNhbnZhcz4nKVswXTtcclxuICAgIHRoaXMuaW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeSh7Li4udmlzdWFsLCBkaXNwYXRjaEV2ZW50OiBib29rLmRpc3BhdGNoRXZlbnQuYmluZChib29rKSwgcmVuZGVyQ2FudmFzOiB0aGlzLmNhbnZhcywgcmVuZGVyQ2FudmFzQ3R4OiB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpfSwgdGhpcy5yZXNvdXJjZXNDYWNoZSk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5ncyA9IFtdO1xyXG4gICAgdGhpcy5yZW5kZXJRdWV1ZSA9IFtdO1xyXG4gICAgdGhpcy5wYWdlUmVxdWVzdHMgPSBbXTtcclxuICAgIHRoaXMucHJlZGljdGVkUmVxdWVzdHMgPSBbXTtcclxuXHJcbiAgICB0aGlzLnRtcE1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCk7XHJcbiAgICB2aXN1YWwuYWRkT2JqZWN0KG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KDAsIDApLCB0aGlzLnRtcE1hdGVyaWFsKSk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nQW5pbWF0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZGluZyA9IHt9O1xyXG4gICAgdGhpcy5sb2FkaW5nW3AuY292ZXIuY29sb3JdID0gdGhpcy5jcmVhdGVMb2FkaW5nVGV4dHVyZShwLmNvdmVyKTtcclxuICAgIGlmKHAucGFnZS5jb2xvciE9PXAuY292ZXIuY29sb3IpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nW3AucGFnZS5jb2xvcl0gPSB0aGlzLmNyZWF0ZUxvYWRpbmdUZXh0dXJlKHAucGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50dXJuT25FdmVudHMoKTtcclxuXHJcbiAgICB2aXN1YWwuYWRkUmVuZGVyQ2FsbGJhY2sodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgc2V0VGltZW91dCh0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMb2FkaW5nVGV4dHVyZShwKSB7XHJcbiAgICBjb25zdCBzcHJpdGVUaWxlcyA9IDYsXHJcbiAgICAgIHNjYWxlID0gTWF0aC5zcXJ0KDQuNSoyMTAqNC41KjI5Ny8ocC53aWR0aFRleGVscypwLmhlaWdodFRleGVscykpLFxyXG4gICAgICBhbmltYXRpb24gPSBuZXcgTG9hZGluZ0FuaW1hdGlvbihzY2FsZSpwLndpZHRoVGV4ZWxzLCBzY2FsZSpwLmhlaWdodFRleGVscywgcC5jb2xvciksXHJcbiAgICAgIGFuaW1hdG9yID0gbmV3IFRleHR1cmVBbmltYXRvcihhbmltYXRpb24uY3JlYXRlU3ByaXRlKHNwcml0ZVRpbGVzKSwgc3ByaXRlVGlsZXMsIDEsIHNwcml0ZVRpbGVzLCAwLjIpO1xyXG4gICAgYW5pbWF0aW9uLmRpc3Bvc2UoKTtcclxuICAgIHJldHVybiBhbmltYXRvcjtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnR1cm5PZmZFdmVudHMoKTtcclxuICAgIGZvcihsZXQgY29sb3Igb2YgT2JqZWN0LmtleXModGhpcy5sb2FkaW5nKSkge1xyXG4gICAgICB0aGlzLmxvYWRpbmdbY29sb3JdLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmc7XHJcbiAgICB0aGlzLnJlc291cmNlc0NhY2hlLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGFnZUNhY2hlLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY2FudmFzLndpZHRoID0gMDtcclxuICAgIGRlbGV0ZSB0aGlzLmNhbnZhcztcclxuICB9XHJcblxyXG4gIGlzQ292ZXIobikge1xyXG4gICAgcmV0dXJuIG48MiB8fCBuPj0yKih0aGlzLnAuc2hlZXRzKzEpO1xyXG4gIH1cclxuXHJcbiAgaXNNb2JpbGUoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMudmlzdWFsLnduZC5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpPjE7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlU3RhdGUobikge1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5wYWdlQ2FjaGUuZ2V0KG4pO1xyXG4gICAgcmV0dXJuIG9iamVjdD8gb2JqZWN0LnN0YXRlOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVMb2FkaW5nQW5pbWF0aW9uKGVuYWJsZSkge1xyXG4gICAgdGhpcy5sb2FkaW5nQW5pbWF0aW9uID0gZW5hYmxlO1xyXG4gICAgZm9yKGxldCBvIG9mIHRoaXMubG9hZGluZ3MpIHtcclxuICAgICAgdGhpcy5zZXR1cE1hdGVyaWFsKG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGR0KSB7XHJcbiAgICBpZih0aGlzLmxvYWRpbmdBbmltYXRpb24pIHtcclxuICAgICAgY29uc3QgbG9hZGluZyA9IHt9O1xyXG4gICAgICBmb3IobGV0IG8gb2YgdGhpcy5sb2FkaW5ncykge1xyXG4gICAgICAgIGlmKG8uaXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgbG9hZGluZ1tvLmNvbG9yXSA9IHRydWU7O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmb3IobGV0IGNvbG9yIG9mIE9iamVjdC5rZXlzKGxvYWRpbmcpKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nW2NvbG9yXS51cGRhdGUoZHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVGcm9tTG9hZGluZ3Mobykge1xyXG4gICAgY29uc3QgaSA9IHRoaXMubG9hZGluZ3MuaW5kZXhPZihvKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZ3Muc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRnJvbVJlbmRlclF1ZXVlKG8pIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnJlbmRlclF1ZXVlLmluZGV4T2Yobyk7XHJcbiAgICBpZih+aSkge1xyXG4gICAgICB0aGlzLnJlbmRlclF1ZXVlLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hQYWdlUXVlcnkobiwgcXVlcnk9JycpIHtcclxuICAgIHRoaXMucGFnZVF1ZXJ5ID0gcXVlcnk7XHJcbiAgICBjb25zdCBvYmplY3QgPSB0aGlzLnBhZ2VDYWNoZS5nZXQobik7XHJcbiAgICBpZihvYmplY3QgJiYgb2JqZWN0LndyYXBwZXIgJiYgb2JqZWN0LndyYXBwZXIuc2V0UXVlcnkpIHtcclxuICAgICAgaWYoIXRoaXMucGFnZUNhY2hlLnJlbW92ZShuKSkge1xyXG4gICAgICAgIG9iamVjdC53cmFwcGVyLnNldFF1ZXJ5KHF1ZXJ5KTtcclxuICAgICAgICB0aGlzLnB1c2hJblJlbmRlclF1ZXVlKG9iamVjdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hab29tKCkge1xyXG4gICAgaWYodGhpcy5wLmF1dG9SZXNvbHV0aW9uLmVuYWJsZSkge1xyXG4gICAgICBjb25zdCBlcyA9IFtdO1xyXG4gICAgICB0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKChlKT0+IHtcclxuICAgICAgICBlcy5wdXNoKGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgZXMuZm9yRWFjaCgoZSk9PiB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gZVsxXTtcclxuICAgICAgICBpZihvYmplY3QgJiYgb2JqZWN0LndyYXBwZXIpIHtcclxuICAgICAgICAgIGlmKCF0aGlzLnBhZ2VDYWNoZS5yZW1vdmUoZVswXSkpIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoSW5SZW5kZXJRdWV1ZShvYmplY3QpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRMYXllcnMobiwgY2xiKSB7XHJcbiAgICBpZih0aGlzLnAuY3NzTGF5ZXJzTG9hZGVyKSB7XHJcbiAgICAgIHRoaXMucC5jc3NMYXllcnNMb2FkZXIobiwgKC4uLmFyZ3MpPT4ge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMucGFnZUNhY2hlLmdldChuKTtcclxuICAgICAgICBpZihvYmplY3QpIHtcclxuICAgICAgICAgIGlmKG9iamVjdC5zdGF0ZSE9PSdhY3RpdmUnKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5wZW5kaW5ncy5wdXNoKHtjbGIsIGFyZ3N9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjbGIoLi4uYXJncyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjbGIoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZVBlbmRpbmdzKHBlbmRpbmdzKSB7XHJcbiAgICBmb3IobGV0IHAgb2YgcGVuZGluZ3MpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBwLmNsYiguLi5wLmFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwZW5kaW5ncy5zcGxpY2UoMCwgcGVuZGluZ3MubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIHJ0bFBhZ2VOKG4pIHtcclxuICAgIHJldHVybiB0aGlzLnAucnRsPyAyKih0aGlzLnAuc2hlZXRzKzIpLTEtbjogbjtcclxuICB9XHJcblxyXG4gIGxvYWQobWF0ZXJpYWwsIG4pIHtcclxuICAgIGNvbnN0IHBpID0gdGhpcy5wLnBhZ2VDYWxsYmFjayh0aGlzLnJ0bFBhZ2VOKG4pKSwgcCA9IHRoaXMuaXNDb3ZlcihuKT8gdGhpcy5wLmNvdmVyOiB0aGlzLnAucGFnZTtcclxuICAgIGNvbnN0IG8gPSB7XHJcbiAgICAgIG4sXHJcbiAgICAgIHRleHR1cmU6IG5ldyBUSFJFRS5UZXh0dXJlKCksXHJcbiAgICAgIHdyYXBwZXI6IG51bGwsXHJcbiAgICAgIHN0YXRlOiAnbG9hZGluZycsXHJcbiAgICAgIGxvY2tlZDogKG4pPT4gby5zdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IG8uc3RhdGUgPT09ICdyZW5kZXJpbmcnIHx8IHRoaXMuYm9vay5pc0FjdGl2ZVBhZ2UobiksXHJcbiAgICAgIGNvbG9yOiBwLmNvbG9yLFxyXG4gICAgICBpc0FjdGl2ZTogKCk9PiB0aGlzLmJvb2suaXNBY3RpdmVQYWdlKG4pLFxyXG4gICAgICBpc1RvcDogKCk9PiB+dGhpcy5ib29rLmdldFRvcFBhZ2VzKCkuaW5kZXhPZihuKSxcclxuICAgICAgZGlzcG9zZTogKCk9PiB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tTG9hZGluZ3Mobyk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tUmVuZGVyUXVldWUobyk7XHJcbiAgICAgICAgaWYoby53cmFwcGVyICYmIG8ud3JhcHBlci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICBvLndyYXBwZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvLnRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBvLnRleHR1cmU7XHJcbiAgICAgICAgZGVsZXRlIG8ud3JhcHBlcjtcclxuICAgICAgfSxcclxuICAgICAgcGVuZGluZ3M6IFtdXHJcbiAgICB9O1xyXG4gICAgby50ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgIHRoaXMubG9hZGluZ3MucHVzaChvKTtcclxuICAgIHRoaXMuc2V0TWF0ZXJpYWwobywgbWF0ZXJpYWwpO1xyXG5cclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgIGlmKG8udGV4dHVyZSkge1xyXG4gICAgICAgIG8ud2lkdGhUZXhlbHMgPSBwaS53aWR0aFRleGVscyB8fCBwLndpZHRoVGV4ZWxzO1xyXG4gICAgICAgIG8uaGVpZ2h0VGV4ZWxzID0gcGkuaGVpZ2h0VGV4ZWxzIHx8IHAuaGVpZ2h0VGV4ZWxzO1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuY2FsY1Jlc29sdXRpb24obyk7XHJcbiAgICAgICAgby53cmFwcGVyID0gdGhpcy5pbWFnZUZhY3RvcnkuYnVpbGQocGksIHBpLm51bWJlcj09PXVuZGVmaW5lZD8gbjogcGkubnVtYmVyLCByZXMud2lkdGgsIHJlcy5oZWlnaHQsIHAuY29sb3IsIHRoaXMucC5pbmplY3Rvcik7XHJcbiAgICAgICAgaWYoby53cmFwcGVyLnNldFF1ZXJ5KSB7XHJcbiAgICAgICAgICBvLndyYXBwZXIuc2V0UXVlcnkodGhpcy5wYWdlUXVlcnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvLnNpbXVsYXRlID0gcGkuaW50ZXJhY3RpdmU/IChvLndyYXBwZXIuc2ltdWxhdGUgfHwgKCgpPT4gdW5kZWZpbmVkKSkuYmluZChvLndyYXBwZXIpOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgby53cmFwcGVyLm9uTG9hZCA9ICgpPT4ge1xyXG4gICAgICAgICAgdGhpcy5wdXNoSW5SZW5kZXJRdWV1ZShvKTtcclxuICAgICAgICAgIHRoaXMuYm9vay5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgICAgICAgdHlwZTogJ2xvYWRlZFBhZ2UnLFxyXG4gICAgICAgICAgICBwYWdlOiBuXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIG8ud3JhcHBlci5vbkNoYW5nZSA9IChpbWFnZSk9PiB7XHJcbiAgICAgICAgICBpZihvLnRleHR1cmUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tTG9hZGluZ3Mobyk7XHJcbiAgICAgICAgICAgIGlmKG8ubWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLm1hcCA9IG8udGV4dHVyZTtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLmNvbG9yID0gbmV3IFRIUkVFLkNvbG9yKDB4RkZGRkZGKTtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvLnRleHR1cmUuaW1hZ2UgPSBpbWFnZTtcclxuICAgICAgICAgICAgby50ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgby50ZXh0dXJlLm9uVXBkYXRlID0gKCk9PiB7XHJcbiAgICAgICAgICAgICAgaWYoby5zdGF0ZSAhPT0gJ3F1ZXVlZEZvclJlbmRlcicpIHtcclxuICAgICAgICAgICAgICAgIG8uc3RhdGUgPSAnYWN0aXZlJztcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVBlbmRpbmdzKG8ucGVuZGluZ3MpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5yZW5kZXJpbmc7XHJcbiAgICAgICAgICAgICAgLy90aGlzLnVwZGF0ZVJlbmRlclF1ZXVlKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMudG1wTWF0ZXJpYWwubWFwID0gby50ZXh0dXJlO1xyXG4gICAgICAgICAgICB0aGlzLnRtcE1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYm9vay5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgdHlwZTogJ2xvYWRQYWdlJyxcclxuICAgICAgcGFnZTogblxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlQ2FjaGUucHV0KG4sIG8pO1xyXG4gIH1cclxuXHJcbiAgaXNTaW5nbGVQYWdlKG8pIHtcclxuICAgIHJldHVybiB0aGlzLnAuc2luZ2xlUGFnZSB8fCAhby5uIHx8IG8ubj09PXRoaXMuYm9vay5nZXRQYWdlcygpLTE7XHJcbiAgfVxyXG5cclxuICBjYWxjUmVzb2x1dGlvbihvKSB7XHJcbiAgICBsZXQgcmVzO1xyXG4gICAgaWYodGhpcy5wLmF1dG9SZXNvbHV0aW9uLmVuYWJsZSkge1xyXG4gICAgICBjb25zdCBrID0gTWF0aC5taW4oKHRoaXMuaXNTaW5nbGVQYWdlKG8pPyAxOiAwLjUpKnRoaXMudmlzdWFsLndpZHRoKCkvby53aWR0aFRleGVscywgdGhpcy52aXN1YWwuaGVpZ2h0KCkvby5oZWlnaHRUZXhlbHMpO1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgd2lkdGg6IHRoaXMucC5hdXRvUmVzb2x1dGlvbi5rKnRoaXMucC56b29tKmsqby53aWR0aFRleGVscyxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMucC5hdXRvUmVzb2x1dGlvbi5rKnRoaXMucC56b29tKmsqby5oZWlnaHRUZXhlbHNcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgd2lkdGg6IG8ud2lkdGhUZXhlbHMsXHJcbiAgICAgICAgaGVpZ2h0OiBvLmhlaWdodFRleGVsc1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHB1c2hJblJlbmRlclF1ZXVlKG8pIHtcclxuICAgIGlmKG8uc3RhdGUgIT09ICdxdWV1ZWRGb3JSZW5kZXInKSB7XHJcbiAgICAgIG8uc3RhdGUgPSAncXVldWVkRm9yUmVuZGVyJztcclxuICAgICAgdGhpcy5yZW5kZXJRdWV1ZS5wdXNoKG8pO1xyXG4gICAgICAvLyB0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVSZW5kZXJRdWV1ZSgpIHtcclxuICAgIGlmKHRoaXMuY2FudmFzKSB7XHJcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnA7XHJcbiAgICAgIGlmKCF0aGlzLnJlbmRlcmluZyAmJiAocC5yZW5kZXJXaGlsZUZsaXBwaW5nIHx8ICF0aGlzLmJvb2suaXNQcm9jZXNzaW5nKCkpKSB7XHJcbiAgICAgICAgbGV0IGFjdGl2ZSwgdG9wO1xyXG4gICAgICAgIGZvcihsZXQgbyBvZiB0aGlzLnJlbmRlclF1ZXVlKSB7XHJcbiAgICAgICAgICBpZighYWN0aXZlICYmIG8uaXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICBhY3RpdmUgPSBvO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYoby5pc1RvcCgpKSB7XHJcbiAgICAgICAgICAgIHRvcCA9IG87XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbmRlcmluZyA9IHRvcCB8fCBhY3RpdmU7XHJcbiAgICAgICAgaWYodGhpcy5pc01vYmlsZSgpICYmIHAucmVuZGVySW5hY3RpdmVQYWdlc09uTW9iaWxlIHx8ICF0aGlzLmlzTW9iaWxlKCkgJiYgcC5yZW5kZXJJbmFjdGl2ZVBhZ2VzKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmluZyA9IHRoaXMucmVuZGVyaW5nIHx8IHRoaXMucmVuZGVyUXVldWVbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMucmVuZGVyaW5nKSB7XHJcbiAgICAgICAgICBpZih0aGlzLnJlbmRlcmluZy53cmFwcGVyLnN0YXJ0UmVuZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVJlbmRlclF1ZXVlKHRoaXMucmVuZGVyaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcuc3RhdGUgPSAncmVuZGVyaW5nJztcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcud3JhcHBlci5zZXRSZXNvbHV0aW9uKHRoaXMuY2FsY1Jlc29sdXRpb24odGhpcy5yZW5kZXJpbmcpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcud3JhcHBlci5zdGFydFJlbmRlcigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlcmluZztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgc2V0VGltZW91dCh0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0dXJuT25FdmVudHMoKSB7XHJcbiAgICB0aGlzLnRyYW5zZmVyRXZlbnRzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHR1cm5PZmZFdmVudHMoKSB7XHJcbiAgICBjb25zdCBtb3VzZXVwID0gJC5FdmVudCgnbW91c2V1cCcpLCBtb3VzZW91dCA9ICQuRXZlbnQoJ21vdXNlb3V0Jyk7XHJcbiAgICB0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKChlbnQpPT4ge1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBlbnRbMV07XHJcbiAgICAgIGlmKG9iamVjdC5zaW11bGF0ZSkge1xyXG4gICAgICAgIG9iamVjdC5zaW11bGF0ZShtb3VzZXVwLCB1bmRlZmluZWQsIDAsIDApO1xyXG4gICAgICAgIG9iamVjdC5zaW11bGF0ZShtb3VzZW91dCwgdW5kZWZpbmVkLCAwLCAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyYW5zZmVyRXZlbnRzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0cmFuc2ZlckV2ZW50VG9UZXh0dXJlKG4sIGUsIGRhdGEpIHtcclxuICAgIGlmKHRoaXMudHJhbnNmZXJFdmVudHMpIHtcclxuICAgICAgY29uc3QgdG9PYmplY3QgPSB0aGlzLmdldE9yTG9hZFRleHR1cmVPYmplY3QodW5kZWZpbmVkLCBuKTtcclxuICAgICAgaWYodG9PYmplY3Qud3JhcHBlcikge1xyXG4gICAgICAgIGNvbnN0IHt1dn0gPSBkYXRhLCB0b0RvYyA9IHRvT2JqZWN0LndyYXBwZXIuZ2V0U2ltdWxhdGVkRG9jKCk7XHJcbiAgICAgICAgdGhpcy5wYWdlQ2FjaGUuZm9yRWFjaCgoZW50KT0+IHtcclxuICAgICAgICAgIGNvbnN0IG9iamVjdCA9IGVudFsxXTtcclxuICAgICAgICAgIGlmKG9iamVjdC5zaW11bGF0ZSkge1xyXG4gICAgICAgICAgICBvYmplY3Quc2ltdWxhdGUoZSwgdG9Eb2MsIHV2LngsIHV2LnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkUHJlZGljdGVkUGFnZXMoKSB7XHJcbiAgICB0aGlzLnByZWRpY3RlZFJlcXVlc3RzID0gQmFzZU1hdGhVdGlscy5wcmVkaWN0KHRoaXMucGFnZVJlcXVlc3RzLCB0aGlzLnAucHJlbG9hZFBhZ2VzKTtcclxuICAgIGZvcihsZXQgcCBvZiB0aGlzLnByZWRpY3RlZFJlcXVlc3RzKSB7XHJcbiAgICAgIGlmKHA8dGhpcy5ib29rLmdldFBhZ2VzKCkgJiYgIXRoaXMucGFnZUNhY2hlLmdldChwKSkge1xyXG4gICAgICAgIHRoaXMubG9hZCh1bmRlZmluZWQsIHApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRQYWdlUmVxdWVzdChuKSB7XHJcbiAgICB0aGlzLnBhZ2VSZXF1ZXN0cy5wdXNoKG4pO1xyXG4gICAgaWYodGhpcy5wYWdlUmVxdWVzdHMubGVuZ3RoPnRoaXMucC5wYWdlc0ZvclByZWRpY3RpbmcpIHtcclxuICAgICAgdGhpcy5wYWdlUmVxdWVzdHMuc2hpZnQoKTtcclxuICAgIH1cclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5sb2FkUHJlZGljdGVkUGFnZXMuYmluZCh0aGlzKSk7XHJcbiAgfVxyXG5cclxuICBzZXRNYXRlcmlhbChvLCBtYXRlcmlhbCkge1xyXG4gICAgdGhpcy5wYWdlQ2FjaGUuZm9yRWFjaCgoZSk9PiB7XHJcbiAgICAgIGNvbnN0IG9iID0gZVsxXTtcclxuICAgICAgaWYobyE9PW9iICYmIG9iLm1hdGVyaWFsPT09bWF0ZXJpYWwpIHtcclxuICAgICAgICBkZWxldGUgb2IubWF0ZXJpYWw7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYobWF0ZXJpYWwgJiYgbWF0ZXJpYWwhPT1vLm1hdGVyaWFsKSB7XHJcbiAgICAgIG8ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuICAgICAgdGhpcy5zZXR1cE1hdGVyaWFsKG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0dXBNYXRlcmlhbChvKSB7XHJcbiAgICBvLm1hdGVyaWFsLm1hcCA9IG8udGV4dHVyZS5pbWFnZT8gby50ZXh0dXJlOiAodGhpcy5sb2FkaW5nQW5pbWF0aW9uPyB0aGlzLmxvYWRpbmdbby5jb2xvcl0udGV4dHVyZTogbnVsbCk7XHJcbiAgICBpZighby5tYXRlcmlhbC5tYXApIHtcclxuICAgICAgby5tYXRlcmlhbC5jb2xvciA9IG5ldyBUSFJFRS5Db2xvcihvLmNvbG9yKTtcclxuICAgIH1cclxuICAgIG8ubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3JMb2FkVGV4dHVyZU9iamVjdChtYXRlcmlhbCwgbikge1xyXG4gICAgbGV0IG9iamVjdCA9IHRoaXMucGFnZUNhY2hlLmdldChuKTtcclxuICAgIGlmKCFvYmplY3QpIHtcclxuICAgICAgb2JqZWN0ID0gdGhpcy5sb2FkKG1hdGVyaWFsLCBuKTtcclxuICAgICAgdGhpcy5hZGRQYWdlUmVxdWVzdChuKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNldE1hdGVyaWFsKG9iamVjdCwgbWF0ZXJpYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBzZXRUZXh0dXJlKG1hdGVyaWFsLCBuKSB7XHJcbiAgICBpZih+dGhpcy5wcmVkaWN0ZWRSZXF1ZXN0cy5pbmRleE9mKG4pKSB7XHJcbiAgICAgIHRoaXMuYWRkUGFnZVJlcXVlc3Qobik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldE9yTG9hZFRleHR1cmVPYmplY3QobWF0ZXJpYWwsIG4pO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL1BhZ2VNYW5hZ2VyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9QYWdlTWFuYWdlci5qcyIsImltcG9ydCBCb29rUHJvcHNCdWlsZGVyIGZyb20gJy4vQm9va1Byb3BzQnVpbGRlcic7XHJcbmltcG9ydCBQZGYgZnJvbSAnUGRmJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBkZkJvb2tQcm9wc0J1aWxkZXIgZXh0ZW5kcyBCb29rUHJvcHNCdWlsZGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Ioc3JjLCBvblJlYWR5KSB7XHJcbiAgICBzdXBlcihvblJlYWR5KTtcclxuICAgIHRoaXMucGRmID0gbmV3IFBkZihzcmMpO1xyXG4gICAgdGhpcy5wYWdlRGVzY3JpcHRpb24gPSB7XHJcbiAgICAgIHR5cGU6ICdwZGYnLFxyXG4gICAgICBzcmM6IHRoaXMucGRmLFxyXG4gICAgICBpbnRlcmFjdGl2ZTogdHJ1ZVxyXG4gICAgfTtcclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIHBhZ2VDYWxsYmFjazogdGhpcy5wYWdlQ2FsbGJhY2suYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgIHRoaXMucGRmLmdldEhhbmRsZXIodGhpcy5pbml0LmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMucGRmLmRpc3Bvc2UoKTtcclxuICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIGluaXQoaGFuZGxlcikge1xyXG4gICAgY29uc3QgcGFnZXMgPSB0aGlzLnBkZi5nZXRQYWdlc051bSgpO1xyXG4gICAgdGhpcy5jYWxjU2hlZXRzKHBhZ2VzKTtcclxuICAgIGlmKHBhZ2VzPjApIHtcclxuICAgICAgaGFuZGxlci5nZXRQYWdlKDEpLlxyXG4gICAgICB0aGVuKChwYWdlKT0+IHtcclxuICAgICAgICBjb25zdCBzaXplID0gUGRmLmdldFBhZ2VTaXplKHBhZ2UpO1xyXG4gICAgICAgIHRoaXMuY2FsY1Byb3BzKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLnJlYWR5KCk7XHJcbiAgICAgIH0pLlxyXG4gICAgICBjYXRjaCgoZSk9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5wcm9wcyA9IHRoaXMuZGVmYXVsdHM7XHJcbiAgICAgIHRoaXMucmVhZHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBhZ2VDYWxsYmFjayhuKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlRGVzY3JpcHRpb247XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL1BkZkJvb2tQcm9wc0J1aWxkZXIuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9qcy9jbGFzc2VzL1BkZkJvb2tQcm9wc0J1aWxkZXIuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZGZMaW5rc0hhbmRsZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihwZGYsIGN0cmwsIGVsZW1lbnQpIHtcclxuICAgIHRoaXMucGRmID0gcGRmO1xyXG4gICAgdGhpcy5jdHJsID0gY3RybDtcclxuICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7XHJcbiAgICB0aGlzLmN1cnNvcnMgPSBbXTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgc2V0SGFuZGxlcihoYW5kbGVyKSB7XHJcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xyXG4gIH1cclxuXHJcbiAgZGVmYXVsdEhhbmRsZXIodHlwZSwgZGVzdGluYXRpb24pIHtcclxuICAgIGlmKHR5cGU9PT0naW50ZXJuYWwnKSB7XHJcbiAgICAgIHRoaXMuY3RybC5nb1RvUGFnZShkZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHR5cGU9PT0nZXh0ZXJuYWwnKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGRlc3RpbmF0aW9uLCAnX2JsYW5rJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxsSGFuZGxlcnModHlwZSwgZGVzdGluYXRpb24pIHtcclxuICAgIGlmKCF0aGlzLmhhbmRsZXIgfHwgIXRoaXMuaGFuZGxlcih0eXBlLCBkZXN0aW5hdGlvbikpIHtcclxuICAgICAgdGhpcy5kZWZhdWx0SGFuZGxlcih0eXBlLCBkZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFdmVudChkYXRhKSB7XHJcbiAgICBjb25zdCBlID0gZGF0YS5ldmVudCwgYW5ubyA9IGRhdGEuYW5ub3RhdGlvbjtcclxuICAgIHN3aXRjaChlLnR5cGUpIHtcclxuICAgICAgY2FzZSAnbW91c2VvdmVyJzoge1xyXG4gICAgICAgIHRoaXMuY3Vyc29ycy5wdXNoKHRoaXMuZWxlbWVudC5jc3MoJ2N1cnNvcicpKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuY3NzKCdjdXJzb3InLCAncG9pbnRlcicpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ21vdXNlb3V0Jzoge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5jc3MoJ2N1cnNvcicsIHRoaXMuY3Vyc29ycy5wb3AoKSB8fCAnJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAndG91Y2h0YXAnOlxyXG4gICAgICBjYXNlICdjbGljayc6IHtcclxuICAgICAgICBpZihhbm5vLnVybCkge1xyXG4gICAgICAgICAgdGhpcy5jYWxsSGFuZGxlcnMoJ2V4dGVybmFsJywgYW5uby51cmwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKGFubm8uZGVzdCkge1xyXG4gICAgICAgICAgbGV0IGRlc3RQcm9taXNlO1xyXG4gICAgICAgICAgaWYodHlwZW9mIGFubm8uZGVzdD09PSdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGRlc3RQcm9taXNlID0gdGhpcy5wZGYuaGFuZGxlci5nZXREZXN0aW5hdGlvbihhbm5vLmRlc3QpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlc3RQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGFubm8uZGVzdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkZXN0UHJvbWlzZS5cclxuICAgICAgICAgICAgdGhlbigoZGVzdCk9PiB0eXBlb2YgZGVzdFswXT09PSdudW1iZXInPyBkZXN0WzBdOiB0aGlzLnBkZi5oYW5kbGVyLmdldFBhZ2VJbmRleChkZXN0WzBdKSkuXHJcbiAgICAgICAgICAgIHRoZW4oKG51bWJlcik9PiB0aGlzLmNhbGxIYW5kbGVycygnaW50ZXJuYWwnLCBudW1iZXIpKS5cclxuICAgICAgICAgICAgY2F0Y2goKCk9PiBjb25zb2xlLmVycm9yKCdCYWQgbGluaycpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvUGRmTGlua3NIYW5kbGVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9QZGZMaW5rc0hhbmRsZXIuanMiLCJpbXBvcnQgRmluZGVyIGZyb20gJ0ZpbmRlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2hFbmdpbmUge1xyXG4gIGNvbnN0cnVjdG9yKHBhZ2VDYWxsYmFjaywgcGFnZXMpIHtcclxuICAgIHRoaXMucGFnZUNhbGxiYWNrID0gcGFnZUNhbGxiYWNrO1xyXG4gICAgdGhpcy5wYWdlcyA9IHBhZ2VzO1xyXG4gICAgdGhpcy5yZXN1bHRzID0gW107XHJcbiAgfVxyXG5cclxuICBzZXRRdWVyeShxdWVyeSkge1xyXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xyXG4gICAgdGhpcy51cGRhdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzKCkge1xyXG4gICAgaWYodGhpcy51cGRhdGUpIHtcclxuICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMucmVzdWx0cztcclxuICAgICAgdGhpcy5yZXN1bHRzID0gW107XHJcbiAgICAgIGlmKHRoaXMub25QYWdlSGl0c0NoYW5nZWQpIHtcclxuICAgICAgICBmb3IobGV0IHJlcyBvZiByZXN1bHRzKSB7XHJcbiAgICAgICAgICB0aGlzLm9uUGFnZUhpdHNDaGFuZ2VkKHVuZGVmaW5lZCwgJycpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnBhZ2UgPSAwO1xyXG4gICAgICB0aGlzLnN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgaWYodGhpcy5xdWVyeS5sZW5ndGg+MSkge1xyXG4gICAgICAgIHRoaXMucHJvY2VzcygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYodGhpcy5wYWdlPHRoaXMucGFnZXMpIHtcclxuICAgICAgICBjb25zdCBzdGFtcCA9IHRoaXMuc3RhbXA7XHJcbiAgICAgICAgdGhpcy5maW5kKHRoaXMucGFnZUNhbGxiYWNrKHRoaXMucGFnZSkpLlxyXG4gICAgICAgICAgdGhlbigoY29udGV4dHMpPT4ge1xyXG4gICAgICAgICAgICBpZihzdGFtcCA9PT0gdGhpcy5zdGFtcCkge1xyXG4gICAgICAgICAgICAgIGlmKGNvbnRleHRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHRzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKyt0aGlzLnBhZ2U7XHJcbiAgICAgICAgICAgICAgaWYodGhpcy5vblBhZ2VIaXRzQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblBhZ2VIaXRzQ2hhbmdlZCh0aGlzLnBhZ2UsIHRoaXMucXVlcnkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbmQocGkpIHtcclxuICAgIGxldCBuZXh0O1xyXG4gICAgaWYocGkudHlwZT09PSdwZGYnKSB7XHJcbiAgICAgIG5leHQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcbiAgICAgICAgcGkuc3JjLmdldEhhbmRsZXIoKCk9PiB7XHJcbiAgICAgICAgICBjb25zdCBuID0gcGkubnVtYmVyPT09dW5kZWZpbmVkPyB0aGlzLnBhZ2U6IHBpLm51bWJlcjtcclxuICAgICAgICAgIGlmKHBpLnNyYy5nZXRQYWdlVHlwZShuKT09PSdyaWdodCcpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcGkuc3JjLmdldFBhZ2UobikuXHJcbiAgICAgICAgICAgIHRoZW4oKHBhZ2UpPT4ge1xyXG4gICAgICAgICAgICAgIHBhZ2UuZ2V0VGV4dENvbnRlbnQoKS5cclxuICAgICAgICAgICAgICB0aGVuKCh0ZXh0Q29udGVudCk9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBGaW5kZXIodGV4dENvbnRlbnQuaXRlbXMubWFwKChpdGVtKT0+IGl0ZW0uc3RyKSwgdGhpcy5xdWVyeSwge2hpdHM6IGZhbHNlfSkuZ2V0Q29udGV4dHMoKSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICBjYXRjaCgoKT0+IHJlc29sdmUoW10pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbmV4dCA9IFByb21pc2UucmVzb2x2ZShbXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dDtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvU2VhcmNoRW5naW5lLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9TZWFyY2hFbmdpbmUuanMiLCJpbXBvcnQgQ1NTTGF5ZXIgZnJvbSAnQ1NTTGF5ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlZXRDc3NMYXllciB7XHJcbiAgY29uc3RydWN0b3IodmlzdWFsLCBibG9jaywgcHJvcHMpIHtcclxuICAgIHRoaXMudmlzdWFsID0gdmlzdWFsO1xyXG4gICAgY29uc3Qgc2l6ZSA9IGJsb2NrLmdldFRvcFNpemUoKTtcclxuICAgIHRoaXMubGF5ZXIgPSBuZXcgQ1NTTGF5ZXIoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIHByb3BzKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZShibG9jayk7XHJcbiAgICB0aGlzLnZpc3VhbC5hZGRDc3NPYmplY3QodGhpcy5sYXllcik7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5sYXllci5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnZpc3VhbC5yZW1vdmVDc3NPYmplY3QodGhpcy5sYXllcik7XHJcbiAgfVxyXG5cclxuICBpc0hpZGRlbigpIHtcclxuICAgIHJldHVybiB0aGlzLmxheWVyLmlzSGlkZGVuKCk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5ZXIuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHJldHVybiB0aGlzLmxheWVyLnNob3coKTtcclxuICB9XHJcblxyXG4gIHNldChjc3MsIGh0bWwsIGpzKSB7XHJcbiAgICB0aGlzLmxheWVyLnNldERhdGEoY3NzLCBodG1sLCBqcyk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoYmxvY2spIHtcclxuICAgIHRoaXMuYmxvY2sgPSBibG9jaztcclxuICAgIHRoaXMuYmxvY2suZ2V0VG9wV29ybGRSb3RhdGlvbih0aGlzLmxheWVyLnJvdGF0aW9uKTtcclxuICAgIHRoaXMuYmxvY2suZ2V0VG9wV29ybGRQb3NpdGlvbih0aGlzLmxheWVyLnBvc2l0aW9uKTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9TaGVldENzc0xheWVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9TaGVldENzc0xheWVyLmpzIiwiaW1wb3J0IE1hdGhVdGlscyBmcm9tICdNYXRoVXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlZXRQaHlzaWNzIHtcclxuXHJcbiAgc3RhdGljIHRhcmdldEZvcmNlQ2xiKG8sYSx2LGNoKSB7XHJcbiAgICBjb25zdCBsID0gYSp0aGlzLnI7XHJcbiAgICByZXR1cm4gMTAwKnRoaXMubSp0aGlzLmcqKDIvKDErTWF0aC5leHAoMTAqKGwtdGhpcy50bCkpKS0xKS10aGlzLm0qNDAqdjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBob3ZlckNvcm5lckZvcmNlQ2xiKG8sdixsLGNoKSB7XHJcbiAgICByZXR1cm4gNTtcclxuICB9XHJcblxyXG4gIGdldFRhcmdldEZvcmNlQ2xiKG1hc3MsIHRhcmdldEFuZ2xlKSB7XHJcbiAgICByZXR1cm4gU2hlZXRQaHlzaWNzLnRhcmdldEZvcmNlQ2xiLmJpbmQoe1xyXG4gICAgICBnOiB0aGlzLnAuZ3Jhdml0eSxcclxuICAgICAgbTogbWFzcyxcclxuICAgICAgdGw6IHRhcmdldEFuZ2xlKnRoaXMucC5yLFxyXG4gICAgICByOiB0aGlzLnAuclxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZHJhZ0ZvcmNlQ2xiKG8sYSx2LGNoKSB7XHJcbiAgICByZXR1cm4gby5mbGJ0Km8ubSooMTAqby5nKmNoLTUwKnYvKDErTWF0aC5leHAoMy41Kk1hdGguYWJzKGNoKSkpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkcmFnQ29ybmVyRm9yY2VDbGIobyxhLHYsY2gpIHtcclxuICAgIHJldHVybiAxNSooMi8oMStNYXRoLmV4cCgxMCooYS10aGlzLnRhKSpvLnIpKS0xKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXREcmFnQ29ybmVyRm9yY2VDbGIodGFyZ2V0QW5nbGUpIHtcclxuICAgIHJldHVybiBTaGVldFBoeXNpY3MuZHJhZ0Nvcm5lckZvcmNlQ2xiLmJpbmQoe1xyXG4gICAgICB0YTogdGFyZ2V0QW5nbGVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3Iocj0xLCBncmF2aXR5PTEsIGNvcm5lckRldmlhdGlvbj0wLjE1LCBmcHM9MjQwKSB7XHJcbiAgICB0aGlzLnAgPSB7XHJcbiAgICAgIHIsXHJcbiAgICAgIGNvcm5lckRldmlhdGlvbixcclxuICAgICAgbDogTWF0aC5QSSpyLFxyXG4gICAgICBzdGFydER0OiAxL2ZwcyxcclxuICAgICAgZ3Jhdml0eSxcclxuICAgICAgbWFyZ2luOiAwLjAwMipyLFxyXG4gICAgICBpbmZNOiAxZTQsXHJcbiAgICAgIGF0dGVtcHRzOiAxNixcclxuICAgICAgbWF4SXRlcmF0aW9uczogMTAwXHJcbiAgICB9O1xyXG4gICAgdGhpcy5vcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMub3MgPSBbXTtcclxuICB9XHJcblxyXG4gIGdldFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBhZGRPYmplY3QobWFzcywgYW5nbGUsIHZlbG9jaXR5LCBmbGV4aWJpbGl0eSwgY29ybmVySGVpZ2h0LCBzaW11bGF0ZUNsYiwgcmVtb3ZlQ2xiLCBmb3JjZUNsYj0oKT0+IDAsIGNvcm5lckZvcmNlQ2xiPSgpPT4gMCkge1xyXG4gICAgY29uc3Qgbm8gPSB7XHJcbiAgICAgIGlkOiBNYXRoVXRpbHMuZ2V0VW5pcXVlKCksXHJcbiAgICAgIG06IG1hc3MsXHJcbiAgICAgIHY6IHZlbG9jaXR5LFxyXG4gICAgICBsOiBhbmdsZSp0aGlzLnAucixcclxuICAgICAgZjogZm9yY2VDbGIsXHJcbiAgICAgIGNmOiBjb3JuZXJGb3JjZUNsYixcclxuICAgICAgY2g6IGNvcm5lckhlaWdodCxcclxuICAgICAgZmxidDogZmxleGliaWxpdHksXHJcbiAgICAgIHNpbXVsYXRlQ2xiLFxyXG4gICAgICByZW1vdmVDbGJcclxuICAgIH07XHJcbiAgICBsZXQgaSA9IHRoaXMub3MuZmluZEluZGV4KChvKT0+IG5vLmw8PW8ubCk7XHJcbiAgICBpID0gfmk/IGk6IHRoaXMub3MubGVuZ3RoO1xyXG4gICAgdGhpcy5vcy5zcGxpY2UoaSwgMCwgbm8pO1xyXG4gICAgcmV0dXJuIG5vLmlkO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFyYW1ldHJNYXAobmFtZSkge1xyXG4gICAgY29uc3QgbWFwID0ge1xyXG4gICAgICBtYXNzOiAnbScsXHJcbiAgICAgIHZlbG9jaXR5OiAndicsXHJcbiAgICAgIGZsZXhpYmlsaXR5OiAnZmxidCcsXHJcbiAgICAgIGNvcm5lckhlaWdodDogJ2NoJyxcclxuICAgICAgc2ltdWxhdGVDbGI6ICdzaW11bGF0ZUNsYicsXHJcbiAgICAgIHJlbW92ZUNsYjogJ3JlbW92ZUNsYicsXHJcbiAgICAgIGZvcmNlQ2xiOiAnZicsXHJcbiAgICAgIGNvcm5lckZvcmNlQ2xiOiAnY2YnXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG1hcFtuYW1lXTtcclxuICB9XHJcblxyXG4gIHNldFBhcmFtZXRyKGlkLCBuYW1lLCB2YWx1ZSkge1xyXG4gICAgY29uc3QgbyA9IHRoaXMub3MuZmluZCgobyk9PiBvLmlkPT09aWQpO1xyXG4gICAgaWYobmFtZSA9PT0gJ2FuZ2xlJykge1xyXG4gICAgICBvLmwgPSB2YWx1ZSp0aGlzLnAucjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBvW3RoaXMuZ2V0UGFyYW1ldHJNYXAobmFtZSldID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQYXJhbWV0cihpZCwgbmFtZSkge1xyXG4gICAgY29uc3QgbyA9IHRoaXMub3MuZmluZCgobyk9PiBvLmlkPT09aWQpO1xyXG4gICAgbGV0IHZhbHVlO1xyXG4gICAgaWYobmFtZSA9PT0gJ2FuZ2xlJykge1xyXG4gICAgICB2YWx1ZSA9IG8ubC90aGlzLnAucjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB2YWx1ZSA9IG9bdGhpcy5nZXRQYXJhbWV0ck1hcChuYW1lKV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzaW11bGF0ZShUKSB7XHJcbiAgICBsZXQgdD0wLFxyXG4gICAgICAgIGR0PXRoaXMucC5zdGFydER0LFxyXG4gICAgICAgIGF0dGVtcHQ9MCxcclxuICAgICAgICBpdD0wO1xyXG5cclxuICAgIHdoaWxlKHQ8VCAmJiBpdDx0aGlzLnAubWF4SXRlcmF0aW9ucykge1xyXG4gICAgICBpZihkdD5ULXQpIHtcclxuICAgICAgICBkdCA9IFQtdDtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBub3MgPSB0aGlzLmludGVncmF0ZSh0aGlzLm9zLCBkdCksXHJcbiAgICAgICAgICAgIGNpID0gdGhpcy5maW5kQ29sbGlzaW9ucyhub3MpO1xyXG4gICAgICBpZihjaS5udW0+MSAmJiBhdHRlbXB0PHRoaXMucC5hdHRlbXB0cykge1xyXG4gICAgICAgIGR0Lz0yO1xyXG4gICAgICAgICsrYXR0ZW1wdDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZihjaS5udW09PT0xKSB7XHJcbiAgICAgICAgICBjb25zdCBzY29zID0gdGhpcy5zb2x2ZUNvbGxpc2lvbihub3NbY2kubGFzdC0xXSwgbm9zW2NpLmxhc3RdKTtcclxuICAgICAgICAgIG5vc1tjaS5sYXN0LTFdID0gc2Nvc1swXTtcclxuICAgICAgICAgIG5vc1tjaS5sYXN0XSA9IHNjb3NbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoY2kubnVtPjEpIHtcclxuICAgICAgICAgIGNvbnN0IGdzID0gW107XHJcbiAgICAgICAgICBsZXQgbGFzdCA9IC0yO1xyXG4gICAgICAgICAgZm9yKGxldCBpIG9mIGNpLmFsbCkge1xyXG4gICAgICAgICAgICBpZihpLWxhc3Q+MSkge1xyXG4gICAgICAgICAgICAgIGdzLnB1c2goW10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdzW2dzLmxlbmd0aC0xXS5wdXNoKGkpO1xyXG4gICAgICAgICAgICBsYXN0ID0gaTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvcihsZXQgZyBvZiBncykge1xyXG4gICAgICAgICAgICBsZXQgc2csIGkwO1xyXG4gICAgICAgICAgICBpZihub3NbZ1swXV0ubD5NYXRoLlBJLzIqdGhpcy5wLnIpIHtcclxuICAgICAgICAgICAgICBzZyA9IC0xO1xyXG4gICAgICAgICAgICAgIGkwID0gZ1tnLmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBzZyA9IDE7XHJcbiAgICAgICAgICAgICAgaTAgPSBnWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvcihsZXQgaT1pMDsgaTxub3MubGVuZ3RoICYmIGk+LTE7IGkrPXNnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbyA9IG5vc1tpK3NnXTtcclxuICAgICAgICAgICAgICBpZihvICYmIHNnKihvLmwtbm9zW2ldLmwpPD10aGlzLnAubWFyZ2luKSB7XHJcbiAgICAgICAgICAgICAgICBvLmw9bm9zW2ldLmwrc2cqMip0aGlzLnAubWFyZ2luO1xyXG4gICAgICAgICAgICAgICAgaWYoby5sPnRoaXMucC5sIHx8IG8ubDwwKSB7XHJcbiAgICAgICAgICAgICAgICAgIG8ubCA9IG8ubD50aGlzLnAubD8gdGhpcy5wLmw6IDA7XHJcbiAgICAgICAgICAgICAgICAgIG8uY2ggPSAwO1xyXG4gICAgICAgICAgICAgICAgICBvLnY9MDtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQmFkIGNvbGxpc2lvbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9zID0gbm9zO1xyXG4gICAgICAgIHRoaXMuZmluZEFuZFNvbHZlQ29ybmVyQ29sbGlzaW9ucygpO1xyXG4gICAgICAgIHQrPWR0O1xyXG4gICAgICAgIGR0PXRoaXMucC5zdGFydER0O1xyXG4gICAgICAgIGF0dGVtcHQ9MDtcclxuICAgICAgfVxyXG4gICAgICArK2l0O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVtb3ZlU3RhdGljcygpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU3RhdGljcygpIHtcclxuICAgIGNvbnN0IG5vcyA9IFtdLCBub3RpZnkgPSBbW10sW11dO1xyXG4gICAgZm9yKGxldCBvIG9mIHRoaXMub3MpIHtcclxuICAgICAgaWYoby5zaW11bGF0ZUNsYikge1xyXG4gICAgICAgIG8uc2ltdWxhdGVDbGIoby5sL3RoaXMucC5yLCBvLmNoKTtcclxuICAgICAgfVxyXG4gICAgICBpZigoby5sPT09dGhpcy5wLmwgfHwgby5sPT09MCkgJiYgby52PT09MCkge1xyXG4gICAgICAgIGlmKG8ucmVtb3ZlQ2xiICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG5vdGlmeVsoby5sIT09dGhpcy5wLmwpKzBdLnB1c2gobyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIG5vcy5wdXNoKG8pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm9zID0gbm9zO1xyXG4gICAgZm9yKGxldCBvIG9mIG5vdGlmeVswXS5yZXZlcnNlKCkpIHtcclxuICAgICAgby5yZW1vdmVDbGIoTWF0aC5QSSwgby5jaCk7XHJcbiAgICB9XHJcbiAgICBmb3IobGV0IG8gb2Ygbm90aWZ5WzFdKSB7XHJcbiAgICAgIG8ucmVtb3ZlQ2xiKDAsIG8uY2gpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluZEFuZFNvbHZlQ29ybmVyQ29sbGlzaW9ucygpIHtcclxuICAgIGlmKHRoaXMub3MubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG9zID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIC4uLnRoaXMub3NbMF0sXHJcbiAgICAgICAgICBsOiAwLFxyXG4gICAgICAgICAgbTogdGhpcy5wLmluZk0sXHJcbiAgICAgICAgICBjaDogMFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4udGhpcy5vcyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAuLi50aGlzLm9zWzBdLFxyXG4gICAgICAgICAgbDogMS4wNSp0aGlzLnAubCxcclxuICAgICAgICAgIG06IHRoaXMucC5pbmZNLFxyXG4gICAgICAgICAgY2g6IDBcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcblxyXG4gICAgICBmb3IobGV0IGk9MTsgaTxvcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgIGNvbnN0IGE9b3NbaS0xXSwgYj1vc1tpXSxcclxuICAgICAgICAgICAgICBhbD1hLmwrdGhpcy5wLmNvcm5lckRldmlhdGlvbiphLmNoKnRoaXMucC5yLFxyXG4gICAgICAgICAgICAgIGJsPWIubCt0aGlzLnAuY29ybmVyRGV2aWF0aW9uKmIuY2gqdGhpcy5wLnI7XHJcbiAgICAgICAgaWYoMS4wNSphbD5ibCAmJiBhLmNoPmIuY2gpIHtcclxuICAgICAgICAgIGNvbnN0IGRDaCA9IGEuY2gtYi5jaCwgZHY9YS5tL2EuZmxidCtiLm0vYi5mbGJ0LCBrYT1hLm0vYS5mbGJ0L2R2LCBrYj1iLm0vYi5mbGJ0L2R2O1xyXG4gICAgICAgICAgYS5jaD1hLmNoLWtiKmRDaDtcclxuICAgICAgICAgIGIuY2g9Yi5jaCtrYSpkQ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzb2x2ZUNvbGxpc2lvbihhLCBiKSB7XHJcbiAgICBjb25zdCBtbT0oYi5tK2EubSksXHJcbiAgICAgIGF2ID0gKC1hLnYqYi5tK2EubSphLnYrMipiLm0qYi52KS9tbSxcclxuICAgICAgYnYgPSAoYi5tKmIudi1iLnYqYS5tKzIqYS5tKmEudikvbW07XHJcbiAgICByZXR1cm4gW3suLi5hLCB2OiBhdn0sIHsuLi5iLCB2OiBidn1dO1xyXG4gIH1cclxuXHJcbiAgZmluZENvbGxpc2lvbnMob3MpIHtcclxuICAgIGNvbnN0IGNpID0ge1xyXG4gICAgICBudW06IDAsXHJcbiAgICAgIGxhc3Q6IDAsXHJcbiAgICAgIGFsbDogW11cclxuICAgIH07XHJcbiAgICBmb3IobGV0IGkgPSAxOyBpPG9zLmxlbmd0aCAmJiBjaS5udW08MjsgKytpKSB7XHJcbiAgICAgIGlmKG9zW2ktMV0ubD5vc1tpXS5sIHx8IHRoaXMuaXNDb2xsaXNpb24ob3NbaS0xXSwgb3NbaV0pKSB7XHJcbiAgICAgICAgaWYob3NbaS0xXS5sPm9zW2ldLmwpIHtcclxuICAgICAgICAgICsrY2kubnVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICArK2NpLm51bTtcclxuICAgICAgICBjaS5sYXN0ID0gaTtcclxuICAgICAgICBpZihjaS5hbGwuaW5kZXhPZihpLTEpPT09LTEpIHtcclxuICAgICAgICAgIGNpLmFsbC5wdXNoKGktMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNpLmFsbC5pbmRleE9mKGkpPT09LTEpIHtcclxuICAgICAgICAgIGNpLmFsbC5wdXNoKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNpO1xyXG4gIH1cclxuXHJcbiAgaXNDb2xsaXNpb24oYSwgYikge1xyXG4gICAgcmV0dXJuIE1hdGguYWJzKGEubC1iLmwpPHRoaXMucC5tYXJnaW4gJiYgYS52PmIudjtcclxuICB9XHJcblxyXG4gIGludGVncmF0ZShvcywgZHQpIHtcclxuICAgIGNvbnN0IG5vcyA9IFtdO1xyXG4gICAgZm9yKGxldCBvIG9mIG9zKSB7XHJcbiAgICAgIGNvbnN0IHZsID0gTWF0aFV0aWxzLnJrNChcclxuICAgICAgICB0aGlzLmR5LmJpbmQoe1xyXG4gICAgICAgICAgZzogdGhpcy5wLmdyYXZpdHksXHJcbiAgICAgICAgICByOiB0aGlzLnAucixcclxuICAgICAgICAgIG06IG8ubSxcclxuICAgICAgICAgIGY6IG8uZixcclxuICAgICAgICAgIGNmOiBvLmNmLFxyXG4gICAgICAgICAgY2g6IG8uY2gsXHJcbiAgICAgICAgICBmbGJ0OiBvLmZsYnRcclxuICAgICAgICB9KSxcclxuICAgICAgICAwLFxyXG4gICAgICAgIGR0LFxyXG4gICAgICAgIFtvLnYsIG8ubCwgby5jaF1cclxuICAgICAgKTtcclxuICAgICAgY29uc3Qgbm8gPSB7XHJcbiAgICAgICAgLi4ubyxcclxuICAgICAgICB2OiB2bFswXSxcclxuICAgICAgICBsOiB2bFsxXSxcclxuICAgICAgICBjaDogdmxbMl1cclxuICAgICAgfTtcclxuICAgICAgaWYobm8ubDw9MCB8fCBuby5sPj10aGlzLnAubCkge1xyXG4gICAgICAgIG5vLmw9bm8ubDw9MD8gMDogdGhpcy5wLmw7XHJcbiAgICAgICAgbm8udj0wO1xyXG4gICAgICAgIG5vLmNoPTA7XHJcbiAgICAgIH1cclxuICAgICAgbm9zLnB1c2gobm8pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vcztcclxuICB9XHJcblxyXG4gIGR5KHQseSkge1xyXG4gICAgY29uc3Qgdj15WzBdLCBsPXlbMV0sIGNoPXlbMl0sIGY9dGhpcy5mKHRoaXMsbC90aGlzLnIsdixjaCksIGNmPXRoaXMuY2YodGhpcyxsL3RoaXMucix2LGNoKTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICgtdGhpcy5nKk1hdGguY29zKGwvdGhpcy5yKSp0aGlzLm0rZikvdGhpcy5tLFxyXG4gICAgICB2KzAuMDEqKE1hdGgucmFuZG9tKCktMC41KSxcclxuICAgICAgdGhpcy5mbGJ0KigoMi8oMStNYXRoLmV4cCgtMC4yKmNmKSktMSkqKDEtMi8oMStNYXRoLmV4cCgtNSooTWF0aC5hYnMoY2gpLTIpKSkpLWNoKVxyXG4gICAgXTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvU2hlZXRQaHlzaWNzLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9TaGVldFBoeXNpY3MuanMiLCJcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvdW5kc0Vudmlyb21lbnQge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZT17fSkge1xyXG4gICAgdGhpcy5zb3VuZHMgPSB0ZW1wbGF0ZS5zb3VuZHMgfHwge307XHJcbiAgICB0aGlzLmF1ZGlvID0ge307XHJcbiAgICBpZih0aGlzLnNvdW5kcy5zdGFydEZsaXApIHtcclxuICAgICAgdGhpcy5hdWRpby5zdGFydEZsaXAgPSBuZXcgQXVkaW8odGhpcy5zb3VuZHMuc3RhcnRGbGlwKTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuc291bmRzLmVuZEZsaXApIHtcclxuICAgICAgdGhpcy5hdWRpby5lbmRGbGlwID0gbmV3IEF1ZGlvKHRoaXMuc291bmRzLmVuZEZsaXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RW5hYmxlZChlbmFibGVkKSB7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgdG9nbGUoKSB7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSAhdGhpcy5lbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGRlbGV0ZSB0aGlzLmF1ZGlvLnN0YXJ0RmxpcDtcclxuICAgIGRlbGV0ZSB0aGlzLmF1ZGlvLmVuZEZsaXA7XHJcbiAgfVxyXG5cclxuICBzdGFydEZsaXAoKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQgJiYgdGhpcy5hdWRpby5zdGFydEZsaXApIHtcclxuICAgICAgdGhpcy5hdWRpby5zdGFydEZsaXAucGxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZW5kRmxpcCgpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCAmJiB0aGlzLmF1ZGlvLnN0YXJ0RmxpcCkge1xyXG4gICAgICB0aGlzLmF1ZGlvLnN0YXJ0RmxpcC5wYXVzZSgpO1xyXG4gICAgICB0aGlzLmF1ZGlvLnN0YXJ0RmxpcC5jdXJyZW50VGltZSA9IDA7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmVuYWJsZWQgJiYgdGhpcy5hdWRpby5lbmRGbGlwKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8uZW5kRmxpcC5wbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVGbGlwcyhlbWl0dGVyKSB7XHJcbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0RmxpcCcsIHRoaXMuc3RhcnRGbGlwLmJpbmQodGhpcykpO1xyXG4gICAgZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKCdlbmRGbGlwJywgdGhpcy5lbmRGbGlwLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9Tb3VuZHNFbnZpcm9tZW50LmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vanMvY2xhc3Nlcy9Tb3VuZHNFbnZpcm9tZW50LmpzIiwiaW1wb3J0IFdpZGdldENvbnRyb2xsZXIgZnJvbSAnV2lkZ2V0Q29udHJvbGxlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2NDb250cm9sbGVyIGV4dGVuZHMgV2lkZ2V0Q29udHJvbGxlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpZXcsIGJvb2tDdHJsKSB7XHJcbiAgICBzdXBlcih2aWV3KTtcclxuICAgIHRoaXMuYm9va0N0cmwgPSBib29rQ3RybDtcclxuICAgIHRoaXMudGFiID0gJ25vbmUnO1xyXG4gIH1cclxuXHJcbiAgc2V0VGh1bWJuYWlscyh0aHVtYm5haWxzKSB7XHJcbiAgICB0aGlzLnRodW1ibmFpbHMgPSB0aHVtYm5haWxzO1xyXG4gICAgdGh1bWJuYWlscy5vbk5hdmlnYXRlID0gdGhpcy5uYXZpZ2F0ZVRodW1ibmFpbHMuYmluZCh0aGlzKTtcclxuICAgIGlmKHRoaXMudGFiID09PSAnbm9uZScpIHtcclxuICAgICAgdGhpcy50YWIgPSAndGh1bWJuYWlscyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpcmVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHNldFNlYXJjaChzZWFyY2gpIHtcclxuICAgIHRoaXMuc2VhcmNoID0gc2VhcmNoO1xyXG4gICAgc2VhcmNoLm9uTmF2aWdhdGUgPSB0aGlzLm5hdmlnYXRlU2VhcmNoLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLmZpcmVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHNldEJvb2ttYXJrcyhib29rbWFya3MsIHBkZikge1xyXG4gICAgdGhpcy5ib29rbWFya3MgPSBib29rbWFya3M7XHJcbiAgICB0aGlzLnBkZiA9IHBkZjtcclxuICAgIGJvb2ttYXJrcy5vbk5hdmlnYXRlID0gdGhpcy5uYXZpZ2F0ZUJvb2ttYXJrcy5iaW5kKHRoaXMpO1xyXG4gICAgaWYoYm9va21hcmtzLmdldFNpemUoKSkge1xyXG4gICAgICB0aGlzLnRhYiA9ICdib29rbWFya3MnO1xyXG4gICAgICB0aGlzLmlzQm9va21hcmtzID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlyZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgY21kQm9va21hcmtzKCkge1xyXG4gICAgdGhpcy50YWIgPSAnYm9va21hcmtzJztcclxuICAgIHRoaXMuZmlyZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgY21kVGh1bWJuYWlscygpIHtcclxuICAgIHRoaXMudGFiID0gJ3RodW1ibmFpbHMnO1xyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBjbWRTZWFyY2goKSB7XHJcbiAgICB0aGlzLnRhYiA9ICdzZWFyY2gnO1xyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBjbWRDbG9zZVRvYygpIHtcclxuICAgIHRoaXMuaGlkZSgpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUaHVtYm5haWxzKG51bWJlcikge1xyXG4gICAgdGhpcy5ib29rQ3RybC5nb1RvUGFnZShudW1iZXIpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVTZWFyY2gobnVtYmVyKSB7XHJcbiAgICB0aGlzLmJvb2tDdHJsLmdvVG9QYWdlKG51bWJlcik7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZUJvb2ttYXJrcyhpdGVtKSB7XHJcbiAgICBpZihpdGVtLnVybCkge1xyXG4gICAgICB3aW5kb3cub3BlbihpdGVtLnVybCwgJ19ibGFuaycpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihpdGVtLmRlc3QpIHtcclxuICAgICAgbGV0IGRlc3RQcm9taXNlO1xyXG4gICAgICBpZih0eXBlb2YgaXRlbS5kZXN0PT09J3N0cmluZycpIHtcclxuICAgICAgICBkZXN0UHJvbWlzZSA9IHRoaXMucGRmLmhhbmRsZXIuZ2V0RGVzdGluYXRpb24oaXRlbS5kZXN0KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBkZXN0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShpdGVtLmRlc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGRlc3RQcm9taXNlLlxyXG4gICAgICAgIHRoZW4oKGRlc3QpPT4gdGhpcy5wZGYuaGFuZGxlci5nZXRQYWdlSW5kZXgoZGVzdFswXSkpLlxyXG4gICAgICAgIHRoZW4oKG51bWJlcik9PiB0aGlzLmJvb2tDdHJsLmdvVG9QYWdlKG51bWJlcikpLlxyXG4gICAgICAgIGNhdGNoKCgpPT4gY29uc29sZS5lcnJvcignQmFkIGJvb2ttYXJrJykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlVmlldygpIHtcclxuICAgIGlmKHRoaXMudmlldykge1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3dpZFRvY01lbnUnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCd3aWRUaHVtYm5haWxzJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLnRhYj09PSd0aHVtYm5haWxzJyxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3dpZFNlYXJjaCcsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy50YWI9PT0nc2VhcmNoJyxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3dpZEJvb2ttYXJrcycsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy50YWI9PT0nYm9va21hcmtzJyxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ2NtZEJvb2ttYXJrcycsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IHRoaXMudGFiPT09J2Jvb2ttYXJrcydcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnY21kQ2xvc2VUb2MnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCdjbWRUaHVtYm5haWxzJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy50YWI9PT0ndGh1bWJuYWlscydcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnY21kU2VhcmNoJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy50YWI9PT0nc2VhcmNoJ1xyXG4gICAgICB9KTtcclxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+IHRoaXMudGh1bWJuYWlscy5zZXRFbmFibGUodGhpcy52aXNpYmxlICYmIHRoaXMudGFiPT09J3RodW1ibmFpbHMnKSk7XHJcbiAgICAgIHN1cGVyLnVwZGF0ZVZpZXcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvVG9jQ29udHJvbGxlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2pzL2NsYXNzZXMvVG9jQ29udHJvbGxlci5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgVGhyZWVVdGlscyBmcm9tICdUaHJlZVV0aWxzJztcclxuXHJcbmNvbnN0IHJlc1ggPSAxMSxcclxuICAgICAgcmVzWSA9IDIsXHJcbiAgICAgIHJlc1ogPSAxNSxcclxuICAgICAgc2NhbGUgPSAxLFxyXG4gICAgICBmYWNlcyA9IFtdO1xyXG5cclxuY29uc3QgZnJvbnRHZW9tZXRyeSA9IG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KHNjYWxlLCBzY2FsZSwgcmVzWC0xLCByZXNZLTEpO1xyXG5mcm9udEdlb21ldHJ5LnRyYW5zbGF0ZSgwLjUqc2NhbGUsMC41KnNjYWxlLHNjYWxlKTtcclxuY29uc3QgYmFja0dlb21ldHJ5ID0gbmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoc2NhbGUsIHNjYWxlLCByZXNYLTEsIHJlc1ktMSk7XHJcbmJhY2tHZW9tZXRyeS5yb3RhdGVZKE1hdGguUEkpO1xyXG5iYWNrR2VvbWV0cnkudHJhbnNsYXRlKDAuNSpzY2FsZSwwLjUqc2NhbGUsMCk7XHJcbmNvbnN0IGxlZnRHZW9tZXRyeSA9IG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KHNjYWxlLCBzY2FsZSwgcmVzWi0xLCByZXNZLTEpO1xyXG5sZWZ0R2VvbWV0cnkucm90YXRlWSgtTWF0aC5QSS8yKTtcclxubGVmdEdlb21ldHJ5LnRyYW5zbGF0ZSgwLDAuNSpzY2FsZSwwLjUqc2NhbGUpO1xyXG5jb25zdCByaWdodEdlb21ldHJ5ID0gbmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoc2NhbGUsIHNjYWxlLCByZXNaLTEsIHJlc1ktMSk7XHJcbnJpZ2h0R2VvbWV0cnkucm90YXRlWShNYXRoLlBJLzIpO1xyXG5yaWdodEdlb21ldHJ5LnRyYW5zbGF0ZShzY2FsZSwwLjUqc2NhbGUsMC41KnNjYWxlKTtcclxuY29uc3QgdG9wR2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeShzY2FsZSwgc2NhbGUsIHJlc1gtMSwgcmVzWi0xKTtcclxudG9wR2VvbWV0cnkucm90YXRlWCgtTWF0aC5QSS8yKTtcclxudG9wR2VvbWV0cnkudHJhbnNsYXRlKDAuNSpzY2FsZSxzY2FsZSwwLjUqc2NhbGUpO1xyXG5jb25zdCBib3R0b21HZW9tZXRyeSA9IHRvcEdlb21ldHJ5LmNsb25lKCk7XHJcbmJvdHRvbUdlb21ldHJ5LnRyYW5zbGF0ZSgwLC1zY2FsZSwwKTtcclxuZm9yKGxldCBmIG9mIGJvdHRvbUdlb21ldHJ5LmZhY2VzKSB7XHJcbiAgW2YuYSwgZi5iXSA9IFtmLmIsIGYuYV07XHJcbn1cclxuXHJcbmNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkdlb21ldHJ5KCk7XHJcbmdlb21ldHJ5LnZlcnRpY2VzID0gWy4uLmJvdHRvbUdlb21ldHJ5LnZlcnRpY2VzLCAuLi50b3BHZW9tZXRyeS52ZXJ0aWNlc107XHJcblxyXG5jb25zdCBhZGRGYWNlcyA9IChmcywgbWFwKT0+IHtcclxuICBmb3IobGV0IGYgb2YgZnMpIHtcclxuICAgIGdlb21ldHJ5LmZhY2VzLnB1c2gobmV3IFRIUkVFLkZhY2UzKG1hcChmLmEpLCBtYXAoZi5iKSwgbWFwKGYuYykpKTtcclxuICB9XHJcbiAgZmFjZXMucHVzaChnZW9tZXRyeS5mYWNlcy5sZW5ndGgpO1xyXG59O1xyXG5cclxuY29uc3QgbWFwVmVydGljZXMgPSAoc3JjLCBkc3QpPT4ge1xyXG4gIGNvbnN0IG1hcCA9IFtdO1xyXG4gIGNvbnN0IGVxID0gKGEsIGIpPT4gTWF0aC5hYnMoYS54LWIueCkrTWF0aC5hYnMoYS55LWIueSkrTWF0aC5hYnMoYS56LWIueik8MWUtNDtcclxuICBmb3IobGV0IGk9MDsgaTxzcmMubGVuZ3RoOyArK2kpIHtcclxuICAgIGZvcihsZXQgaj0wOyBqPGRzdC5sZW5ndGg7ICsraikge1xyXG4gICAgICBpZihlcShzcmNbaV0sIGRzdFtqXSkpIHtcclxuICAgICAgICBtYXBbaV09ajtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbWFwO1xyXG59O1xyXG5cclxuY29uc3QgZnJvbnRNYXAgPSBtYXBWZXJ0aWNlcyhmcm9udEdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS52ZXJ0aWNlcyk7XHJcbmNvbnN0IGJhY2tNYXAgPSBtYXBWZXJ0aWNlcyhiYWNrR2VvbWV0cnkudmVydGljZXMsIGdlb21ldHJ5LnZlcnRpY2VzKTtcclxuY29uc3QgbGVmdE1hcCA9IG1hcFZlcnRpY2VzKGxlZnRHZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkudmVydGljZXMpO1xyXG5jb25zdCByaWdodE1hcCA9IG1hcFZlcnRpY2VzKHJpZ2h0R2VvbWV0cnkudmVydGljZXMsIGdlb21ldHJ5LnZlcnRpY2VzKTtcclxuXHJcbmFkZEZhY2VzKHRvcEdlb21ldHJ5LmZhY2VzLCAoaSk9PiBpK2JvdHRvbUdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCk7XHJcbmFkZEZhY2VzKGJvdHRvbUdlb21ldHJ5LmZhY2VzLCAoaSk9PiBpKTtcclxuYWRkRmFjZXMoZnJvbnRHZW9tZXRyeS5mYWNlcywgKGkpPT4gZnJvbnRNYXBbaV0pO1xyXG5hZGRGYWNlcyhiYWNrR2VvbWV0cnkuZmFjZXMsIChpKT0+IGJhY2tNYXBbaV0pO1xyXG5hZGRGYWNlcyhsZWZ0R2VvbWV0cnkuZmFjZXMsIChpKT0+IGxlZnRNYXBbaV0pO1xyXG5hZGRGYWNlcyhyaWdodEdlb21ldHJ5LmZhY2VzLCAoaSk9PiByaWdodE1hcFtpXSk7XHJcbmZhY2VzLnBvcCgpO1xyXG5cclxuVGhyZWVVdGlscy5jb21wdXRlRmFjZVZlcnRleFV2cyhnZW9tZXRyeSwgZmFjZXMpO1xyXG5cclxuZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuLy9nZW9tZXRyeS5jb21wdXRlRmFjZU5vcm1hbHMoKTtcclxuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcbi8vZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbmdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHRydWU7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcblx0cmVzWCxcclxuXHRyZXNZLFxyXG5cdHJlc1osXHJcblx0ZmFjZXMsXHJcblx0Z2VvbWV0cnlcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvbW9kZWxzL3NoZWV0QmxvY2suanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9qcy9tb2RlbHMvc2hlZXRCbG9jay5qcyIsImNvbnN0IG1vdXNlQnV0dG9ucyA9IHtcclxuICBMZWZ0OiAwLFxyXG4gIE1pZGRsZTogMSxcclxuICBSaWdodDogMlxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3BzKCkge1xyXG4gIHJldHVybiB7XHJcbiAgICBlcHM6IDFlLTQsXHJcbiAgICBza2luOiB7XHJcbiAgICAgIGRlZmF1bHQ6ICdzaG9ydC13aGl0ZS1ib29rLXZpZXcnLFxyXG4gICAgfSxcclxuICAgIHNjYWxlOiB7XHJcbiAgICAgIGRlZmF1bHQ6IDAuOSxcclxuICAgICAgbWluOiAwLjksXHJcbiAgICAgIG1heDogMi41LFxyXG4gICAgICBsZXZlbHM6IDdcclxuICAgIH0sXHJcbiAgICBsaWdodGluZzoge1xyXG4gICAgICBkZWZhdWx0OiAwLjcsXHJcbiAgICAgIG1pbjogMCxcclxuICAgICAgbWF4OiAxLFxyXG4gICAgICBsZXZlbHM6IDdcclxuICAgIH0sXHJcbiAgICBwYW46IHtcclxuICAgICAgc3BlZWQ6IDUwXHJcbiAgICB9LFxyXG4gICAgbG9hZGluZ0FuaW1hdGlvbjoge1xyXG4gICAgICBza2luOiBmYWxzZSxcclxuICAgICAgYm9vazogdHJ1ZVxyXG4gICAgfSxcclxuICAgIGF1dG9SZXNvbHV0aW9uOiB7XHJcbiAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvZWZmaWNpZW50OiAxLjVcclxuICAgIH0sXHJcbiAgICBhY3Rpb25zOiB7XHJcbiAgICAgIGNtZFpvb21Jbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFpvb21PdXQ6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZERlZmF1bHRab29tOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnZGJsY2xpY2snLFxyXG4gICAgICAgIGNvZGU6IDBcclxuICAgICAgfSxcclxuICAgICAgY21kVG9jOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRGYXN0QmFja3dhcmQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRCYWNrd2FyZDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kRm9yd2FyZDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kRmFzdEZvcndhcmQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRTYXZlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQcmludDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kRnVsbFNjcmVlbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgd2lkU2V0dGluZ3M6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFNtYXJ0UGFuOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFNpbmdsZVBhZ2U6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgYWN0aXZlRm9yTW9iaWxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRTb3VuZHM6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRTdGF0czoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRMaWdodGluZ1VwOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRMaWdodGluZ0Rvd246IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFBhbkxlZnQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQYW5SaWdodDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFBhblVwOiB7XHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgY21kUGFuRG93bjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1vdXNlQ21kUm90YXRlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnbW91c2VkcmFnJyxcclxuICAgICAgICBjb2RlOiBtb3VzZUJ1dHRvbnMuUmlnaHRcclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWREcmFnWm9vbToge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ21vdXNlZHJhZycsXHJcbiAgICAgICAgY29kZTogbW91c2VCdXR0b25zLk1pZGRsZVxyXG4gICAgICB9LFxyXG4gICAgICBtb3VzZUNtZFBhbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ21vdXNlZHJhZycsXHJcbiAgICAgICAgY29kZTogbW91c2VCdXR0b25zLkxlZnRcclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWRXaGVlbFpvb206IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHR5cGU6ICdtb3VzZXdoZWVsJyxcclxuICAgICAgICBjb2RlOiAwXHJcbiAgICAgIH0sXHJcbiAgICAgIHRvdWNoQ21kUm90YXRlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAndG91Y2hkcmFnJyxcclxuICAgICAgICBjb2RlOiAzXHJcbiAgICAgIH0sXHJcbiAgICAgIHRvdWNoQ21kWm9vbToge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ3RvdWNoZHJhZycsXHJcbiAgICAgICAgY29kZTogMlxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFBhbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ3RvdWNoZHJhZycsXHJcbiAgICAgICAgY29kZTogMVxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFN3aXBlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAndG91Y2hkcmFnJyxcclxuICAgICAgICBjb2RlOiAxXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9wcm9wcy9ib29rQ29udHJvbGxlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2pzL3Byb3BzL2Jvb2tDb250cm9sbGVyLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEltYWdlQmFzZSBmcm9tICcuL0ltYWdlQmFzZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCbGFua0ltYWdlIGV4dGVuZHMgSW1hZ2VCYXNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IpIHtcclxuICAgIHN1cGVyKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yKTtcclxuXHJcbiAgICBQcm9taXNlLnJlc29sdmUoKS5cclxuICAgICAgdGhlbigoKT0+IHtcclxuICAgICAgICB0aGlzLnN0YXJ0UmVuZGVyID0gKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlckJsYW5rUGFnZSgpO1xyXG4gICAgICAgICAgdGhpcy5maW5pc2hSZW5kZXIoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvQmxhbmtJbWFnZS5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0JsYW5rSW1hZ2UuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9va21hcmtzIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCBpdGVtcywgZ2V0VGl0bGU9KGkpPT4gaS50aXRsZSwgZ2V0SXRlbXM9KGkpPT5pLml0ZW1zKSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIHRoaXMubWFwID0gW107XHJcbiAgICB0aGlzLmdldFRpdGxlID0gZ2V0VGl0bGU7XHJcbiAgICB0aGlzLmdldEl0ZW1zID0gZ2V0SXRlbXM7XHJcbiAgICB0aGlzLm5vZGVzID0gdGhpcy5tYXBOb2RlcyhpdGVtcywgdGhpcy5tYXApO1xyXG5cclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIHRvZ2xlOiAoZSk9PiB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGxldCBsaSA9ICQoZS50YXJnZXQpO1xyXG4gICAgICAgIHdoaWxlKGxpWzBdICYmIGxpWzBdIT09Y29udGFpbmVyWzBdICYmICFsaS5oYXNDbGFzcygnaXRlbScpKSB7XHJcbiAgICAgICAgICBsaSA9ICQobGlbMF0ucGFyZW50Tm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGxpLmhhc0NsYXNzKCdpdGVtJykpIHtcclxuICAgICAgICAgIGxldCBjbWQgPSAkKGUudGFyZ2V0KTtcclxuICAgICAgICAgIHdoaWxlKGNtZFswXSAmJiBjbWRbMF0hPT1saVswXSAmJiAhY21kLmhhc0NsYXNzKCdjbWQnKSkge1xyXG4gICAgICAgICAgICBjbWQgPSAkKGNtZFswXS5wYXJlbnROb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGNtZC5oYXNDbGFzcygnY21kJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMubWFwW2xpLmF0dHIoJ2RhdGEtaWQnKV07XHJcbiAgICAgICAgICAgIGlmKGNtZC5oYXNDbGFzcygndG9nbGUnKSkge1xyXG4gICAgICAgICAgICAgIG5vZGUubWluaW1pemVkID0gIW5vZGUubWluaW1pemVkO1xyXG4gICAgICAgICAgICAgIGlmKG5vZGUubWluaW1pemVkKSB7XHJcbiAgICAgICAgICAgICAgICBsaS5maW5kKCd1bCcpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgbGkuZmluZCgnLnRvZ2xlJykuYWRkQ2xhc3MoJ21pbmltaXplZCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxpLmZpbmQoJy50b2dsZScpLnJlbW92ZUNsYXNzKCdtaW5pbWl6ZWQnKTtcclxuICAgICAgICAgICAgICAgIGxpLmFwcGVuZCgodGhpcy5yZW5kZXJOb2RlKG5vZGUpLm1hdGNoKC88dWwuKjxcXC91bD4vKSB8fCBbJyddKVswXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmKHRoaXMub25OYXZpZ2F0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbk5hdmlnYXRlKG5vZGUuaXRlbSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29udGFpbmVyLm9uKCdjbGljaycsIHRoaXMuYmluZHMudG9nbGUpO1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIGdldFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXAubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuY29udGFpbmVyLm9mZignY2xpY2snLCB0aGlzLmJpbmRzLnRvZ2xlKTtcclxuICAgIHRoaXMuY29udGFpbmVyLmh0bWwoJycpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKCkge1xyXG4gICAgdGhpcy5jb250YWluZXIuaHRtbCh0aGlzLnJlbmRlck5vZGVzKHRoaXMubm9kZXMpKTtcclxuICB9XHJcblxyXG4gIGZvckVhY2goZiwgbm9kZXM9dGhpcy5ub2Rlcykge1xyXG4gICAgZm9yKGxldCBub2RlIG9mIChub2RlcyB8fCBbXSkpIHtcclxuICAgICAgZihub2RlKTtcclxuICAgICAgdGhpcy5mb3JFYWNoKGYsIG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwYW5kKCkge1xyXG4gICAgdGhpcy5mb3JFYWNoKChuKT0+IG4ubWluaW1pemVkID0gZmFsc2UpO1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIG1pbmltaXplKCkge1xyXG4gICAgdGhpcy5mb3JFYWNoKChuKT0+IG4ubWluaW1pemVkID0gdHJ1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyTm9kZShub2RlKSB7XHJcbiAgICByZXR1cm4gWyc8ZGl2IGNsYXNzPVwiYXJlYVwiPicsXHJcbiAgICAgIG5vZGUuY2hpbGRyZW4/ICc8YSBocmVmPVwiI1wiIGNsYXNzPVwiY21kIHRvZ2xlJyArIChub2RlLm1pbmltaXplZD8gJyBtaW5pbWl6ZWQnOiAnJykgKyAnXCI+PGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT48L2E+ICc6ICc8aSBjbGFzcz1cIndoaXRlLXNwYWNlXCI+PC9pPiAnLFxyXG4gICAgICAnPGEgY2xhc3M9XCJjbWRcIiB0aXRsZT1cIicsIG5vZGUudGl0bGUsJ1wiIGhyZWY9XCIjXCI+Jywgbm9kZS50aXRsZSwgJzwvYT48L2Rpdj4nLFxyXG4gICAgICBub2RlLm1pbmltaXplZD8gJyc6IHRoaXMucmVuZGVyTm9kZXMobm9kZS5jaGlsZHJlbilcclxuICAgIF0uam9pbignJyk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJOb2Rlcyhub2Rlcykge1xyXG4gICAgbGV0IHJlcyA9IFsnPGRpdiBjbGFzcz1cImJvb2ttYXJrc1wiPiddO1xyXG4gICAgaWYobm9kZXMgJiYgbm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgIHJlcy5wdXNoKCc8dWwgY2xhc3M9XCJsZXZlbC0nLCBub2Rlc1swXS5sZXZlbCwgJ1wiPicpO1xyXG4gICAgICBmb3IobGV0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgICByZXMucHVzaChbXHJcbiAgICAgICAgICAnPGxpIGNsYXNzPVwiaXRlbVwiIGRhdGEtaWQ9XCInLCBub2RlLmlkLCdcIj4nLFxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlck5vZGUobm9kZSksXHJcbiAgICAgICAgICAnPC9saT4nXS5qb2luKCcnKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzLnB1c2goJzwvdWw+Jyk7XHJcbiAgICB9XHJcbiAgICByZXMucHVzaCgnPC9kaXY+Jyk7XHJcbiAgICByZXR1cm4gcmVzLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcbiAgbWFwTm9kZXMoaXRlbXMsIG1hcD1bXSwgbGV2ZWw9MCkge1xyXG4gICAgbGV0IG5vZGVzID0gbnVsbDtcclxuICAgIGlmKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICBub2Rlcz1bXTtcclxuICAgICAgZm9yKGxldCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgY29uc3QgaWQgPSBtYXAubGVuZ3RoO1xyXG4gICAgICAgIG1hcC5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHtcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0VGl0bGUoaXRlbSksXHJcbiAgICAgICAgICBsZXZlbCxcclxuICAgICAgICAgIGl0ZW0sXHJcbiAgICAgICAgICBtaW5pbWl6ZWQ6IHRydWUsXHJcbiAgICAgICAgICBjaGlsZHJlbjogdGhpcy5tYXBOb2Rlcyh0aGlzLmdldEl0ZW1zKGl0ZW0pLCBtYXAsIGxldmVsKzEpXHJcbiAgICAgICAgfTtcclxuICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xyXG4gICAgICAgIG1hcFtpZF0gPSBub2RlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Cb29rbWFya3MuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9Cb29rbWFya3MuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV0ZWN0b3Ige1xyXG5cclxuXHRzdGF0aWMgY2FudmFzID0gISEgd2luZG93LkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuXHJcblx0c3RhdGljIHdlYmdsID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcblx0XHRcdHJldHVybiAhISAod2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJiAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcpKSk7XHJcblx0XHR9XHJcblx0XHRjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0fSkoKTtcclxuXHJcblx0c3RhdGljIHdvcmtlcnMgPSAhISB3aW5kb3cuV29ya2VyO1xyXG5cclxuXHRzdGF0aWMgZmlsZWFwaSA9IHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuQmxvYjtcclxuXHJcblx0c3RhdGljIGdldFdlYkdMRXJyb3JNZXNzYWdlKCkge1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0ZWxlbWVudC5pZCA9ICd3ZWJnbC1lcnJvci1tZXNzYWdlJztcclxuXHRcdGVsZW1lbnQuc3R5bGUuZm9udEZhbWlseSA9ICdtb25vc3BhY2UnO1xyXG5cdFx0ZWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxM3B4JztcclxuXHRcdGVsZW1lbnQuc3R5bGUuZm9udFdlaWdodCA9ICdub3JtYWwnO1xyXG5cdFx0ZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuXHRcdGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJztcclxuXHRcdGVsZW1lbnQuc3R5bGUuY29sb3IgPSAnIzAwMCc7XHJcblx0XHRlbGVtZW50LnN0eWxlLnBhZGRpbmcgPSAnMS41ZW0nO1xyXG5cdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9ICc0MDBweCc7XHJcblx0XHRlbGVtZW50LnN0eWxlLm1hcmdpbiA9ICc1ZW0gYXV0byAwJztcclxuXHJcblx0XHRpZiAoIURldGVjdG9yLndlYmdsKSB7XHJcblx0XHRcdGVsZW1lbnQuaW5uZXJIVE1MID0gd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCA/IFtcclxuXHRcdFx0XHQnWW91ciBncmFwaGljcyBjYXJkIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCA8YSBocmVmPVwiaHR0cDovL2tocm9ub3Mub3JnL3dlYmdsL3dpa2kvR2V0dGluZ19hX1dlYkdMX0ltcGxlbWVudGF0aW9uXCIgc3R5bGU9XCJjb2xvcjojMDAwXCI+V2ViR0w8L2E+LjxiciAvPicsXHJcblx0XHRcdFx0J0ZpbmQgb3V0IGhvdyB0byBnZXQgaXQgPGEgaHJlZj1cImh0dHA6Ly9nZXQud2ViZ2wub3JnL1wiIHN0eWxlPVwiY29sb3I6IzAwMFwiPmhlcmU8L2E+LidcclxuXHRcdFx0XS5qb2luKCdcXG4nKSA6IFtcclxuXHRcdFx0XHQnWW91ciBicm93c2VyIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCA8YSBocmVmPVwiaHR0cDovL2tocm9ub3Mub3JnL3dlYmdsL3dpa2kvR2V0dGluZ19hX1dlYkdMX0ltcGxlbWVudGF0aW9uXCIgc3R5bGU9XCJjb2xvcjojMDAwXCI+V2ViR0w8L2E+Ljxici8+JyxcclxuXHRcdFx0XHQnRmluZCBvdXQgaG93IHRvIGdldCBpdCA8YSBocmVmPVwiaHR0cDovL2dldC53ZWJnbC5vcmcvXCIgc3R5bGU9XCJjb2xvcjojMDAwXCI+aGVyZTwvYT4uJ1xyXG5cdFx0XHRdLmpvaW4oJ1xcbicpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGVsZW1lbnQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWRkR2V0V2ViR0xNZXNzYWdlKHBhcmFtZXRlcnMpIHtcclxuXHRcdGxldCBwYXJlbnQsIGlkLCBlbGVtZW50O1xyXG5cdFx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XHJcblxyXG5cdFx0cGFyZW50ID0gcGFyYW1ldGVycy5wYXJlbnQgfHwgJChkb2N1bWVudC5ib2R5KTtcclxuXHRcdGlkID0gcGFyYW1ldGVycy5pZCB8fCAnb2xkaWUnO1xyXG5cclxuXHRcdGVsZW1lbnQgPSBEZXRlY3Rvci5nZXRXZWJHTEVycm9yTWVzc2FnZSgpO1xyXG5cdFx0Ly9lbGVtZW50LmlkID0gaWQ7XHJcblxyXG5cdFx0cGFyZW50LmFwcGVuZChlbGVtZW50KTtcclxuXHR9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0RldGVjdG9yLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvRGV0ZWN0b3IuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb2NNb3VzZVNpbXVsYXRvciB7XHJcblxyXG4gIHN0YXRpYyBIT1ZFUiA9ICdTSU1VTEFURUQtSE9WRVInO1xyXG4gIHN0YXRpYyBBQ1RJVkUgPSAnU0lNVUxBVEVELUFDVElWRSc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGpGcmFtZSwgZWxlbWVudCwgYkVsZW1lbnQ9ZG9jdW1lbnQuYm9keSkge1xyXG4gICAgdGhpcy5qRnJhbWUgPSBqRnJhbWU7XHJcbiAgICB0aGlzLnduZCA9IGpGcmFtZVswXS5jb250ZW50V2luZG93O1xyXG4gICAgdGhpcy5kb2MgPSBqRnJhbWVbMF0uY29udGVudERvY3VtZW50O1xyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudCB8fCBkb2MuYm9keTtcclxuICAgIHRoaXMuYkVsZW1lbnQgPSBiRWxlbWVudDtcclxuICAgIHRoaXMucmVzZW5kUHJvcGVydGllcyA9IHRoaXMuZ2V0RGVmYXVsdFJlc2VuZFByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMudW5kZWZpbmVkUHJvcGVydGllcyA9IHRoaXMuZ2V0RGVmYXVsdFVuZGVmaW5lZFByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMuY3Vyc29ycyA9IFtdO1xyXG4gICAgdGhpcy5vbkRvY0NoYW5nZUNsYnMgPSBbXTtcclxuICAgIGNvbnN0IHRlcm1zID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbmQ6ICc6aG92ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogJy4nK0RvY01vdXNlU2ltdWxhdG9yLkhPVkVSXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmaW5kOiAnOmFjdGl2ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlOiAnLicrRG9jTW91c2VTaW11bGF0b3IuQUNUSVZFXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBdO1xyXG4gICAgbGV0IHN0eWxlID0gWyc8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+J107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZG9jLnN0eWxlU2hlZXRzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGxldCBzcyA9IHRoaXMuZG9jLnN0eWxlU2hlZXRzW2ldO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNzLmNzc1J1bGVzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgbGV0IHIgPSBzcy5jc3NSdWxlc1tqXSwgY3NzVGV4dDtcclxuICAgICAgICBmb3IobGV0IHRlcm0gb2YgdGVybXMpIHtcclxuICAgICAgICAgIGlmICh+ci5zZWxlY3RvclRleHQuaW5kZXhPZih0ZXJtLmZpbmQpKSB7XHJcbiAgICAgICAgICAgIGNzc1RleHQgPSAoY3NzVGV4dCB8fCByLmNzc1RleHQpLnJlcGxhY2UobmV3IFJlZ0V4cCh0ZXJtLmZpbmQsICdnJyksIHRlcm0ucmVwbGFjZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNzc1RleHQpIHtcclxuICAgICAgICAgIHN0eWxlLnB1c2goY3NzVGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBzdHlsZS5wdXNoKCc8L3N0eWxlPicpO1xyXG4gICAgJCh0aGlzLmRvYy5oZWFkKS5hcHBlbmQoJChzdHlsZS5qb2luKCcnKSkpO1xyXG4gIH1cclxuXHJcbiAgY29udmVydENvb3Jkcyh4LCB5KSB7XHJcbiAgICBjb25zdCBqRWxlbWVudCA9ICQodGhpcy5lbGVtZW50KTtcclxuICAgIGNvbnN0IG9mZnNldCA9IGpFbGVtZW50Lm9mZnNldCgpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgeDogb2Zmc2V0LmxlZnQrakVsZW1lbnQud2lkdGgoKSp4LFxyXG4gICAgICB5OiBvZmZzZXQudG9wK2pFbGVtZW50LmhlaWdodCgpKigxLXkpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsIGUsIHAsIHR5cGUsIGFkdmFuY2VkUHJvcHMpIHtcclxuICAgIGNvbnN0IHByb3BzID0ge307XHJcbiAgICBmb3IobGV0IG4gb2YgdGhpcy5yZXNlbmRQcm9wZXJ0aWVzKSB7XHJcbiAgICAgIHByb3BzW25dID0gZVtuXTtcclxuICAgIH1cclxuICAgIGZvcihsZXQgbiBvZiB0aGlzLnVuZGVmaW5lZFByb3BlcnRpZXMpIHtcclxuICAgICAgcHJvcHNbbl0gPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBmb3IobGV0IG4gaW4gYWR2YW5jZWRQcm9wcykge1xyXG4gICAgICBpZihhZHZhbmNlZFByb3BzLmhhc093blByb3BlcnR5KG4pKSB7XHJcbiAgICAgICAgcHJvcHNbbl0gPSBhZHZhbmNlZFByb3BzW25dO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm9wcy52aWV3ID0gdGhpcy53bmQ7XHJcbiAgICBwcm9wcy5wYWdlWCA9IHAueDtcclxuICAgIHByb3BzLnBhZ2VZID0gcC55O1xyXG4gICAgY29uc3QgakUgPSAkLkV2ZW50KHR5cGUsIHByb3BzKTtcclxuICAgIGpFLnRpbWVTdGFtcCA9IGUudGltZVN0YW1wO1xyXG4gICAgJChlbGVtZW50KS50cmlnZ2VyKGpFKTtcclxuICB9XHJcblxyXG4gIGFkZENsYXNzKGVsZW1lbnQsIG5hbWUpIHtcclxuICAgICQoZWxlbWVudCkuYWRkQ2xhc3MobmFtZSk7XHJcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMud25kLmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XHJcbiAgICB0aGlzLmN1cnNvcnMucHVzaCgkKHRoaXMuYkVsZW1lbnQpLmNzcygnY3Vyc29yJykpO1xyXG4gICAgJCh0aGlzLmJFbGVtZW50KS5jc3MoJ2N1cnNvcicsIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2N1cnNvcicpKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUNsYXNzKGVsZW1lbnQsIG5hbWUpIHtcclxuICAgICQoZWxlbWVudCkucmVtb3ZlQ2xhc3MobmFtZSk7XHJcbiAgICAkKHRoaXMuYkVsZW1lbnQpLmNzcygnY3Vyc29yJywgdGhpcy5jdXJzb3JzLnBvcCgpKTtcclxuICB9XHJcblxyXG4gIGVudGVyRWxlbWVudChlbGVtZW50KSB7XHJcbiAgICB0aGlzLmFkZENsYXNzKGVsZW1lbnQsIERvY01vdXNlU2ltdWxhdG9yLkhPVkVSKTtcclxuICB9XHJcblxyXG4gIGxlYXZlRWxlbWVudChlbGVtZW50KSB7XHJcbiAgICB0aGlzLnJlbW92ZUNsYXNzKGVsZW1lbnQsIERvY01vdXNlU2ltdWxhdG9yLkhPVkVSKTtcclxuICB9XHJcblxyXG4gIGFjdGl2YXRlRWxlbWVudChlbGVtZW50KSB7XHJcbiAgICB0aGlzLmFkZENsYXNzKGVsZW1lbnQsIERvY01vdXNlU2ltdWxhdG9yLkFDVElWRSk7XHJcbiAgfVxyXG5cclxuICBkZWFjdGl2YXRlRWxlbWVudChlbGVtZW50KSB7XHJcbiAgICB0aGlzLnJlbW92ZUNsYXNzKGVsZW1lbnQsIERvY01vdXNlU2ltdWxhdG9yLkFDVElWRSk7XHJcbiAgfVxyXG5cclxuICBhZGREb2NDaGFuZ2VDbGIoY2xiKSB7XHJcbiAgICB0aGlzLm9uRG9jQ2hhbmdlQ2xicy5wdXNoKGNsYik7XHJcbiAgfVxyXG5cclxuICBub3RpZnkoKSB7XHJcbiAgICBmb3IobGV0IGNsYiBvZiB0aGlzLm9uRG9jQ2hhbmdlQ2xicykge1xyXG4gICAgICBjbGIodGhpcy53bmQsIHRoaXMuZG9jKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVsZW1lbnRGcm9tUG9pbnQocCkge1xyXG4gICAgbGV0IG5vZGUgPSB0aGlzLmRvYy5ib2R5LCBuZXh0ID0gdHJ1ZTtcclxuICAgIHdoaWxlKG5leHQpIHtcclxuICAgICAgbmV4dCA9IGZhbHNlO1xyXG4gICAgICBmb3IobGV0IGk9MDsgaTxub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICBpZihjaGlsZCBpbnN0YW5jZW9mIHRoaXMud25kLkVsZW1lbnQpIHtcclxuICAgICAgICAgIGNvbnN0IGpDID0gJChjaGlsZCksIG9mZnNldCA9IGpDLm9mZnNldCgpLCBoZWlnaHQgPSBqQy5oZWlnaHQoKSwgd2lkdGggPSBqQy53aWR0aCgpO1xyXG4gICAgICAgICAgaWYocC54Pm9mZnNldC5sZWZ0ICYmIHAueDxvZmZzZXQubGVmdCt3aWR0aCAmJiBwLnk+b2Zmc2V0LnRvcCAmJiBwLnk8b2Zmc2V0LnRvcCtoZWlnaHQpIHtcclxuICAgICAgICAgICAgbm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICBuZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZTtcclxuICB9XHJcblxyXG4gIGdldEVsZW1lbnQocCkge1xyXG4gICAgY29uc3Qgb2ZmMCA9IHRoaXMuakZyYW1lLm9mZnNldCgpO1xyXG4gICAgdGhpcy5qRnJhbWUub2Zmc2V0KHtsZWZ0OiAwLjUqd2luZG93LmlubmVyV2lkdGgtcC54LCB0b3A6IDAuNSp3aW5kb3cuaW5uZXJIZWlnaHQtcC55fSk7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuZG9jLmVsZW1lbnRGcm9tUG9pbnQocC54LCBwLnkpO1xyXG4gICAgaWYoIWVsZW1lbnQpIHsgLy8gaXQgaXNuJ3QgYSBqb2tlIGl0J3MgSUVcclxuICAgICAgZWxlbWVudCA9IHRoaXMuZG9jLmVsZW1lbnRGcm9tUG9pbnQocC54LCBwLnkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5qRnJhbWUub2Zmc2V0KG9mZjApO1xyXG4gICAgcmV0dXJuIGVsZW1lbnQ/IGVsZW1lbnQ6IHRoaXMuZWxlbWVudEZyb21Qb2ludChwKTtcclxuICB9XHJcblxyXG4gIHNpbXVsYXRlKGUsIGRvYywgeCwgeSkge1xyXG4gICAgY29uc3QgcCA9IHRoaXMuY29udmVydENvb3Jkcyh4LCB5KSxcclxuICAgICAgICAgIGVsZW1lbnQgPSBkb2M9PT10aGlzLmRvYz8gdGhpcy5nZXRFbGVtZW50KHApOiB1bmRlZmluZWQ7XHJcbiAgICBsZXQgdHJpZ2dlciA9IGVsZW1lbnQgIT09IHVuZGVmaW5lZCwgbm90aWZ5ID0gZmFsc2U7XHJcblxyXG4gICAgc3dpdGNoKGUudHlwZSkge1xyXG4gICAgICBjYXNlICdtb3VzZWRvd24nOiB7XHJcbiAgICAgICAgaWYodGhpcy5jYXBFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVFbGVtZW50KHRoaXMuY2FwRWxlbWVudCk7XHJcbiAgICAgICAgICBub3RpZnkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhcEVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgICAgIGlmKHRoaXMuY2FwRWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmF0ZUVsZW1lbnQodGhpcy5jYXBFbGVtZW50KTtcclxuICAgICAgICAgIG5vdGlmeSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ21vdXNldXAnOiB7XHJcbiAgICAgICAgaWYodGhpcy5jYXBFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmRlYWN0aXZhdGVFbGVtZW50KHRoaXMuY2FwRWxlbWVudCk7XHJcbiAgICAgICAgICBub3RpZnkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRpbWVTdGFtcCA9IGUudGltZVN0YW1wO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2NsaWNrJzoge1xyXG4gICAgICAgIHRyaWdnZXIgPSBlbGVtZW50ICYmIHRoaXMuY2FwRWxlbWVudCA9PT0gZWxlbWVudCAmJiBlLnRpbWVTdGFtcCA9PT0gdGhpcy50aW1lU3RhbXA7XHJcbiAgICAgICAgdGhpcy5jYXBFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ21vdXNlZW50ZXInOlxyXG4gICAgICBjYXNlICdtb3VzZW92ZXInOlxyXG4gICAgICBjYXNlICdtb3VzZW1vdmUnOiB7XHJcbiAgICAgICAgbGV0IGxlYXZlZCA9IG51bGw7XHJcbiAgICAgICAgaWYodGhpcy5ob3ZFbGVtZW50ICE9PSBlbGVtZW50ICYmIHRoaXMuaG92RWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQodGhpcy5ob3ZFbGVtZW50LCBlLCBwLCAnbW91c2VvdXQnLCB7cmVsYXRlZFRhcmdldDogZWxlbWVudD8gZWxlbWVudDogbnVsbH0pO1xyXG4gICAgICAgICAgdGhpcy5sZWF2ZUVsZW1lbnQodGhpcy5ob3ZFbGVtZW50KTtcclxuICAgICAgICAgIGxlYXZlZCA9IHRoaXMuaG92RWxlbWVudDtcclxuICAgICAgICAgIHRoaXMuaG92RWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIG5vdGlmeSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLmhvdkVsZW1lbnQgJiYgZWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZWxlbWVudCwgZSwgcCwgJ21vdXNlb3ZlcicsIHtyZWxhdGVkVGFyZ2V0OiBsZWF2ZWR9KTtcclxuICAgICAgICAgIHRoaXMuZW50ZXJFbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgICAgICAgdGhpcy5ob3ZFbGVtZW50ID0gZWxlbWVudDtcclxuICAgICAgICAgIG5vdGlmeSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyaWdnZXIgPSBlbGVtZW50ICYmIGUudHlwZSA9PT0gJ21vdXNlbW92ZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbW91c2VsZWF2ZSc6XHJcbiAgICAgIGNhc2UgJ21vdXNlb3V0Jzoge1xyXG4gICAgICAgIGlmKHRoaXMuaG92RWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQodGhpcy5ob3ZFbGVtZW50LCBlLCBwLCAnbW91c2VvdXQnLCB7cmVsYXRlZFRhcmdldDogZS5yZWxhdGVkVGFyZ2V0fSk7XHJcbiAgICAgICAgICB0aGlzLmxlYXZlRWxlbWVudCh0aGlzLmhvdkVsZW1lbnQpO1xyXG4gICAgICAgICAgdGhpcy5ob3ZFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgbm90aWZ5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJpZ2dlciA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZih0cmlnZ2VyKSB7XHJcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGVsZW1lbnQsIGUsIHAsIGUudHlwZSk7XHJcbiAgICB9XHJcbiAgICBpZihub3RpZnkpIHtcclxuICAgICAgdGhpcy5ub3RpZnkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERlZmF1bHRVbmRlZmluZWRQcm9wZXJ0aWVzKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ2NsaWVudFgnLFxyXG4gICAgICAnY2xpZW50WScsXHJcbiAgICAgICdvZmZzZXRYJyxcclxuICAgICAgJ29mZnNldFknLFxyXG4gICAgICAnc2NyZWVuWCcsXHJcbiAgICAgICdzY3JlZW5ZJ1xyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldERlZmF1bHRSZXNlbmRQcm9wZXJ0aWVzKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ2FsdEtleScsXHJcbiAgICAgICdidWJibGVzJyxcclxuICAgICAgJ2J1dHRvbicsXHJcbiAgICAgICdidXR0b25zJyxcclxuICAgICAgJ2NhbmNlbGFibGUnLFxyXG4gICAgICAnY2hhbmdlZFRvdWNoZXMnLFxyXG4gICAgICAnY2hhcicsXHJcbiAgICAgICdjaGFyQ29kZScsXHJcbiAgICAgICdjdHJsS2V5JyxcclxuICAgICAgJ2RhdGEnLFxyXG4gICAgICAnZGV0YWlsJyxcclxuICAgICAgJ2V2ZW50UGhhc2UnLFxyXG4gICAgICAnaXNEZWZhdWx0UHJldmVudGVkJyxcclxuICAgICAgJ2tleScsXHJcbiAgICAgICdrZXlDb2RlJyxcclxuICAgICAgJ21ldGFLZXknLFxyXG4gICAgICAncG9pbnRlcklkJyxcclxuICAgICAgJ3BvaW50ZXJUeXBlJyxcclxuICAgICAgJ3NoaWZ0S2V5JyxcclxuICAgICAgJ3RhcmdldFRvdWNoZXMnLFxyXG4gICAgICAndG91Y2hlcycsXHJcbiAgICAgICd3aGljaCdcclxuICAgIF07XHJcbiAgfVxyXG5cclxufVxyXG5cclxuLypcclxuYWx0S2V5LFxyXG5idWJibGVzLFxyXG5idXR0b24sXHJcbmJ1dHRvbnMsXHJcbmNhbmNlbGFibGUsXHJcbmNoYW5nZWRUb3VjaGVzLFxyXG5jaGFyLFxyXG5jaGFyQ29kZSxcclxuY2xpZW50WCxcclxuY2xpZW50WSxcclxuY3RybEtleSxcclxuY3VycmVudFRhcmdldCxcclxuZGF0YSxcclxuZGVsZWdhdGVUYXJnZXQsXHJcbmRldGFpbCxcclxuZXZlbnRQaGFzZSxcclxuaGFuZGxlT2JqLFxyXG5pc0RlZmF1bHRQcmV2ZW50ZWQsXHJcbmtleSxcclxua2V5Q29kZSxcclxubWV0YUtleSxcclxub2Zmc2V0WCxcclxub2Zmc2V0WSxcclxub3JpZ2luYWxFdmVudCxcclxucGFnZVgsXHJcbnBhZ2VZLFxyXG5wb2ludGVySWQsXHJcbnBvaW50ZXJUeXBlLFxyXG5yZWxhdGVkVGFyZ2V0LFxyXG5zY3JlZW5YLFxyXG5zY3JlZW5ZLFxyXG5zaGlmdEtleSxcclxudGFyZ2V0LFxyXG50YXJnZXRUb3VjaGVzLFxyXG50aW1lU3RhbXAsXHJcbnRvRWxlbWVudCxcclxudG91Y2hlcyxcclxudHlwZSxcclxudmlldyxcclxud2hpY2hcclxuKi9cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvRG9jTW91c2VTaW11bGF0b3IuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9Eb2NNb3VzZVNpbXVsYXRvci5qcyIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIERvbTJJbWFnZSB7XG5cbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIGNhY2hlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy53aW5kb3cgPSB3bmQ7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvYztcbiAgICB0aGlzLmNhY2hlID0gY2FjaGU7XG5cbiAgICBjb25zdCB1dGlsID0gbmV3VXRpbCgpO1xuICAgIGNvbnN0IGlubGluZXIgPSBuZXdJbmxpbmVyKCk7XG4gICAgY29uc3QgZm9udEZhY2VzID0gbmV3Rm9udEZhY2VzKCk7XG4gICAgY29uc3QgaW1hZ2VzID0gbmV3SW1hZ2VzKCk7XG5cbiAgICB0aGlzLnRvU3ZnID0gdG9Tdmc7XG4gICAgdGhpcy50b1BuZyA9IHRvUG5nO1xuICAgIHRoaXMudG9KcGVnID0gdG9KcGVnO1xuICAgIHRoaXMudG9CbG9iID0gdG9CbG9iO1xuICAgIHRoaXMudG9QaXhlbERhdGEgPSB0b1BpeGVsRGF0YTtcbiAgICB0aGlzLmltcGwgPSB7XG4gICAgICAgICAgICAgICAgICBmb250RmFjZXM6IGZvbnRGYWNlcyxcbiAgICAgICAgICAgICAgICAgIGltYWdlczogaW1hZ2VzLFxuICAgICAgICAgICAgICAgICAgdXRpbDogdXRpbCxcbiAgICAgICAgICAgICAgICAgIGlubGluZXI6IGlubGluZXJcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5maWx0ZXIgLSBTaG91bGQgcmV0dXJuIHRydWUgaWYgcGFzc2VkIG5vZGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXRcbiAgICAgKiAgICAgICAgICAoZXhjbHVkaW5nIG5vZGUgbWVhbnMgZXhjbHVkaW5nIGl0J3MgY2hpbGRyZW4gYXMgd2VsbCkuIE5vdCBjYWxsZWQgb24gdGhlIHJvb3Qgbm9kZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5iZ2NvbG9yIC0gY29sb3IgZm9yIHRoZSBiYWNrZ3JvdW5kLCBhbnkgdmFsaWQgQ1NTIGNvbG9yIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLndpZHRoIC0gd2lkdGggdG8gYmUgYXBwbGllZCB0byBub2RlIGJlZm9yZSByZW5kZXJpbmcuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuaGVpZ2h0IC0gaGVpZ2h0IHRvIGJlIGFwcGxpZWQgdG8gbm9kZSBiZWZvcmUgcmVuZGVyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLnN0eWxlIC0gYW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgdG8gYmUgY29waWVkIHRvIG5vZGUncyBzdHlsZSBiZWZvcmUgcmVuZGVyaW5nLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLnF1YWxpdHkgLSBhIE51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5kaWNhdGluZyBpbWFnZSBxdWFsaXR5IChhcHBsaWNhYmxlIHRvIEpQRUcgb25seSksXG4gICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gMS4wLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBTVkcgaW1hZ2UgZGF0YSBVUkxcbiAgICAgKiAqL1xuXG4gICAgZnVuY3Rpb24gdG9Tdmcobm9kZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShub2RlKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVOb2RlKG5vZGUsIG9wdGlvbnMuZmlsdGVyLCB0cnVlKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihlbWJlZEZvbnRzKVxuICAgICAgICAgICAgLnRoZW4oaW5saW5lSW1hZ2VzKVxuICAgICAgICAgICAgLnRoZW4oYXBwbHlPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTdmdEYXRhVXJpKGNsb25lLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLndpZHRoIHx8IHV0aWwud2lkdGgobm9kZSksXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVpZ2h0IHx8IHV0aWwuaGVpZ2h0KG5vZGUpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5T3B0aW9ucyhjbG9uZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmdjb2xvcikgY2xvbmUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gb3B0aW9ucy5iZ2NvbG9yO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy53aWR0aCkgY2xvbmUuc3R5bGUud2lkdGggPSBvcHRpb25zLndpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhlaWdodCkgY2xvbmUuc3R5bGUuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgKyAncHgnO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdHlsZSlcbiAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5PYmplY3Qua2V5cyhvcHRpb25zLnN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICBjbG9uZS5zdHlsZVtwcm9wZXJ0eV0gPSBvcHRpb25zLnN0eWxlW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLCBAc2VlIHtAbGluayB0b1N2Z31cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgVWludDhBcnJheSBjb250YWluaW5nIFJHQkEgcGl4ZWwgZGF0YS5cbiAgICAgKiAqL1xuICAgIGZ1bmN0aW9uIHRvUGl4ZWxEYXRhKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRyYXcobm9kZSwgb3B0aW9ucyB8fCB7fSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FudmFzLmdldENvbnRleHQoJzJkJykuZ2V0SW1hZ2VEYXRhKFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICB1dGlsLndpZHRoKG5vZGUpLFxuICAgICAgICAgICAgICAgICAgICB1dGlsLmhlaWdodChub2RlKVxuICAgICAgICAgICAgICAgICkuZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gTm9kZSBvYmplY3QgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBSZW5kZXJpbmcgb3B0aW9ucywgQHNlZSB7QGxpbmsgdG9Tdmd9XG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gLSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIFBORyBpbWFnZSBkYXRhIFVSTFxuICAgICAqICovXG4gICAgZnVuY3Rpb24gdG9Qbmcobm9kZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZHJhdyhub2RlLCBvcHRpb25zIHx8IHt9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgRE9NIE5vZGUgb2JqZWN0IHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMsIEBzZWUge0BsaW5rIHRvU3ZnfVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBKUEVHIGltYWdlIGRhdGEgVVJMXG4gICAgICogKi9cbiAgICBmdW5jdGlvbiB0b0pwZWcobm9kZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIGRyYXcobm9kZSwgb3B0aW9ucylcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjYW52YXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIG9wdGlvbnMucXVhbGl0eSB8fCAxLjApO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLCBAc2VlIHtAbGluayB0b1N2Z31cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgUE5HIGltYWdlIGJsb2JcbiAgICAgKiAqL1xuICAgIGZ1bmN0aW9uIHRvQmxvYihub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMgfHwge30pXG4gICAgICAgICAgICAudGhlbih1dGlsLmNhbnZhc1RvQmxvYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHJhdyhkb21Ob2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0b1N2Zyhkb21Ob2RlLCBvcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4odXRpbC5tYWtlSW1hZ2UpXG4gICAgICAgICAgICAudGhlbih1dGlsLmRlbGF5KDEwMCkpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSBuZXdDYW52YXMoZG9tTm9kZSk7XG4gICAgICAgICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gbmV3Q2FudmFzKGRvbU5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSBvcHRpb25zLndpZHRoIHx8IHV0aWwud2lkdGgoZG9tTm9kZSk7XG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgfHwgdXRpbC5oZWlnaHQoZG9tTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmJnY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iZ2NvbG9yO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVOb2RlKG5vZGUsIGZpbHRlciwgcm9vdCkge1xuICAgICAgICBpZiAoIXJvb3QgJiYgZmlsdGVyICYmICFmaWx0ZXIobm9kZSkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpXG4gICAgICAgICAgICAudGhlbihtYWtlTm9kZUNvcHkpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmVDaGlsZHJlbihub2RlLCBjbG9uZSwgZmlsdGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0Nsb25lKG5vZGUsIGNsb25lKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIG1ha2VOb2RlQ29weShub2RlKSB7XG4gICAgICAgICAgICBpZiAodXRpbC5pc0NhbnZhcyhub2RlKSkgcmV0dXJuIHV0aWwubWFrZUltYWdlKG5vZGUudG9EYXRhVVJMKCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNsb25lQ2hpbGRyZW4ob3JpZ2luYWwsIGNsb25lLCBmaWx0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gb3JpZ2luYWwuY2hpbGROb2RlcztcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmUpO1xuXG4gICAgICAgICAgICByZXR1cm4gY2xvbmVDaGlsZHJlbkluT3JkZXIoY2xvbmUsIHV0aWwuYXNBcnJheShjaGlsZHJlbiksIGZpbHRlcilcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gY2xvbmVDaGlsZHJlbkluT3JkZXIocGFyZW50LCBjaGlsZHJlbiwgZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRvbmUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gZG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZU5vZGUoY2hpbGQsIGZpbHRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNoaWxkQ2xvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRDbG9uZSkgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkQ2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwcm9jZXNzQ2xvbmUob3JpZ2luYWwsIGNsb25lKSB7XG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNFbGVtZW50KGNsb25lKSkgcmV0dXJuIGNsb25lO1xuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICAudGhlbihjbG9uZVN0eWxlKVxuICAgICAgICAgICAgICAgIC50aGVuKGNsb25lUHNldWRvRWxlbWVudHMpXG4gICAgICAgICAgICAgICAgLnRoZW4oY29weVVzZXJJbnB1dClcbiAgICAgICAgICAgICAgICAudGhlbihmaXhTdmcpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsb25lU3R5bGUoKSB7XG4gICAgICAgICAgICAgICAgY29weVN0eWxlKHNlbGYud2luZG93LmdldENvbXB1dGVkU3R5bGUob3JpZ2luYWwpLCBjbG9uZS5zdHlsZSk7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3B5U3R5bGUoc291cmNlLCB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jc3NUZXh0KSB0YXJnZXQuY3NzVGV4dCA9IHNvdXJjZS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvcHlQcm9wZXJ0aWVzKHNvdXJjZSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3B5UHJvcGVydGllcyhzb3VyY2UsIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5hc0FycmF5KHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFByb3BlcnR5VmFsdWUobmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRQcm9wZXJ0eVByaW9yaXR5KG5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9uZVBzZXVkb0VsZW1lbnRzKCkge1xuICAgICAgICAgICAgICAgIFsnOmJlZm9yZScsICc6YWZ0ZXInXS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lUHNldWRvRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsb25lUHNldWRvRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gc2VsZi53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvcmlnaW5hbCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT09ICcnIHx8IGNvbnRlbnQgPT09ICdub25lJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHV0aWwudWlkKCk7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lLmNsYXNzTmFtZSA9IGNsb25lLmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gc2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZm9ybWF0UHNldWRvRWxlbWVudFN0eWxlKGNsYXNzTmFtZSwgZWxlbWVudCwgc3R5bGUpKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRQc2V1ZG9FbGVtZW50U3R5bGUoY2xhc3NOYW1lLCBlbGVtZW50LCBzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAnLicgKyBjbGFzc05hbWUgKyAnOicgKyBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3NzVGV4dCA9IHN0eWxlLmNzc1RleHQgPyBmb3JtYXRDc3NUZXh0KHN0eWxlKSA6IGZvcm1hdENzc1Byb3BlcnRpZXMoc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc2VsZWN0b3IgKyAneycgKyBjc3NUZXh0ICsgJ30nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0Q3NzVGV4dChzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmNzc1RleHQgKyAnIGNvbnRlbnQ6ICcgKyBjb250ZW50ICsgJzsnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRDc3NQcm9wZXJ0aWVzKHN0eWxlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hc0FycmF5KHN0eWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZvcm1hdFByb3BlcnR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignOyAnKSArICc7JztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAnOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkobmFtZSkgPyAnICFpbXBvcnRhbnQnIDogJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gY29weVVzZXJJbnB1dCgpIHtcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc1RleHRBcmVhKG9yaWdpbmFsKSkgY2xvbmUuaW5uZXJIVE1MID0gb3JpZ2luYWwudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNJbnB1dChvcmlnaW5hbCkpIGNsb25lLnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIG9yaWdpbmFsLnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gZml4U3ZnKCkge1xuICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc1NWRyhjbG9uZSkpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXV0aWwuaXNTVkdSZWN0KGNsb25lKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIFsnd2lkdGgnLCAnaGVpZ2h0J10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xvbmUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBjbG9uZS5zdHlsZS5zZXRQcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVtYmVkRm9udHMobm9kZSkge1xuICAgICAgICByZXR1cm4gZm9udEZhY2VzLnJlc29sdmVBbGwoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdHlsZU5vZGUpO1xuICAgICAgICAgICAgICAgIHN0eWxlTm9kZS5hcHBlbmRDaGlsZChzZWxmLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1RleHQpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlubGluZUltYWdlcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBpbWFnZXMuaW5saW5lQWxsKG5vZGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlU3ZnRGF0YVVyaShub2RlLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNlbGYud2luZG93LlhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih1dGlsLmVzY2FwZVhodG1sKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHhodG1sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJyxcbiAgICAgICAgICAgICAgICAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCInLCB3aWR0aCwgJ1wiIGhlaWdodD1cIicsIGhlaWdodCwgJ1wiPicsXG4gICAgICAgICAgICAgICAgICAnPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIj4nLCB4aHRtbCwgJzwvZm9yZWlnbk9iamVjdD4nLFxuICAgICAgICAgICAgICAgICc8L3N2Zz4nXS5qb2luKCcnKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5ld1V0aWwoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlc2NhcGU6IGVzY2FwZSxcbiAgICAgICAgICAgIHBhcnNlRXh0ZW5zaW9uOiBwYXJzZUV4dGVuc2lvbixcbiAgICAgICAgICAgIG1pbWVUeXBlOiBtaW1lVHlwZSxcbiAgICAgICAgICAgIGRhdGFBc1VybDogZGF0YUFzVXJsLFxuICAgICAgICAgICAgaXNEYXRhVXJsOiBpc0RhdGFVcmwsXG4gICAgICAgICAgICBjYW52YXNUb0Jsb2I6IGNhbnZhc1RvQmxvYixcbiAgICAgICAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsXG4gICAgICAgICAgICBnZXRBbmRFbmNvZGU6IGdldEFuZEVuY29kZSxcbiAgICAgICAgICAgIHVpZDogdWlkKCksXG4gICAgICAgICAgICBkZWxheTogZGVsYXksXG4gICAgICAgICAgICBhc0FycmF5OiBhc0FycmF5LFxuICAgICAgICAgICAgZXNjYXBlWGh0bWw6IGVzY2FwZVhodG1sLFxuICAgICAgICAgICAgbWFrZUltYWdlOiBtYWtlSW1hZ2UsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcblxuICAgICAgICAgICAgaXNFbGVtZW50LFxuICAgICAgICAgICAgaXNDYW52YXMsXG4gICAgICAgICAgICBpc1RleHRBcmVhLFxuICAgICAgICAgICAgaXNJbnB1dCxcbiAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgaXNTVkdSZWN0LFxuICAgICAgICAgICAgaXNJbWFnZVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIG1pbWVzKCkge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIE9ubHkgV09GRiBhbmQgRU9UIG1pbWUgdHlwZXMgZm9yIGZvbnRzIGFyZSAncmVhbCdcbiAgICAgICAgICAgICAqIHNlZSBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL21lZGlhLXR5cGVzLnhodG1sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IFdPRkYgPSAnYXBwbGljYXRpb24vZm9udC13b2ZmJztcbiAgICAgICAgICAgIGNvbnN0IEpQRUcgPSAnaW1hZ2UvanBlZyc7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJ3dvZmYnOiBXT0ZGLFxuICAgICAgICAgICAgICAgICd3b2ZmMic6IFdPRkYsXG4gICAgICAgICAgICAgICAgJ3R0Zic6ICdhcHBsaWNhdGlvbi9mb250LXRydWV0eXBlJyxcbiAgICAgICAgICAgICAgICAnZW90JzogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0JyxcbiAgICAgICAgICAgICAgICAncG5nJzogJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICAgICAgJ2pwZyc6IEpQRUcsXG4gICAgICAgICAgICAgICAgJ2pwZWcnOiBKUEVHLFxuICAgICAgICAgICAgICAgICdnaWYnOiAnaW1hZ2UvZ2lmJyxcbiAgICAgICAgICAgICAgICAndGlmZic6ICdpbWFnZS90aWZmJyxcbiAgICAgICAgICAgICAgICAnc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcGFyc2VFeHRlbnNpb24odXJsKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IC9cXC4oW15cXC5cXC9dKj8pJC9nLmV4ZWModXJsKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtaW1lVHlwZSh1cmwpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhcnNlRXh0ZW5zaW9uKHVybCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBtaW1lcygpW2V4dGVuc2lvbl0gfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc0RhdGFVcmwodXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsLnNlYXJjaCgvXihkYXRhOikvKSAhPT0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB0b0Jsb2IoY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBzZWxmLndpbmRvdy5hdG9iKGNhbnZhcy50b0RhdGFVUkwoKS5zcGxpdCgnLCcpWzFdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbmFyeUFycmF5ID0gbmV3IHNlbGYud2luZG93LlVpbnQ4QXJyYXkobGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGJpbmFyeUFycmF5W2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBzZWxmLndpbmRvdy5CbG9iKFtiaW5hcnlBcnJheV0sIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlL3BuZydcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNhbnZhc1RvQmxvYihjYW52YXMpIHtcbiAgICAgICAgICAgIGlmIChjYW52YXMudG9CbG9iKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYW52YXMudG9CbG9iKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdG9CbG9iKGNhbnZhcyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZXNvbHZlVXJsKHVybCwgYmFzZVVybCkge1xuICAgICAgICAgICAgY29uc3QgZG9jID0gc2VsZi5kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBkb2MuY3JlYXRlRWxlbWVudCgnYmFzZScpO1xuICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoYmFzZSk7XG4gICAgICAgICAgICBjb25zdCBhID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgICAgICAgYmFzZS5ocmVmID0gYmFzZVVybDtcbiAgICAgICAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgICAgICAgIHJldHVybiBhLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiB1aWQoKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAndScgKyBmb3VyUmFuZG9tQ2hhcnMoKSArIGluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3VyUmFuZG9tQ2hhcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82MjQ4NzIyLzI1MTkzNzMgKi9cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnMDAwMCcgKyAoc2VsZi53aW5kb3cuTWF0aC5yYW5kb20oKSAqIHNlbGYud2luZG93Lk1hdGgucG93KDM2LCA0KSA8PCAwKS50b1N0cmluZygzNikpLnNsaWNlKC00KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbWFrZUltYWdlKHVyaSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBzZWxmLndpbmRvdy5JbWFnZSgpO1xuICAgICAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbWFnZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgICAgIGltYWdlLnNyYyA9IHVyaTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0QW5kRW5jb2RlKHVybCkge1xuICAgICAgICAgIGxldCBkYXRhID0gc2VsZi5jYWNoZS5nZXQodXJsKTtcbiAgICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgICBpZihkYXRhLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT4ge1xuICAgICAgICAgICAgICAgIGlmKGRhdGEuY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGRhdGEucGVuZGluZ3MucHVzaChyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNhY2hlLnB1dCh1cmwsIHtwZW5kaW5nczogW119KTtcblxuICAgICAgICAgICAgY29uc3QgVElNRU9VVCA9IDMwMDAwO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IHNlbGYud2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGRvbmU7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QudGltZW91dCA9IFRJTUVPVVQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZCgpO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCdjYW5ub3QgZmV0Y2ggcmVzb3VyY2U6ICcgKyB1cmwgKyAnLCBzdGF0dXM6ICcgKyByZXF1ZXN0LnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IHNlbGYud2luZG93LkZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSBlbmNvZGVyLnJlc3VsdC5zcGxpdCgvLC8pWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCByZXNvbHZlIG9mIGRhdGEucGVuZGluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wZW5kaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnJlYWRBc0RhdGFVUkwocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gdGltZW91dCgpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbCgndGltZW91dCBvZiAnICsgVElNRU9VVCArICdtcyBvY2N1cmVkIHdoaWxlIGZldGNoaW5nIHJlc291cmNlOiAnICsgdXJsKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZGF0YUFzVXJsKGNvbnRlbnQsIHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2RhdGE6Jyx0eXBlLCc7YmFzZTY0LCcsY29udGVudF0uam9pbignJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhbLiorP14ke30oKXxcXFtcXF1cXC9cXFxcXSkvZywgJ1xcXFwkMScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZGVsYXkobXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcmcpO1xuICAgICAgICAgICAgICAgICAgICB9LCBtcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYXNBcnJheShhcnJheUxpa2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheUxpa2UubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgYXJyYXkucHVzaChhcnJheUxpa2VbaV0pO1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZXNjYXBlWGh0bWwoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLygjfFxcbikvZywgKGMpPT4gYz09PScjJz8gJyUyMyc6ICclMEEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHdpZHRoKG5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRCb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLWxlZnQtd2lkdGgnKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0Qm9yZGVyID0gcHgobm9kZSwgJ2JvcmRlci1yaWdodC13aWR0aCcpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuc2Nyb2xsV2lkdGggKyBsZWZ0Qm9yZGVyICsgcmlnaHRCb3JkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBoZWlnaHQobm9kZSkge1xuICAgICAgICAgICAgY29uc3QgdG9wQm9yZGVyID0gcHgobm9kZSwgJ2JvcmRlci10b3Atd2lkdGgnKTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbUJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItYm90dG9tLXdpZHRoJyk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5zY3JvbGxIZWlnaHQgKyB0b3BCb3JkZXIgKyBib3R0b21Cb3JkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBweChub2RlLCBzdHlsZVByb3BlcnR5KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNlbGYud2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlLnJlcGxhY2UoJ3B4JywgJycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBzZWxmLndpbmRvdy5FbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXNDYW52YXMobm9kZSkge1xuICAgICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2Ygc2VsZi53aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc1RleHRBcmVhKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc0lucHV0KG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LkhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc1NWRyhub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBzZWxmLndpbmRvdy5TVkdFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXNTVkdSZWN0KG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LlNWR1JlY3RFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXNJbWFnZShub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBzZWxmLndpbmRvdy5IVE1MSW1hZ2VFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbmV3SW5saW5lcigpIHtcbiAgICAgICAgY29uc3QgVVJMX1JFR0VYID0gL3VybFxcKFsnXCJdPyhbXidcIl0rPylbJ1wiXT9cXCkvZztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5saW5lQWxsOiBpbmxpbmVBbGwsXG4gICAgICAgICAgICBzaG91bGRQcm9jZXNzOiBzaG91bGRQcm9jZXNzLFxuICAgICAgICAgICAgaW1wbDoge1xuICAgICAgICAgICAgICAgIHJlYWRVcmxzOiByZWFkVXJscyxcbiAgICAgICAgICAgICAgICBpbmxpbmU6IGlubGluZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3Moc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnNlYXJjaChVUkxfUkVHRVgpICE9PSAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlYWRVcmxzKHN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgICAgICB3aGlsZSAoKG1hdGNoID0gVVJMX1JFR0VYLmV4ZWMoc3RyaW5nKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtYXRjaFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICF1dGlsLmlzRGF0YVVybCh1cmwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbmxpbmUoc3RyaW5nLCB1cmwsIGJhc2VVcmwsIGdldCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cmwpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHVybCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVVybCA/IHV0aWwucmVzb2x2ZVVybCh1cmwsIGJhc2VVcmwpIDogdXJsO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZ2V0IHx8IHV0aWwuZ2V0QW5kRW5jb2RlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLmRhdGFBc1VybChkYXRhLCB1dGlsLm1pbWVUeXBlKHVybCkpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHVybEFzUmVnZXgodXJsKSwgWyckMScsIGRhdGFVcmwsICckMyddLmpvaW4oJycpKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gdXJsQXNSZWdleCh1cmwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNlbGYud2luZG93LlJlZ0V4cChbJyh1cmxcXFxcKFtcXCdcIl0/KSgnLCB1dGlsLmVzY2FwZSh1cmwpLCAnKShbXFwnXCJdP1xcXFwpKSddLmpvaW4oJycpLCAnZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5saW5lQWxsKHN0cmluZywgYmFzZVVybCwgZ2V0KSB7XG4gICAgICAgICAgICBpZiAobm90aGluZ1RvSW5saW5lKCkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RyaW5nKTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdHJpbmcpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVhZFVybHMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHVybHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbmUgPSBQcm9taXNlLnJlc29sdmUoc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgdXJscy5mb3JFYWNoKGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb25lLnRoZW4oZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmUoc3RyaW5nLCB1cmwsIGJhc2VVcmwsIGdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBub3RoaW5nVG9JbmxpbmUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFzaG91bGRQcm9jZXNzKHN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXdGb250RmFjZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNvbHZlQWxsOiByZXNvbHZlQWxsLFxuICAgICAgICAgICAgaW1wbDoge1xuICAgICAgICAgICAgICAgIHJlYWRBbGw6IHJlYWRBbGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiByZXNvbHZlQWxsKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWRBbGwoc2VsZi5kb2N1bWVudClcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAod2ViRm9udHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgd2ViRm9udHMubWFwKGZ1bmN0aW9uICh3ZWJGb250KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlYkZvbnQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjc3NTdHJpbmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjc3NTdHJpbmdzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZEFsbCgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXRpbC5hc0FycmF5KHNlbGYuZG9jdW1lbnQuc3R5bGVTaGVldHMpKVxuICAgICAgICAgICAgICAgIC50aGVuKGdldENzc1J1bGVzKVxuICAgICAgICAgICAgICAgIC50aGVuKHNlbGVjdFdlYkZvbnRSdWxlcylcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVzLm1hcChuZXdXZWJGb250KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0V2ViRm9udFJ1bGVzKGNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNzc1J1bGVzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBydWxlLnR5cGUgPT09IENTU1J1bGUuRk9OVF9GQUNFX1JVTEU7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVyLnNob3VsZFByb2Nlc3MocnVsZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdzcmMnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRDc3NSdWxlcyhzdHlsZVNoZWV0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzc1J1bGVzID0gW107XG4gICAgICAgICAgICAgICAgc3R5bGVTaGVldHMuZm9yRWFjaChmdW5jdGlvbiAoc2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuYXNBcnJheShzaGVldC5jc3NSdWxlcyB8fCBbXSkuZm9yRWFjaChjc3NSdWxlcy5wdXNoLmJpbmQoY3NzUnVsZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoaWxlIHJlYWRpbmcgQ1NTIHJ1bGVzIGZyb20gJyArIHNoZWV0LmhyZWYsIGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3NzUnVsZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG5ld1dlYkZvbnQod2ViRm9udFJ1bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9ICh3ZWJGb250UnVsZS5wYXJlbnRTdHlsZVNoZWV0IHx8IHt9KS5ocmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZXIuaW5saW5lQWxsKHdlYkZvbnRSdWxlLmNzc1RleHQsIGJhc2VVcmwpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZWJGb250UnVsZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXdJbWFnZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmxpbmVBbGw6IGlubGluZUFsbCxcbiAgICAgICAgICAgIGltcGw6IHtcbiAgICAgICAgICAgICAgICBuZXdJbWFnZTogbmV3SW1hZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBuZXdJbWFnZShlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlubGluZTogaW5saW5lXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBpbmxpbmUoZ2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNEYXRhVXJsKGVsZW1lbnQuc3JjKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbGVtZW50LnNyYylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZ2V0IHx8IHV0aWwuZ2V0QW5kRW5jb2RlKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwuZGF0YUFzVXJsKGRhdGEsIHV0aWwubWltZVR5cGUoZWxlbWVudC5zcmMpKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGFVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNyYyA9IGRhdGFVcmw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbmxpbmVBbGwobm9kZSkge1xuICAgICAgICAgICAgaWYgKCF1dGlsLmlzRWxlbWVudChub2RlKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShub2RlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGlubGluZUJhY2tncm91bmQobm9kZSlcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzSW1hZ2Uobm9kZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW1hZ2Uobm9kZSkuaW5saW5lKCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmFzQXJyYXkobm9kZS5jaGlsZE5vZGVzKS5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVBbGwoY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBpbmxpbmVCYWNrZ3JvdW5kKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWJhY2tncm91bmQpIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lci5pbmxpbmVBbGwoYmFja2dyb3VuZClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGlubGluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KCdiYWNrZ3JvdW5kJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvRG9tMkltYWdlLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvRG9tMkltYWdlLmpzIiwiaW1wb3J0IHskLCBUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcmFnIHtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIHZpc3VhbFdvcmxkKSB7XHJcbiAgICB0aGlzLnduZCA9IHduZDtcclxuICAgIHRoaXMuZG9jID0gZG9jO1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWxXb3JsZDtcclxuICAgIHRoaXMuY29vcmRzID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICAgIHRoaXMuaW50ZXJzZWN0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIHRoaXMucmF5Y2FzdGVyID0gdGhpcy52aXN1YWwucmF5Y2FzdGVyO1xyXG4gICAgdGhpcy5jYW1lcmEgPSB0aGlzLnZpc3VhbC5jYW1lcmE7XHJcbiAgICB0aGlzLnBsYW5lID0gbmV3IFRIUkVFLlBsYW5lKCk7XHJcbiAgICB0aGlzLnRocmVlcyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5jb250cm9sc1N0YXRlID0gdGhpcy52aXN1YWwuZ2V0Q29udHJvbHNTdGF0ZSgpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMudmlzdWFsLmVsZW1lbnQ7XHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBvbk1vdXNlTW92ZTogdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLFxyXG4gICAgICBvbk1vdXNlRG93bjogdGhpcy5vbk1vdXNlRG93bi5iaW5kKHRoaXMpLFxyXG4gICAgICBvbk1vdXNlVXA6IHRoaXMub25Nb3VzZVVwLmJpbmQodGhpcylcclxuICAgIH07XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub24oJ21vdXNlbW92ZScsIHRoaXMuYmluZHMub25Nb3VzZU1vdmUpO1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9uKCdtb3VzZWRvd24nLCB0aGlzLmJpbmRzLm9uTW91c2VEb3duKTtcclxuICAgICQodGhpcy5kb2MpLm9uKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5vbk1vdXNlVXApO1xyXG4gIH1cclxuXHJcbiAgYWRkVGhyZWUodGhyZWUpIHtcclxuICAgIHRoaXMudGhyZWVzLnB1c2godGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGhyZWUodGhyZWUpIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnRocmVlcy5pbmRleE9mKHRocmVlKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMudGhyZWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUGlja0NhbGxiYWNrKCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdDYWxsYmFjaygpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25SZWxlYXNlQ2FsbGJhY2soKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgICQodGhpcy5lbGVtZW50KS5vZmYoJ21vdXNlbW92ZScsIHRoaXMuYmluZHMub25Nb3VzZU1vdmUpO1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9mZignbW91c2Vkb3duJywgdGhpcy5iaW5kcy5vbk1vdXNlRG93bik7XHJcbiAgICAkKHRoaXMuZG9jKS5vZmYoJ21vdXNldXAnLCB0aGlzLmJpbmRzLm9uTW91c2VVcCk7XHJcbiAgfVxyXG5cclxuICBzZXRDb29yZHNGcm9tRXZlbnQoZSkge1xyXG4gICAgY29uc3QgakVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudCk7XHJcbiAgICBjb25zdCBvZmZzZXQgPSBqRWxlbWVudC5vZmZzZXQoKTtcclxuICAgIHRoaXMuY29vcmRzLnggPSAoKGUucGFnZVgtb2Zmc2V0LmxlZnQpL2pFbGVtZW50LndpZHRoKCkpKjItMTtcclxuICAgIHRoaXMuY29vcmRzLnkgPSAtKChlLnBhZ2VZLW9mZnNldC50b3ApL2pFbGVtZW50LmhlaWdodCgpKSoyKzE7XHJcbiAgICByZXR1cm4gdGhpcy5jb29yZHM7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlRG93bihlKSB7XHJcbiAgICBpZighdGhpcy5lbmFibGVkKSByZXR1cm47XHJcblxyXG4gICAgaWYodGhpcy5zZWxlY3RlZCkgdGhpcy5vbk1vdXNlVXAoZSk7XHJcblxyXG4gICAgdGhpcy5zZXRDb29yZHNGcm9tRXZlbnQoZSk7XHJcbiAgXHR0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMuY29vcmRzLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gIFx0Y29uc3QgaW50ZXJzZWN0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy50aHJlZXMpO1xyXG4gIFx0aWYoaW50ZXJzZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gaW50ZXJzZWN0c1swXS5vYmplY3Q7XHJcbiAgICAgIGlmKCF0aGlzLm9uUGlja0NhbGxiYWNrKGludGVyc2VjdHNbMF0pKSByZXR1cm47XHJcbiAgICAgIGNvbnN0IHYgPSBpbnRlcnNlY3RzWzBdLnBvaW50LmNsb25lKCk7XHJcbiAgICAgIHRoaXMuZGlzdGFuY2UgPSB2LnN1Yih0aGlzLnJheWNhc3Rlci5yYXkub3JpZ2luKS5sZW5ndGgoKTs7XHJcbiAgICAgIHRoaXMuY29udHJvbHNTdGF0ZSA9IHRoaXMudmlzdWFsLmdldENvbnRyb2xzU3RhdGUoKTtcclxuICAgICAgdGhpcy52aXN1YWwuc2V0Q29udHJvbHNTdGF0ZShmYWxzZSk7XHJcbiAgICAgIHRoaXMucGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodGhpcy52aXN1YWwuY2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHRoaXMucGxhbmUubm9ybWFsKSwgaW50ZXJzZWN0c1swXS5wb2ludCk7XHJcbiAgICAgIC8vdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCh0aGlzLnBsYW5lLm5vcm1hbC5zZXQoMCwwLDEpLCBuZXcgVEhSRUUuVmVjdG9yMygwLDAsMCkpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XHJcbiAgXHR9XHJcblxyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZSkge1xyXG4gICAgaWYoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xyXG4gIFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICBcdGlmKHRoaXMuc2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy5zZXRDb29yZHNGcm9tRXZlbnQoZSk7XHJcbiAgICBcdHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5jb29yZHMsIHRoaXMuY2FtZXJhKTtcclxuXHQgICAgaWYodGhpcy5yYXljYXN0ZXIucmF5LmludGVyc2VjdFBsYW5lKHRoaXMucGxhbmUsIHRoaXMuaW50ZXJzZWN0aW9uKSkge1xyXG4gICAgICAgIGlmKCF0aGlzLm9uRHJhZ0NhbGxiYWNrKHRoaXMuaW50ZXJzZWN0aW9uKSkgdGhpcy5vbk1vdXNlVXAoZSk7XHJcbiAgICAgIH0vKiovXHJcbiAgICAgIC8vdGhpcy5pbnRlcnNlY3Rpb24uY29weSh0aGlzLnJheWNhc3Rlci5yYXkuZGlyZWN0aW9uKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0aGlzLmRpc3RhbmNlKS5hZGQodGhpcy5yYXljYXN0ZXIucmF5Lm9yaWdpbik7LyoqL1xyXG4gICAgICAvL2lmKCF0aGlzLm9uRHJhZ0NhbGxiYWNrKHRoaXMuc2VsZWN0ZWQsIHRoaXMuaW50ZXJzZWN0aW9uKSkgdGhpcy5vbk1vdXNlVXAoZSk7XHJcbiAgXHR9XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlVXAoZSkge1xyXG4gICAgaWYodGhpcy5zZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLm9uUmVsZWFzZUNhbGxiYWNrKCk7XHJcbiAgXHRcdHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICB0aGlzLnZpc3VhbC5zZXRDb250cm9sc1N0YXRlKHRoaXMuY29udHJvbHNTdGF0ZSk7XHJcbiAgXHR9XHJcbiAgICBpZighdGhpcy5lbmFibGVkKSByZXR1cm47XHJcbiAgXHRlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9EcmFnLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvRHJhZy5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbnJlcXVpcmUoJ2ltcG9ydHMtbG9hZGVyP2RlZmluZT0+ZmFsc2UhanF1ZXJ5LW1vdXNld2hlZWwnKSgkKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50c1RvQWN0aW9ucyB7XHJcblxyXG4gIHN0YXRpYyBtb2RLZXlzID0ge1xyXG4gICAgQ3RybDogMSxcclxuICAgIFNoaWZ0OiAyLFxyXG4gICAgQWx0OiA0XHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIG1vdXNlQnV0dG9ucyA9IHtcclxuICAgIExlZnQ6IDAsXHJcbiAgICBNaWRkbGU6IDEsXHJcbiAgICBSaWdodDogMlxyXG4gIH07XHJcblxyXG4gIHN0YXRpYyBnZXRFdmVudEZsYWdzKGUpIHtcclxuICAgIHJldHVybiBlLmN0cmxLZXk8PDAgfCBlLnNoaWZ0S2V5PDwxIHwgZS5hbHRLZXk8PDI7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0UG9zaXRpb24odG91Y2hlcykge1xyXG4gICAgbGV0IHgsIHk7XHJcbiAgICBpZih0b3VjaGVzLmxlbmd0aD09PTIpIHtcclxuICAgICAgeCA9IHRvdWNoZXNbMV0ucGFnZVgtdG91Y2hlc1swXS5wYWdlWDtcclxuICAgICAgeSA9IHRvdWNoZXNbMV0ucGFnZVktdG91Y2hlc1swXS5wYWdlWTtcclxuICAgICAgeSA9IC1NYXRoLnNxcnQoeCp4K3kqeSk7XHJcbiAgICAgIHggPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHggPSB0b3VjaGVzWzBdLnBhZ2VYO1xyXG4gICAgICB5ID0gdG91Y2hlc1swXS5wYWdlWTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHgsXHJcbiAgICAgIHlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBhY3Rpb25zKSB7XHJcbiAgICB0aGlzLmFjdGlvbnMgPSBhY3Rpb25zIHx8IHt9O1xyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuZG9jID0gZWxlbWVudFswXS5vd25lckRvY3VtZW50O1xyXG4gICAgdGhpcy53bmQgPSB0aGlzLmRvYy5kZWZhdWx0VmlldztcclxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgY29udGV4dE1lbnU6IHRoaXMuY29udGV4dE1lbnUuYmluZCh0aGlzKSxcclxuXHJcbiAgICAgIG1vdXNlRG93bjogdGhpcy5tb3VzZURvd24uYmluZCh0aGlzKSxcclxuICAgICAgbW91c2VNb3ZlOiB0aGlzLm1vdXNlTW92ZS5iaW5kKHRoaXMpLFxyXG4gICAgICBtb3VzZVVwOiB0aGlzLm1vdXNlVXAuYmluZCh0aGlzKSxcclxuICAgICAgbW91c2VXaGVlbDogdGhpcy5tb3VzZVdoZWVsLmJpbmQodGhpcyksXHJcblxyXG4gICAgICBtb3VzZU1vdmVEb2M6IHRoaXMubW91c2VNb3ZlRG9jLmJpbmQodGhpcyksXHJcbiAgICAgIG1vdXNlVXBEb2M6IHRoaXMubW91c2VVcERvYy5iaW5kKHRoaXMpLFxyXG5cclxuICAgICAgY2xpY2s6IHRoaXMuY2xpY2suYmluZCh0aGlzKSxcclxuICAgICAgZGJsY2xpY2s6IHRoaXMuZGJsY2xpY2suYmluZCh0aGlzKSxcclxuXHJcbiAgICAgIHRvdWNoU3RhcnQ6IHRoaXMudG91Y2hTdGFydC5iaW5kKHRoaXMpLFxyXG4gICAgICB0b3VjaE1vdmU6IHRoaXMudG91Y2hNb3ZlLmJpbmQodGhpcyksXHJcbiAgICAgIHRvdWNoRW5kOiB0aGlzLnRvdWNoRW5kLmJpbmQodGhpcyksXHJcblxyXG4gICAgICBrZXlEb3duOiB0aGlzLmtleURvd24uYmluZCh0aGlzKSxcclxuICAgICAga2V5UHJlc3M6IHRoaXMua2V5UHJlc3MuYmluZCh0aGlzKSxcclxuICAgICAga2V5VXA6IHRoaXMua2V5VXAuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ2NvbnRleHRtZW51JywgdGhpcy5iaW5kcy5jb250ZXh0TWVudSk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCdtb3VzZWRvd24nLCB0aGlzLmJpbmRzLm1vdXNlRG93bik7XHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ21vdXNlbW92ZScsIHRoaXMuYmluZHMubW91c2VNb3ZlKTtcclxuICAgIHRoaXMuZWxlbWVudC5vbignbW91c2V1cCcsIHRoaXMuYmluZHMubW91c2VVcCk7XHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ21vdXNld2hlZWwnLCB0aGlzLmJpbmRzLm1vdXNlV2hlZWwpO1xyXG5cclxuICAgICQodGhpcy5kb2MpLm9uKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRzLm1vdXNlTW92ZURvYyk7XHJcbiAgICAkKHRoaXMuZG9jKS5vbignbW91c2V1cCcsIHRoaXMuYmluZHMubW91c2VVcERvYyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCdjbGljaycsIHRoaXMuYmluZHMuY2xpY2spO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCdkYmxjbGljaycsIHRoaXMuYmluZHMuZGJsY2xpY2spO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudC5vbigndG91Y2hzdGFydCcsIHRoaXMuYmluZHMudG91Y2hTdGFydCk7XHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ3RvdWNobW92ZScsIHRoaXMuYmluZHMudG91Y2hNb3ZlKTtcclxuICAgIHRoaXMuZWxlbWVudC5vbigndG91Y2hlbmQnLCB0aGlzLmJpbmRzLnRvdWNoRW5kKTtcclxuXHJcbiAgICAkKHRoaXMud25kKS5vbigna2V5ZG93bicsIHRoaXMuYmluZHMua2V5RG93bik7XHJcbiAgICAkKHRoaXMud25kKS5vbigna2V5cHJlc3MnLCB0aGlzLmJpbmRzLmtleVByZXNzKTtcclxuICAgICQodGhpcy53bmQpLm9uKCdrZXl1cCcsIHRoaXMuYmluZHMua2V5VXApO1xyXG4gIH1cclxuXHJcbiAgYWRkQWN0aW9uKGFjdGlvbiwgdHlwZSwgY29kZSwgZmxhZ3MpIHtcclxuICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZighdGhpcy5hY3Rpb25zW3R5cGVdKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uc1t0eXBlXSA9IHt9O1xyXG4gICAgfVxyXG4gICAgaWYoIXRoaXMuYWN0aW9uc1t0eXBlXVtjb2RlXSkge1xyXG4gICAgICB0aGlzLmFjdGlvbnNbdHlwZV1bY29kZV0gPSB7fVxyXG4gICAgfVxyXG4gICAgaWYoIXRoaXMuYWN0aW9uc1t0eXBlXVtjb2RlXVtmbGFnc10pIHtcclxuICAgICAgdGhpcy5hY3Rpb25zW3R5cGVdW2NvZGVdW2ZsYWdzXSA9IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3Rpb25zW3R5cGVdW2NvZGVdW2ZsYWdzXS5wdXNoKGFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBnZXRBY3Rpb25zKHR5cGUsIGNvZGUsIGZsYWdzKSB7XHJcbiAgICByZXR1cm4gKCh0aGlzLmFjdGlvbnNbdHlwZV0gfHwge30pW2NvZGVdIHx8IHt9KVtmbGFnc10gfHwgW107XHJcbiAgfVxyXG5cclxuICBmaXJlQWN0aW9ucyhhY3Rpb25zLCBlLCBkYXRhKSB7XHJcbiAgICBmb3IobGV0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XHJcbiAgICAgIGFjdGlvbihlLCBkYXRhKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnRleHRNZW51KGUpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpO1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucygnY29udGV4dG1lbnUnLCBlLmJ1dHRvbiwgZmxhZ3MpLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlRG93bihlKSB7XHJcbiAgICBpZih0aGlzLnBpY2tlZCkge1xyXG4gICAgICB0aGlzLm1vdXNlVXBEb2MoKTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpO1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucygnbW91c2Vkb3duJywgZS5idXR0b24sIGZsYWdzKSwgZSk7XHJcbiAgICAgIHRoaXMucGlja2VkID0ge1xyXG4gICAgICAgIHg6IGUucGFnZVgsXHJcbiAgICAgICAgeTogZS5wYWdlWSxcclxuICAgICAgICBhY3Rpb25zOiB0aGlzLmdldEFjdGlvbnMoJ21vdXNlZHJhZycsIGUuYnV0dG9uLCBmbGFncylcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLnBpY2tlZC5hY3Rpb25zLCBlLCB7XHJcbiAgICAgICAgc3RhdGU6ICdzdGFydCdcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZU1vdmUoZSkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSk7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKCdtb3VzZW1vdmUnLCBlLmJ1dHRvbiwgZmxhZ3MpLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlTW92ZURvYyhlKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQgJiYgdGhpcy5waWNrZWQpIHtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLnBpY2tlZC5hY3Rpb25zLCBlLCB7XHJcbiAgICAgICAgc3RhdGU6ICdtb3ZlJyxcclxuICAgICAgICBkeDogZS5wYWdlWC10aGlzLnBpY2tlZC54LFxyXG4gICAgICAgIGR5OiBlLnBhZ2VZLXRoaXMucGlja2VkLnlcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucGlja2VkID0ge1xyXG4gICAgICAgIHg6IGUucGFnZVgsXHJcbiAgICAgICAgeTogZS5wYWdlWSxcclxuICAgICAgICBhY3Rpb25zOiB0aGlzLnBpY2tlZC5hY3Rpb25zXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZVVwKGUpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpO1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucygnbW91c2V1cCcsIGUuYnV0dG9uLCBmbGFncyksIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VVcERvYyhlKSB7XHJcbiAgICBpZih0aGlzLnBpY2tlZCkge1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMucGlja2VkLmFjdGlvbnMsIGUsIHtcclxuICAgICAgICBzdGF0ZTogJ2VuZCdcclxuICAgICAgfSk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLnBpY2tlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlV2hlZWwoZSkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSk7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKCdtb3VzZXdoZWVsJywgMCwgZmxhZ3MpLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsaWNrcyhlLCB0eXBlKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKTtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnModHlwZSwgZS5idXR0b24sIGZsYWdzKSwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGljayhlKSB7XHJcbiAgICB0aGlzLmNsaWNrcyhlLCAnY2xpY2snKTtcclxuICB9XHJcblxyXG4gIGRibGNsaWNrKGUpIHtcclxuICAgIHRoaXMuY2xpY2tzKGUsICdkYmxjbGljaycpO1xyXG4gIH1cclxuXHJcbiAgdG91Y2hQaWNrKGUsIGZsYWdzLCB0b3VjaGVzKSB7XHJcbiAgICB0aGlzLnRvdWNoUGlja2VkID0ge1xyXG4gICAgICAuLi5FdmVudHNUb0FjdGlvbnMuZ2V0UG9zaXRpb24odG91Y2hlcyksXHJcbiAgICAgIGFjdGlvbnM6IHRoaXMuZ2V0QWN0aW9ucygndG91Y2hkcmFnJywgdG91Y2hlcy5sZW5ndGgsIGZsYWdzKSxcclxuICAgICAgY29kZTogdG91Y2hlcy5sZW5ndGgsXHJcbiAgICAgIGZsYWdzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLnRvdWNoUGlja2VkLmFjdGlvbnMsIGUsIHtcclxuICAgICAgc3RhdGU6ICdzdGFydCdcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG91Y2hTdGFydChlKSB7XHJcbiAgICBpZih0aGlzLnRvdWNoUGlja2VkKSB7XHJcbiAgICAgIHRoaXMudG91Y2hFbmQoZSk7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKSwgdG91Y2hlcyA9IGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnMoJ3RvdWNoc3RhcnQnLCB0b3VjaGVzLmxlbmd0aCwgZmxhZ3MpLCBlKTtcclxuICAgICAgdGhpcy50b3VjaFBpY2soZSwgZmxhZ3MsIHRvdWNoZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG91Y2hNb3ZlKGUpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpLCB0b3VjaGVzID0gZS50b3VjaGVzIHx8IGUub3JpZ2luYWxFdmVudC50b3VjaGVzO1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucygndG91Y2htb3ZlJywgdG91Y2hlcy5sZW5ndGgsIGZsYWdzKSwgZSk7XHJcbiAgICAgIGlmKHRoaXMudG91Y2hQaWNrZWQpIHtcclxuICAgICAgICBpZih0aGlzLnRvdWNoUGlja2VkLmNvZGU9PT10b3VjaGVzLmxlbmd0aCAmJiB0aGlzLnRvdWNoUGlja2VkLmZsYWdzPT09ZmxhZ3MpIHtcclxuICAgICAgICAgIGNvbnN0IHBvcyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRQb3NpdGlvbih0b3VjaGVzKTtcclxuICAgICAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy50b3VjaFBpY2tlZC5hY3Rpb25zLCBlLCB7XHJcbiAgICAgICAgICAgIHN0YXRlOiAnbW92ZScsXHJcbiAgICAgICAgICAgIGR4OiBwb3MueC10aGlzLnRvdWNoUGlja2VkLngsXHJcbiAgICAgICAgICAgIGR5OiBwb3MueS10aGlzLnRvdWNoUGlja2VkLnlcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy50b3VjaFBpY2tlZCA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy50b3VjaFBpY2tlZCxcclxuICAgICAgICAgICAgLi4ucG9zXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG91Y2hFbmQoZSk7XHJcbiAgICAgICAgICB0aGlzLnRvdWNoUGljayhlLCBmbGFncywgdG91Y2hlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b3VjaEVuZChlKSB7XHJcbiAgICBpZih0aGlzLnRvdWNoUGlja2VkKSB7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy50b3VjaFBpY2tlZC5hY3Rpb25zLCBlLCB7XHJcbiAgICAgICAgc3RhdGU6ICdlbmQnXHJcbiAgICAgIH0pO1xyXG4gICAgICBkZWxldGUgdGhpcy50b3VjaFBpY2tlZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGtleShlLCB0eXBlKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKTtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnModHlwZSwgZS5rZXlDb2RlLCBmbGFncyksIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAga2V5RG93bihlKSB7XHJcbiAgICB0aGlzLmtleShlLCAna2V5ZG93bicpO1xyXG4gIH1cclxuXHJcbiAga2V5UHJlc3MoZSkge1xyXG4gICAgdGhpcy5rZXkoZSwgJ2tleXByZXNzJyk7XHJcbiAgfVxyXG5cclxuICBrZXlVcChlKSB7XHJcbiAgICB0aGlzLmtleShlLCAna2V5dXAnKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCdjb250ZXh0bWVudScsIHRoaXMuYmluZHMuY29udGV4dE1lbnUpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ21vdXNlZG93bicsIHRoaXMuYmluZHMubW91c2VEb3duKTtcclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuYmluZHMubW91c2VNb3ZlKTtcclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ21vdXNldXAnLCB0aGlzLmJpbmRzLm1vdXNlVXApO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9mZignbW91c2V3aGVlbCcsIHRoaXMuYmluZHMubW91c2VXaGVlbCk7XHJcblxyXG4gICAgJCh0aGlzLmRvYykub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRzLm1vdXNlTW92ZURvYyk7XHJcbiAgICAkKHRoaXMuZG9jKS5vZmYoJ21vdXNldXAnLCB0aGlzLmJpbmRzLm1vdXNlVXBEb2MpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ2NsaWNrJywgdGhpcy5iaW5kcy5jbGljayk7XHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCdkYmxjbGljaycsIHRoaXMuYmluZHMuZGJsY2xpY2spO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ3RvdWNoc3RhcnQnLCB0aGlzLmJpbmRzLnRvdWNoU3RhcnQpO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9mZigndG91Y2htb3ZlJywgdGhpcy5iaW5kcy50b3VjaE1vdmUpO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9mZigndG91Y2hlbmQnLCB0aGlzLmJpbmRzLnRvdWNoRW5kKTtcclxuXHJcbiAgICAkKHRoaXMud25kKS5vZmYoJ2tleWRvd24nLCB0aGlzLmJpbmRzLmtleURvd24pO1xyXG4gICAgJCh0aGlzLnduZCkub2ZmKCdrZXlwcmVzcycsIHRoaXMuYmluZHMua2V5UHJlc3MpO1xyXG4gICAgJCh0aGlzLnduZCkub2ZmKCdrZXl1cCcsIHRoaXMuYmluZHMua2V5VXApO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvRXZlbnRzVG9BY3Rpb25zLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvRXZlbnRzVG9BY3Rpb25zLmpzIiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZ1bGxTY3JlZW4ge1xyXG5cclxuXHRzdGF0aWMgX2hhc1dlYmtpdEZ1bGxTY3JlZW5cdD0gISFkb2N1bWVudC53ZWJraXRDYW5jZWxGdWxsU2NyZWVuO1xyXG5cdHN0YXRpYyBfaGFzTW96RnVsbFNjcmVlblx0PSAhIWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW47XHJcblx0c3RhdGljIF9oYXNNc0Z1bGxzY3JlZW4gPSAhIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuO1xyXG5cclxuXHRzdGF0aWMgYXZhaWxhYmxlKCkge1xyXG5cdFx0cmV0dXJuIEZ1bGxTY3JlZW4uX2hhc1dlYmtpdEZ1bGxTY3JlZW4gfHwgRnVsbFNjcmVlbi5faGFzTW96RnVsbFNjcmVlbiB8fCBGdWxsU2NyZWVuLl9oYXNNc0Z1bGxzY3JlZW47XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWN0aXZhdGVkKCkge1xyXG5cdFx0aWYoRnVsbFNjcmVlbi5faGFzV2Via2l0RnVsbFNjcmVlbikge1xyXG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQud2Via2l0SXNGdWxsU2NyZWVuO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihGdWxsU2NyZWVuLl9oYXNNb3pGdWxsU2NyZWVuKSB7XHJcblx0XHRcdHJldHVybiBkb2N1bWVudC5tb3pGdWxsU2NyZWVuO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihGdWxsU2NyZWVuLl9oYXNNc0Z1bGxzY3JlZW4pIHtcclxuXHRcdFx0cmV0dXJuICEhZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudDtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmFzc2VydChmYWxzZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBoYW5kbGVyKSB7XHJcblx0XHRpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKSB7XHJcblx0XHQgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywgaGFuZGxlciwgZmFsc2UpO1xyXG5cdFx0ICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96ZnVsbHNjcmVlbmNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcclxuXHRcdCAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblx0XHQgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdNU0Z1bGxzY3JlZW5DaGFuZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBoYW5kbGVyKSB7XHJcblx0XHRpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XHJcblx0XHQgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywgaGFuZGxlciwgZmFsc2UpO1xyXG5cdFx0ICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW96ZnVsbHNjcmVlbmNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcclxuXHRcdCAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblx0XHQgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdNU0Z1bGxzY3JlZW5DaGFuZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgcmVxdWVzdChlbGVtZW50KSB7XHJcblx0XHRlbGVtZW50XHQ9IGVsZW1lbnRcdHx8IGRvY3VtZW50LmJvZHk7XHJcblx0XHRpZihGdWxsU2NyZWVuLl9oYXNXZWJraXRGdWxsU2NyZWVuKSB7XHJcblx0XHRcdGVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4oKTtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYoRnVsbFNjcmVlbi5faGFzTW96RnVsbFNjcmVlbikge1xyXG5cdFx0XHRlbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKEZ1bGxTY3JlZW4uX2hhc01zRnVsbHNjcmVlbikge1xyXG5cdFx0XHRlbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmFzc2VydChmYWxzZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY2FuY2VsKCkge1xyXG5cdFx0aWYoRnVsbFNjcmVlbi5faGFzV2Via2l0RnVsbFNjcmVlbikge1xyXG5cdFx0XHRkb2N1bWVudC53ZWJraXRDYW5jZWxGdWxsU2NyZWVuKCk7XHJcblx0XHR9ZWxzZSBpZihGdWxsU2NyZWVuLl9oYXNNb3pGdWxsU2NyZWVuKSB7XHJcblx0XHRcdGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYoRnVsbFNjcmVlbi5faGFzTXNGdWxsc2NyZWVuKSB7XHJcblx0XHRcdGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmFzc2VydChmYWxzZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9GdWxsU2NyZWVuLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvRnVsbFNjcmVlbi5qcyIsImltcG9ydCB7JCwgaHRtbDJjYW52YXN9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgSW1hZ2VCYXNlIGZyb20gJy4vSW1hZ2VCYXNlJztcclxuaW1wb3J0IEJhc2VNYXRoVXRpbHMgZnJvbSAnLi9CYXNlTWF0aFV0aWxzJztcclxuaW1wb3J0IERvbTJJbWFnZSBmcm9tICcuL0RvbTJJbWFnZSc7XHJcbmltcG9ydCBEb2NNb3VzZVNpbXVsYXRvciBmcm9tICcuL0RvY01vdXNlU2ltdWxhdG9yJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVyYWN0aXZlSW1hZ2UgZXh0ZW5kcyBJbWFnZUJhc2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBjb2xvciwgc3JjLCBjYWNoZSwgaW5qZWN0b3IpIHtcclxuICAgIHN1cGVyKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yKTtcclxuXHJcbiAgICB0aGlzLmlJZCA9ICdpJytCYXNlTWF0aFV0aWxzLmdldFVuaXF1ZSgpO1xyXG4gICAgY29uc3QgakZyYW1lID0gJCgnPGlmcmFtZSBpZD1cIicrdGhpcy5pSWQrJ1wiIHNyYz1cIicgKyBzcmMgKyAnXCIgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwcHg7XCI+PC9pZnJhbWU+Jyk7XHJcbiAgICAkKHRoaXMuZG9jLmJvZHkpLmFwcGVuZChqRnJhbWUpO1xyXG4gICAgdGhpcy5mcmFtZSA9IGpGcmFtZVswXTtcclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge307XHJcblxyXG4gICAgaWYoaW5qZWN0b3IpIHtcclxuICAgICAgaW5qZWN0b3IodGhpcy5mcmFtZS5jb250ZW50V2luZG93KTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmRvYy5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCd3d3cuaHR0cDovL3czLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHknLCAnMS4xJykpIHsgLy8gc3ZnIGZvcmVpZ25PYmplY3QgcmVuZGVyZXJcclxuICAgICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICB0aGlzLmJpbmRzLmltYWdlTG9hZCA9ICgpPT4ge1xyXG4gICAgICAgIHRoaXMucmVuZGVySW1hZ2UodGhpcy5pbWFnZSk7XHJcbiAgICAgICAgdGhpcy5maW5pc2hSZW5kZXIoKTtcclxuICAgICAgfTtcclxuICAgICAgJCh0aGlzLmltYWdlKS5vbignbG9hZCcsIHRoaXMuYmluZHMuaW1hZ2VMb2FkKTtcclxuICAgICAgdGhpcy5zdmdSZW5kZXIgPSBuZXcgRG9tMkltYWdlKHRoaXMuZnJhbWUuY29udGVudFdpbmRvdywgdGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQsIGNhY2hlKTtcclxuICAgIH0gLy8gb3RoZXJ3aXNlIC0gaHRtbDJjYW52YXNcclxuXHJcbiAgICB0aGlzLmJpbmRzLmZyYW1lTG9hZCA9ICgpPT4ge1xyXG4gICAgICBpZih+dGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQudGl0bGUuaW5kZXhPZignNDA0JykpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0UmVuZGVyID0gKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlck5vdEZvdW5kUGFnZSgpO1xyXG4gICAgICAgICAgdGhpcy5maW5pc2hSZW5kZXIoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgICBpZih0aGlzLmZyYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSAkKHRoaXMuZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gJCh0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5KS5oZWlnaHQoKTtcclxuICAgICAgICAgICAgakZyYW1lLmNzcygnd2lkdGgnLCB0aGlzLndpZHRoKydweCcpLmNzcygnaGVpZ2h0JywgdGhpcy5oZWlnaHQrJ3B4Jyk7XHJcbiAgICAgICAgICAgIGpGcmFtZS5vZmZzZXQoe2xlZnQ6IC10aGlzLndpZHRoLTEwMCwgdG9wOiAwfSk7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuc3ZnUmVuZGVyKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaW11bGF0b3IgPSBuZXcgRG9jTW91c2VTaW11bGF0b3IoakZyYW1lLCB0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5LCB0aGlzLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2ltdWxhdG9yLmFkZERvY0NoYW5nZUNsYih0aGlzLmZpbmlzaExvYWQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zdGFydFJlbmRlciA9ICgpPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAkKHRoaXMuZnJhbWUuY29udGVudFdpbmRvdykub24oJ2xvYWQnLCB0aGlzLmJpbmRzLmZyYW1lTG9hZCk7XHJcbiAgfVxyXG5cclxuICBnZXRTaW11bGF0ZWREb2MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQ7XHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICBpZih0aGlzLnN2Z1JlbmRlcikge1xyXG4gICAgICB0aGlzLnN2Z1JlbmRlci50b1N2Zyh0aGlzLnNpbXVsYXRvci5lbGVtZW50LCB7aGVpZ2h0OiB0aGlzLmhlaWdodCsncHgnLCB3aWR0aDogdGhpcy53aWR0aCsncHgnfSlcclxuICAgICAgICAudGhlbigoZGF0YVVybCk9PiB7XHJcbiAgICAgICAgICB0aGlzLmltYWdlLnNyYyA9IGRhdGFVcmw7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yKT0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RvbTJJbWFnZTogJywgZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJCbGFua1BhZ2UoKTtcclxuICAgICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaHRtbDJjYW52YXModGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQuYm9keSwge3RpbWVvdXQ6IDMwMDAwfSkuXHJcbiAgICAgICAgdGhlbigoY2FudmFzKT0+IHtcclxuICAgICAgICAgIHRoaXMucmVuZGVySW1hZ2UoY2FudmFzKTtcclxuICAgICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgJCh0aGlzLmltYWdlKS5vZmYoJ2xvYWQnLCB0aGlzLmJpbmRzLmltYWdlTG9hZCk7XHJcbiAgICAkKHRoaXMuZnJhbWUuY29udGVudFdpbmRvdykub2ZmKCdsb2FkJywgdGhpcy5iaW5kcy5mcmFtZUxvYWQpO1xyXG4gICAgJCh0aGlzLmRvYy5ib2R5KS5maW5kKCcjJyt0aGlzLmlJZCkucmVtb3ZlKCk7XHJcbiAgICBpZih0aGlzLmltYWdlKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2Uuc3JjID0gJyc7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmltYWdlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mcmFtZS5zcmMgPSAnJztcclxuICAgIGRlbGV0ZSB0aGlzLmZyYW1lO1xyXG4gICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgc2ltdWxhdGUoZSwgZG9jLCB4LCB5KSB7XHJcbiAgICBpZih0aGlzLnNpbXVsYXRvcikge1xyXG4gICAgICB0aGlzLnNpbXVsYXRvci5zaW11bGF0ZShlLCBkb2MsIHgsIHkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvSW50ZXJhY3RpdmVJbWFnZS5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL0ludGVyYWN0aXZlSW1hZ2UuanMiLCJpbXBvcnQgeyQsIHRyfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEdyYXBoVXRpbHMgZnJvbSAnLi9HcmFwaFV0aWxzJztcclxuaW1wb3J0IE1hdGhVdGlscyBmcm9tICcuL01hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2FkaW5nQW5pbWF0aW9uIHtcclxuXHJcbiAgZHkodCx5KSB7XHJcbiAgICBjb25zdCB3PXlbMF0sIGE9eVsxXTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIC10aGlzLmcqTWF0aC5jb3MoYSksXHJcbiAgICAgIHdcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBpbnRlZ3JhdGUoVCkge1xyXG4gICAgbGV0IHQ9MCwgZHQ9dGhpcy5wLmR0LCBvcyA9IHRoaXMub3M7XHJcbiAgICB3aGlsZSh0PFQpIHtcclxuICAgICAgaWYodCtkdD5UKSB7XHJcbiAgICAgICAgZHQ9VC10O1xyXG4gICAgICB9XHJcbiAgICAgIG9zPU1hdGhVdGlscy5yazQodGhpcy5keS5iaW5kKHtnOiB0aGlzLnAuZ30pLCAwLCBkdCwgb3MpO1xyXG4gICAgICB0Kz1kdDtcclxuICAgIH1cclxuICAgIHJldHVybiBvcztcclxuICB9XHJcblxyXG4gIGNhbGNUaW1lVG8odGFyZ2V0KSB7XHJcbiAgICBsZXQgdD0wLCBkdD10aGlzLnAuZHQsIG9zID0gdGhpcy5vcztcclxuICAgIHdoaWxlKE1hdGguYWJzKG9zWzFdLXRhcmdldCk+MWUtNCkge1xyXG4gICAgICBjb25zdCBub3M9TWF0aFV0aWxzLnJrNCh0aGlzLmR5LmJpbmQoe2c6IHRoaXMucC5nfSksIDAsIGR0LCBvcyk7XHJcbiAgICAgIGlmKG5vc1swXTwwICYmIG5vc1sxXTx0YXJnZXQgfHwgbm9zWzBdPjAgJiYgbm9zWzFdPnRhcmdldCkge1xyXG4gICAgICAgIGR0Lz0yO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIG9zID0gbm9zO1xyXG4gICAgICAgIHQrPWR0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZShUKSB7XHJcbiAgICB0aGlzLm9zID0gdGhpcy5pbnRlZ3JhdGUoVCk7XHJcblxyXG4gICAgdGhpcy50Kz1UXHJcbiAgICBpZih0aGlzLnQ+PXRoaXMucC51cGRhdGVJbnRlcnZhbCkge1xyXG4gICAgICB0aGlzLnQgPSAwO1xyXG4gICAgICBjb25zdCByID0gMC4wNipNYXRoLm1pbih0aGlzLmMud2lkdGgsIHRoaXMuYy5oZWlnaHQpLFxyXG4gICAgICAgICAgICBhID0gdGhpcy5vc1sxXSxcclxuICAgICAgICAgICAgeDAgPSAwLjUqdGhpcy5jLndpZHRoLFxyXG4gICAgICAgICAgICB5MCA9IDAuNSp0aGlzLmMuaGVpZ2h0LFxyXG4gICAgICAgICAgICBjdHggPSB0aGlzLmN0eDtcclxuXHJcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jLndpZHRoLCB0aGlzLmMuaGVpZ2h0KTtcclxuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICBjdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKHRoaXMucC5jb2xvciwxKTtcclxuICAgICAgY3R4LnJlY3QoMCwgMCwgdGhpcy5jLndpZHRoLCB0aGlzLmMuaGVpZ2h0KTtcclxuICAgICAgY3R4LmZpbGwoKTtcclxuXHJcbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgY3R4LnNoYWRvd0JsdXIgPSA1MDtcclxuICAgICAgY3R4LmZpbGxTdHlsZSA9IEdyYXBoVXRpbHMuY29sb3IyUmdiYShHcmFwaFV0aWxzLmludmVyc2VDb2xvcih0aGlzLnAuY29sb3IsMC45KSxNYXRoLmFicyh0aGlzLm9zWzBdLzYuMzYpKTtcclxuICAgICAgY3R4LnNoYWRvd0NvbG9yID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKEdyYXBoVXRpbHMuaW52ZXJzZUNvbG9yKHRoaXMucC5jb2xvciwxKSwwLjkpO1xyXG4gICAgICBjdHguc2hhZG93T2Zmc2V0WCA9IDA7XHJcbiAgICAgIGN0eC5zaGFkb3dPZmZzZXRZID0gMDtcclxuICAgICAgY3R4LmZvbnQ9J2JvbGQgJytNYXRoLnJvdW5kKDAuMjUqcikrJ3B4IEFyaWFsJztcclxuICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XHJcbiAgICAgIGN0eC5maWxsVGV4dCh0cignTG9hZGluZy4uLicpLHgwLHkwKTtcclxuXHJcbiAgICAgIGNvbnN0IHBzID0gMTAsIGRhPTIqTWF0aC5QSS9wczsvLzIuNSpfci9yXHJcbiAgICAgIGN0eC5zaGFkb3dDb2xvciA9IEdyYXBoVXRpbHMuY29sb3IyUmdiYShHcmFwaFV0aWxzLmludmVyc2VDb2xvcih0aGlzLnAuY29sb3IsMSksMC43KTtcclxuICAgICAgZm9yKGxldCBpPTAsIF9hPWEsIF9yPTAuMipyOyBpPHBzOyArK2ksIF9yKj0wLjksIF9hKz1kYSkge1xyXG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKEdyYXBoVXRpbHMuaW52ZXJzZUNvbG9yKHRoaXMucC5jb2xvciwocHMtaSkvcHMpLDAuNyoocHMtaSkvcHMpO1xyXG4gICAgICAgIGNvbnN0IGN4PXgwK3IqTWF0aC5jb3MoX2EpLCBjeT15MC1yKk1hdGguc2luKF9hKSwgbng9eDArcipNYXRoLmNvcyhfYStkYSksIG55PXkwLXIqTWF0aC5zaW4oX2ErZGEpO1xyXG4gICAgICAgIGN0eC5zaGFkb3dPZmZzZXRYID0gMC4yKihueC1jeCk7XHJcbiAgICAgICAgY3R4LnNoYWRvd09mZnNldFkgPSAwLjIqKG55LWN5KTtcclxuICAgICAgICBjdHguYXJjKGN4LCBjeSwgX3IsIDAsIE1hdGguUEkqMiwgMSk7XHJcbiAgICAgICAgY3R4LmZpbGwoKTtcclxuICAgICAgfVxyXG4gICAgICBpZih0aGlzLm9uQ2hhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmMsIHRoaXMucC5jb2xvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEltYWdlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYztcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmMud2lkdGggPSAwO1xyXG4gICAgdGhpcy5jLmhlaWdodCA9IDA7XHJcbiAgICBkZWxldGUgdGhpcy5jdHg7XHJcbiAgICBkZWxldGUgdGhpcy5jO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlU3ByaXRlKG4pIHtcclxuICAgIGNvbnN0IGMgPSAkKCc8Y2FudmFzIHdpZHRoPVwiJyt0aGlzLmMud2lkdGgqbisnXCIgaGVpZ2h0PVwiJyt0aGlzLmMuaGVpZ2h0KydcIj48L2NhbnZhcz4nKVswXSwgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcpLFxyXG4gICAgdCA9IHRoaXMuY2FsY1RpbWVUbyh0aGlzLm9zWzFdK01hdGguc2lnbih0aGlzLm9zWzBdKSoyKk1hdGguUEkpLCBkdD10LyhuKzEpO1xyXG4gICAgY29uc3Qge3VwZGF0ZUludGVydmFsfSA9IHRoaXMucDtcclxuICAgIHRoaXMucC51cGRhdGVJbnRlcnZhbCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxuOyArK2kpIHtcclxuICAgICAgdGhpcy51cGRhdGUoZHQpO1xyXG4gICAgICBjdHguZHJhd0ltYWdlKHRoaXMuYywgaSp0aGlzLmMud2lkdGgsIDApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wLnVwZGF0ZUludGVydmFsID0gdXBkYXRlSW50ZXJ2YWw7XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQsIGNvbG9yKSB7XHJcbiAgICBjb25zdCBqQyA9ICQoJzxjYW52YXMgd2lkdGg9XCInK3dpZHRoKydcIiBoZWlnaHQ9XCInK2hlaWdodCsnXCI+PC9jYW52YXM+Jyk7XHJcbiAgICB0aGlzLmMgPSBqQ1swXTtcclxuICAgIHRoaXMucCA9IHtcclxuICAgICAgZzogOS44LFxyXG4gICAgICBkdDogMS82MCxcclxuICAgICAgY29sb3IsXHJcbiAgICAgIHVwZGF0ZUludGVydmFsOiAwLjI1XHJcbiAgICB9O1xyXG4gICAgdGhpcy5jdHggPSB0aGlzLmMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIHRoaXMub3MgPSBbLTIsIE1hdGguUEkvMl07XHJcbiAgICB0aGlzLnQgPSB0aGlzLnAudXBkYXRlSW50ZXJ2YWw7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Mb2FkaW5nQW5pbWF0aW9uLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvTG9hZGluZ0FuaW1hdGlvbi5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2FkaW5nQ29udHJvbGxlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpZXcsIHNob3dQcm9ncmVzcz10cnVlLCBsb2FkaW5nTXNnPXVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy52aWV3ID0gdmlldztcclxuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG4gICAgdGhpcy5zaG93UHJvZ3Jlc3MgPSBzaG93UHJvZ3Jlc3M7XHJcbiAgICB0aGlzLmdldExvYWRpbmdNc2cgPSBsb2FkaW5nTXNnIHx8IExvYWRpbmdDb250cm9sbGVyLmRlZmF1bHRMb2FkaW5nTXNnO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGVmYXVsdExvYWRpbmdNc2cocHJvZ3Jlc3MpIHtcclxuICAgIHJldHVybiBbJ1BsZWFzZSB3YWl0Li4uIHRoZSBBcHBsaWNhdGlvbiBpcyBMb2FkaW5nOiAnLCBwcm9ncmVzcywgJyUnXS5qb2luKCcnKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnNob3dQcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgICBkZWxldGUgdGhpcy52aWV3O1xyXG4gIH1cclxuXHJcbiAgc2V0UHJvZ3Jlc3Modikge1xyXG4gICAgdGhpcy5wcm9ncmVzcyA9IHY7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICBpZih0aGlzLnZpZXcpIHtcclxuXHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnd2lkTG9hZGluZ1Byb2dyZXNzJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLnNob3dQcm9ncmVzcyxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCd0eHRMb2FkaW5nUHJvZ3Jlc3MnLCB7XHJcbiAgICAgICAgdmFsdWU6IHRoaXMuZ2V0TG9hZGluZ01zZyh0aGlzLnByb2dyZXNzKSxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZm9yKGxldCBuYW1lIG9mIHRoaXMudmlldy5nZXRMaW5rcygpKSB7XHJcbiAgICAgICAgdGhpcy52aWV3LnNldFN0YXRlKG5hbWUsIHtcclxuICAgICAgICAgIGVuYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ2lucFBhZ2VzJywge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCdpbnBQYWdlJywge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlOiBmYWxzZSxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvTG9hZGluZ0NvbnRyb2xsZXIuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9Mb2FkaW5nQ29udHJvbGxlci5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBFdmVudENvbnZlcnRlciBmcm9tICcuL0V2ZW50Q29udmVydGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vdXNlRXZlbnRDb252ZXJ0ZXIgZXh0ZW5kcyBFdmVudENvbnZlcnRlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHduZCwgZG9jLCBlbGVtZW50KSB7XHJcbiAgICBzdXBlcih3bmQsIGRvYyk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIGNvbnZlcnQ6IHRoaXMuY29udmVydC5iaW5kKHRoaXMpXHJcbiAgICB9O1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9uKCdtb3VzZW1vdmUgbW91c2Vkb3duIG1vdXNlb3ZlciBtb3VzZW91dCBjbGljaycsIHRoaXMuYmluZHMuY29udmVydCk7XHJcbiAgICAkKHRoaXMuZG9jKS5vbignbW91c2V1cCcsIHRoaXMuYmluZHMuY29udmVydCk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9mZignbW91c2Vtb3ZlIG1vdXNlZG93biBtb3VzZW92ZXIgbW91c2VvdXQgY2xpY2snLCB0aGlzLmJpbmRzLmNvbnZlcnQpO1xyXG4gICAgJCh0aGlzLmRvYykub2ZmKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvTW91c2VFdmVudENvbnZlcnRlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL01vdXNlRXZlbnRDb252ZXJ0ZXIuanMiLCJpbXBvcnQge1RIUkVFfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IE1hdGhVdGlscyBmcm9tICcuL01hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPYmplY3QzRFdhdGNoZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aXN1YWwsIGJvdW5kQm94Q2xiLCB0ZXN0U2NhbGU9dGhpcy50ZXN0U2NhbGUpIHtcclxuICAgIHRoaXMudmlzdWFsID0gdmlzdWFsO1xyXG4gICAgdGhpcy5ib3VuZEJveENsYiA9IGJvdW5kQm94Q2xiO1xyXG4gICAgdGhpcy50ZXN0U2NhbGUgPSB0ZXN0U2NhbGU7XHJcbiAgICB0aGlzLmNhbWVyYSA9IHZpc3VhbC5jYW1lcmE7XHJcbiAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLnZpc3VhbC5lbGVtZW50O1xyXG4gICAgdGhpcy5lbGVtZW50U2l6ZSA9IHt3OiAxLCBoOiAxfTtcclxuICAgIHRoaXMuZGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMudmlzdWFsLnduZC5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XHJcbiAgICB0aGlzLm9yYml0ID0gdmlzdWFsLmdldE9yYml0KCk7XHJcbiAgICB0aGlzLnNjYWxlID0gMTtcclxuXHJcbiAgICB0aGlzLmVwcyA9IDFlLTQ7XHJcbiAgICB0aGlzLnYgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgdGhpcy5kdiA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XHJcblxyXG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgdmlzdWFsLmFkZFJlbmRlckNhbGxiYWNrKHRoaXMudXBkYXRlLmJpbmQodGhpcykpO1xyXG5cclxuICAgIHRoaXMub3MgPSB7XHJcbiAgICAgIHZ4OiAwLFxyXG4gICAgICB2eTogMCxcclxuICAgICAgeDogMCxcclxuICAgICAgeTogMFxyXG4gICAgfTtcclxuICAgIHRoaXMub3JiaXQudXBkYXRlKCk7XHJcbiAgICB0aGlzLmNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG4gICAgbGV0IGJveCA9IHRoaXMuY29tcHV0ZUNsaWVudEJvdW5kQm94KCksIGs9MS4xMTtcclxuICAgIHRoaXMubW92ZVBhbih7eDogLWsqYm94Lm1pZC54LCB5OiAtaypib3gubWlkLnl9KTtcclxuICB9XHJcblxyXG4gIG1vdmVQYW4oZHYpIHtcclxuICAgIHRoaXMub3JiaXQucGFuKGR2LngqdGhpcy52aXN1YWwud2lkdGgoKSwgLWR2LnkqdGhpcy52aXN1YWwuaGVpZ2h0KCkpO1xyXG4gIH1cclxuXHJcbiAgdlRvQ2FtZXJhKHYpIHtcclxuICAgIHYucHJvamVjdCh0aGlzLmNhbWVyYSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiAwLjUqdi54LFxyXG4gICAgICB5OiAwLjUqdi55XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgY29tcHV0ZUNsaWVudEJvdW5kQm94KCkge1xyXG4gICAgY29uc3QgYm94ID0gdGhpcy5ib3VuZEJveENsYigpLFxyXG4gICAgICB4cyA9IFtib3gubWluLngsIGJveC5tYXgueF0sXHJcbiAgICAgIHlzID0gWzAsIDBdLFxyXG4gICAgICB6cyA9IFtib3gubWluLnosIGJveC5tYXguel07XHJcblxyXG4gICAgY29uc3QgcHMgPSBbXSwgcmVzID0ge21heDoge30sIG1pbjoge319O1xyXG4gICAgZm9yKGxldCB4IG9mIHhzKSB7XHJcbiAgICAgIGZvcihsZXQgeSBvZiB5cykge1xyXG4gICAgICAgIGZvcihsZXQgeiBvZiB6cykge1xyXG4gICAgICAgICAgcHMucHVzaCh0aGlzLnZUb0NhbWVyYSh0aGlzLnYuc2V0KHgseSx6KSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHBzLnNvcnQoKHAxLCBwMik9PiBwMS54LXAyLngpO1xyXG4gICAgcmVzLm1pbi54ID0gcHNbMF0ueDtcclxuICAgIHJlcy5tYXgueCA9IHBzW3BzLmxlbmd0aC0xXS54O1xyXG4gICAgcHMuc29ydCgocDEsIHAyKT0+IHAxLnktcDIueSk7XHJcbiAgICByZXMubWluLnkgPSBwc1swXS55O1xyXG4gICAgcmVzLm1heC55ID0gcHNbcHMubGVuZ3RoLTFdLnk7XHJcblxyXG4gICAgcmVzLndpZHRoID0gcmVzLm1heC54LXJlcy5taW4ueDtcclxuICAgIHJlcy5oZWlnaHQgPSByZXMubWF4LnktcmVzLm1pbi55O1xyXG5cclxuICAgIHJlcy5taWQgPSB7XHJcbiAgICAgIHg6IDAuNSoocmVzLm1heC54K3Jlcy5taW4ueCksXHJcbiAgICAgIHk6IDAuNSoocmVzLm1heC55K3Jlcy5taW4ueSlcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHNldE9iamVjdChib3VuZEJveENsYikge1xyXG4gICAgdGhpcy5ib3VuZEJveENsYiA9IGJvdW5kQm94Q2xiO1xyXG4gIH1cclxuXHJcbiAgdGVzdFNjYWxlKCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBjb21wdXRlQ29ycihLLCBtaW4sIG1heCkge1xyXG4gICAgbGV0IGNvcnIgPSAwO1xyXG4gICAgaWYoSzwxKSB7XHJcbiAgICAgIGlmKG1pbj4tMC41KSB7XHJcbiAgICAgICAgY29yciA9IC0wLjUtbWluO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYobWF4PDAuNSkge1xyXG4gICAgICAgIGNvcnIgPSAwLjUtbWF4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYobWluPC0wLjUpIHtcclxuICAgICAgICBjb3JyID0gLTAuNS1taW47XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihtYXg+MC41KSB7XHJcbiAgICAgICAgY29yciA9IDAuNS1tYXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb3JyO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2NhbGUoKSB7XHJcbiAgICBjb25zdCBib3ggPSB0aGlzLmNvbXB1dGVDbGllbnRCb3VuZEJveCgpLFxyXG4gICAgICBLeCA9IHRoaXMuZWxlbWVudFNpemUudy9ib3gud2lkdGgsXHJcbiAgICAgIEt5ID0gdGhpcy5lbGVtZW50U2l6ZS5oL2JveC5oZWlnaHQ7XHJcbiAgICByZXR1cm4gMS9NYXRoLm1pbihLeCwgS3kpO1xyXG4gIH1cclxuXHJcbiAgY2VudGVyVmlldyhUKSB7XHJcbiAgICBsZXQgYm94ID0gdGhpcy5jb21wdXRlQ2xpZW50Qm91bmRCb3goKSxcclxuICAgICAgS3ggPSB0aGlzLmVsZW1lbnRTaXplLncvYm94LndpZHRoLFxyXG4gICAgICBLeSA9IHRoaXMuZWxlbWVudFNpemUuaC9ib3guaGVpZ2h0LFxyXG4gICAgICBLID0gTWF0aC5taW4oS3gsIEt5KTtcclxuXHJcbiAgICBpZih0aGlzLnRlc3RTY2FsZSgpICYmIE1hdGguYWJzKDEvSy10aGlzLnNjYWxlKT50aGlzLmVwcykge1xyXG4gICAgICBjb25zdCBzY2FsZSA9IDEvSyswLjIqKHRoaXMuc2NhbGUtMS9LKTtcclxuICAgICAgdGhpcy5vcmJpdC5zZXRTY2FsZSh0aGlzLm9yYml0LmdldFNjYWxlKCkvKEsqc2NhbGUpKTtcclxuICAgICAgdGhpcy5vcmJpdC51cGRhdGUoKTtcclxuICAgICAgdGhpcy5jYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcclxuICAgICAgYm94ID0gdGhpcy5jb21wdXRlQ2xpZW50Qm91bmRCb3goKTtcclxuICAgICAgICBLeCA9IHRoaXMuZWxlbWVudFNpemUudy9ib3gud2lkdGg7XHJcbiAgICAgICAgS3kgPSB0aGlzLmVsZW1lbnRTaXplLmgvYm94LmhlaWdodDtcclxuICAgICAgICBLID0gTWF0aC5taW4oS3gsIEt5KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkdiA9IHRoaXMuZHY7XHJcbiAgICBpZihLPjEtdGhpcy5lcHMpIHtcclxuICAgICAgZHYuc2V0KC1ib3gubWlkLngsIC1ib3gubWlkLnkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGR2LnNldCh0aGlzLmNvbXB1dGVDb3JyKEt4LCBib3gubWluLngsIGJveC5tYXgueCksXHJcbiAgICAgICAgICAgICB0aGlzLmNvbXB1dGVDb3JyKEt5LCBib3gubWluLnksIGJveC5tYXgueSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKE1hdGguc3FydCh0aGlzLm9zLnZ4KnRoaXMub3MudngrdGhpcy5vcy52eSp0aGlzLm9zLnZ5KT4wLjAwMyB8fCBkdi5sZW5ndGgoKT4wLjAwMykge1xyXG4gICAgICBsZXQgZHQgPSAxLzYwLCB0PTAsIG9zID0ge1xyXG4gICAgICAgIC4uLnRoaXMub3MsXHJcbiAgICAgICAgeDogMCxcclxuICAgICAgICB5OiAwXHJcbiAgICAgIH07XHJcbiAgICAgIG9zLnRmID0gKHZ4LCB2eSwgeCwgeSk9PiAoe1xyXG4gICAgICAgIHg6IDc1Kihkdi54LXgpL01hdGgucG93KHRoaXMuZGV2aWNlUGl4ZWxSYXRpbywgMS4wKSxcclxuICAgICAgICB5OiA3NSooZHYueS15KS9NYXRoLnBvdyh0aGlzLmRldmljZVBpeGVsUmF0aW8sIDEuMClcclxuICAgICAgfSk7XHJcbiAgICAgIHdoaWxlKHQ8VCkge1xyXG4gICAgICAgIGlmKHQrZHQ+VCkge1xyXG4gICAgICAgICAgZHQgPSBULXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9zID0gdGhpcy5pbnRlZ3JhdGUob3MsIGR0KTtcclxuICAgICAgICB0ICs9IGR0O1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubW92ZVBhbihvcyk7XHJcbiAgICAgIHRoaXMub3MgPSBvcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGludGVncmF0ZShvcywgZHQpIHtcclxuICAgIGNvbnN0IFt2eCwgdnksIHgsIHldID0gTWF0aFV0aWxzLnJrNChcclxuICAgICAgdGhpcy5keS5iaW5kKG9zKSxcclxuICAgICAgMCxcclxuICAgICAgZHQsXHJcbiAgICAgIFtvcy52eCwgb3MudnksIG9zLngsIG9zLnldXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ub3MsXHJcbiAgICAgIHZ4LCB2eSwgeCwgeVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGR5KHQsWSkge1xyXG4gICAgY29uc3QgW3Z4LCB2eSwgeCwgeV0gPSBZLCB2ZCA9IDE1LCB0ZiA9IHRoaXMudGYodngsIHZ5LCB4LCB5KTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHRmLngtdmQqdngsXHJcbiAgICAgIHRmLnktdmQqdnksXHJcbiAgICAgIHZ4LFxyXG4gICAgICB2eVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZShkdCkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkICYmIHRoaXMuYm91bmRCb3hDbGIpIHtcclxuICAgICAgdGhpcy5jZW50ZXJWaWV3KGR0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL09iamVjdDNEV2F0Y2hlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL09iamVjdDNEV2F0Y2hlci5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3JiaXQgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihvYmplY3QsIGRvbUVsZW1lbnQpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcclxuICBcdHRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keTtcclxuXHJcbiAgXHQvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGlzIGNvbnRyb2xcclxuICBcdHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcblxyXG4gIFx0Ly8gXCJ0YXJnZXRcIiBzZXRzIHRoZSBsb2NhdGlvbiBvZiBmb2N1cywgd2hlcmUgdGhlIG9iamVjdCBvcmJpdHMgYXJvdW5kXHJcbiAgXHR0aGlzLnRhcmdldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcblxyXG4gIFx0Ly8gSG93IGZhciB5b3UgY2FuIGRvbGx5IGluIGFuZCBvdXQoUGVyc3BlY3RpdmVDYW1lcmEgb25seSlcclxuICBcdHRoaXMubWluRGlzdGFuY2UgPSAwO1xyXG4gIFx0dGhpcy5tYXhEaXN0YW5jZSA9IEluZmluaXR5O1xyXG5cclxuICBcdC8vIEhvdyBmYXIgeW91IGNhbiB6b29tIGluIGFuZCBvdXQoT3J0aG9ncmFwaGljQ2FtZXJhIG9ubHkpXHJcbiAgXHR0aGlzLm1pblpvb20gPSAwO1xyXG4gIFx0dGhpcy5tYXhab29tID0gSW5maW5pdHk7XHJcblxyXG4gIFx0Ly8gSG93IGZhciB5b3UgY2FuIG9yYml0IHZlcnRpY2FsbHksIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuXHJcbiAgXHQvLyBSYW5nZSBpcyAwIHRvIE1hdGguUEkgcmFkaWFucy5cclxuICBcdHRoaXMubWluUG9sYXJBbmdsZSA9IDA7IC8vIHJhZGlhbnNcclxuICBcdHRoaXMubWF4UG9sYXJBbmdsZSA9IE1hdGguUEk7IC8vIHJhZGlhbnNcclxuXHJcbiAgXHQvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgaG9yaXpvbnRhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxyXG4gIFx0Ly8gSWYgc2V0LCBtdXN0IGJlIGEgc3ViLWludGVydmFsIG9mIHRoZSBpbnRlcnZhbCBbLU1hdGguUEksIE1hdGguUEkgXS5cclxuICBcdHRoaXMubWluQXppbXV0aEFuZ2xlID0gLUluZmluaXR5OyAvLyByYWRpYW5zXHJcbiAgXHR0aGlzLm1heEF6aW11dGhBbmdsZSA9IEluZmluaXR5OyAvLyByYWRpYW5zXHJcblxyXG4gIFx0Ly8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGRhbXBpbmcgKGluZXJ0aWEpXHJcbiAgXHQvLyBJZiBkYW1waW5nIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxyXG4gIFx0dGhpcy5lbmFibGVEYW1waW5nID0gZmFsc2U7XHJcbiAgXHR0aGlzLmRhbXBpbmdGYWN0b3IgPSAwLjI1O1xyXG5cclxuICBcdC8vIFRoaXMgb3B0aW9uIGFjdHVhbGx5IGVuYWJsZXMgZG9sbHlpbmcgaW4gYW5kIG91dDsgbGVmdCBhcyBcInpvb21cIiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXHJcbiAgXHQvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB6b29taW5nXHJcbiAgXHR0aGlzLmVuYWJsZVpvb20gPSB0cnVlO1xyXG4gIFx0dGhpcy56b29tU3BlZWQgPSAxLjA7XHJcblxyXG4gIFx0Ly8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm90YXRpbmdcclxuICBcdHRoaXMuZW5hYmxlUm90YXRlID0gdHJ1ZTtcclxuICBcdHRoaXMucm90YXRlU3BlZWQgPSAxLjA7XHJcblxyXG4gIFx0Ly8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcGFubmluZ1xyXG4gIFx0dGhpcy5lbmFibGVQYW4gPSB0cnVlO1xyXG5cclxuICBcdC8vIFNldCB0byB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgcm90YXRlIGFyb3VuZCB0aGUgdGFyZ2V0XHJcbiAgXHQvLyBJZiBhdXRvLXJvdGF0ZSBpcyBlbmFibGVkLCB5b3UgbXVzdCBjYWxsIGNvbnRyb2xzLnVwZGF0ZSgpIGluIHlvdXIgYW5pbWF0aW9uIGxvb3BcclxuICBcdHRoaXMuYXV0b1JvdGF0ZSA9IGZhbHNlO1xyXG4gIFx0dGhpcy5hdXRvUm90YXRlU3BlZWQgPSAyLjA7IC8vIDMwIHNlY29uZHMgcGVyIHJvdW5kIHdoZW4gZnBzIGlzIDYwXHJcblxyXG4gIFx0Ly8gZm9yIHJlc2V0XHJcbiAgXHR0aGlzLnRhcmdldDAgPSB0aGlzLnRhcmdldC5jbG9uZSgpO1xyXG4gIFx0dGhpcy5wb3NpdGlvbjAgPSB0aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gIFx0dGhpcy56b29tMCA9IHRoaXMub2JqZWN0Lnpvb207XHJcblxyXG4gIFx0Ly9cclxuICBcdC8vIHB1YmxpYyBtZXRob2RzXHJcbiAgXHQvL1xyXG4gIFx0dGhpcy5nZXRQb2xhckFuZ2xlID0gZnVuY3Rpb24gKCkge1xyXG4gIFx0XHRyZXR1cm4gc3BoZXJpY2FsLnBoaTtcclxuICBcdH07XHJcblxyXG4gIFx0dGhpcy5nZXRBemltdXRoYWxBbmdsZSA9IGZ1bmN0aW9uICgpIHtcclxuICBcdFx0cmV0dXJuIHNwaGVyaWNhbC50aGV0YTtcclxuICBcdH07XHJcblxyXG4gIFx0dGhpcy5yZXNldCA9IGZ1bmN0aW9uICgpIHtcclxuICBcdFx0c2NvcGUudGFyZ2V0LmNvcHkoc2NvcGUudGFyZ2V0MCk7XHJcbiAgXHRcdHNjb3BlLm9iamVjdC5wb3NpdGlvbi5jb3B5KHNjb3BlLnBvc2l0aW9uMCk7XHJcbiAgXHRcdHNjb3BlLm9iamVjdC56b29tID0gc2NvcGUuem9vbTA7XHJcblxyXG4gIFx0XHRzY29wZS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gIFx0XHRzY29wZS5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcclxuXHJcbiAgXHRcdHNjb3BlLnVwZGF0ZSgpO1xyXG4gIFx0fTtcclxuXHJcbiAgICB0aGlzLnpvb21PdXQgPSBmdW5jdGlvbihzcGVlZD10aGlzLnpvb21TcGVlZCkge1xyXG4gICAgICBjb25zdCBfc3BlZWQgPSB0aGlzLnpvb21TcGVlZDtcclxuICAgICAgdGhpcy56b29tU3BlZWQgPSBzcGVlZDtcclxuICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XHJcbiAgICAgIHRoaXMuem9vbVNwZWVkID0gX3NwZWVkO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnpvb21JbiA9IGZ1bmN0aW9uKHNwZWVkPXRoaXMuem9vbVNwZWVkKSB7XHJcbiAgICAgIGNvbnN0IF9zcGVlZCA9IHRoaXMuem9vbVNwZWVkO1xyXG4gICAgICB0aGlzLnpvb21TcGVlZCA9IHNwZWVkO1xyXG4gICAgICBkb2xseU91dChnZXRab29tU2NhbGUoKSk7XHJcbiAgICAgIHRoaXMuem9vbVNwZWVkID0gX3NwZWVkO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmdldFNjYWxlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBzY2FsZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFNjYWxlID0gZnVuY3Rpb24obmV3U2NhbGUpIHtcclxuICAgICAgc2NhbGUgPSBuZXdTY2FsZTtcclxuICAgIH1cclxuXHJcbiAgXHQvLyB0aGlzIG1ldGhvZCBpcyBleHBvc2VkLCBidXQgcGVyaGFwcyBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2UgY2FuIG1ha2UgaXQgcHJpdmF0ZS4uLlxyXG4gIFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbigpIHtcclxuICBcdFx0dmFyIG9mZnNldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgXHRcdC8vIHNvIGNhbWVyYS51cCBpcyB0aGUgb3JiaXQgYXhpc1xyXG4gIFx0XHR2YXIgcXVhdCA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkuc2V0RnJvbVVuaXRWZWN0b3JzKG9iamVjdC51cCwgbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCkpO1xyXG4gIFx0XHR2YXIgcXVhdEludmVyc2UgPSBxdWF0LmNsb25lKCkuaW52ZXJzZSgpO1xyXG4gIFx0XHR2YXIgbGFzdFBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICBcdFx0dmFyIGxhc3RRdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuXHJcbiAgXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUgKCkge1xyXG4gIFx0XHRcdHZhciBwb3NpdGlvbiA9IHNjb3BlLm9iamVjdC5wb3NpdGlvbjtcclxuICBcdFx0XHRvZmZzZXQuY29weShwb3NpdGlvbikuc3ViKHNjb3BlLnRhcmdldCk7XHJcbiAgXHRcdFx0Ly8gcm90YXRlIG9mZnNldCB0byBcInktYXhpcy1pcy11cFwiIHNwYWNlXHJcbiAgXHRcdFx0b2Zmc2V0LmFwcGx5UXVhdGVybmlvbihxdWF0KTtcclxuICBcdFx0XHQvLyBhbmdsZSBmcm9tIHotYXhpcyBhcm91bmQgeS1heGlzXHJcbiAgXHRcdFx0c3BoZXJpY2FsLnNldEZyb21WZWN0b3IzKG9mZnNldCk7XHJcbiAgXHRcdFx0aWYoc2NvcGUuYXV0b1JvdGF0ZSkge1xyXG4gIFx0XHRcdFx0cm90YXRlTGVmdChnZXRBdXRvUm90YXRpb25BbmdsZSgpKTtcclxuICBcdFx0XHR9XHJcbiAgXHRcdFx0c3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRhLnRoZXRhO1xyXG4gIFx0XHRcdHNwaGVyaWNhbC5waGkgKz0gc3BoZXJpY2FsRGVsdGEucGhpO1xyXG4gIFx0XHRcdC8vIHJlc3RyaWN0IHRoZXRhIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcclxuICBcdFx0XHRzcGhlcmljYWwudGhldGEgPSBNYXRoLm1heChzY29wZS5taW5BemltdXRoQW5nbGUsIE1hdGgubWluKHNjb3BlLm1heEF6aW11dGhBbmdsZSwgc3BoZXJpY2FsLnRoZXRhKSk7XHJcbiAgXHRcdFx0Ly8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcclxuICBcdFx0XHRzcGhlcmljYWwucGhpID0gTWF0aC5tYXgoc2NvcGUubWluUG9sYXJBbmdsZSwgTWF0aC5taW4oc2NvcGUubWF4UG9sYXJBbmdsZSwgc3BoZXJpY2FsLnBoaSkpO1xyXG4gIFx0XHRcdHNwaGVyaWNhbC5tYWtlU2FmZSgpO1xyXG4gIFx0XHRcdHNwaGVyaWNhbC5yYWRpdXMgKj0gc2NhbGU7XHJcbiAgXHRcdFx0Ly8gcmVzdHJpY3QgcmFkaXVzIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcclxuICBcdFx0XHRzcGhlcmljYWwucmFkaXVzID0gTWF0aC5tYXgoc2NvcGUubWluRGlzdGFuY2UsIE1hdGgubWluKHNjb3BlLm1heERpc3RhbmNlLCBzcGhlcmljYWwucmFkaXVzKSk7XHJcbiAgXHRcdFx0Ly8gbW92ZSB0YXJnZXQgdG8gcGFubmVkIGxvY2F0aW9uXHJcbiAgXHRcdFx0c2NvcGUudGFyZ2V0LmFkZChwYW5PZmZzZXQpO1xyXG4gIFx0XHRcdG9mZnNldC5zZXRGcm9tU3BoZXJpY2FsKHNwaGVyaWNhbCk7XHJcbiAgXHRcdFx0Ly8gcm90YXRlIG9mZnNldCBiYWNrIHRvIFwiY2FtZXJhLXVwLXZlY3Rvci1pcy11cFwiIHNwYWNlXHJcbiAgXHRcdFx0b2Zmc2V0LmFwcGx5UXVhdGVybmlvbihxdWF0SW52ZXJzZSk7XHJcbiAgXHRcdFx0cG9zaXRpb24uY29weShzY29wZS50YXJnZXQpLmFkZChvZmZzZXQpO1xyXG4gIFx0XHRcdHNjb3BlLm9iamVjdC5sb29rQXQoc2NvcGUudGFyZ2V0KTtcclxuXHJcbiAgXHRcdFx0aWYoc2NvcGUuZW5hYmxlRGFtcGluZz09PXRydWUpIHtcclxuICBcdFx0XHRcdHNwaGVyaWNhbERlbHRhLnRoZXRhICo9KDEtc2NvcGUuZGFtcGluZ0ZhY3Rvcik7XHJcbiAgXHRcdFx0XHRzcGhlcmljYWxEZWx0YS5waGkgKj0oMS1zY29wZS5kYW1waW5nRmFjdG9yKTtcclxuICBcdFx0XHR9IGVsc2Uge1xyXG4gIFx0XHRcdFx0c3BoZXJpY2FsRGVsdGEuc2V0KDAsIDAsIDApO1xyXG4gIFx0XHRcdH1cclxuXHJcbiAgXHRcdFx0c2NhbGUgPSAxO1xyXG4gIFx0XHRcdHBhbk9mZnNldC5zZXQoMCwgMCwgMCk7XHJcblxyXG4gIFx0XHRcdC8vIHVwZGF0ZSBjb25kaXRpb24gaXM6XHJcbiAgXHRcdFx0Ly8gbWluKGNhbWVyYSBkaXNwbGFjZW1lbnQsIGNhbWVyYSByb3RhdGlvbiBpbiByYWRpYW5zKV4yID4gRVBTXHJcbiAgXHRcdFx0Ly8gdXNpbmcgc21hbGwtYW5nbGUgYXBwcm94aW1hdGlvbiBjb3MoeC8yKSA9IDEteF4yIC8gOFxyXG5cclxuICBcdFx0XHRpZih6b29tQ2hhbmdlZCB8fFxyXG4gIFx0XHRcdFx0bGFzdFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKHNjb3BlLm9iamVjdC5wb3NpdGlvbikgPiBFUFMgfHxcclxuICBcdFx0XHRcdDggKigxLWxhc3RRdWF0ZXJuaW9uLmRvdChzY29wZS5vYmplY3QucXVhdGVybmlvbikpID4gRVBTKSB7XHJcblxyXG4gIFx0XHRcdFx0c2NvcGUuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XHJcblxyXG4gIFx0XHRcdFx0bGFzdFBvc2l0aW9uLmNvcHkoc2NvcGUub2JqZWN0LnBvc2l0aW9uKTtcclxuICBcdFx0XHRcdGxhc3RRdWF0ZXJuaW9uLmNvcHkoc2NvcGUub2JqZWN0LnF1YXRlcm5pb24pO1xyXG4gIFx0XHRcdFx0em9vbUNoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuICBcdFx0XHR9XHJcbiAgXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG4gIFx0XHR9O1xyXG4gIFx0fSgpO1xyXG5cclxuICAgIHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIH07XHJcblxyXG4gIFx0Ly9cclxuICBcdC8vIGludGVybmFsc1xyXG4gIFx0Ly9cclxuICBcdHZhciBzY29wZSA9IHRoaXM7XHJcbiAgXHR2YXIgY2hhbmdlRXZlbnQgPSB7IHR5cGU6ICdjaGFuZ2UnIH07XHJcbiAgXHR2YXIgRVBTID0gMWUtNjtcclxuICBcdC8vIGN1cnJlbnQgcG9zaXRpb24gaW4gc3BoZXJpY2FsIGNvb3JkaW5hdGVzXHJcbiAgXHR2YXIgc3BoZXJpY2FsID0gbmV3IFRIUkVFLlNwaGVyaWNhbCgpO1xyXG4gIFx0dmFyIHNwaGVyaWNhbERlbHRhID0gbmV3IFRIUkVFLlNwaGVyaWNhbCgpO1xyXG5cclxuICBcdHZhciBzY2FsZSA9IDE7XHJcbiAgXHR2YXIgcGFuT2Zmc2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICBcdHZhciB6b29tQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICBcdGZ1bmN0aW9uIGdldEF1dG9Sb3RhdGlvbkFuZ2xlKCkge1xyXG4gIFx0XHRyZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAvIDYwICogc2NvcGUuYXV0b1JvdGF0ZVNwZWVkO1xyXG4gIFx0fVxyXG5cclxuICBcdGZ1bmN0aW9uIGdldFpvb21TY2FsZSgpIHtcclxuICBcdFx0cmV0dXJuIE1hdGgucG93KDAuOTUsIHNjb3BlLnpvb21TcGVlZCk7XHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gcm90YXRlTGVmdChhbmdsZSkge1xyXG4gIFx0XHRzcGhlcmljYWxEZWx0YS50aGV0YSAtPSBhbmdsZTtcclxuICBcdH1cclxuXHJcbiAgXHRmdW5jdGlvbiByb3RhdGVVcChhbmdsZSkge1xyXG4gIFx0XHRzcGhlcmljYWxEZWx0YS5waGkgLT0gYW5nbGU7XHJcbiAgXHR9XHJcblxyXG4gIFx0dmFyIHBhbkxlZnQgPSBmdW5jdGlvbigpIHtcclxuICBcdFx0dmFyIHYgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIFx0XHRyZXR1cm4gZnVuY3Rpb24gcGFuTGVmdChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSB7XHJcbiAgXHRcdFx0di5zZXRGcm9tTWF0cml4Q29sdW1uKG9iamVjdE1hdHJpeCwgMCk7IC8vIGdldCBYIGNvbHVtbiBvZiBvYmplY3RNYXRyaXhcclxuICBcdFx0XHR2Lm11bHRpcGx5U2NhbGFyKC0gZGlzdGFuY2UpO1xyXG4gIFx0XHRcdHBhbk9mZnNldC5hZGQodik7XHJcbiAgXHRcdH07XHJcbiAgXHR9KCk7XHJcblxyXG4gIFx0dmFyIHBhblVwID0gZnVuY3Rpb24oKSB7XHJcbiAgXHRcdHZhciB2ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICBcdFx0cmV0dXJuIGZ1bmN0aW9uIHBhblVwKGRpc3RhbmNlLCBvYmplY3RNYXRyaXgpIHtcclxuICBcdFx0XHR2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAxKTsgLy8gZ2V0IFkgY29sdW1uIG9mIG9iamVjdE1hdHJpeFxyXG4gIFx0XHRcdHYubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xyXG4gIFx0XHRcdHBhbk9mZnNldC5hZGQodik7XHJcbiAgXHRcdH07XHJcbiAgXHR9KCk7XHJcblxyXG4gIFx0Ly8gZGVsdGFYIGFuZCBkZWx0YVkgYXJlIGluIHBpeGVsczsgcmlnaHQgYW5kIGRvd24gYXJlIHBvc2l0aXZlXHJcbiAgXHRzY29wZS5wYW4gPSBmdW5jdGlvbigpIHtcclxuICBcdFx0dmFyIG9mZnNldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgXHRcdHJldHVybiBmdW5jdGlvbiBwYW4oZGVsdGFYLCBkZWx0YVkpIHtcclxuICBcdFx0XHR2YXIgZWxlbWVudCA9IHNjb3BlLmRvbUVsZW1lbnQ7XHJcbiAgXHRcdFx0aWYoc2NvcGUub2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEpIHtcclxuICBcdFx0XHRcdC8vIHBlcnNwZWN0aXZlXHJcbiAgXHRcdFx0XHR2YXIgcG9zaXRpb24gPSBzY29wZS5vYmplY3QucG9zaXRpb247XHJcbiAgXHRcdFx0XHRvZmZzZXQuY29weShwb3NpdGlvbikuc3ViKHNjb3BlLnRhcmdldCk7XHJcbiAgXHRcdFx0XHR2YXIgdGFyZ2V0RGlzdGFuY2UgPSBvZmZzZXQubGVuZ3RoKCk7XHJcbiAgXHRcdFx0XHQvLyBoYWxmIG9mIHRoZSBmb3YgaXMgY2VudGVyIHRvIHRvcCBvZiBzY3JlZW5cclxuICBcdFx0XHRcdHRhcmdldERpc3RhbmNlICo9IE1hdGgudGFuKChzY29wZS5vYmplY3QuZm92IC8gMikgKiBNYXRoLlBJIC8gMTgwLjApO1xyXG4gIFx0XHRcdFx0Ly8gd2UgYWN0dWFsbHkgZG9uJ3QgdXNlIHNjcmVlbldpZHRoLCBzaW5jZSBwZXJzcGVjdGl2ZSBjYW1lcmEgaXMgZml4ZWQgdG8gc2NyZWVuIGhlaWdodFxyXG4gIFx0XHRcdFx0cGFuTGVmdCgyICogZGVsdGFYICogdGFyZ2V0RGlzdGFuY2UgLyBlbGVtZW50LmNsaWVudEhlaWdodCwgc2NvcGUub2JqZWN0Lm1hdHJpeCk7XHJcbiAgXHRcdFx0XHRwYW5VcCgyICogZGVsdGFZICogdGFyZ2V0RGlzdGFuY2UgLyBlbGVtZW50LmNsaWVudEhlaWdodCwgc2NvcGUub2JqZWN0Lm1hdHJpeCk7XHJcbiAgXHRcdFx0fSBlbHNlIGlmKHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSkge1xyXG4gIFx0XHRcdFx0Ly8gb3J0aG9ncmFwaGljXHJcbiAgXHRcdFx0XHRwYW5MZWZ0KGRlbHRhWCAqKHNjb3BlLm9iamVjdC5yaWdodC1zY29wZS5vYmplY3QubGVmdCkgLyBzY29wZS5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50V2lkdGgsIHNjb3BlLm9iamVjdC5tYXRyaXgpO1xyXG4gIFx0XHRcdFx0cGFuVXAoZGVsdGFZICooc2NvcGUub2JqZWN0LnRvcC1zY29wZS5vYmplY3QuYm90dG9tKSAvIHNjb3BlLm9iamVjdC56b29tIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHNjb3BlLm9iamVjdC5tYXRyaXgpO1xyXG4gIFx0XHRcdH0gZWxzZSB7XHJcbiAgXHRcdFx0XHQvLyBjYW1lcmEgbmVpdGhlciBvcnRob2dyYXBoaWMgbm9yIHBlcnNwZWN0aXZlXHJcbiAgXHRcdFx0XHRjb25zb2xlLndhcm4oJ1dBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZS1wYW4gZGlzYWJsZWQuJyk7XHJcbiAgXHRcdFx0XHRzY29wZS5lbmFibGVQYW4gPSBmYWxzZTtcclxuICBcdFx0XHR9XHJcbiAgXHRcdH07XHJcbiAgXHR9KCk7XHJcblxyXG4gIFx0ZnVuY3Rpb24gZG9sbHlJbihkb2xseVNjYWxlKSB7XHJcbiAgICAgIGlmKHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKSB7XHJcbiAgXHRcdFx0c2NhbGUgLz0gZG9sbHlTY2FsZTtcclxuICBcdFx0fSBlbHNlIGlmKHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSkge1xyXG4gIFx0XHRcdHNjb3BlLm9iamVjdC56b29tID0gTWF0aC5tYXgoc2NvcGUubWluWm9vbSwgTWF0aC5taW4oc2NvcGUubWF4Wm9vbSwgc2NvcGUub2JqZWN0Lnpvb20gKiBkb2xseVNjYWxlKSk7XHJcbiAgXHRcdFx0c2NvcGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICBcdFx0XHR6b29tQ2hhbmdlZCA9IHRydWU7XHJcbiAgXHRcdH0gZWxzZSB7XHJcbiAgXHRcdFx0Y29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUtZG9sbHkvem9vbSBkaXNhYmxlZC4nKTtcclxuICBcdFx0XHRzY29wZS5lbmFibGVab29tID0gZmFsc2U7XHJcbiAgXHRcdH1cclxuICBcdH1cclxuXHJcbiAgXHRmdW5jdGlvbiBkb2xseU91dChkb2xseVNjYWxlKSB7XHJcbiAgICAgIGlmKHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKSB7XHJcbiAgXHRcdFx0c2NhbGUgKj0gZG9sbHlTY2FsZTtcclxuICBcdFx0fSBlbHNlIGlmKHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSkge1xyXG4gIFx0XHRcdHNjb3BlLm9iamVjdC56b29tID0gTWF0aC5tYXgoc2NvcGUubWluWm9vbSwgTWF0aC5taW4oc2NvcGUubWF4Wm9vbSwgc2NvcGUub2JqZWN0Lnpvb20gLyBkb2xseVNjYWxlKSk7XHJcbiAgXHRcdFx0c2NvcGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICBcdFx0XHR6b29tQ2hhbmdlZCA9IHRydWU7XHJcbiAgXHRcdH0gZWxzZSB7XHJcbiAgXHRcdFx0Y29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUtZG9sbHkvem9vbSBkaXNhYmxlZC4nKTtcclxuICBcdFx0XHRzY29wZS5lbmFibGVab29tID0gZmFsc2U7XHJcbiAgXHRcdH1cclxuICBcdH1cclxuXHJcbiAgICAvKiBBY3Rpb25zICovXHJcblxyXG4gICAgZnVuY3Rpb24gcm90YXRlKGV2ZW50LCBkYXRhKSB7XHJcbiAgICAgIGlmKHNjb3BlLmVuYWJsZWQgJiYgc2NvcGUuZW5hYmxlUm90YXRlICYmIGRhdGEuc3RhdGU9PT0nbW92ZScpIHtcclxuICAgICAgICB2YXIgZWxlbWVudCA9IHNjb3BlLmRvbUVsZW1lbnQ7XHJcbiAgICAgICAgLy8gcm90YXRpbmcgYWNyb3NzIHdob2xlIHNjcmVlbiBnb2VzIDM2MCBkZWdyZWVzIGFyb3VuZFxyXG4gICAgICAgIHJvdGF0ZUxlZnQoMiAqIE1hdGguUEkgKiBkYXRhLmR4IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIHNjb3BlLnJvdGF0ZVNwZWVkKTtcclxuICAgICAgICAvLyByb3RhdGluZyB1cCBhbmQgZG93biBhbG9uZyB3aG9sZSBzY3JlZW4gYXR0ZW1wdHMgdG8gZ28gMzYwLCBidXQgbGltaXRlZCB0byAxODBcclxuICAgICAgICByb3RhdGVVcCgyICogTWF0aC5QSSAqIGRhdGEuZHkgLyBlbGVtZW50LmNsaWVudEhlaWdodCAqIHNjb3BlLnJvdGF0ZVNwZWVkKTtcclxuICAgICAgICBzY29wZS51cGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHBhbihldmVudCwgZGF0YSkge1xyXG4gICAgICBpZihzY29wZS5lbmFibGVkICYmIHNjb3BlLmVuYWJsZVBhbiAmJiBkYXRhLnN0YXRlPT09J21vdmUnKSB7XHJcbiAgICAgICAgc2NvcGUucGFuKGRhdGEuZHgsIGRhdGEuZHkpO1xyXG4gICAgICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gb2Zmc2V0RG9sbHkoZXZlbnQsIGRhdGEpIHtcclxuICAgICAgaWYoc2NvcGUuZW5hYmxlZCAmJiBzY29wZS5lbmFibGVab29tICYmIGRhdGEuc3RhdGU9PT0nbW92ZScpIHtcclxuICAgICAgICBpZihkYXRhLmR5PjApIHtcclxuICAgICAgICAgIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZihkYXRhLmR5PDApIHtcclxuICAgICAgICAgIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2NvcGUudXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB3aGVlbERvbGx5KGV2ZW50KSB7XHJcbiAgICAgIGlmKHNjb3BlLmVuYWJsZWQgJiYgc2NvcGUuZW5hYmxlWm9vbSkge1xyXG4gICAgICAgIGlmKGV2ZW50LmRlbHRhWT4wKSB7XHJcbiAgICAgICAgICBkb2xseU91dChnZXRab29tU2NhbGUoKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmKGV2ZW50LmRlbHRhWTwwKSB7XHJcbiAgICAgICAgICBkb2xseUluKGdldFpvb21TY2FsZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2NvcGUudXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdGlvbnMgPSB7XHJcbiAgICAgIHJvdGF0ZSxcclxuICAgICAgcGFuLFxyXG4gICAgICBvZmZzZXREb2xseSxcclxuICAgICAgd2hlZWxEb2xseVxyXG4gICAgfVxyXG5cclxuICBcdC8vIGZvcmNlIGFuIHVwZGF0ZSBhdCBzdGFydFxyXG4gIFx0dGhpcy51cGRhdGUoKTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL09yYml0LmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvT3JiaXQuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgSW1hZ2VCYXNlIGZyb20gJy4vSW1hZ2VCYXNlJztcclxuaW1wb3J0IFBkZiBmcm9tICcuL1BkZic7XHJcbmltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJy4vQmFzZU1hdGhVdGlscyc7XHJcbmltcG9ydCBDdXN0b21FdmVudENvbnZlcnRlciBmcm9tICcuL0N1c3RvbUV2ZW50Q29udmVydGVyJztcclxuaW1wb3J0IFBvbHlUYXJnZXQgZnJvbSAnLi90YXJnZXRzL1BvbHlUYXJnZXQnO1xyXG5cclxuaW1wb3J0IEZpbmRlciBmcm9tICcuL0ZpbmRlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZGZJbWFnZSBleHRlbmRzIEltYWdlQmFzZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yLCBwZGYsIG4pIHtcclxuICAgIHN1cGVyKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yKTtcclxuXHJcbiAgICB0aGlzLnF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLm4gPSBuO1xyXG4gICAgdGhpcy5wZGYgPSBwZGY7XHJcbiAgICB0aGlzLnYgPSB7eDogMCwgeTogMCwgejogMCwgc2V0OiBmdW5jdGlvbih4LHkseikge1xyXG4gICAgICB0aGlzLng9eDsgdGhpcy55PXk7IHRoaXMuej16O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sIHRyYW5zZm9ybTogZnVuY3Rpb24obSkge1xyXG4gICAgICBjb25zdCB4PW0ubVswXVswXSp0aGlzLngrbS5tWzFdWzBdKnRoaXMueSttLm1bMl1bMF0qdGhpcy56LFxyXG4gICAgICAgICAgICB5PW0ubVswXVsxXSp0aGlzLngrbS5tWzFdWzFdKnRoaXMueSttLm1bMl1bMV0qdGhpcy56LFxyXG4gICAgICAgICAgICB6PW0ubVswXVsyXSp0aGlzLngrbS5tWzBdWzJdKnRoaXMueSttLm1bMl1bMF0qdGhpcy56O1xyXG4gICAgICB0aGlzLng9eDtcclxuICAgICAgdGhpcy55PXk7XHJcbiAgICAgIHRoaXMuej16O1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH19O1xyXG4gICAgdGhpcy5tID0ge206IFtbMSwwLDBdLFswLDEsMF0sWzAsMCwxXV0sIHNldDogZnVuY3Rpb24obTAwLG0wMSxtMDIsbTEwLG0xMSxtMTIsbTIwLG0yMSxtMjIpIHtcclxuICAgICAgdGhpcy5tPVtbbTAwLG0wMSxtMDJdLFttMTAsbTExLG0xMl0sW20yMCxtMjEsbTIyXV07XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfX07XHJcblxyXG4gICAgdGhpcy5zdGFydFJlbmRlciA9ICgpPT4ge1xyXG4gICAgICB0aGlzLnBkZi5nZXRIYW5kbGVyKHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xyXG4gICAgfTtcclxuICAgIFByb21pc2UucmVzb2x2ZSgpLlxyXG4gICAgICB0aGVuKCgpPT4gdGhpcy5wZGYuZ2V0SGFuZGxlcih0aGlzLmluaXQuYmluZCh0aGlzKSkpO1xyXG4gIH1cclxuXHJcbiAgc2V0UXVlcnkocXVlcnkpIHtcclxuICAgIHRoaXMucXVlcnkgPSBxdWVyeS50cmltKCk7XHJcbiAgICBpZih0aGlzLnRleHRDb250ZW50KSB7XHJcbiAgICAgIHRoaXMuc2V0SGl0cyh0aGlzLnRleHRDb250ZW50KTtcclxuICAgICAgLy8gdGhpcy5maW5pc2hMb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWN0U2l6ZShyKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogclsyXS1yWzBdLFxyXG4gICAgICBoZWlnaHQ6IHJbM10tclsxXVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVBvbHkobSwgcCwgcykge1xyXG4gICAgY29uc3QgcG9seSA9IFtdLCB2ID0gdGhpcy52O1xyXG4gICAgdi5zZXQocC54LCBwLnksIDEpLnRyYW5zZm9ybShtKTtcclxuICAgIHBvbHkucHVzaCh7eDogdi54LCB5OiB2Lnl9KTtcclxuICAgIHYuc2V0KHAueCwgcC55K3MuaGVpZ2h0LCAxKS50cmFuc2Zvcm0obSk7XHJcbiAgICBwb2x5LnB1c2goe3g6IHYueCwgeTogdi55fSk7XHJcbiAgICB2LnNldChwLngrcy53aWR0aCwgcC55K3MuaGVpZ2h0LCAxKS50cmFuc2Zvcm0obSk7XHJcbiAgICBwb2x5LnB1c2goe3g6IHYueCwgeTogdi55fSk7XHJcbiAgICB2LnNldChwLngrcy53aWR0aCwgcC55LCAxKS50cmFuc2Zvcm0obSk7XHJcbiAgICBwb2x5LnB1c2goe3g6IHYueCwgeTogdi55fSk7XHJcbiAgICByZXR1cm4gcG9seTtcclxuICB9XHJcblxyXG4gIGdldFNpbXVsYXRlZERvYygpIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2U7XHJcbiAgfVxyXG5cclxuICBzaW11bGF0ZShlLCBkb2MsIHgsIHkpIHtcclxuICAgIGlmKHRoaXMuZXZlbnRDb252ZXJ0ZXIpIHtcclxuICAgICAgdGhpcy5ldmVudENvbnZlcnRlci5jb252ZXJ0KGUsIHtkb2MsIHgsIHl9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEFubm90YXRpb25zKGFubm9zKSB7XHJcbiAgICBjb25zdCB0ID0gdGhpcy52aWV3cG9ydC50cmFuc2Zvcm0sXHJcbiAgICAgIHRhcmdldHMgPSBbXTtcclxuICAgIHRoaXMubS5zZXQoXHJcbiAgICAgIHRbMF0sdFsxXSwwLFxyXG4gICAgICB0WzJdLHRbM10sMCxcclxuICAgICAgdFs0XSx0WzVdLDEpO1xyXG5cclxuICAgIGZvcihsZXQgYW5ubyBvZiBhbm5vcykge1xyXG4gICAgICBpZiAoYW5uby5zdWJ0eXBlPT09J0xpbmsnKSB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGFubm8ucmVjdCxcclxuICAgICAgICAgIGFQb3MgPSB7XHJcbiAgICAgICAgICAgIHg6IHJlY3RbMF0sXHJcbiAgICAgICAgICAgIHk6IHJlY3RbMV1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBhU3ogPSB0aGlzLnJlY3RTaXplKHJlY3QpO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG5ldyBQb2x5VGFyZ2V0KHRoaXMuY3JlYXRlUG9seSh0aGlzLm0sIGFQb3MsIGFTeikubWFwKChwKT0+ICh7eDogcC54L3RoaXMudmlld3BvcnQud2lkdGgsIHk6IDEtcC55L3RoaXMudmlld3BvcnQuaGVpZ2h0fSkpKTtcclxuICAgICAgICB0YXJnZXQuYW5ubyA9IGFubm87XHJcbiAgICAgICAgdGFyZ2V0LmNhbGxiYWNrID0gdGhpcy5hbm5vQ2xiLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGFyZ2V0cy5wdXNoKHRhcmdldCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKHRhcmdldHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRDb252ZXJ0ZXIgPSBuZXcgQ3VzdG9tRXZlbnRDb252ZXJ0ZXIodGhpcy53bmQsIHRoaXMuZG9jLCBQb2x5VGFyZ2V0LnRlc3QsIHRoaXMucGFnZSk7XHJcbiAgICAgIGZvcihsZXQgdGFyZ2V0IG9mIHRhcmdldHMpIHtcclxuICAgICAgICB0aGlzLmV2ZW50Q29udmVydGVyLmFkZEN1c3RvbSh0YXJnZXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRIaXRzKHRleHRDb250ZW50KSB7XHJcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XHJcbiAgICBpZih0aGlzLnF1ZXJ5IT09JycpIHtcclxuICAgICAgdGhpcy5maW5kZXIgPSBuZXcgRmluZGVyKHRleHRDb250ZW50Lml0ZW1zLm1hcCgoaXRlbSk9PiBpdGVtLnN0ciksIHRoaXMucXVlcnksIHtjb250ZXh0czogZmFsc2V9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbmRlckhpdHMoKSB7XHJcbiAgICBpZih0aGlzLmZpbmRlcikge1xyXG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy5wYWdlLnZpZXcsXHJcbiAgICAgICAgdGVzdFN6ID0gJCgnPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdmlzaWJpbGl0eTogaGlkZGVuO1wiPjwvZGl2PicpLmFwcGVuZFRvKCdib2R5JyksIHRleHREaXYgPSB0ZXN0U3pbMF0sXHJcbiAgICAgICAgYmFzZU9mZnNldCA9IHRlc3RTei5vZmZzZXQoKS5sZWZ0O1xyXG4gICAgICBmb3IobGV0IGhpdCBvZiB0aGlzLmZpbmRlci5nZXRIaXRzKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnRleHRDb250ZW50Lml0ZW1zW2hpdC5pbmRleF0sXHJcbiAgICAgICAgICAgICAgICB0ID0gUERGSlMuVXRpbC50cmFuc2Zvcm0odGhpcy52aWV3cG9ydC50cmFuc2Zvcm0sIGl0ZW0udHJhbnNmb3JtKSxcclxuICAgICAgICAgICAgICAgIHN0eWxlID0gdGhpcy50ZXh0Q29udGVudC5zdHlsZXNbaXRlbS5mb250TmFtZV0sXHJcbiAgICAgICAgICAgICAgICBhbmdsZSA9IE1hdGguYXRhbjIodFsxXSwgdFswXSkrKHN0eWxlLnZlcnRpY2FsPyBNYXRoLlBJIC8gMjogMCksXHJcbiAgICAgICAgICAgICAgICBmb250SGVpZ2h0ID0gTWF0aC5zcXJ0KCh0WzJdICogdFsyXSkgKyAodFszXSAqIHRbM10pKSxcclxuICAgICAgICAgICAgICAgIGZvbnRBc2NlbnQgPSBzdHlsZS5hc2NlbnQ/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFzY2VudCAqIGZvbnRIZWlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHlsZS5kZXNjZW50PyAoMSArIHN0eWxlLmRlc2NlbnQpICogZm9udEhlaWdodDogZm9udEhlaWdodCk7XHJcbiAgICAgICAgICB0ZXN0U3ouaHRtbChpdGVtLnN0ci5zdWJzdHIoMCwgaGl0Lm9mZnNldCkrJzxzcGFuPicraXRlbS5zdHIuc3Vic3RyKGhpdC5vZmZzZXQsIGhpdC5sZW5ndGgpKyc8L3NwYW4+JytpdGVtLnN0ci5zdWJzdHIoaGl0Lm9mZnNldCtoaXQubGVuZ3RoKSk7XHJcblxyXG4gICAgICAgICAgdGV4dERpdi5zdHlsZS5mb250U2l6ZSA9IGZvbnRIZWlnaHQrJ3B4JztcclxuICAgICAgICAgIHRleHREaXYuc3R5bGUuZm9udEZhbWlseSA9IHN0eWxlLmZvbnRGYW1pbHk7XHJcblxyXG4gICAgICAgICAgY29uc3QgdGVzdFNwYW4gPSB0ZXN0U3ouZmluZCgnc3BhbicpLFxyXG4gICAgICAgICAgICAgIGl3aWR0aCA9IHN0eWxlLnZlcnRpY2FsPyBpdGVtLmhlaWdodCp0aGlzLnZpZXdwb3J0LnNjYWxlOiBpdGVtLndpZHRoKnRoaXMudmlld3BvcnQuc2NhbGUsXHJcbiAgICAgICAgICAgICAgd2lkdGggPSB0ZXN0U3oud2lkdGgoKSxcclxuICAgICAgICAgICAgICByZWxhdGl2ZU9mZnNldCA9ICh0ZXN0U3Bhbi5vZmZzZXQoKS5sZWZ0LWJhc2VPZmZzZXQpL3dpZHRoO1xyXG4gICAgICAgICAgdGhpcy5tLnNldChcclxuICAgICAgICAgICAgMSwwLDAsXHJcbiAgICAgICAgICAgIDAsMSwwLFxyXG4gICAgICAgICAgICB0WzRdK2ZvbnRBc2NlbnQqTWF0aC5zaW4oYW5nbGUpLHRbNV0tZm9udEFzY2VudCpNYXRoLmNvcyhhbmdsZSksMSk7XHJcbiAgICAgICAgICBsZXQgcG9seSA9IHRoaXMuY3JlYXRlUG9seSh0aGlzLm0sIHt4OiByZWxhdGl2ZU9mZnNldCppd2lkdGgsIHk6IDB9LCB7d2lkdGg6IGl3aWR0aCp0ZXN0U3Bhbi53aWR0aCgpL3dpZHRoLCBoZWlnaHQ6IHRlc3RTcGFuLmhlaWdodCgpfSk7XHJcbiAgICAgICAgICBwb2x5ID0gcG9seS5tYXAoKHApPT4gKHt4OiBwLngvdGhpcy52aWV3cG9ydC53aWR0aCwgeTogMS1wLnkvdGhpcy52aWV3cG9ydC5oZWlnaHR9KSk7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlckhpdChwb2x5KTtcclxuICAgICAgfVxyXG4gICAgICB0ZXN0U3oucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhbm5vQ2xiKGUsIGRhdGEpIHtcclxuICAgIGlmKHRoaXMuY29udGV4dC5kaXNwYXRjaEV2ZW50KSB7XHJcbiAgICAgIHRoaXMuY29udGV4dC5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgICB0eXBlOiAncGRmQW5ub3RhdGlvbicsXHJcbiAgICAgICAgZXZlbnQ6IGUsXHJcbiAgICAgICAgYW5ub3RhdGlvbjogZGF0YS50YXJnZXQuYW5ub1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGNWaWV3cG9ydCgpIHtcclxuICAgIGNvbnN0IHNjYWxlID0gQmFzZU1hdGhVdGlscy5jYWxjU2NhbGUodGhpcy5zaXplLndpZHRoLCB0aGlzLnNpemUuaGVpZ2h0LCB0aGlzLnJlc1csIHRoaXMucmVzSCk7XHJcbiAgICBpZighdGhpcy52aWV3cG9ydCB8fCBNYXRoLmFicyh0aGlzLnZpZXdwb3J0LnNjYWxlLXNjYWxlKT4xZS00KSB7XHJcbiAgICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLnBhZ2UuZ2V0Vmlld3BvcnQoc2NhbGUpO1xyXG4gICAgICBpZih0aGlzLnR5cGUhPT0nZnVsbCcpIHtcclxuICAgICAgICBpZih0aGlzLnR5cGU9PT0ncmlnaHQnKSB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0Lm9mZnNldFggKz0gMC41KnRoaXMudmlld3BvcnQud2lkdGg7XHJcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0LnRyYW5zZm9ybVs0XSAtPSAwLjUqdGhpcy52aWV3cG9ydC53aWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydC53aWR0aCAvPSAyO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVzVyA9IHRoaXMud2lkdGggPSB0aGlzLnZpZXdwb3J0LndpZHRoO1xyXG4gICAgICB0aGlzLnJlc0ggPSB0aGlzLmhlaWdodCA9IHRoaXMudmlld3BvcnQuaGVpZ2h0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIHRoaXMudHlwZSA9IHRoaXMucGRmLmdldFBhZ2VUeXBlKHRoaXMubik7XHJcbiAgICB0aGlzLnBkZi5nZXRQYWdlKHRoaXMubikuXHJcbiAgICAgIHRoZW4oKHBhZ2UpPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgdGhpcy5zaXplID0gUGRmLmdldFBhZ2VTaXplKHBhZ2UpO1xyXG4gICAgICAgIGlmKHRoaXMudHlwZSE9PSdmdWxsJykge1xyXG4gICAgICAgICAgdGhpcy5zaXplLndpZHRoIC89IDI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhZ2UuZ2V0QW5ub3RhdGlvbnMoKS5cclxuICAgICAgICAgIHRoZW4odGhpcy5zZXRBbm5vdGF0aW9ucy5iaW5kKHRoaXMpKTtcclxuICAgICAgICBwYWdlLmdldFRleHRDb250ZW50KCkuXHJcbiAgICAgICAgICB0aGVuKHRoaXMuc2V0SGl0cy5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLmNhbGNWaWV3cG9ydCgpO1xyXG4gICAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgICB9KS5cclxuICAgICAgY2F0Y2goKGUpPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBsb2FkIFBERiBwYWdlOiAnKyh0aGlzLm4rMSkpO1xyXG4gICAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFJlc29sdXRpb24ocmVzKSB7XHJcbiAgICBzdXBlci5zZXRSZXNvbHV0aW9uKHJlcyk7XHJcbiAgICBpZih0aGlzLnBhZ2UpIHtcclxuICAgICAgdGhpcy5jYWxjVmlld3BvcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbmRlcihoYW5kbGVyKSB7XHJcbiAgICBpZih0aGlzLnBhZ2UpIHtcclxuICAgICAgdGhpcy5wYWdlLnJlbmRlcih7XHJcbiAgICAgICAgY2FudmFzQ29udGV4dDogdGhpcy5wdXNoQ3R4KCksXHJcbiAgICAgICAgdmlld3BvcnQ6IHRoaXMudmlld3BvcnRcclxuICAgICAgfSkuXHJcbiAgICAgIHRoZW4oKCk9PiB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJIaXRzKCk7XHJcbiAgICAgICAgdGhpcy5wb3BDdHgoKTtcclxuICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcigpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlckJsYW5rUGFnZSgpO1xyXG4gICAgICB0aGlzLmZpbmlzaFJlbmRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvUGRmSW1hZ2UuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9QZGZJbWFnZS5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2gge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIHBhZ2VzKSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIHRoaXMucGFnZXMgPSBwYWdlcztcclxuICAgIHRoaXMucHJldlJlc3VsdHMgPSBbXTtcclxuICAgIGNvbnRhaW5lci5odG1sKGBcclxuICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWVyeVwiPlxyXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wUXVlcnlcIiB0eXBlPVwidGV4dFwiIG1heGxlbmd0aD1cIjMwXCIgdmFsdWU9XCJcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICBgKTtcclxuICAgIHRoaXMucXVlcnkgPSBjb250YWluZXIuZmluZCgnLnF1ZXJ5IGlucHV0Jyk7XHJcbiAgICB0aGlzLnJlc3VsdHMgPSBjb250YWluZXIuZmluZCgnLnJlc3VsdHMnKTtcclxuICAgIHRoaXMuc3RhdHVzID0gY29udGFpbmVyLmZpbmQoJy5zdGF0dXMnKTtcclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBuYXZpZ2F0ZTogdGhpcy5uYXZpZ2F0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICBkb1F1ZXJ5OiB0aGlzLmRvUXVlcnkuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnF1ZXJ5Lm9uKCdrZXlkb3duJywgdGhpcy5iaW5kcy5kb1F1ZXJ5KTtcclxuICAgIHRoaXMucmVzdWx0cy5vbignY2xpY2snLCB0aGlzLmJpbmRzLm5hdmlnYXRlKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnJlc3VsdHMub2ZmKCdjbGljaycsIHRoaXMuYmluZHMubmF2aWdhdGUpO1xyXG4gICAgdGhpcy5xdWVyeS5vZmYoJ2tleWRvd24nLCB0aGlzLmJpbmRzLmRvUXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGUoZSkge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYodGhpcy5vbk5hdmlnYXRlIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCB0YXJnZXQgPSAkKGUudGFyZ2V0KTtcclxuICAgICAgaWYoIXRhcmdldC5oYXNDbGFzcygncmVzdWx0JykpIHtcclxuICAgICAgICBjb25zdCB0ID0gdGFyZ2V0LmZpbmQoJy5yZXN1bHQnKTtcclxuICAgICAgICBpZih0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGFyZ2V0ID0gdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB3aGlsZSh0YXJnZXQubGVuZ3RoICYmICF0YXJnZXQuaGFzQ2xhc3MoJ3Jlc3VsdCcpKSB7XHJcbiAgICAgICAgICAgIHRhcmdldCA9ICQodGFyZ2V0WzBdLnBhcmVudE5vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYWdlID0gdGFyZ2V0LmF0dHIoJ2RhdGEnKTtcclxuICAgICAgaWYocGFnZSE9PXVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMub25OYXZpZ2F0ZShwYXJzZUludChwYWdlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRvUXVlcnkoKSB7XHJcbiAgICBpZih0aGlzLm9uUXVlcnkpIHtcclxuICAgICAgY29uc3QgcXVlcnlTdGFtcCA9IHRoaXMucXVlcnlTdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgaWYocXVlcnlTdGFtcCA9PT0gdGhpcy5xdWVyeVN0YW1wKSB7XHJcbiAgICAgICAgICB0aGlzLm9uUXVlcnkodGhpcy5xdWVyeVswXS52YWx1ZS50cmltKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRSZXN1bHRzKHJlc3VsdHMsIGxhc3RQYWdlKSB7XHJcbiAgICBpZih0aGlzLnByZXZSZXN1bHRzLmxlbmd0aCAmJiByZXN1bHRzWzBdIT09dGhpcy5wcmV2UmVzdWx0c1swXSkge1xyXG4gICAgICB0aGlzLnByZXZSZXN1bHRzID0gW107XHJcbiAgICAgIHRoaXMucmVzdWx0cy5odG1sKCcnKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGh0bWxzID0gW107XHJcbiAgICBmb3IobGV0IGk9dGhpcy5wcmV2UmVzdWx0cy5sZW5ndGg7IGk8cmVzdWx0cy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2ldO1xyXG4gICAgICBodG1scy5wdXNoKCc8ZGl2IGNsYXNzPVwicmVzdWx0XCIgZGF0YT1cIicrcmVzdWx0LnBhZ2UrJ1wiPicpO1xyXG4gICAgICAgIGh0bWxzLnB1c2goJzxhIGhyZWY9XCIjXCI+Jyk7XHJcbiAgICAgICAgICBodG1scy5wdXNoKCc8ZGl2PicrcmVzdWx0LmNvbnRleHRzLmpvaW4oJzwvZGl2PjxkaXY+JykrJzwvZGl2PicpO1xyXG4gICAgICAgIGh0bWxzLnB1c2goJzwvYT4nKTtcclxuICAgICAgaHRtbHMucHVzaCgnPC9kaXY+Jyk7XHJcbiAgICB9XHJcbiAgICAkKGh0bWxzLmpvaW4oJycpKS5hcHBlbmRUbyh0aGlzLnJlc3VsdHMpO1xyXG4gICAgdGhpcy5wcmV2UmVzdWx0cyA9IFsuLi5yZXN1bHRzXTtcclxuICAgIGlmKGxhc3RQYWdlPT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLmh0bWwoJycpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLmh0bWwobGFzdFBhZ2UrJyBvZiAnK3RoaXMucGFnZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvU2VhcmNoLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvU2VhcmNoLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEltYWdlQmFzZSBmcm9tICcuL0ltYWdlQmFzZSc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY0ltYWdlIGV4dGVuZHMgSW1hZ2VCYXNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IsIHNyYykge1xyXG4gICAgc3VwZXIoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IpO1xyXG5cclxuICAgIHRoaXMuYmluZHMgPSB7fVxyXG4gICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgdGhpcy5pbWFnZS5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xyXG4gICAgdGhpcy5iaW5kcy5pbWFnZUxvYWQgPSAoKT0+IHtcclxuICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaW1hZ2Uud2lkdGg7XHJcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5pbWFnZS5oZWlnaHQ7XHJcbiAgICAgIHRoaXMuc3RhcnRSZW5kZXIgPSAoKT0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlckltYWdlKHRoaXMuaW1hZ2UpO1xyXG4gICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuYmluZHMuaW1hZ2VFcnJvciA9ICgpPT4ge1xyXG4gICAgICB0aGlzLnN0YXJ0UmVuZGVyID0gKCk9PiB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOb3RGb3VuZFBhZ2UoKTtcclxuICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcigpO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmZpbmlzaExvYWQoKTtcclxuICAgIH07XHJcbiAgICAkKHRoaXMuaW1hZ2UpLm9uKCdsb2FkJywgdGhpcy5iaW5kcy5pbWFnZUxvYWQpLm9uKCdlcnJvcicsIHRoaXMuYmluZHMuaW1hZ2VFcnJvcik7XHJcbiAgICB0aGlzLmltYWdlLnNyYyA9IFV0aWxzLm5vcm1hbGl6ZVVybChzcmMpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgICQodGhpcy5pbWFnZSkub2ZmKCdsb2FkJywgdGhpcy5iaW5kcy5pbWFnZUxvYWQpLm9mZignZXJyb3InLCB0aGlzLmJpbmRzLmltYWdlRXJyb3IpO1xyXG4gICAgdGhpcy5pbWFnZS5zcmMgPSAnJztcclxuICAgIGRlbGV0ZSB0aGlzLmltYWdlO1xyXG4gICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvU3RhdGljSW1hZ2UuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9TdGF0aWNJbWFnZS5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0dXJlQW5pbWF0b3Ige1xyXG4gIGNvbnN0cnVjdG9yKGltZywgdGlsZXNIb3JpeiwgdGlsZXNWZXJ0LCBudW1UaWxlcywgdGlsZURpc3BEdXJhdGlvbikge1xyXG5cclxuICAgIGNvbnN0IHRleHR1cmUgPSBuZXcgVEhSRUUuVGV4dHVyZSgpO1xyXG4gICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBUSFJFRS5MaW5lYXJGaWx0ZXI7XHJcbiAgICB0ZXh0dXJlLmltYWdlID0gaW1nO1xyXG4gICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcblxyXG4gIFx0Ly8gbm90ZTogdGV4dHVyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhlIHVwZGF0ZSBmdW5jdGlvbi5cclxuICAgIHRoaXMudGV4dHVyZSA9IHRleHR1cmU7XHJcbiAgXHR0aGlzLnRpbGVzSG9yaXpvbnRhbCA9IHRpbGVzSG9yaXo7XHJcbiAgXHR0aGlzLnRpbGVzVmVydGljYWwgPSB0aWxlc1ZlcnQ7XHJcbiAgXHQvLyBob3cgbWFueSBpbWFnZXMgZG9lcyB0aGlzIHNwcml0ZXNoZWV0IGNvbnRhaW4/XHJcbiAgXHQvLyAgdXN1YWxseSBlcXVhbHMgdGlsZXNIb3JpeiAqIHRpbGVzVmVydCwgYnV0IG5vdCBuZWNlc3NhcmlseSxcclxuICBcdC8vICBpZiB0aGVyZSBhdCBibGFuayB0aWxlcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzcHJpdGVzaGVldC5cclxuICBcdHRoaXMubnVtYmVyT2ZUaWxlcyA9IG51bVRpbGVzO1xyXG4gIFx0dGV4dHVyZS5yZXBlYXQuc2V0KDEvdGhpcy50aWxlc0hvcml6b250YWwsIDEvdGhpcy50aWxlc1ZlcnRpY2FsKTtcclxuXHJcbiAgXHQvLyBob3cgbG9uZyBzaG91bGQgZWFjaCBpbWFnZSBiZSBkaXNwbGF5ZWQ/XHJcbiAgXHR0aGlzLnRpbGVEaXNwbGF5RHVyYXRpb24gPSB0aWxlRGlzcER1cmF0aW9uO1xyXG5cclxuICBcdC8vIGhvdyBsb25nIGhhcyB0aGUgY3VycmVudCBpbWFnZSBiZWVuIGRpc3BsYXllZD9cclxuICBcdHRoaXMuY3VycmVudERpc3BsYXlUaW1lID0gMDtcclxuXHJcbiAgXHQvLyB3aGljaCBpbWFnZSBpcyBjdXJyZW50bHkgYmVpbmcgZGlzcGxheWVkP1xyXG4gIFx0dGhpcy5jdXJyZW50VGlsZSA9IDA7XHJcbiAgfVxyXG5cclxuICB1cGRhdGUobWlsbGlTZWMpIHtcclxuICAgIHRoaXMuY3VycmVudERpc3BsYXlUaW1lICs9IG1pbGxpU2VjO1xyXG4gICAgd2hpbGUodGhpcy5jdXJyZW50RGlzcGxheVRpbWUgPiB0aGlzLnRpbGVEaXNwbGF5RHVyYXRpb24pIHtcclxuICAgICAgdGhpcy5jdXJyZW50RGlzcGxheVRpbWUgLT0gdGhpcy50aWxlRGlzcGxheUR1cmF0aW9uO1xyXG4gICAgICArK3RoaXMuY3VycmVudFRpbGU7XHJcbiAgICAgIGlmKHRoaXMuY3VycmVudFRpbGUgPT0gdGhpcy5udW1iZXJPZlRpbGVzKVxyXG4gICAgICAgIHRoaXMuY3VycmVudFRpbGUgPSAwO1xyXG4gICAgICB2YXIgY3VycmVudENvbHVtbiA9IHRoaXMuY3VycmVudFRpbGUldGhpcy50aWxlc0hvcml6b250YWw7XHJcbiAgICAgIHRoaXMudGV4dHVyZS5vZmZzZXQueCA9IGN1cnJlbnRDb2x1bW4vdGhpcy50aWxlc0hvcml6b250YWw7XHJcbiAgICAgIHZhciBjdXJyZW50Um93ID0gTWF0aC5mbG9vcih0aGlzLmN1cnJlbnRUaWxlL3RoaXMudGlsZXNIb3Jpem9udGFsKTtcclxuICAgICAgdGhpcy50ZXh0dXJlLm9mZnNldC55ID0gY3VycmVudFJvdy90aGlzLnRpbGVzVmVydGljYWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgY29uc3QgaW1nID0gdGhpcy50ZXh0dXJlLmltYWdlO1xyXG4gICAgaW1nLmhlaWdodCA9IGltZy53aWR0aCA9IDA7XHJcbiAgICB0aGlzLnRleHR1cmUuZGlzcG9zZSgpO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9UZXh0dXJlQW5pbWF0b3IuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9UZXh0dXJlQW5pbWF0b3IuanMiLCJpbXBvcnQge1RIUkVFLCAkfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IFV0aWxzIGZyb20gJy4vVXRpbHMnO1xyXG5pbXBvcnQgTW91c2VFdmVudENvbnZlcnRlciBmcm9tICcuL01vdXNlRXZlbnRDb252ZXJ0ZXInO1xyXG5pbXBvcnQgVGhyZWVFdmVudENvbnZlcnRlciBmcm9tICcuL1RocmVlRXZlbnRDb252ZXJ0ZXInO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRocmVlTW91c2VFdmVudENvbnZlcnRlciBleHRlbmRzIE1vdXNlRXZlbnRDb252ZXJ0ZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYywgdmlzdWFsV29ybGQsIHRlc3QpIHtcclxuICAgIHN1cGVyKHduZCwgZG9jLCB2aXN1YWxXb3JsZC5lbGVtZW50KTtcclxuICAgIFV0aWxzLmV4dGVuZHModGhpcywgbmV3IFRocmVlRXZlbnRDb252ZXJ0ZXIodmlzdWFsV29ybGQsIHRlc3QpKTtcclxuICB9XHJcblxyXG4gIGdldENhbGxiYWNrKG9iamVjdCkge1xyXG4gICAgcmV0dXJuIG9iamVjdC5vYmplY3QudXNlckRhdGEubW91c2VDYWxsYmFjaztcclxuICB9XHJcblxyXG4gIHNldENvb3Jkc0Zyb21FdmVudChlKSB7XHJcbiAgICBjb25zdCBqRWxlbWVudCA9ICQodGhpcy5lbGVtZW50KTtcclxuICAgIGNvbnN0IG9mZnNldCA9IGpFbGVtZW50Lm9mZnNldCgpO1xyXG4gICAgdGhpcy5jb29yZHMueCA9ICgoZS5wYWdlWC1vZmZzZXQubGVmdCkvakVsZW1lbnQud2lkdGgoKSkqMi0xO1xyXG4gICAgdGhpcy5jb29yZHMueSA9IC0oKGUucGFnZVktb2Zmc2V0LnRvcCkvakVsZW1lbnQuaGVpZ2h0KCkpKjIrMTtcclxuICAgIHJldHVybiB0aGlzLmNvb3JkcztcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVNb3VzZUV2ZW50Q29udmVydGVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvVGhyZWVNb3VzZUV2ZW50Q29udmVydGVyLmpzIiwiaW1wb3J0IHtUSFJFRSwgJH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuaW1wb3J0IFRvdWNoRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9Ub3VjaEV2ZW50Q29udmVydGVyJztcclxuaW1wb3J0IFRocmVlRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9UaHJlZUV2ZW50Q29udmVydGVyJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaHJlZVRvdWNoRXZlbnRDb252ZXJ0ZXIgZXh0ZW5kcyBUb3VjaEV2ZW50Q29udmVydGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIHZpc3VhbFdvcmxkLCB0ZXN0KSB7XHJcbiAgICBzdXBlcih3bmQsIGRvYywgdmlzdWFsV29ybGQuZWxlbWVudCk7XHJcbiAgICBVdGlscy5leHRlbmRzKHRoaXMsIG5ldyBUaHJlZUV2ZW50Q29udmVydGVyKHZpc3VhbFdvcmxkLCB0ZXN0KSk7XHJcbiAgfVxyXG5cclxuICBnZXRDYWxsYmFjayhvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3Qub2JqZWN0LnVzZXJEYXRhLnRvdWNoQ2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBzZXRDb29yZHNGcm9tRXZlbnQoZSkge1xyXG4gICAgY29uc3QgakVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudCksIG9mZnNldCA9IGpFbGVtZW50Lm9mZnNldCgpLFxyXG4gICAgICB0b3VjaGVzID0gZS50b3VjaGVzIHx8IGUub3JpZ2luYWxFdmVudC50b3VjaGVzLCB0b3VjaCA9IHRvdWNoZXMubGVuZ3RoPyB0b3VjaGVzWzBdOiAodGhpcy5sYXN0VG91Y2hlcyB8fCBbe3BhZ2VYOiAwLCBwYWdlWTogMH1dKVswXSxcclxuICAgICAgcGFnZVggPSB0b3VjaC5wYWdlWCwgcGFnZVkgPSB0b3VjaC5wYWdlWTtcclxuICAgIHRoaXMubGFzdFRvdWNoZXMgPSB0b3VjaGVzLmxlbmd0aD8gdG91Y2hlczogdGhpcy5sYXN0VG91Y2hlcztcclxuICAgIHRoaXMuY29vcmRzLnggPSAoKHBhZ2VYLW9mZnNldC5sZWZ0KS9qRWxlbWVudC53aWR0aCgpKSoyLTE7XHJcbiAgICB0aGlzLmNvb3Jkcy55ID0gLSgocGFnZVktb2Zmc2V0LnRvcCkvakVsZW1lbnQuaGVpZ2h0KCkpKjIrMTtcclxuICAgIHJldHVybiB0aGlzLmNvb3JkcztcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEltYWdlRmFjdG9yeSBmcm9tICcuL0ltYWdlRmFjdG9yeSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaHVtYm5haWxzIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgY29udGFpbmVyLCB0aHVtYm5haWxzQ2xiLCBzaXplLCBwcm9wcz17a1d0b0g6IDIxMC8yOTd9KSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIHRoaXMucCA9IHByb3BzO1xyXG4gICAgdGhpcy50aHVtYm5haWxzQ2xiID0gdGh1bWJuYWlsc0NsYjtcclxuICAgIHRoaXMuc2l6ZSA9IHNpemU7XHJcbiAgICB0aGlzLmNhbnZhcyA9ICQoJzxjYW52YXM+JylbMF07XHJcbiAgICB0aGlzLmltYWdlRmFjdG9yeSA9IG5ldyBJbWFnZUZhY3Rvcnkoe1xyXG4gICAgICAuLi5jb250ZXh0LFxyXG4gICAgICByZW5kZXJDYW52YXM6IHRoaXMuY2FudmFzLFxyXG4gICAgICByZW5kZXJDYW52YXNDdHg6IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJylcclxuICAgIH0pO1xyXG4gICAgdGhpcy50aHVtYm5haWxzID0gW107XHJcbiAgICBmb3IobGV0IGk9MDsgaTxzaXplOyArK2kpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IHRoaXMudGh1bWJuYWlsc0NsYihpKTtcclxuICAgICAgdGhpcy50aHVtYm5haWxzLnB1c2goe1xyXG4gICAgICAgIC4uLmluZm8sXHJcbiAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgbG9hZGVkOiBpbmZvLnR5cGU9PT0ndGh1bWJuYWlsLWltYWdlJyxcclxuICAgICAgICBoZWFkaW5nOiBudWxsLFxyXG4gICAgICAgIHRodW1ibmFpbDogbnVsbCxcclxuICAgICAgICB0aXRsZTogaW5mby50aXRsZSB8fCBpXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIHVwZGF0ZTogdGhpcy51cGRhdGUuYmluZCh0aGlzKSxcclxuICAgICAgbmF2aWdhdGU6IChlKT0+IHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaWYodGhpcy5vbk5hdmlnYXRlKSB7XHJcbiAgICAgICAgICBsZXQgbm9kZSA9IGUudGFyZ2V0O1xyXG4gICAgICAgICAgd2hpbGUobm9kZSAmJiAhbm9kZS5kYXRhVGh1bWJuYWlsKSB7XHJcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLm9uTmF2aWdhdGUobm9kZS5kYXRhVGh1bWJuYWlsLmluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aGlzLmNvbnRhaW5lci5vbignc2Nyb2xsJywgdGhpcy5iaW5kcy51cGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemU7XHJcbiAgfVxyXG5cclxuICBzZXRFbmFibGUoZW5hYmxlKSB7XHJcbiAgICB0aGlzLmVuYWJsZSA9IGVuYWJsZTtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5jb250YWluZXIuZmluZCgnYScpLm9mZignY2xpY2snLCB0aGlzLmJpbmRzLm5hdmlnYXRlKTtcclxuICAgIHRoaXMuY29udGFpbmVyLm9mZignc2Nyb2xsJywgdGhpcy5iaW5kcy51cGRhdGUpO1xyXG4gICAgdGhpcy5jb250YWluZXIuaHRtbCgnJyk7XHJcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB0aGlzLmNhbnZhcy53aWR0aCA9IDA7XHJcbiAgICBkZWxldGUgdGhpcy5jYW52YXM7XHJcbiAgfVxyXG5cclxuICBsb2FkKHRodW1ibmFpbCkge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmltYWdlRmFjdG9yeS5idWlsZCh0aHVtYm5haWwsIHRodW1ibmFpbC5udW1iZXI9PT11bmRlZmluZWQ/IHRodW1ibmFpbC5pbmRleDogdGh1bWJuYWlsLm51bWJlciwgdGhpcy5wLmtXdG9IKjMwMCwgMzAwKTtcclxuICAgIHdyYXBwZXIub25DaGFuZ2UgPSAoY2FudmFzKT0+IHtcclxuICAgICAgdGhpcy5zZXRJbWFnZSh0aHVtYm5haWwsIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcclxuICAgICAgdGh1bWJuYWlsLmxvYWRlZCA9IHRydWU7XHJcbiAgICAgIHdyYXBwZXIuZGlzcG9zZSgpO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+IHRoaXMudXBkYXRlKCkpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZSgpIHtcclxuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jb250YWluZXIuc2Nyb2xsVG9wKCksIGxhc3QgPSBmaXJzdCArIHRoaXMuY29udGFpbmVyLmhlaWdodCgpLCByZXMgPSBbXTtcclxuICAgIGZvcihsZXQgdGh1bWJuYWlsIG9mIHRoaXMudGh1bWJuYWlscykge1xyXG4gICAgICBpZihNYXRoLm1heCh0aHVtYm5haWwuZmlyc3QsIGZpcnN0KTxNYXRoLm1pbih0aHVtYm5haWwubGFzdCwgbGFzdCkpIHtcclxuICAgICAgICByZXMucHVzaCh0aHVtYm5haWwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKCkge1xyXG4gICAgaWYoIXRoaXMubG9hZGluZyAmJiB0aGlzLmNhbnZhcyAmJiB0aGlzLmVuYWJsZSkge1xyXG4gICAgICBpZighdGhpcy5idWlsdCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcclxuICAgICAgZm9yKGxldCB0aHVtYm5haWwgb2YgYWN0aXZlKSB7XHJcbiAgICAgICAgaWYoIXRodW1ibmFpbC5sb2FkZWQpIHtcclxuICAgICAgICAgIHRoaXMubG9hZCh0aHVtYm5haWwpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRJbWFnZSh0aHVtYm5haWwsIGltZykge1xyXG4gICAgdGh1bWJuYWlsLmltZyA9IGltZztcclxuICAgIHRodW1ibmFpbC50aHVtYm5haWwuY3NzKCdiYWNrZ3JvdW5kLWltYWdlJywgWyd1cmwoXFwnJywgaW1nLCdcXCcpJ10uam9pbignJykpO1xyXG4gICAgdGh1bWJuYWlsLnRodW1ibmFpbC5yZW1vdmVDbGFzcygnbG9hZGluZycpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyKCkge1xyXG4gICAgY29uc3QgZWxlbWVudHMgPSBbJzxkaXYgY2xhc3M9XCJ0aHVtYm5haWxzXCI+J11cclxuICAgIGZvcihsZXQgaT0wOyBpPHRoaXMuc2l6ZTsgKytpKSB7XHJcbiAgICAgIGVsZW1lbnRzLnB1c2goWyc8ZGl2IGNsYXNzPVwiaXRlbVwiPjxhIGhyZWY9XCIjXCI+PGRpdiBjbGFzcz1cInRodW1ibmFpbCBsb2FkaW5nXCI+PC9kaXY+PC9hPjxkaXYgY2xhc3M9XCJoZWFkaW5nXCI+PGEgaHJlZj1cIiNcIiB0aXRsZT1cIicsIGkrMSwnXCI+JywgaSsxLCAnPC9hPjwvZGl2PjwvZGl2PiddLmpvaW4oJycpKTtcclxuICAgIH1cclxuICAgIGVsZW1lbnRzLnB1c2goJzwvZGl2PicpO1xyXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnRzLmpvaW4oJycpKTtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5jb250YWluZXIuZmluZCgnLml0ZW0nKSwgYmFzZSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy50aHVtYm5haWxzJykub2Zmc2V0KCkudG9wO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8aXRlbXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgaXRlbSA9ICQoaXRlbXNbaV0pO1xyXG4gICAgICB0aGlzLnRodW1ibmFpbHNbaV0uaGVhZGluZyA9IGl0ZW0uZmluZCgnLmhlYWRpbmcnKTtcclxuICAgICAgdGhpcy50aHVtYm5haWxzW2ldLnRodW1ibmFpbCA9IGl0ZW0uZmluZCgnLnRodW1ibmFpbCcpO1xyXG4gICAgICB0aGlzLnRodW1ibmFpbHNbaV0uZmlyc3QgPSBpdGVtLm9mZnNldCgpLnRvcC1iYXNlO1xyXG4gICAgICB0aGlzLnRodW1ibmFpbHNbaV0ubGFzdCA9IHRoaXMudGh1bWJuYWlsc1tpXS5maXJzdCtpdGVtLmhlaWdodCgpO1xyXG4gICAgICBpZih0aGlzLnRodW1ibmFpbHNbaV0ubG9hZGVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXRJbWFnZSh0aGlzLnRodW1ibmFpbHNbaV0sIHRoaXMudGh1bWJuYWlsc1tpXS5zcmMpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFzID0gaXRlbS5maW5kKCdhJyk7XHJcbiAgICAgIGZvcihsZXQgaj0wOyBqPGFzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgY29uc3QgYSA9IGFzW2pdO1xyXG4gICAgICAgIGEuZGF0YVRodW1ibmFpbCA9IHRoaXMudGh1bWJuYWlsc1tpXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jb250YWluZXIuZmluZCgnYScpLm9uKCdjbGljaycsIHRoaXMuYmluZHMubmF2aWdhdGUpO1xyXG4gICAgdGhpcy5idWlsdCA9IHRydWU7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9UaHVtYm5haWxzLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvVGh1bWJuYWlscy5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBFdmVudENvbnZlcnRlciBmcm9tICcuL0V2ZW50Q29udmVydGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvdWNoQ29udmVydGVyIGV4dGVuZHMgRXZlbnRDb252ZXJ0ZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYywgZWxlbWVudCkge1xyXG4gICAgc3VwZXIod25kLCBkb2MpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBjb252ZXJ0OiB0aGlzLmNvbnZlcnQuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgICQodGhpcy5lbGVtZW50KS5vbigndG91Y2hzdGFydCB0b3VjaG1vdmUnLCB0aGlzLmJpbmRzLmNvbnZlcnQpO1xyXG4gICAgJCh0aGlzLmRvYykub24oJ3RvdWNoZW5kJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub2ZmKCd0b3VjaHN0YXJ0IHRvdWNobW92ZScsIHRoaXMuYmluZHMuY29udmVydCk7XHJcbiAgICAkKHRoaXMuZG9jKS5vZmYoJ3RvdWNoZW5kJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVG91Y2hFdmVudENvbnZlcnRlci5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL1RvdWNoRXZlbnRDb252ZXJ0ZXIuanMiLCJpbXBvcnQgeyQsIHRyfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xyXG5cclxuICBzdGF0aWMgbGlua1N0YXRlSGFuZGxlcnMgPSB7XHJcbiAgICB2aXNpYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdoaWRkZW4nLCAhdmFsdWUpLFxyXG4gICAgYWN0aXZlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdhY3RpdmUnLCB2YWx1ZSksXHJcbiAgICBlbmFibGU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmNsYXNzUHJvcGVydHkoY3RybCwgJ2Rpc2FibGVkJywgIXZhbHVlKVxyXG4gIH07XHJcblxyXG4gIHN0YXRpYyB3aWRnZXRTdGF0ZUhhbmRsZXJzID0ge1xyXG4gICAgdmlzaWJsZTogKGN0cmwsIHZhbHVlKT0+IFZpZXcuY2xhc3NQcm9wZXJ0eShjdHJsLCAnaGlkZGVuJywgIXZhbHVlKSxcclxuICAgIGFjdGl2ZTogKGN0cmwsIHZhbHVlKT0+IFZpZXcuY2xhc3NQcm9wZXJ0eShjdHJsLCAnYWN0aXZlJywgdmFsdWUpLFxyXG4gICAgZW5hYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdkaXNhYmxlZCcsICF2YWx1ZSlcclxuICB9O1xyXG5cclxuICBzdGF0aWMgaW5wdXRTdGF0ZUhhbmRsZXJzID0ge1xyXG4gICAgdmlzaWJsZTogKGN0cmwsIHZhbHVlKT0+IFZpZXcuY2xhc3NQcm9wZXJ0eShjdHJsLCAnaGlkZGVuJywgIXZhbHVlKSxcclxuICAgIHZhbHVlOiAoY3RybCwgdmFsdWUpPT4gY3RybFswXS52YWx1ZSA9IHZhbHVlLFxyXG4gICAgZW5hYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5hdHRyaWJ1dGVQcm9wZXJ0eShjdHJsLCAnZGlzYWJsZWQnLCAhdmFsdWUpXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIHRleHRTdGF0ZUhhbmRsZXJzID0ge1xyXG4gICAgdmlzaWJsZTogKGN0cmwsIHZhbHVlKT0+IFZpZXcuY2xhc3NQcm9wZXJ0eShjdHJsLCAnaGlkZGVuJywgIXZhbHVlKSxcclxuICAgIHZhbHVlOiAoY3RybCwgdmFsdWUpPT4gY3RybC50ZXh0KHZhbHVlKVxyXG4gIH07XHJcblxyXG4gIHN0YXRpYyBjbGFzc1Byb3BlcnR5KGN0cmwsIGNsYXNzTmFtZSwgdmFsdWUpIHtcclxuICAgIGlmKHZhbHVlKSB7XHJcbiAgICAgIGN0cmwuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjdHJsLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYXR0cmlidXRlUHJvcGVydHkoY3RybCwgYXR0cmlidXRlTmFtZSwgdmFsdWUpIHtcclxuICAgIGlmKHZhbHVlKSB7XHJcbiAgICAgIGN0cmwuYXR0cihhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY3RybC5yZW1vdmVBdHRyKGF0dHJpYnV0ZU5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNhbGxIYW5kbGVycyhoYW5kbGVycywgaWQsIGUsIGRhdGEpIHtcclxuICAgIGZvcihsZXQgaGFuZGxlciBvZiBoYW5kbGVycykge1xyXG4gICAgICBpZihoYW5kbGVyW2lkXSkge1xyXG4gICAgICAgIGhhbmRsZXJbaWRdKGUsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYoaGFuZGxlci5oYW5kbGVEZWZhdWx0KSB7XHJcbiAgICAgICAgaGFuZGxlci5oYW5kbGVEZWZhdWx0KGlkLCBlLCBkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGhhbmRsZUV2ZW50KGlkLCBnZXRIYW5kbGVycywgZSwgZGF0YSkge1xyXG4gICAgVmlldy5jYWxsSGFuZGxlcnMoZ2V0SGFuZGxlcnMoaWQpLCBpZCwgZSwgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaGFuZGxlTGlua0V2ZW50KGUpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGlmKCF0aGlzLmN0cmwuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHtcclxuICAgICAgVmlldy5oYW5kbGVFdmVudCh0aGlzLmlkLCB0aGlzLmdldEhhbmRsZXJzLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBoYW5kbGVJbnB1dEV2ZW50KGUpIHtcclxuICAgIFZpZXcuaGFuZGxlRXZlbnQodGhpcy5pZCwgdGhpcy5nZXRIYW5kbGVycywgZSwgZS50YXJnZXQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGhhbmRsZUZvcm1FdmVudChlKSB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBWaWV3LmhhbmRsZUV2ZW50KHRoaXMuaWQsIHRoaXMuZ2V0SGFuZGxlcnMsIGUpO1xyXG4gIH1cclxuXHJcbiAgLy8gdmlydHVhbCBmdW5jdGlvbnMge1xyXG4gIGdldExpbmtzKCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRXaWRnZXRzKCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRJbnB1dHMoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFRleHRzKCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIGdldEhhbmRsZXJzKGlkKSB7XHJcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVycztcclxuICB9XHJcbiAgLy8gfVxyXG5cclxuICBjYWxsTGF0ZXIoaGFuZGxlcnMsIGlkLCBlLCBkYXRhLCBtcykge1xyXG4gICAgdGhpcy5wZW5kaW5nc1tpZF0gPSB7XHJcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKClcclxuICAgIH07XHJcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgcGVuZGluZyA9IHRoaXMucGVuZGluZ3NbaWRdO1xyXG4gICAgICBpZihwZW5kaW5nICYmIHRpbWVzdGFtcC1wZW5kaW5nLnRpbWVzdGFtcD49bXMpIHtcclxuICAgICAgICBWaWV3LmNhbGxIYW5kbGVycyhoYW5kbGVycywgaWQsIGUsIGRhdGEpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdzW2lkXTtcclxuICAgICAgfVxyXG4gICAgfSwgbXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gbG9hZEZpbGVzKHVybHMsIHJlYWR5LCBmYWlsdXJlKSB7XHJcbiAgLy8gICBsZXQgZG9uZSA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gIC8vICAgZm9yKGxldCB1cmwgb2YgdXJscykge1xyXG4gIC8vICAgICBkb25lID0gZG9uZS50aGVuKCgpPT4ge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+IHtcclxuICAvLyAgICAgICAgICQuZ2V0KHVybCwgKHJlcyk9PiB7XHJcbiAgLy8gICAgICAgICAgIHJlYWR5KHJlcywgdXJsKTtcclxuICAvLyAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gIC8vICAgICAgICAgfSkuZmFpbCgocmVzKT0+IHtcclxuICAvLyAgICAgICAgICAgaWYoZmFpbHVyZSAmJiBmYWlsdXJlKHJlcywgdXJsKSkge1xyXG4gIC8vICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBlbHNlIHtcclxuICAvLyAgICAgICAgICAgICByZWplY3QocmVzKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIGRvbmU7XHJcbiAgLy8gfVxyXG5cclxuICBsb2FkRmlsZXModXJscywgZmlsZXMpIHtcclxuICAgIGNvbnN0IHRhc2tzID0gW107XHJcbiAgICBmb3IobGV0IG5hbWUgb2YgT2JqZWN0LmtleXModXJscykpIHtcclxuICAgICAgZmlsZXNbbmFtZV0gPSBbXTtcclxuICAgICAgZm9yKGxldCB1cmwgb2YgdXJsc1tuYW1lXSkge1xyXG4gICAgICAgIHRhc2tzLnB1c2goXHJcbiAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+IHtcclxuICAgICAgICAgICAgJC5nZXQodXJsLCAoZGF0YSk9PiB7XHJcbiAgICAgICAgICAgICAgZmlsZXNbbmFtZV0ucHVzaCh7dXJsLCBkYXRhfSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9KS5mYWlsKChyZXMpPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChyZXMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRhc2tzKTtcclxuICB9XHJcblxyXG4gIHVybFJlc29sdmVyKGJhc2VVcmwsIHVybCkge1xyXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcclxuICAgIGlmKHVybC5jaGFyQXQoMCkhPT0nLycpIHtcclxuICAgICAgYmFzZVVybCA9IGJhc2VVcmwucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG4gICAgICBjb25zdCBwID0gYmFzZVVybC5sYXN0SW5kZXhPZignLycpO1xyXG4gICAgICB1cmwgPSAofnA/IGJhc2VVcmwuc3Vic3RyKDAsIHArMSk6ICcnKSt1cmw7XHJcblxyXG4gICAgICBjb25zdCBwYXJ0cyA9IHVybC5zcGxpdCgnLycpO1xyXG4gICAgICB1cmwgPSBbXTtcclxuICAgICAgZm9yKGxldCBwYXJ0IG9mIHBhcnRzKSB7XHJcbiAgICAgICAgaWYocGFydD09PScuJykge1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHBhcnQ9PT0nLi4nKSB7XHJcbiAgICAgICAgICBpZih1cmwubGVuZ3RoICYmICEodXJsLmxlbmd0aD09PTEgJiYgdXJsWzBdPT09JycpKSB7XHJcbiAgICAgICAgICAgIHVybC5wb3AoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB1cmwucHVzaChwYXJ0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdXJsID0gdXJsLmpvaW4oJy8nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdXJsO1xyXG4gIH1cclxuXHJcbiAgb2JqVG9BdHRyc1N0cihvKSB7XHJcbiAgICBjb25zdCByZXMgPSBbXTtcclxuICAgIGZvcihsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyhvKSkge1xyXG4gICAgICByZXMucHVzaChbbmFtZSwgJz1cIicsIG9bbmFtZV0sICdcIiddLmpvaW4oJycpKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXMuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJZnJhbWVTaXplKCkge1xyXG4gICAgaWYodGhpcy5mcmFtZSkge1xyXG4gICAgICBpZihNYXRoLmFicyh0aGlzLmZyYW1lLndpZHRoLXRoaXMucGFyZW50Q29udGFpbmVyLndpZHRoKCkpPjEgfHwgTWF0aC5hYnModGhpcy5mcmFtZS5oZWlnaHQtdGhpcy5wYXJlbnRDb250YWluZXIuaGVpZ2h0KCkpPjEpIHtcclxuICAgICAgICB0aGlzLm9uUmVzaXplKCk7XHJcbiAgICAgIH1cclxuICAgICAgc2V0VGltZW91dCh0aGlzLmNoZWNrSWZyYW1lU2l6ZS5iaW5kKHRoaXMpLCAyNTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25SZXNpemUoKSB7XHJcbiAgICB0aGlzLmZyYW1lLndpZHRoID0gdGhpcy5wYXJlbnRDb250YWluZXIud2lkdGgoKTtcclxuICAgIHRoaXMuZnJhbWUuaGVpZ2h0ID0gdGhpcy5wYXJlbnRDb250YWluZXIuaGVpZ2h0KCk7XHJcbiAgfVxyXG5cclxuICB0cmFuc2xhdGUoaHRtbCkge1xyXG4gICAgcmV0dXJuIGh0bWwucmVwbGFjZSgvPFxcJHRyPiguKik8XFwvXFwkdHI+L2dpLCAoczAsczEpPT4gdHIoczEpKTtcclxuICB9XHJcblxyXG4gIGZpcmVMaW5rc09uTG9hZEV2ZW50KCkge1xyXG4gICAgaWYodGhpcy50ZW1wbGF0ZU9iamVjdCAmJiB0aGlzLnRlbXBsYXRlT2JqZWN0LmxpbmtMb2FkZWQpIHtcclxuICAgICAgbGV0IGxvYWRlZCA9IHRydWU7XHJcbiAgICAgIGZvcihsZXQgakxpbmsgb2YgdGhpcy5qTGlua3MpIHtcclxuICAgICAgICBjb25zdCBsaW5rID0gakxpbmtbMF07XHJcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgaW1nLm9uZXJyb3IgPSAoKT0+IHRoaXMudGVtcGxhdGVPYmplY3QubGlua0xvYWRlZChsaW5rKTtcclxuICAgICAgICBpbWcuc3JjID0gbGluay5ocmVmO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihwYXJlbnRDb250YWluZXIsIG9uTG9hZCwgdGVtcGxhdGU9e30pIHtcclxuICAgIHRoaXMucGVuZGluZ3MgPSB7fTtcclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIG9uUmVzaXplOiB0aGlzLm9uUmVzaXplLmJpbmQodGhpcylcclxuICAgIH07XHJcbiAgICB0aGlzLnBhcmVudENvbnRhaW5lciA9ICQocGFyZW50Q29udGFpbmVyKTtcclxuICAgIHRoaXMuaXNJT1MgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhd2luZG93Lk1TU3RyZWFtO1xyXG4gICAgdGhpcy5wYXJlbnRDb250YWluZXIuaHRtbCgnPGlmcmFtZSBzdHlsZT1cImJvcmRlcjogMDsnKyh0aGlzLmlzSU9TPyAnJzogJyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlJykrJ1wiIHNjcm9sbGluZz1cIm5vXCI+PC9pZnJhbWU+Jyk7XHJcblxyXG4gICAgdGhpcy5mcmFtZSA9IHRoaXMucGFyZW50Q29udGFpbmVyLmZpbmQoJ2lmcmFtZScpWzBdO1xyXG4gICAgaWYodGhpcy5mcmFtZS5jb250ZW50V2luZG93LnN0b3ApIHtcclxuICAgICAgdGhpcy5mcmFtZS5jb250ZW50V2luZG93LnN0b3AoKTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuaXNJT1MpIHtcclxuICAgICAgJCh0aGlzLnBhcmVudENvbnRhaW5lclswXS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KS5vbigncmVzaXplJywgdGhpcy5iaW5kcy5vblJlc2l6ZSk7XHJcbiAgICAgIHRoaXMub25SZXNpemUoKTtcclxuICAgICAgc2V0VGltZW91dCh0aGlzLmNoZWNrSWZyYW1lU2l6ZS5iaW5kKHRoaXMpLCAyNTApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29udGFpbmVyID0gJCh0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5KTtcclxuICAgIHRoaXMuY29udGFpbmVyLmNzcygnbWFyZ2luJywgJzAnKTtcclxuICAgIHRoaXMuaGVhZCA9ICQodGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQuaGVhZCk7XHJcbiAgICB0aGlzLm9uTG9hZCA9IG9uTG9hZDtcclxuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcclxuXHJcbiAgICBjb25zdCBzY3JpcHQgPSB0ZW1wbGF0ZS5odG1sPyB0ZW1wbGF0ZS5zY3JpcHQ6IHRoaXMuZ2V0VGVtcGxhdGUoKS5zY3JpcHQ7XHJcbiAgICBjb25zdCB1cmxzID0ge1xyXG4gICAgICBzdHlsZXM6IHRlbXBsYXRlLnN0eWxlcyB8fCB0aGlzLmdldFRlbXBsYXRlKCkuc3R5bGVzLFxyXG4gICAgICBodG1sOiBbdGVtcGxhdGUuaHRtbCB8fCB0aGlzLmdldFRlbXBsYXRlKCkuaHRtbF0sXHJcbiAgICAgIHNjcmlwdDogc2NyaXB0PyBbc2NyaXB0XTogW11cclxuICAgIH0sIGZpbGVzID0ge30sIGxpbmtzID0gdGVtcGxhdGUubGlua3MgfHwgdGhpcy5nZXRUZW1wbGF0ZSgpLmxpbmtzO1xyXG5cclxuICAgIHRoaXMubG9hZEZpbGVzKHVybHMsIGZpbGVzKS50aGVuKCgpPT4ge1xyXG4gICAgICBmb3IobGV0IHN0eWxlIG9mIGZpbGVzLnN0eWxlcykge1xyXG4gICAgICAgIGxldCB0ZXh0Q3NzID0gc3R5bGUuZGF0YSwgdXJsID0gc3R5bGUudXJsO1xyXG4gICAgICAgIHRleHRDc3MgPSB0ZXh0Q3NzLnJlcGxhY2UoL3VybFxcKFsnXCJdKC4qPylbXCInXVxcKS9nLCAociwgcjEpPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIFsndXJsKCcsIHRoaXMudXJsUmVzb2x2ZXIodXJsLCByMSksICcpJ10uam9pbignJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJChgPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPiR7dGV4dENzc308L3N0eWxlPmApLmFwcGVuZFRvKHRoaXMuaGVhZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY29udGFpbmVyLmh0bWwodGhpcy50cmFuc2xhdGUoZmlsZXMuaHRtbFswXS5kYXRhKSk7XHJcblxyXG4gICAgICB0aGlzLmpMaW5rcyA9IFtdO1xyXG4gICAgICBmb3IobGV0IGxpbmsgb2YgbGlua3MpIHtcclxuICAgICAgICB0aGlzLmpMaW5rcy5wdXNoKCQoWyc8bGluayAnLCB0aGlzLm9ialRvQXR0cnNTdHIobGluayksICc+J10uam9pbignJykpLmFwcGVuZFRvKHRoaXMuaGVhZCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZihmaWxlcy5zY3JpcHRbMF0pIHtcclxuICAgICAgICBjb25zdCBpbml0ID0gZXZhbChmaWxlcy5zY3JpcHRbMF0uZGF0YSk7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU9iamVjdCA9IGluaXQodGhpcy5jb250YWluZXIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVPYmplY3QgPSB7fTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5saW5rQ29udHJvbHMgPSB7fTtcclxuICAgICAgZm9yKGxldCBpZCBvZiB0aGlzLmdldExpbmtzKCkpIHtcclxuICAgICAgICB0aGlzLmxpbmtDb250cm9sc1tpZF0gPSB0aGlzLmNvbnRhaW5lci5maW5kKCcuJytpZCk7XHJcbiAgICAgICAgdGhpcy5iaW5kc1tpZF0gPSBWaWV3LmhhbmRsZUxpbmtFdmVudC5iaW5kKHtnZXRIYW5kbGVyczogdGhpcy5nZXRIYW5kbGVycy5iaW5kKHRoaXMpLCBpZCwgY3RybDogdGhpcy5saW5rQ29udHJvbHNbaWRdfSk7XHJcbiAgICAgICAgdGhpcy5saW5rQ29udHJvbHNbaWRdLm9uKCdjbGljaycsIHRoaXMuYmluZHNbaWRdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy53aWRnZXRDb250cm9scyA9IHt9O1xyXG4gICAgICBmb3IobGV0IGlkIG9mIHRoaXMuZ2V0V2lkZ2V0cygpKSB7XHJcbiAgICAgICAgdGhpcy53aWRnZXRDb250cm9sc1tpZF0gPSB0aGlzLmNvbnRhaW5lci5maW5kKCcuJytpZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaW5wdXRDb250cm9scyA9IHt9O1xyXG4gICAgICBmb3IobGV0IGlkIG9mIHRoaXMuZ2V0SW5wdXRzKCkpIHtcclxuICAgICAgICB0aGlzLmlucHV0Q29udHJvbHNbaWRdID0gdGhpcy5jb250YWluZXIuZmluZCgnLicraWQpO1xyXG4gICAgICAgIHRoaXMuYmluZHNbaWRdID0gVmlldy5oYW5kbGVJbnB1dEV2ZW50LmJpbmQoe2dldEhhbmRsZXJzOiB0aGlzLmdldEhhbmRsZXJzLmJpbmQodGhpcyksIGlkLCBjdHJsOiB0aGlzLmlucHV0Q29udHJvbHNbaWRdfSk7XHJcbiAgICAgICAgdGhpcy5pbnB1dENvbnRyb2xzW2lkXS5vbigna2V5dXAnLCB0aGlzLmJpbmRzW2lkXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2xzID0ge307XHJcbiAgICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRGb3JtcygpKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHNbaWRdID0gdGhpcy5jb250YWluZXIuZmluZCgnLicraWQpO1xyXG4gICAgICAgIHRoaXMuYmluZHNbaWRdID0gVmlldy5oYW5kbGVGb3JtRXZlbnQuYmluZCh7Z2V0SGFuZGxlcnM6IHRoaXMuZ2V0SGFuZGxlcnMuYmluZCh0aGlzKSwgaWQsIGN0cmw6IHRoaXMuZm9ybUNvbnRyb2xzW2lkXX0pO1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xzW2lkXS5vbignc3VibWl0JywgdGhpcy5iaW5kc1tpZF0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRleHRDb250cm9scyA9IHt9O1xyXG4gICAgICBmb3IobGV0IGlkIG9mIHRoaXMuZ2V0VGV4dHMoKSkge1xyXG4gICAgICAgIHRoaXMudGV4dENvbnRyb2xzW2lkXSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy4nK2lkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zdGF0ZVNldHRlcnMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbWFwOiB0aGlzLmxpbmtDb250cm9scyxcclxuICAgICAgICAgIHNldHRlcjogdGhpcy5zZXRMaW5rQ29udHJvbFN0YXRlLmJpbmQodGhpcylcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG1hcDogdGhpcy53aWRnZXRDb250cm9scyxcclxuICAgICAgICAgIHNldHRlcjogdGhpcy5zZXRXaWRnZXRDb250cm9sU3RhdGUuYmluZCh0aGlzKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbWFwOiB0aGlzLmlucHV0Q29udHJvbHMsXHJcbiAgICAgICAgICBzZXR0ZXI6IHRoaXMuc2V0SW5wdXRDb250cm9sU3RhdGUuYmluZCh0aGlzKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbWFwOiB0aGlzLnRleHRDb250cm9scyxcclxuICAgICAgICAgIHNldHRlcjogdGhpcy5zZXRUZXh0Q29udHJvbFN0YXRlLmJpbmQodGhpcylcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcblxyXG4gICAgICB0aGlzLmluaXRWaWV3KCk7XHJcblxyXG4gICAgICBpZih0aGlzLm9uTG9hZCkge1xyXG4gICAgICAgIHRoaXMub25Mb2FkKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZmlyZUxpbmtzT25Mb2FkRXZlbnQoKTtcclxuICAgIH0pLlxyXG4gICAgY2F0Y2goKHJlcyk9PiBjb25zb2xlLmVycm9yKHJlcykpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGRlbGV0ZSB0aGlzLnRleHRDb250cm9scztcclxuICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRMaW5rcygpKSB7XHJcbiAgICAgIHRoaXMubGlua0NvbnRyb2xzW2lkXS5vZmYoJ2NsaWNrJywgdGhpcy5iaW5kc1tpZF0pO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlIHRoaXMubGlua0NvbnRyb2xzO1xyXG4gICAgZGVsZXRlIHRoaXMud2lkZ2V0Q29udHJvbHM7XHJcbiAgICBmb3IobGV0IGlkIG9mIHRoaXMuZ2V0SW5wdXRzKCkpIHtcclxuICAgICAgdGhpcy5pbnB1dENvbnRyb2xzW2lkXS5vZmYoJ2tleXVwJywgdGhpcy5iaW5kc1tpZF0pO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlIHRoaXMuaW5wdXRDb250cm9scztcclxuICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRGb3JtcygpKSB7XHJcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2xzW2lkXS5vZmYoJ3N1Ym1pdCcsIHRoaXMuYmluZHNbaWRdKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLmZvcm1Db250cm9scztcclxuXHJcbiAgICAhdGhpcy50ZW1wbGF0ZU9iamVjdC5kaXNwb3NlIHx8IHRoaXMudGVtcGxhdGVPYmplY3QuZGlzcG9zZSgpO1xyXG4gICAgZGVsZXRlIHRoaXMudGVtcGxhdGVPYmplY3Q7XHJcblxyXG4gICAgaWYodGhpcy5pc0lPUykge1xyXG4gICAgICAkKHRoaXMucGFyZW50Q29udGFpbmVyWzBdLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpLm9mZigncmVzaXplJywgdGhpcy5iaW5kcy5vblJlc2l6ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhcmVudENvbnRhaW5lci5odG1sKCcnKTtcclxuICAgIGRlbGV0ZSB0aGlzLmZyYW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29udGFpbmVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFyZW50Q29udGFpbmVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q29udGFpbmVyWzBdO1xyXG4gIH1cclxuXHJcbiAgYWRkSGFuZGxlcihoYW5kbGVyKSB7XHJcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goaGFuZGxlcik7XHJcbiAgfVxyXG5cclxuICBpbml0VmlldygpIHtcclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0Q29udHJvbFN0YXRlKGN0cmwsIGRlZmF1bHRzLCBzdGF0ZSwgc3RhdGVIYW5kbGVycykge1xyXG4gICAgaWYoY3RybCkge1xyXG4gICAgICBjb25zdCBzdCA9IHtcclxuICAgICAgICAuLi5kZWZhdWx0cyxcclxuICAgICAgICAuLi5zdGF0ZVxyXG4gICAgICB9O1xyXG4gICAgICBmb3IobGV0IG5hbWUgaW4gc3QpIHtcclxuICAgICAgICBpZihzdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBzdGF0ZUhhbmRsZXJzW25hbWVdKSB7XHJcbiAgICAgICAgICBzdGF0ZUhhbmRsZXJzW25hbWVdKGN0cmwsIHN0W25hbWVdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldExpbmtDb250cm9sU3RhdGUoaWQsIHN0YXRlKSB7XHJcbiAgICBWaWV3LnNldENvbnRyb2xTdGF0ZShcclxuICAgICAgdGhpcy5saW5rQ29udHJvbHNbaWRdLFxyXG4gICAgICB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBzdGF0ZSxcclxuICAgICAgVmlldy5saW5rU3RhdGVIYW5kbGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNldFdpZGdldENvbnRyb2xTdGF0ZShpZCwgc3RhdGUpIHtcclxuICAgIFZpZXcuc2V0Q29udHJvbFN0YXRlKFxyXG4gICAgICB0aGlzLndpZGdldENvbnRyb2xzW2lkXSxcclxuICAgICAge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBlbmFibGU6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgc3RhdGUsXHJcbiAgICAgIFZpZXcud2lkZ2V0U3RhdGVIYW5kbGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNldElucHV0Q29udHJvbFN0YXRlKGlkLCBzdGF0ZSkge1xyXG4gICAgVmlldy5zZXRDb250cm9sU3RhdGUoXHJcbiAgICAgIHRoaXMuaW5wdXRDb250cm9sc1tpZF0sXHJcbiAgICAgIHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2YWx1ZTogJydcclxuICAgICAgfSxcclxuICAgICAgc3RhdGUsXHJcbiAgICAgIFZpZXcuaW5wdXRTdGF0ZUhhbmRsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0VGV4dENvbnRyb2xTdGF0ZShpZCwgc3RhdGUpIHtcclxuICAgIFZpZXcuc2V0Q29udHJvbFN0YXRlKFxyXG4gICAgICB0aGlzLnRleHRDb250cm9sc1tpZF0sXHJcbiAgICAgIHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICBzdGF0ZSxcclxuICAgICAgVmlldy50ZXh0U3RhdGVIYW5kbGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9uSXRlbVN0YXRlQ2hhbmdlZCgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBzZXRTdGF0ZShpZCwgc3RhdGUpIHtcclxuICAgIGZvcihsZXQgaXRlbSBvZiB0aGlzLnN0YXRlU2V0dGVycykge1xyXG4gICAgICBpZihpdGVtLm1hcFtpZF0pIHtcclxuICAgICAgICBpdGVtLnNldHRlcihpZCwgc3RhdGUpO1xyXG4gICAgICAgIHRoaXMub25JdGVtU3RhdGVDaGFuZ2VkKGlkLCBzdGF0ZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1ZpZXcuanNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9jb21tb24vY2xhc3Nlcy9WaWV3LmpzIiwiaW1wb3J0IHskLCBUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBPcmJpdCBmcm9tICcuL09yYml0JztcclxuaW1wb3J0IFRocmVlTW91c2VFdmVudENvbnZlcnRlciBmcm9tICcuL1RocmVlTW91c2VFdmVudENvbnZlcnRlcic7XHJcbmltcG9ydCBUaHJlZVRvdWNoRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9UaHJlZVRvdWNoRXZlbnRDb252ZXJ0ZXInO1xyXG5pbXBvcnQgRHJhZyBmcm9tICcuL0RyYWcnO1xyXG5pbXBvcnQgQ1NTM0RSZW5kZXJlciBmcm9tICcuL0NTUzNEUmVuZGVyZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlzdWFsV29ybGQgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYywgY29udGFpbmVyLCB1c2VIZWxwZXJzPWZhbHNlKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy53bmQgPSB3bmQ7XHJcbiAgICB0aGlzLmRvYyA9IGRvYztcclxuICAgIHRoaXMuakNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIHRoaXMucmVuZGVyQ2FsbGJhY2tzID0gW107XHJcblxyXG4gICAgdGhpcy5jbG9jayA9IG5ldyBUSFJFRS5DbG9jaygpO1xyXG5cclxuICAgIHRoaXMucmF5Y2FzdGVyID0gbmV3IFRIUkVFLlJheWNhc3RlcigpO1xyXG5cclxuICAgIHRoaXMuc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcclxuICAgIHRoaXMuY3NzU2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcclxuXHJcbiAgICB0aGlzLmNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSgzMCwgdGhpcy53aWR0aCgpL3RoaXMuaGVpZ2h0KCksIDAuMiwgMjAwMCk7XHJcbiAgICBjb25zdCBzY2FsZSA9IDE7XHJcblxyXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24ueCA9IDA7XHJcbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi55ID0gNS41KnNjYWxlO1xyXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24ueiA9IDA7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbHBoYTogdHJ1ZSwgYW50aWFsaWFzOiB0cnVlfSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHgwMDAwMDAsIDApO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKHRoaXMud25kLmRldmljZVBpeGVsUmF0aW8pO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHRoaXMud2lkdGgoKSwgdGhpcy5oZWlnaHQoKSk7XHJcblxyXG4gICAgdGhpcy5qQ29udGFpbmVyLmFwcGVuZCh0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMuY3NzUmVuZGVyZXJcdD0gbmV3IENTUzNEUmVuZGVyZXIoKTtcclxuICAgIHRoaXMuY3NzUmVuZGVyZXIuc2V0U2l6ZSh0aGlzLndpZHRoKCksIHRoaXMuaGVpZ2h0KCkpO1xyXG4gICAgJCh0aGlzLmNzc1JlbmRlcmVyLmRvbUVsZW1lbnQpLmNzcyh7XHJcbiAgXHRcdHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxyXG4gIFx0XHR0b3A6IDAsXHJcbiAgXHRcdG1hcmdpbjogMCxcclxuICBcdFx0cGFkZGluZzogMFxyXG5cdCAgfSk7XHJcbiAgICB0aGlzLmpDb250YWluZXIuYXBwZW5kKHRoaXMuY3NzUmVuZGVyZXIuZG9tRWxlbWVudCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5jc3NSZW5kZXJlci5kb21FbGVtZW50O1xyXG5cclxuXHJcblxyXG4gICAgdGhpcy5jb250cm9scyA9IG5ldyBPcmJpdCh0aGlzLmNhbWVyYSwgdGhpcy5lbGVtZW50KTtcclxuICAgIHRoaXMuY29udHJvbHMudGFyZ2V0LnkgPSAwLjU7XHJcblxyXG4gICAgY29uc3QgY3NzU2NlbmUgPSAkKHRoaXMuY3NzUmVuZGVyZXIuZG9tRWxlbWVudCkuZmluZCgnZGl2JyksIHRtcFZlY3RvciA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpPT4ge1xyXG4gICAgICB0aGlzLmNhbWVyYS5nZXRXb3JsZERpcmVjdGlvbih0bXBWZWN0b3IpO1xyXG4gICAgICBjc3NTY2VuZS5jc3MoJ2Rpc3BsYXknLCB0bXBWZWN0b3IueS10aGlzLmNhbWVyYS5wb3NpdGlvbi55PjA/ICdub25lJzogJ2Jsb2NrJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRleHR1cmVMb2FkZXIgPSBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpO1xyXG5cclxuICAgIHRoaXMuc2NlbmUuYWRkKG5ldyBUSFJFRS5BbWJpZW50TGlnaHQoMHhEMEQwRDApKTsvLzB4QzBDMEMwXHJcblxyXG4gICAgdGhpcy5saWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4NDA0MDQwLCAxKTtcclxuICAgIHRoaXMubGlnaHQucG9zaXRpb24uc2V0KDAsIDYqc2NhbGUsIDApO1xyXG4gICAgdGhpcy5saWdodC5jYXN0U2hhZG93ID0gZmFsc2U7XHJcbiAgICAvLyBjb25zdCBkID0gMjAqc2NhbGU7XHJcbiAgICAvLyB0aGlzLmxpZ2h0LnNoYWRvdy5jYW1lcmEubGVmdCA9IC1kO1xyXG4gICAgLy8gdGhpcy5saWdodC5zaGFkb3cuY2FtZXJhLnJpZ2h0ID0gZDtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS50b3AgPSBkO1xyXG4gICAgLy8gdGhpcy5saWdodC5zaGFkb3cuY2FtZXJhLmJvdHRvbSA9IC1kO1xyXG4gICAgLy8gdGhpcy5saWdodC5zaGFkb3cuY2FtZXJhLm5lYXIgPSAxKnNjYWxlO1xyXG4gICAgLy8gdGhpcy5saWdodC5zaGFkb3cuY2FtZXJhLmZhciA9IDI1KnNjYWxlO1xyXG4gICAgLy8gdGhpcy5saWdodC5zaGFkb3cubWFwU2l6ZS54ID0gMTAyNDtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93Lm1hcFNpemUueSA9IDEwMjQ7XHJcbiAgICB0aGlzLnNjZW5lLmFkZCh0aGlzLmxpZ2h0KTtcclxuXHJcbiAgICBpZih1c2VIZWxwZXJzKSB7XHJcbiAgICAgIHRoaXMuc2NlbmUuYWRkKG5ldyBUSFJFRS5BeGlzSGVscGVyKDUpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBvbldpbmRvd1Jlc2l6ZTogdGhpcy5vbldpbmRvd1Jlc2l6ZS5iaW5kKHRoaXMpLFxyXG4gICAgICBhbmltYXRlOiB0aGlzLmFuaW1hdGUuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuXHJcbiAgICAkKHRoaXMud25kKS5vbigncmVzaXplJywgdGhpcy5iaW5kcy5vbldpbmRvd1Jlc2l6ZSk7XHJcblxyXG4gICAgdGhpcy5tb3VzZUV2ZW50cyA9IG5ldyBUaHJlZU1vdXNlRXZlbnRDb252ZXJ0ZXIodGhpcy53bmQsIHRoaXMuZG9jLCB0aGlzKTtcclxuICAgIHRoaXMudG91Y2hFdmVudHMgPSBuZXcgVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyKHRoaXMud25kLCB0aGlzLmRvYywgdGhpcyk7XHJcbiAgICBjb25zdCBmaWx0ZXJEYXRhID0ge3R5cGU6ICdtb3VzZW1vdmUnfTtcclxuICAgIHRoaXMubW91c2VFdmVudHMuZmlsdGVyID0gKGVsZW1lbnQsIGUpPT4ge1xyXG4gICAgICBjb25zdCB0eXBlcyA9IFsnbW91c2VlbnRlcicsICdtb3VzZW92ZXInLCAnbW91c2VsZWF2ZScsICdtb3VzZW91dCddLCBjb250YWlucyA9IChwLCBjKT0+IHA9PT1jIHx8ICQuY29udGFpbnMocCwgYyk7XHJcbiAgICAgIGlmKGUudHlwZT09PSdtb3VzZW1vdmUnKSB7XHJcbiAgICAgICAgZmlsdGVyRGF0YS5wYWdlWCA9IGUucGFnZVg7XHJcbiAgICAgICAgZmlsdGVyRGF0YS5wYWdlWSA9IGUucGFnZVk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGUucmVsYXRlZFRhcmdldCAmJiB+dHlwZXMuaW5kZXhPZihlLnR5cGUpICYmIGNvbnRhaW5zKGVsZW1lbnQsIGUudGFyZ2V0KSAmJiBjb250YWlucyhlbGVtZW50LCBlLnJlbGF0ZWRUYXJnZXQpPyB7Li4uZSwgLi4uZmlsdGVyRGF0YX06IGU7XHJcbiAgICB9O1xyXG4gICAgdGhpcy5kcmFnID0gbmV3IERyYWcodGhpcy53bmQsIHRoaXMuZG9jLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLmFuaW1hdGUoKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBkZWxldGUgdGhpcy5iaW5kcy5hbmltYXRlO1xyXG4gICAgJCh0aGlzLnduZCkub2ZmKCdyZXNpemUnLCB0aGlzLmJpbmRzLm9uV2luZG93UmVzaXplKTtcclxuICAgIHRoaXMubW91c2VFdmVudHMuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy50b3VjaEV2ZW50cy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmRyYWcuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5jb250cm9scy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICB3aWR0aCgpIHtcclxuICAgIHJldHVybiB0aGlzLmpDb250YWluZXIud2lkdGgoKTtcclxuICB9XHJcblxyXG4gIGhlaWdodCgpIHtcclxuICAgIHJldHVybiB0aGlzLmpDb250YWluZXIuaGVpZ2h0KCk7XHJcbiAgfVxyXG5cclxuICBzZXRFeHRyYUxpZ2h0aW5nKHYpIHtcclxuICAgIHRoaXMubGlnaHQuaW50ZW5zaXR5ID0gdjtcclxuICB9XHJcblxyXG4gIGdldE9yYml0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbHM7XHJcbiAgfVxyXG5cclxuICBzZXRDb250cm9sc1N0YXRlKHN0YXRlKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZWQgPSBzdGF0ZTtcclxuICB9XHJcblxyXG4gIGdldENvbnRyb2xzU3RhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9scy5lbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgb25XaW5kb3dSZXNpemUoKSB7XHJcbiAgICBjb25zdCB1cGRhdGVDYW1lcmEgPSAoY2FtZXJhKT0+IHtcclxuICAgICAgY2FtZXJhLmFzcGVjdCA9IHRoaXMud2lkdGgoKS90aGlzLmhlaWdodCgpO1xyXG4gICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gICAgfSxcclxuICAgIHVwZGF0ZVJlbmRlcmVyID0gKHJlbmRlcmVyKT0+IHtcclxuICAgICAgcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLndpZHRoKCksIHRoaXMuaGVpZ2h0KCkpO1xyXG4gICAgfTtcclxuXHJcbiAgICB1cGRhdGVDYW1lcmEodGhpcy5jYW1lcmEpO1xyXG4gICAgdXBkYXRlUmVuZGVyZXIodGhpcy5yZW5kZXJlcik7XHJcbiAgICB1cGRhdGVSZW5kZXJlcih0aGlzLmNzc1JlbmRlcmVyKTtcclxuXHJcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ICdyZXNpemUnfSk7XHJcbiAgfVxyXG5cclxuICBhZGRPYmplY3Qob2JqZWN0KSB7XHJcbiAgICB0aGlzLnNjZW5lLmFkZChvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgYWRkQ3NzT2JqZWN0KG9iamVjdCkge1xyXG4gICAgdGhpcy5jc3NTY2VuZS5hZGQob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUNzc09iamVjdChvYmplY3QpIHtcclxuICAgIHRoaXMuY3NzU2NlbmUucmVtb3ZlKG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVPYmplY3Qob2JqZWN0KSB7XHJcbiAgICB0aGlzLnNjZW5lLnJlbW92ZShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgYW5pbWF0ZSgpIHtcclxuICAgIGlmKHRoaXMuYmluZHMuYW5pbWF0ZSkge1xyXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5iaW5kcy5hbmltYXRlKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgfVxyXG5cclxuICBhZGRSZW5kZXJDYWxsYmFjayhjbGIpIHtcclxuICAgIHRoaXMucmVuZGVyQ2FsbGJhY2tzLnB1c2goY2xiKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVJlbmRlckNhbGxiYWNrKGNsYikge1xyXG4gICAgY29uc3QgaSA9IHRoaXMucmVuZGVyQ2FsbGJhY2tzLmluZGV4T2YoY2xiKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyQ2FsbGJhY2tzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbmRlcigpIHtcclxuICAgIGNvbnN0IGRlbHRhVGltZSA9IHRoaXMuY2xvY2suZ2V0RGVsdGEoKTtcclxuICAgIHRoaXMuY29udHJvbHMudXBkYXRlKGRlbHRhVGltZSk7XHJcbiAgICBmb3IobGV0IGNsYiBvZiB0aGlzLnJlbmRlckNhbGxiYWNrcykge1xyXG4gICAgICBjbGIoZGVsdGFUaW1lKTtcclxuICAgIH1cclxuICAgIHRoaXMuY3NzUmVuZGVyZXIucmVuZGVyKHRoaXMuY3NzU2NlbmUsIHRoaXMuY2FtZXJhKTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NHZW9tZXRyeShidWZHZW9tZXRyeSwgbWVzaCkge1xyXG4gICAgbWVzaC5nZW9tZXRyeSA9IGJ1Zkdlb21ldHJ5O1xyXG4gICAgLy8gT2J0YWluIGEgR2VvbWV0cnlcclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkdlb21ldHJ5KCkuZnJvbUJ1ZmZlckdlb21ldHJ5KGJ1Zkdlb21ldHJ5KTtcclxuICAgIC8vIE1lcmdlIHRoZSB2ZXJ0aWNlcyBzbyB0aGUgdHJpYW5nbGUgc291cCBpcyBjb252ZXJ0ZWQgdG8gaW5kZXhlZCB0cmlhbmdsZXNcclxuICAgIGdlb21ldHJ5Lm1lcmdlVmVydGljZXMoKTtcclxuICAgIC8vIENvbnZlcnQgYWdhaW4gdG8gQnVmZmVyR2VvbWV0cnksIGluZGV4ZWRcclxuICAgIGNvbnN0IGluZGV4ZWRCdWZmZXJHZW9tID0gdGhpcy5jcmVhdGVJbmRleGVkQnVmZmVyR2VvbWV0cnlGcm9tR2VvbWV0cnkoZ2VvbWV0cnkpO1xyXG4gICAgLy8gQ3JlYXRlIGluZGV4IGFycmF5cyBtYXBwaW5nIHRoZSBpbmRleGVkIHZlcnRpY2VzIHRvIGJ1Zkdlb21ldHJ5IHZlcnRpY2VzXHJcbiAgICByZXR1cm4gdGhpcy5tYXBJbmRpY2VzKGJ1Zkdlb21ldHJ5LCBpbmRleGVkQnVmZmVyR2VvbSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVJbmRleGVkQnVmZmVyR2VvbWV0cnlGcm9tR2VvbWV0cnkoZ2VvbWV0cnkpIHtcclxuICAgIGNvbnN0IG51bVZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoO1xyXG4gICAgY29uc3QgbnVtRmFjZXMgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7XHJcblxyXG4gICAgY29uc3QgYnVmZmVyR2VvbSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpO1xyXG4gICAgY29uc3QgdmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVZlcnRpY2VzICogMyk7XHJcbiAgICBjb25zdCBpbmRpY2VzID0gbmV3IChudW1GYWNlcyAqIDMgPiA2NTUzNSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXkpKG51bUZhY2VzICogMyk7XHJcblxyXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IG51bVZlcnRpY2VzOyBpKyspIHtcclxuICAgICAgY29uc3QgcCA9IGdlb21ldHJ5LnZlcnRpY2VzW2ldO1xyXG4gICAgICBjb25zdCBpMyA9IGkgKiAzO1xyXG4gICAgICB2ZXJ0aWNlc1tpM10gPSBwLng7XHJcbiAgICAgIHZlcnRpY2VzW2kzICsgMV0gPSBwLnk7XHJcbiAgICAgIHZlcnRpY2VzW2kzICsgMl0gPSBwLno7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IG51bUZhY2VzOyBpKyspIHtcclxuICAgICAgY29uc3QgZiA9IGdlb21ldHJ5LmZhY2VzW2ldO1xyXG4gICAgICBjb25zdCBpMyA9IGkgKiAzO1xyXG4gICAgICBpbmRpY2VzW2kzXSA9IGYuYTtcclxuICAgICAgaW5kaWNlc1tpMyArIDFdID0gZi5iO1xyXG4gICAgICBpbmRpY2VzW2kzICsgMl0gPSBmLmM7XHJcbiAgICB9XHJcblxyXG4gICAgYnVmZmVyR2VvbS5zZXRJbmRleChuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGluZGljZXMsIDEpKTtcclxuICAgIGJ1ZmZlckdlb20uYWRkQXR0cmlidXRlKCdwb3NpdGlvbicsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodmVydGljZXMsIDMpKTtcclxuXHJcbiAgICByZXR1cm4gYnVmZmVyR2VvbTtcclxuICB9XHJcblxyXG4gIGlzRXF1YWwoeDEsIHkxLCB6MSwgeDIsIHkyLCB6Mikge1xyXG4gICAgY29uc3QgZGVsdGEgPSAwLjAwMDAwMTtcclxuICAgIHJldHVybiBNYXRoLmFicyh4MiAtIHgxKSA8IGRlbHRhICYmXHJcbiAgICBNYXRoLmFicyh5MiAtIHkxKSA8IGRlbHRhICYmXHJcbiAgICBNYXRoLmFicyh6MiAtIHoxKSA8IGRlbHRhO1xyXG4gIH1cclxuXHJcbiAgbWFwSW5kaWNlcyhidWZHZW9tZXRyeSwgaW5kZXhlZEJ1ZmZlckdlb20pIHtcclxuICAgIC8vIENyZWF0ZXMgbWFwcGVkVmVydGljZXMsIG1hcHBlZEluZGljZXMgYW5kIG1hcHBlZEFzc29jaWF0aW9uIGluIGJ1Zkdlb21ldHJ5XHJcbiAgICBjb25zdCB2ZXJ0aWNlcyA9IGJ1Zkdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XHJcbiAgICBjb25zdCBpZHhWZXJ0aWNlcyA9IGluZGV4ZWRCdWZmZXJHZW9tLmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XHJcbiAgICBjb25zdCBpbmRpY2VzID0gaW5kZXhlZEJ1ZmZlckdlb20uaW5kZXguYXJyYXk7XHJcblxyXG4gICAgY29uc3QgbnVtSWR4VmVydGljZXMgPSBpZHhWZXJ0aWNlcy5sZW5ndGggLyAzO1xyXG4gICAgY29uc3QgbnVtVmVydGljZXMgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xyXG5cclxuICAgIGJ1Zkdlb21ldHJ5Lm1hcHBlZFZlcnRpY2VzID0gaWR4VmVydGljZXM7XHJcbiAgICBidWZHZW9tZXRyeS5tYXBwZWRJbmRpY2VzID0gaW5kaWNlcztcclxuICAgIGJ1Zkdlb21ldHJ5Lm1hcHBlZEFzc29jaWF0aW9uID0gW107XHJcblxyXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IG51bUlkeFZlcnRpY2VzOyBpKyspIHtcclxuICAgICAgY29uc3QgYXNzb2NpYXRpb24gPSBbXTtcclxuICAgICAgYnVmR2VvbWV0cnkubWFwcGVkQXNzb2NpYXRpb24ucHVzaChhc3NvY2lhdGlvbik7XHJcbiAgICAgIGNvbnN0IGkzID0gaSAqIDM7XHJcbiAgICAgIGZvcihsZXQgaiA9IDA7IGogPCBudW1WZXJ0aWNlczsgaisrKSB7XHJcbiAgICAgICAgY29uc3QgajMgPSBqICogMztcclxuICAgICAgICBpZiAodGhpcy5pc0VxdWFsKGlkeFZlcnRpY2VzW2kzXSwgaWR4VmVydGljZXNbaTMgKyAxXSwgaWR4VmVydGljZXNbaTMgKyAyXSxcclxuICAgICAgICB2ZXJ0aWNlc1tqM10sIHZlcnRpY2VzW2ozICsgMV0sIHZlcnRpY2VzW2ozICsgMl0pKSB7XHJcbiAgICAgICAgICBhc3NvY2lhdGlvbi5wdXNoKGozKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7dmVydGljZXM6IGJ1Zkdlb21ldHJ5Lm1hcHBlZFZlcnRpY2VzLCBpbmRpY2VzOiBidWZHZW9tZXRyeS5tYXBwZWRJbmRpY2VzfTtcclxuICB9XHJcblxyXG4gIG9uZU5vZGVQb3NpdGlvbkNhbGxiYWNrKHAsIHEpIHtcclxuICAgIHRoaXMucG9zaXRpb24uc2V0KHAueCwgcC55LCBwLnopO1xyXG4gICAgdGhpcy5xdWF0ZXJuaW9uLnNldChxLngsIHEueSwgcS56LCBxLncpO1xyXG4gIH1cclxuXHJcbiAgbXVsdHlOb2RlUG9zaXRpb25DYWxsYmFjayhub2RlLCBwLCBuKSB7XHJcbiAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcbiAgICBjb25zdCB2b2x1bWVQb3NpdGlvbnMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xyXG4gICAgY29uc3Qgdm9sdW1lTm9ybWFscyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xyXG4gICAgY29uc3QgYXNzb2NWZXJ0ZXggPSBnZW9tZXRyeS5tYXBwZWRBc3NvY2lhdGlvbltub2RlXTtcclxuXHJcbiAgICBmb3IobGV0IGsgPSAwOyBrIDwgYXNzb2NWZXJ0ZXgubGVuZ3RoOyBrKyspIHtcclxuICAgICAgICBsZXQgaW5kZXhWZXJ0ZXggPSBhc3NvY1ZlcnRleFtrXTtcclxuICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaW5kZXhWZXJ0ZXhdID0gcC54O1xyXG4gICAgICAgIHZvbHVtZU5vcm1hbHNbaW5kZXhWZXJ0ZXhdID0gbi54O1xyXG4gICAgICAgICsraW5kZXhWZXJ0ZXg7XHJcbiAgICAgICAgdm9sdW1lUG9zaXRpb25zW2luZGV4VmVydGV4XSA9IHAueTtcclxuICAgICAgICB2b2x1bWVOb3JtYWxzW2luZGV4VmVydGV4XSA9IG4ueTtcclxuICAgICAgICArK2luZGV4VmVydGV4O1xyXG4gICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpbmRleFZlcnRleF0gPSBwLno7XHJcbiAgICAgICAgdm9sdW1lTm9ybWFsc1tpbmRleFZlcnRleF0gPSBuLno7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtdWx0eU5vZGVQb3NpdGlvblBvc3RDYWxsYmFjaygpIHtcclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcclxuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcGF0aFBvc2l0aW9uQ2FsbGJhY2sobm9kZSwgcCkge1xyXG4gICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xyXG5cdFx0bGV0IGkgPSAzICogbm9kZTtcclxuXHRcdHBvc2l0aW9uc1tpKytdID0gcC54O1xyXG5cdFx0cG9zaXRpb25zW2krK10gPSBwLnk7XHJcblx0XHRwb3NpdGlvbnNbaV0gPSBwLno7XHJcbiAgfVxyXG5cclxuICBwYXRoUG9zaXRpb25Qb3N0Q2FsbGJhY2soKSB7XHJcbiAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcbiAgICBnZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG4gICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9WaXN1YWxXb3JsZC5qc1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL2NvbW1vbi9jbGFzc2VzL1Zpc3VhbFdvcmxkLmpzIiwiaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnLi9Db250cm9sbGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdpZGdldENvbnRyb2xsZXIgZXh0ZW5kcyBDb250cm9sbGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iodmlldykge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMudmlldyA9IHZpZXc7XHJcbiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2xlKCkge1xyXG4gICAgdGhpcy52aXNpYmxlID0gIXRoaXMudmlzaWJsZTtcclxuICAgIHRoaXMuZmlyZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBmaXJlQ2hhbmdlKCkge1xyXG4gICAgaWYodGhpcy5vbkNoYW5nZSkge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICBpZih0aGlzLnZpZXcpIHtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCd3aWRGbG9hdFduZCcsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy52aXNpYmxlLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9XaWRnZXRDb250cm9sbGVyLmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvV2lkZ2V0Q29udHJvbGxlci5qcyIsImltcG9ydCBUYXJnZXQgZnJvbSAnLi9UYXJnZXQnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY2xlVGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHtcclxuXHJcbiAgY29uc3RydWN0b3IoeCwgeSwgcikge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMucCA9IHtcclxuICAgICAgeCxcclxuICAgICAgeSxcclxuICAgICAgclxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHRlc3RJbnRlcnNlY3Rpb24oZSwgZGF0YSkge1xyXG4gICAgbGV0IHJlcztcclxuICAgIGNvbnN0IHt4LCB5fSA9IGRhdGEsIHAgPSB0aGlzLnA7XHJcbiAgICBpZigoeC1wLngpKih4LXAueCkrKHktcC55KSooeS1wLnkpPD1wLnIqcC5yKSB7XHJcbiAgICAgIHJlcyA9IHtcclxuICAgICAgICB0YXJnZXQ6IHRoaXMsXHJcbiAgICAgICAgZGF0YVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL3RhcmdldHMvQ2lyY2xlVGFyZ2V0LmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvdGFyZ2V0cy9DaXJjbGVUYXJnZXQuanMiLCJpbXBvcnQgVGFyZ2V0IGZyb20gJy4vVGFyZ2V0JztcclxuaW1wb3J0IEJhc2VNYXRoVXRpbHMgZnJvbSAnLi4vQmFzZU1hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2x5VGFyZ2V0IGV4dGVuZHMgVGFyZ2V0IHtcclxuXHJcbiAgY29uc3RydWN0b3IocG9seSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMucG9seSA9IHBvbHk7XHJcbiAgfVxyXG5cclxuICB0ZXN0SW50ZXJzZWN0aW9uKGUsIHApIHtcclxuICAgIHJldHVybiBCYXNlTWF0aFV0aWxzLmlzSW5zaWRlUG9seSh0aGlzLnBvbHksIHApPyB7XHJcbiAgICAgIHRhcmdldDogdGhpcyxcclxuICAgICAgZGF0YTogcFxyXG4gICAgfTogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvdGFyZ2V0cy9Qb2x5VGFyZ2V0LmpzXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2s6Ly8vY29tbW9uL2NsYXNzZXMvdGFyZ2V0cy9Qb2x5VGFyZ2V0LmpzIiwiLy8gc3RhdHMuanMgLSBodHRwOi8vZ2l0aHViLmNvbS9tcmRvb2Ivc3RhdHMuanNcbihmdW5jdGlvbihmLGUpe1wib2JqZWN0XCI9PT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGUpOmYuU3RhdHM9ZSgpfSkodGhpcyxmdW5jdGlvbigpe3ZhciBmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShhKXtjLmFwcGVuZENoaWxkKGEuZG9tKTtyZXR1cm4gYX1mdW5jdGlvbiB1KGEpe2Zvcih2YXIgZD0wO2Q8Yy5jaGlsZHJlbi5sZW5ndGg7ZCsrKWMuY2hpbGRyZW5bZF0uc3R5bGUuZGlzcGxheT1kPT09YT9cImJsb2NrXCI6XCJub25lXCI7bD1hfXZhciBsPTAsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2Muc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDtjdXJzb3I6cG9pbnRlcjtvcGFjaXR5OjAuOTt6LWluZGV4OjEwMDAwXCI7Yy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIixmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCk7XG51KCsrbCVjLmNoaWxkcmVuLmxlbmd0aCl9LCExKTt2YXIgaz0ocGVyZm9ybWFuY2V8fERhdGUpLm5vdygpLGc9ayxhPTAscj1lKG5ldyBmLlBhbmVsKFwiRlBTXCIsXCIjMGZmXCIsXCIjMDAyXCIpKSxoPWUobmV3IGYuUGFuZWwoXCJNU1wiLFwiIzBmMFwiLFwiIzAyMFwiKSk7aWYoc2VsZi5wZXJmb3JtYW5jZSYmc2VsZi5wZXJmb3JtYW5jZS5tZW1vcnkpdmFyIHQ9ZShuZXcgZi5QYW5lbChcIk1CXCIsXCIjZjA4XCIsXCIjMjAxXCIpKTt1KDApO3JldHVybntSRVZJU0lPTjoxNixkb206YyxhZGRQYW5lbDplLHNob3dQYW5lbDp1LGJlZ2luOmZ1bmN0aW9uKCl7az0ocGVyZm9ybWFuY2V8fERhdGUpLm5vdygpfSxlbmQ6ZnVuY3Rpb24oKXthKys7dmFyIGM9KHBlcmZvcm1hbmNlfHxEYXRlKS5ub3coKTtoLnVwZGF0ZShjLWssMjAwKTtpZihjPmcrMUUzJiYoci51cGRhdGUoMUUzKmEvKGMtZyksMTAwKSxnPWMsYT0wLHQpKXt2YXIgZD1wZXJmb3JtYW5jZS5tZW1vcnk7dC51cGRhdGUoZC51c2VkSlNIZWFwU2l6ZS9cbjEwNDg1NzYsZC5qc0hlYXBTaXplTGltaXQvMTA0ODU3Nil9cmV0dXJuIGN9LHVwZGF0ZTpmdW5jdGlvbigpe2s9dGhpcy5lbmQoKX0sZG9tRWxlbWVudDpjLHNldE1vZGU6dX19O2YuUGFuZWw9ZnVuY3Rpb24oZSxmLGwpe3ZhciBjPUluZmluaXR5LGs9MCxnPU1hdGgucm91bmQsYT1nKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKSxyPTgwKmEsaD00OCphLHQ9MyphLHY9MiphLGQ9MyphLG09MTUqYSxuPTc0KmEscD0zMCphLHE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtxLndpZHRoPXI7cS5oZWlnaHQ9aDtxLnN0eWxlLmNzc1RleHQ9XCJ3aWR0aDo4MHB4O2hlaWdodDo0OHB4XCI7dmFyIGI9cS5nZXRDb250ZXh0KFwiMmRcIik7Yi5mb250PVwiYm9sZCBcIis5KmErXCJweCBIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZlwiO2IudGV4dEJhc2VsaW5lPVwidG9wXCI7Yi5maWxsU3R5bGU9bDtiLmZpbGxSZWN0KDAsMCxyLGgpO2IuZmlsbFN0eWxlPWY7Yi5maWxsVGV4dChlLHQsdik7XG5iLmZpbGxSZWN0KGQsbSxuLHApO2IuZmlsbFN0eWxlPWw7Yi5nbG9iYWxBbHBoYT0uOTtiLmZpbGxSZWN0KGQsbSxuLHApO3JldHVybntkb206cSx1cGRhdGU6ZnVuY3Rpb24oaCx3KXtjPU1hdGgubWluKGMsaCk7az1NYXRoLm1heChrLGgpO2IuZmlsbFN0eWxlPWw7Yi5nbG9iYWxBbHBoYT0xO2IuZmlsbFJlY3QoMCwwLHIsbSk7Yi5maWxsU3R5bGU9ZjtiLmZpbGxUZXh0KGcoaCkrXCIgXCIrZStcIiAoXCIrZyhjKStcIi1cIitnKGspK1wiKVwiLHQsdik7Yi5kcmF3SW1hZ2UocSxkK2EsbSxuLWEscCxkLG0sbi1hLHApO2IuZmlsbFJlY3QoZCtuLWEsbSxhLHApO2IuZmlsbFN0eWxlPWw7Yi5nbG9iYWxBbHBoYT0uOTtiLmZpbGxSZWN0KGQrbi1hLG0sYSxnKCgxLWgvdykqcCkpfX19O3JldHVybiBmfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc3RhdHMuanMvYnVpbGQvc3RhdHMubWluLmpzXG4vLyBtb2R1bGUgaWQgPSA3MFxuLy8gbW9kdWxlIGNodW5rcyA9IDBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjazovLy9+L3N0YXRzLmpzL2J1aWxkL3N0YXRzLm1pbi5qcyIsIi8qKiogSU1QT1JUUyBGUk9NIGltcG9ydHMtbG9hZGVyICoqKi9cbnZhciBkZWZpbmUgPSBmYWxzZTtcblxuLyohXG4gKiBqUXVlcnkgTW91c2V3aGVlbCAzLjEuMTNcbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKi9cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgaWYgKCB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIE5vZGUvQ29tbW9uSlMgc3R5bGUgZm9yIEJyb3dzZXJpZnlcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xuICAgICAgICBmYWN0b3J5KGpRdWVyeSk7XG4gICAgfVxufShmdW5jdGlvbiAoJCkge1xuXG4gICAgdmFyIHRvRml4ICA9IFsnd2hlZWwnLCAnbW91c2V3aGVlbCcsICdET01Nb3VzZVNjcm9sbCcsICdNb3pNb3VzZVBpeGVsU2Nyb2xsJ10sXG4gICAgICAgIHRvQmluZCA9ICggJ29ud2hlZWwnIGluIGRvY3VtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSA5ICkgP1xuICAgICAgICAgICAgICAgICAgICBbJ3doZWVsJ10gOiBbJ21vdXNld2hlZWwnLCAnRG9tTW91c2VTY3JvbGwnLCAnTW96TW91c2VQaXhlbFNjcm9sbCddLFxuICAgICAgICBzbGljZSAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsXG4gICAgICAgIG51bGxMb3dlc3REZWx0YVRpbWVvdXQsIGxvd2VzdERlbHRhO1xuXG4gICAgaWYgKCAkLmV2ZW50LmZpeEhvb2tzICkge1xuICAgICAgICBmb3IgKCB2YXIgaSA9IHRvRml4Lmxlbmd0aDsgaTsgKSB7XG4gICAgICAgICAgICAkLmV2ZW50LmZpeEhvb2tzWyB0b0ZpeFstLWldIF0gPSAkLmV2ZW50Lm1vdXNlSG9va3M7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3BlY2lhbCA9ICQuZXZlbnQuc3BlY2lhbC5tb3VzZXdoZWVsID0ge1xuICAgICAgICB2ZXJzaW9uOiAnMy4xLjEyJyxcblxuICAgICAgICBzZXR1cDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIHRoaXMuYWRkRXZlbnRMaXN0ZW5lciApIHtcbiAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IHRvQmluZC5sZW5ndGg7IGk7ICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIHRvQmluZFstLWldLCBoYW5kbGVyLCBmYWxzZSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbm1vdXNld2hlZWwgPSBoYW5kbGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGxpbmUgaGVpZ2h0IGFuZCBwYWdlIGhlaWdodCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGVsZW1lbnRcbiAgICAgICAgICAgICQuZGF0YSh0aGlzLCAnbW91c2V3aGVlbC1saW5lLWhlaWdodCcsIHNwZWNpYWwuZ2V0TGluZUhlaWdodCh0aGlzKSk7XG4gICAgICAgICAgICAkLmRhdGEodGhpcywgJ21vdXNld2hlZWwtcGFnZS1oZWlnaHQnLCBzcGVjaWFsLmdldFBhZ2VIZWlnaHQodGhpcykpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRlYXJkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICggdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gdG9CaW5kLmxlbmd0aDsgaTsgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggdG9CaW5kWy0taV0sIGhhbmRsZXIsIGZhbHNlICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ubW91c2V3aGVlbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgZGF0YSB3ZSBhZGRlZCB0byB0aGUgZWxlbWVudFxuICAgICAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICdtb3VzZXdoZWVsLWxpbmUtaGVpZ2h0Jyk7XG4gICAgICAgICAgICAkLnJlbW92ZURhdGEodGhpcywgJ21vdXNld2hlZWwtcGFnZS1oZWlnaHQnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRMaW5lSGVpZ2h0OiBmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICB2YXIgJGVsZW0gPSAkKGVsZW0pLFxuICAgICAgICAgICAgICAgICRwYXJlbnQgPSAkZWxlbVsnb2Zmc2V0UGFyZW50JyBpbiAkLmZuID8gJ29mZnNldFBhcmVudCcgOiAncGFyZW50J10oKTtcbiAgICAgICAgICAgIGlmICghJHBhcmVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkcGFyZW50ID0gJCgnYm9keScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KCRwYXJlbnQuY3NzKCdmb250U2l6ZScpLCAxMCkgfHwgcGFyc2VJbnQoJGVsZW0uY3NzKCdmb250U2l6ZScpLCAxMCkgfHwgMTY7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0UGFnZUhlaWdodDogZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuICQoZWxlbSkuaGVpZ2h0KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgIGFkanVzdE9sZERlbHRhczogdHJ1ZSwgLy8gc2VlIHNob3VsZEFkanVzdE9sZERlbHRhcygpIGJlbG93XG4gICAgICAgICAgICBub3JtYWxpemVPZmZzZXQ6IHRydWUgIC8vIGNhbGxzIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmb3IgZWFjaCBldmVudFxuICAgICAgICB9XG4gICAgfTtcblxuICAgICQuZm4uZXh0ZW5kKHtcbiAgICAgICAgbW91c2V3aGVlbDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIHJldHVybiBmbiA/IHRoaXMuYmluZCgnbW91c2V3aGVlbCcsIGZuKSA6IHRoaXMudHJpZ2dlcignbW91c2V3aGVlbCcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVubW91c2V3aGVlbDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuYmluZCgnbW91c2V3aGVlbCcsIGZuKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG5cbiAgICBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHZhciBvcmdFdmVudCAgID0gZXZlbnQgfHwgd2luZG93LmV2ZW50LFxuICAgICAgICAgICAgYXJncyAgICAgICA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgICAgIGRlbHRhICAgICAgPSAwLFxuICAgICAgICAgICAgZGVsdGFYICAgICA9IDAsXG4gICAgICAgICAgICBkZWx0YVkgICAgID0gMCxcbiAgICAgICAgICAgIGFic0RlbHRhICAgPSAwLFxuICAgICAgICAgICAgb2Zmc2V0WCAgICA9IDAsXG4gICAgICAgICAgICBvZmZzZXRZICAgID0gMDtcbiAgICAgICAgZXZlbnQgPSAkLmV2ZW50LmZpeChvcmdFdmVudCk7XG4gICAgICAgIGV2ZW50LnR5cGUgPSAnbW91c2V3aGVlbCc7XG5cbiAgICAgICAgLy8gT2xkIHNjaG9vbCBzY3JvbGx3aGVlbCBkZWx0YVxuICAgICAgICBpZiAoICdkZXRhaWwnICAgICAgaW4gb3JnRXZlbnQgKSB7IGRlbHRhWSA9IG9yZ0V2ZW50LmRldGFpbCAqIC0xOyAgICAgIH1cbiAgICAgICAgaWYgKCAnd2hlZWxEZWx0YScgIGluIG9yZ0V2ZW50ICkgeyBkZWx0YVkgPSBvcmdFdmVudC53aGVlbERlbHRhOyAgICAgICB9XG4gICAgICAgIGlmICggJ3doZWVsRGVsdGFZJyBpbiBvcmdFdmVudCApIHsgZGVsdGFZID0gb3JnRXZlbnQud2hlZWxEZWx0YVk7ICAgICAgfVxuICAgICAgICBpZiAoICd3aGVlbERlbHRhWCcgaW4gb3JnRXZlbnQgKSB7IGRlbHRhWCA9IG9yZ0V2ZW50LndoZWVsRGVsdGFYICogLTE7IH1cblxuICAgICAgICAvLyBGaXJlZm94IDwgMTcgaG9yaXpvbnRhbCBzY3JvbGxpbmcgcmVsYXRlZCB0byBET01Nb3VzZVNjcm9sbCBldmVudFxuICAgICAgICBpZiAoICdheGlzJyBpbiBvcmdFdmVudCAmJiBvcmdFdmVudC5heGlzID09PSBvcmdFdmVudC5IT1JJWk9OVEFMX0FYSVMgKSB7XG4gICAgICAgICAgICBkZWx0YVggPSBkZWx0YVkgKiAtMTtcbiAgICAgICAgICAgIGRlbHRhWSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgZGVsdGEgdG8gYmUgZGVsdGFZIG9yIGRlbHRhWCBpZiBkZWx0YVkgaXMgMCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdGl5XG4gICAgICAgIGRlbHRhID0gZGVsdGFZID09PSAwID8gZGVsdGFYIDogZGVsdGFZO1xuXG4gICAgICAgIC8vIE5ldyBzY2hvb2wgd2hlZWwgZGVsdGEgKHdoZWVsIGV2ZW50KVxuICAgICAgICBpZiAoICdkZWx0YVknIGluIG9yZ0V2ZW50ICkge1xuICAgICAgICAgICAgZGVsdGFZID0gb3JnRXZlbnQuZGVsdGFZICogLTE7XG4gICAgICAgICAgICBkZWx0YSAgPSBkZWx0YVk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCAnZGVsdGFYJyBpbiBvcmdFdmVudCApIHtcbiAgICAgICAgICAgIGRlbHRhWCA9IG9yZ0V2ZW50LmRlbHRhWDtcbiAgICAgICAgICAgIGlmICggZGVsdGFZID09PSAwICkgeyBkZWx0YSAgPSBkZWx0YVggKiAtMTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY2hhbmdlIGFjdHVhbGx5IGhhcHBlbmVkLCBubyByZWFzb24gdG8gZ28gYW55IGZ1cnRoZXJcbiAgICAgICAgaWYgKCBkZWx0YVkgPT09IDAgJiYgZGVsdGFYID09PSAwICkgeyByZXR1cm47IH1cblxuICAgICAgICAvLyBOZWVkIHRvIGNvbnZlcnQgbGluZXMgYW5kIHBhZ2VzIHRvIHBpeGVscyBpZiB3ZSBhcmVuJ3QgYWxyZWFkeSBpbiBwaXhlbHNcbiAgICAgICAgLy8gVGhlcmUgYXJlIHRocmVlIGRlbHRhIG1vZGVzOlxuICAgICAgICAvLyAgICogZGVsdGFNb2RlIDAgaXMgYnkgcGl4ZWxzLCBub3RoaW5nIHRvIGRvXG4gICAgICAgIC8vICAgKiBkZWx0YU1vZGUgMSBpcyBieSBsaW5lc1xuICAgICAgICAvLyAgICogZGVsdGFNb2RlIDIgaXMgYnkgcGFnZXNcbiAgICAgICAgaWYgKCBvcmdFdmVudC5kZWx0YU1vZGUgPT09IDEgKSB7XG4gICAgICAgICAgICB2YXIgbGluZUhlaWdodCA9ICQuZGF0YSh0aGlzLCAnbW91c2V3aGVlbC1saW5lLWhlaWdodCcpO1xuICAgICAgICAgICAgZGVsdGEgICo9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBkZWx0YVkgKj0gbGluZUhlaWdodDtcbiAgICAgICAgICAgIGRlbHRhWCAqPSBsaW5lSGVpZ2h0O1xuICAgICAgICB9IGVsc2UgaWYgKCBvcmdFdmVudC5kZWx0YU1vZGUgPT09IDIgKSB7XG4gICAgICAgICAgICB2YXIgcGFnZUhlaWdodCA9ICQuZGF0YSh0aGlzLCAnbW91c2V3aGVlbC1wYWdlLWhlaWdodCcpO1xuICAgICAgICAgICAgZGVsdGEgICo9IHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBkZWx0YVkgKj0gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIGRlbHRhWCAqPSBwYWdlSGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgbG93ZXN0IGFic29sdXRlIGRlbHRhIHRvIG5vcm1hbGl6ZSB0aGUgZGVsdGEgdmFsdWVzXG4gICAgICAgIGFic0RlbHRhID0gTWF0aC5tYXgoIE1hdGguYWJzKGRlbHRhWSksIE1hdGguYWJzKGRlbHRhWCkgKTtcblxuICAgICAgICBpZiAoICFsb3dlc3REZWx0YSB8fCBhYnNEZWx0YSA8IGxvd2VzdERlbHRhICkge1xuICAgICAgICAgICAgbG93ZXN0RGVsdGEgPSBhYnNEZWx0YTtcblxuICAgICAgICAgICAgLy8gQWRqdXN0IG9sZGVyIGRlbHRhcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgIGlmICggc2hvdWxkQWRqdXN0T2xkRGVsdGFzKG9yZ0V2ZW50LCBhYnNEZWx0YSkgKSB7XG4gICAgICAgICAgICAgICAgbG93ZXN0RGVsdGEgLz0gNDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGp1c3Qgb2xkZXIgZGVsdGFzIGlmIG5lY2Vzc2FyeVxuICAgICAgICBpZiAoIHNob3VsZEFkanVzdE9sZERlbHRhcyhvcmdFdmVudCwgYWJzRGVsdGEpICkge1xuICAgICAgICAgICAgLy8gRGl2aWRlIGFsbCB0aGUgdGhpbmdzIGJ5IDQwIVxuICAgICAgICAgICAgZGVsdGEgIC89IDQwO1xuICAgICAgICAgICAgZGVsdGFYIC89IDQwO1xuICAgICAgICAgICAgZGVsdGFZIC89IDQwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGEgd2hvbGUsIG5vcm1hbGl6ZWQgdmFsdWUgZm9yIHRoZSBkZWx0YXNcbiAgICAgICAgZGVsdGEgID0gTWF0aFsgZGVsdGEgID49IDEgPyAnZmxvb3InIDogJ2NlaWwnIF0oZGVsdGEgIC8gbG93ZXN0RGVsdGEpO1xuICAgICAgICBkZWx0YVggPSBNYXRoWyBkZWx0YVggPj0gMSA/ICdmbG9vcicgOiAnY2VpbCcgXShkZWx0YVggLyBsb3dlc3REZWx0YSk7XG4gICAgICAgIGRlbHRhWSA9IE1hdGhbIGRlbHRhWSA+PSAxID8gJ2Zsb29yJyA6ICdjZWlsJyBdKGRlbHRhWSAvIGxvd2VzdERlbHRhKTtcblxuICAgICAgICAvLyBOb3JtYWxpc2Ugb2Zmc2V0WCBhbmQgb2Zmc2V0WSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICggc3BlY2lhbC5zZXR0aW5ncy5ub3JtYWxpemVPZmZzZXQgJiYgdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QgKSB7XG4gICAgICAgICAgICB2YXIgYm91bmRpbmdSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIG9mZnNldFggPSBldmVudC5jbGllbnRYIC0gYm91bmRpbmdSZWN0LmxlZnQ7XG4gICAgICAgICAgICBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIGJvdW5kaW5nUmVjdC50b3A7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgaW5mb3JtYXRpb24gdG8gdGhlIGV2ZW50IG9iamVjdFxuICAgICAgICBldmVudC5kZWx0YVggPSBkZWx0YVg7XG4gICAgICAgIGV2ZW50LmRlbHRhWSA9IGRlbHRhWTtcbiAgICAgICAgZXZlbnQuZGVsdGFGYWN0b3IgPSBsb3dlc3REZWx0YTtcbiAgICAgICAgZXZlbnQub2Zmc2V0WCA9IG9mZnNldFg7XG4gICAgICAgIGV2ZW50Lm9mZnNldFkgPSBvZmZzZXRZO1xuICAgICAgICAvLyBHbyBhaGVhZCBhbmQgc2V0IGRlbHRhTW9kZSB0byAwIHNpbmNlIHdlIGNvbnZlcnRlZCB0byBwaXhlbHNcbiAgICAgICAgLy8gQWx0aG91Z2ggdGhpcyBpcyBhIGxpdHRsZSBvZGQgc2luY2Ugd2Ugb3ZlcndyaXRlIHRoZSBkZWx0YVgvWVxuICAgICAgICAvLyBwcm9wZXJ0aWVzIHdpdGggbm9ybWFsaXplZCBkZWx0YXMuXG4gICAgICAgIGV2ZW50LmRlbHRhTW9kZSA9IDA7XG5cbiAgICAgICAgLy8gQWRkIGV2ZW50IGFuZCBkZWx0YSB0byB0aGUgZnJvbnQgb2YgdGhlIGFyZ3VtZW50c1xuICAgICAgICBhcmdzLnVuc2hpZnQoZXZlbnQsIGRlbHRhLCBkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICAgICAgLy8gQ2xlYXJvdXQgbG93ZXN0RGVsdGEgYWZ0ZXIgc29tZXRpbWUgdG8gYmV0dGVyXG4gICAgICAgIC8vIGhhbmRsZSBtdWx0aXBsZSBkZXZpY2UgdHlwZXMgdGhhdCBnaXZlIGRpZmZlcmVudFxuICAgICAgICAvLyBhIGRpZmZlcmVudCBsb3dlc3REZWx0YVxuICAgICAgICAvLyBFeDogdHJhY2twYWQgPSAzIGFuZCBtb3VzZSB3aGVlbCA9IDEyMFxuICAgICAgICBpZiAobnVsbExvd2VzdERlbHRhVGltZW91dCkgeyBjbGVhclRpbWVvdXQobnVsbExvd2VzdERlbHRhVGltZW91dCk7IH1cbiAgICAgICAgbnVsbExvd2VzdERlbHRhVGltZW91dCA9IHNldFRpbWVvdXQobnVsbExvd2VzdERlbHRhLCAyMDApO1xuXG4gICAgICAgIHJldHVybiAoJC5ldmVudC5kaXNwYXRjaCB8fCAkLmV2ZW50LmhhbmRsZSkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbnVsbExvd2VzdERlbHRhKCkge1xuICAgICAgICBsb3dlc3REZWx0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2hvdWxkQWRqdXN0T2xkRGVsdGFzKG9yZ0V2ZW50LCBhYnNEZWx0YSkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIG9sZGVyIGV2ZW50IGFuZCB0aGUgZGVsdGEgaXMgZGl2aXNhYmxlIGJ5IDEyMCxcbiAgICAgICAgLy8gdGhlbiB3ZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgYnJvd3NlciBpcyB0cmVhdGluZyB0aGlzIGFzIGFuXG4gICAgICAgIC8vIG9sZGVyIG1vdXNlIHdoZWVsIGV2ZW50IGFuZCB0aGF0IHdlIHNob3VsZCBkaXZpZGUgdGhlIGRlbHRhc1xuICAgICAgICAvLyBieSA0MCB0byB0cnkgYW5kIGdldCBhIG1vcmUgdXNhYmxlIGRlbHRhRmFjdG9yLlxuICAgICAgICAvLyBTaWRlIG5vdGUsIHRoaXMgYWN0dWFsbHkgaW1wYWN0cyB0aGUgcmVwb3J0ZWQgc2Nyb2xsIGRpc3RhbmNlXG4gICAgICAgIC8vIGluIG9sZGVyIGJyb3dzZXJzIGFuZCBjYW4gY2F1c2Ugc2Nyb2xsaW5nIHRvIGJlIHNsb3dlciB0aGFuIG5hdGl2ZS5cbiAgICAgICAgLy8gVHVybiB0aGlzIG9mZiBieSBzZXR0aW5nICQuZXZlbnQuc3BlY2lhbC5tb3VzZXdoZWVsLnNldHRpbmdzLmFkanVzdE9sZERlbHRhcyB0byBmYWxzZS5cbiAgICAgICAgcmV0dXJuIHNwZWNpYWwuc2V0dGluZ3MuYWRqdXN0T2xkRGVsdGFzICYmIG9yZ0V2ZW50LnR5cGUgPT09ICdtb3VzZXdoZWVsJyAmJiBhYnNEZWx0YSAlIDEyMCA9PT0gMDtcbiAgICB9XG5cbn0pKTtcblxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vY29tbW9uL34vaW1wb3J0cy1sb2FkZXI/ZGVmaW5lPT5mYWxzZSEuL34vanF1ZXJ5LW1vdXNld2hlZWwvanF1ZXJ5Lm1vdXNld2hlZWwuanNcbi8vIG1vZHVsZSBpZCA9IDcxXG4vLyBtb2R1bGUgY2h1bmtzID0gMFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrOi8vL34vanF1ZXJ5LW1vdXNld2hlZWwvanF1ZXJ5Lm1vdXNld2hlZWwuanMiLCJjb25zdCBfJCA9IEdMT0JBTF9MSUJTLmpRdWVyeT8gd2luZG93LmpRdWVyeTogcmVxdWlyZSgnanF1ZXJ5JyksXHJcbiAgICAgIF9odG1sMmNhbnZhcyA9IEdMT0JBTF9MSUJTLmh0bWwyY2FudmFzPyB3aW5kb3cuaHRtbDJjYW52YXM6IHJlcXVpcmUoJ2h0bWwyY2FudmFzJyksXHJcbiAgICAgIF9USFJFRSA9IEdMT0JBTF9MSUJTLlRIUkVFPyB3aW5kb3cuVEhSRUU6IHJlcXVpcmUoJ3RocmVlJyksXHJcbiAgICAgIF9QREZKUyA9IEdMT0JBTF9MSUJTLlBERkpTPyB3aW5kb3cuUERGSlM6IHJlcXVpcmUoJ3BkZmpzJyk7XHJcblxyXG5leHBvcnQge1xyXG4gIF8kIGFzICQsXHJcbiAgX2h0bWwyY2FudmFzIGFzIGh0bWwyY2FudmFzLFxyXG4gIF9USFJFRSBhcyBUSFJFRSxcclxuICBfUERGSlMgYXMgUERGSlNcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xpYnMuanMiXSwic291cmNlUm9vdCI6IiJ9 ================================================ FILE: index.js ================================================ import {$, html2canvas, THREE, PDFJS} from './src/libs'; require('./src/'+(ENVIROMENT.debug? '3dflipbook.js': '3dflipbook.min.js')); export default $; ================================================ FILE: js/default-book-view.js ================================================ function init(container) { var instance; if(window.jQuery) { var $ = window.jQuery; instance = { floatWnd: container.find('.float-wnd'), binds: { showDropMenu: function(e) { e.preventDefault(); var el = $(e.target); while(!el.hasClass('toggle')) { el = $(el[0].parentNode); } var menu = el.find('.menu'); if(menu.hasClass('hidden')) { container.find('.ctrl .fnavbar .menu').addClass('hidden'); menu.removeClass('hidden'); e.stopPropagation(); } }, hideDropMenu: function() { container.find('.ctrl .fnavbar .menu').addClass('hidden'); }, pickFloatWnd: function(e) { if(instance.pos) { instance.binds.dropFloatWnd(); } else { instance.pos = { x: e.pageX, y: e.pageY }; } }, moveFloatWnd: function(e) { if(instance.pos) { var dv = { x: e.pageX-instance.pos.x, y: e.pageY-instance.pos.y }, old = { x: parseInt(instance.floatWnd.css('left')), y: parseInt(instance.floatWnd.css('top')) }; instance.floatWnd.css('left', old.x+dv.x+'px').css('top', old.y+dv.y+'px'); instance.pos = { x: e.pageX, y: e.pageY }; } }, dropFloatWnd: function() { delete instance.pos; }, jsCenter: function() { var ns = container.find('.js-center'); for(var i=0; i>9&127;this.clow=this.clow<<7&65535;this.ct-=7;this.a=32768}r.prototype={byteIn:function e(){var t=this.data;var r=this.bp;if(t[r]===255){var a=t[r+1];if(a>143){this.clow+=65280;this.ct=8}else{r++;this.clow+=t[r]<<9;this.ct=7;this.bp=r}}else{r++;this.clow+=r65535){this.chigh+=this.clow>>16;this.clow&=65535}},readBit:function e(r,a){var i=r[a]>>1,n=r[a]&1;var s=t[i];var o=s.qe;var l;var c=this.a-o;if(this.chigh>15&1;this.clow=this.clow<<1&65535;this.ct--}while((c&32768)===0);this.a=c;r[a]=i<<1|n;return l}};return r}();e.ArithmeticDecoder=t});(function(e,t){t(e.pdfjsCoreCharsets={})})(this,function(e){var t=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron"];var r=[".notdef","space","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];var a=[".notdef","space","dollaroldstyle","dollarsuperior","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","hyphensuperior","colonmonetary","onefitted","rupiah","centoldstyle","figuredash","hypheninferior","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior"];e.ISOAdobeCharset=t;e.ExpertCharset=r;e.ExpertSubsetCharset=a});(function(e,t){t(e.pdfjsCoreEncodings={})})(this,function(e){var t=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","","asuperior","bsuperior","centsuperior","dsuperior","esuperior","","","isuperior","","","lsuperior","msuperior","nsuperior","osuperior","","","rsuperior","ssuperior","tsuperior","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdownsmall","centoldstyle","Lslashsmall","","","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","","Dotaccentsmall","","","Macronsmall","","","figuredash","hypheninferior","","","Ogoneksmall","Ringsmall","Cedillasmall","","","","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];var r=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","centoldstyle","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","","threequartersemdash","","questionsmall","","","","","Ethsmall","","","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","","","","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hypheninferior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","asuperior","centsuperior","","","","","Aacutesmall","Agravesmall","Acircumflexsmall","Adieresissmall","Atildesmall","Aringsmall","Ccedillasmall","Eacutesmall","Egravesmall","Ecircumflexsmall","Edieresissmall","Iacutesmall","Igravesmall","Icircumflexsmall","Idieresissmall","Ntildesmall","Oacutesmall","Ogravesmall","Ocircumflexsmall","Odieresissmall","Otildesmall","Uacutesmall","Ugravesmall","Ucircumflexsmall","Udieresissmall","","eightsuperior","fourinferior","threeinferior","sixinferior","eightinferior","seveninferior","Scaronsmall","","centinferior","twoinferior","","Dieresissmall","","Caronsmall","osuperior","fiveinferior","","commainferior","periodinferior","Yacutesmall","","dollarinferior","","Thornsmall","","nineinferior","zeroinferior","Zcaronsmall","AEsmall","Oslashsmall","questiondownsmall","oneinferior","Lslashsmall","","","","","","","Cedillasmall","","","","","","OEsmall","figuredash","hyphensuperior","","","","","exclamdownsmall","","Ydieresissmall","","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","ninesuperior","zerosuperior","","esuperior","rsuperior","tsuperior","","","isuperior","ssuperior","dsuperior","","","","","","lsuperior","Ogoneksmall","Brevesmall","Macronsmall","bsuperior","nsuperior","msuperior","commasuperior","periodsuperior","Dotaccentsmall","Ringsmall"];var a=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","space","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron"];var i=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","","endash","dagger","daggerdbl","periodcentered","","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","","questiondown","","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","","ring","cedilla","","hungarumlaut","ogonek","caron","emdash","","","","","","","","","","","","","","","","","AE","","ordfeminine","","","","","Lslash","Oslash","OE","ordmasculine","","","","","","ae","","","","dotlessi","","","lslash","oslash","oe","germandbls"];var n=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","bullet","Euro","bullet","quotesinglbase","florin","quotedblbase","ellipsis","dagger","daggerdbl","circumflex","perthousand","Scaron","guilsinglleft","OE","bullet","Zcaron","bullet","bullet","quoteleft","quoteright","quotedblleft","quotedblright","bullet","endash","emdash","tilde","trademark","scaron","guilsinglright","oe","bullet","zcaron","Ydieresis","space","exclamdown","cent","sterling","currency","yen","brokenbar","section","dieresis","copyright","ordfeminine","guillemotleft","logicalnot","hyphen","registered","macron","degree","plusminus","twosuperior","threesuperior","acute","mu","paragraph","periodcentered","cedilla","onesuperior","ordmasculine","guillemotright","onequarter","onehalf","threequarters","questiondown","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring","AE","Ccedilla","Egrave","Eacute","Ecircumflex","Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth","Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash","Ugrave","Uacute","Ucircumflex","Udieresis","Yacute","Thorn","germandbls","agrave","aacute","acircumflex","atilde","adieresis","aring","ae","ccedilla","egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex","idieresis","eth","ntilde","ograve","oacute","ocircumflex","otilde","odieresis","divide","oslash","ugrave","uacute","ucircumflex","udieresis","yacute","thorn","ydieresis"];var s=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","universal","numbersign","existential","percent","ampersand","suchthat","parenleft","parenright","asteriskmath","plus","comma","minus","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","congruent","Alpha","Beta","Chi","Delta","Epsilon","Phi","Gamma","Eta","Iota","theta1","Kappa","Lambda","Mu","Nu","Omicron","Pi","Theta","Rho","Sigma","Tau","Upsilon","sigma1","Omega","Xi","Psi","Zeta","bracketleft","therefore","bracketright","perpendicular","underscore","radicalex","alpha","beta","chi","delta","epsilon","phi","gamma","eta","iota","phi1","kappa","lambda","mu","nu","omicron","pi","theta","rho","sigma","tau","upsilon","omega1","omega","xi","psi","zeta","braceleft","bar","braceright","similar","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Euro","Upsilon1","minute","lessequal","fraction","infinity","florin","club","diamond","heart","spade","arrowboth","arrowleft","arrowup","arrowright","arrowdown","degree","plusminus","second","greaterequal","multiply","proportional","partialdiff","bullet","divide","notequal","equivalence","approxequal","ellipsis","arrowvertex","arrowhorizex","carriagereturn","aleph","Ifraktur","Rfraktur","weierstrass","circlemultiply","circleplus","emptyset","intersection","union","propersuperset","reflexsuperset","notsubset","propersubset","reflexsubset","element","notelement","angle","gradient","registerserif","copyrightserif","trademarkserif","product","radical","dotmath","logicalnot","logicaland","logicalor","arrowdblboth","arrowdblleft","arrowdblup","arrowdblright","arrowdbldown","lozenge","angleleft","registersans","copyrightsans","trademarksans","summation","parenlefttp","parenleftex","parenleftbt","bracketlefttp","bracketleftex","bracketleftbt","bracelefttp","braceleftmid","braceleftbt","braceex","","angleright","integral","integraltp","integralex","integralbt","parenrighttp","parenrightex","parenrightbt","bracketrighttp","bracketrightex","bracketrightbt","bracerighttp","bracerightmid","bracerightbt"];var o=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13","a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25","a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34","a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47","a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60","a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73","a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97","a98","a99","a100","","a89","a90","a93","a94","a91","a92","a205","a85","a206","a86","a87","a88","a95","a96","","","","","","","","","","","","","","","","","","","","a101","a102","a103","a104","a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123","a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134","a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145","a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156","a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166","a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176","a177","a178","a179","a193","a180","a199","a181","a200","a182","","a201","a183","a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190","a191"];function l(e){switch(e){case"WinAnsiEncoding":return n;case"StandardEncoding":return i;case"MacRomanEncoding":return a;case"SymbolSetEncoding":return s;case"ZapfDingbatsEncoding":return o;case"ExpertEncoding":return t;case"MacExpertEncoding":return r;default:return null}}e.WinAnsiEncoding=n;e.StandardEncoding=i;e.MacRomanEncoding=a;e.SymbolSetEncoding=s;e.ZapfDingbatsEncoding=o;e.ExpertEncoding=t;e.getEncoding=l});(function(e,t){t(e.pdfjsSharedUtil={})})(this,function(e){var t=typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:this;var r=[.001,0,0,.001,0,0];var a={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_ADD_TO_PATH:4,STROKE_ADD_TO_PATH:5,FILL_STROKE_ADD_TO_PATH:6,ADD_TO_PATH:7,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4};var i={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3};var n={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26};var s={INVISIBLE:1,HIDDEN:2,PRINT:4,NOZOOM:8,NOROTATE:16,NOVIEW:32,READONLY:64,LOCKED:128,TOGGLENOVIEW:256,LOCKEDCONTENTS:512};var o={READONLY:1,REQUIRED:2,NOEXPORT:4,MULTILINE:4096,PASSWORD:8192,NOTOGGLETOOFF:16384,RADIO:32768,PUSHBUTTON:65536,COMBO:131072,EDIT:262144,SORT:524288,FILESELECT:1048576,MULTISELECT:2097152,DONOTSPELLCHECK:4194304,DONOTSCROLL:8388608,COMB:16777216,RICHTEXT:33554432,RADIOSINUNISON:33554432,COMMITONSELCHANGE:67108864};var l={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5};var c={UNKNOWN:0,FLATE:1,LZW:2,DCT:3,JPX:4,JBIG:5,A85:6,AHX:7,CCF:8,RL:9};var h={UNKNOWN:0,TYPE1:1,TYPE1C:2,CIDFONTTYPE0:3,CIDFONTTYPE0C:4,TRUETYPE:5,CIDFONTTYPE2:6,TYPE3:7,OPENTYPE:8,TYPE0:9,MMTYPE1:10};var u={errors:0,warnings:1,infos:5};var f={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91};var d=u.warnings;function g(e){d=e}function v(){return d}function p(e){if(d>=u.infos){console.log("Info: "+e)}}function m(e){if(d>=u.warnings){console.log("Warning: "+e)}}function b(e){console.log("Deprecated API usage: "+e)}function y(e){if(d>=u.errors){console.log("Error: "+e);console.log(k())}throw new Error(e)}function k(){try{throw new Error}catch(e){return e.stack?e.stack.split("\n").slice(2).join("\n"):""}}function w(e,t){if(!e){y(t)}}var C={unknown:"unknown",forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font"};function x(e,t){try{var r=new URL(e);if(!r.origin||r.origin==="null"){return false}}catch(e){return false}var a=new URL(t,r);return r.origin===a.origin}function S(e){if(!e){return false}switch(e.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return true;default:return false}}function A(e,t){if(!e){return null}try{var r=t?new URL(e,t):new URL(e);if(S(r)){return r}}catch(e){}return null}function I(e,t,r){Object.defineProperty(e,t,{value:r,enumerable:true,configurable:true,writable:false});return r}function B(e){var t;return function(){if(e){t=Object.create(null);e(t);e=null}return t}}var R={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};var T=function e(){function t(e,t){this.name="PasswordException";this.message=e;this.code=t}t.prototype=new Error;t.constructor=t;return t}();var O=function e(){function t(e,t){this.name="UnknownErrorException";this.message=e;this.details=t}t.prototype=new Error;t.constructor=t;return t}();var P=function e(){function t(e){this.name="InvalidPDFException";this.message=e}t.prototype=new Error;t.constructor=t;return t}();var E=function e(){function t(e){this.name="MissingPDFException";this.message=e}t.prototype=new Error;t.constructor=t;return t}();var M=function e(){function t(e,t){this.name="UnexpectedResponseException";this.message=e;this.status=t}t.prototype=new Error;t.constructor=t;return t}();var L=function e(){function t(e){this.message=e}t.prototype=new Error;t.prototype.name="NotImplementedException";t.constructor=t;return t}();var D=function e(){function t(e,t){this.begin=e;this.end=t;this.message="Missing data ["+e+", "+t+")"}t.prototype=new Error;t.prototype.name="MissingDataException";t.constructor=t;return t}();var F=function e(){function t(e){this.message=e}t.prototype=new Error;t.prototype.name="XRefParseException";t.constructor=t;return t}();var U=/\x00/g;function j(e){if(typeof e!=="string"){m("The argument for removeNullCharacters must be a string.");return e}return e.replace(U,"")}function q(e){w(e!==null&&typeof e==="object"&&e.length!==undefined,"Invalid argument for bytesToString");var t=e.length;var r=8192;if(t>24&255,e>>16&255,e>>8&255,e&255)}function G(e){var t=1,r=0;while(e>t){t<<=1;r++}return r}function X(e,t){return e[t]<<24>>24}function W(e,t){return e[t]<<8|e[t+1]}function V(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}function K(){var e=new Uint8Array(2);e[0]=1;var t=new Uint16Array(e.buffer);return t[0]===1}function Y(){try{new Function("");return true}catch(e){return false}}var J=function e(){function t(e,t){this.buffer=e;this.byteLength=e.length;this.length=t===undefined?this.byteLength>>2:t;i(this.length)}t.prototype=Object.create(null);var r=0;function a(e){return{get:function(){var t=this.buffer,r=e<<2;return(t[r]|t[r+1]<<8|t[r+2]<<16|t[r+3]<<24)>>>0},set:function(t){var r=this.buffer,a=e<<2;r[a]=t&255;r[a+1]=t>>8&255;r[a+2]=t>>16&255;r[a+3]=t>>>24&255}}}function i(e){while(rt[2]){r[0]=t[2];r[2]=t[0]}if(t[1]>t[3]){r[1]=t[3];r[3]=t[1]}return r};t.intersect=function e(r,a){function i(e,t){return e-t}var n=[r[0],r[2],a[0],a[2]].sort(i),s=[r[1],r[3],a[1],a[3]].sort(i),o=[];r=t.normalizeRect(r);a=t.normalizeRect(a);if(n[0]===r[0]&&n[1]===a[0]||n[0]===a[0]&&n[1]===r[0]){o[0]=n[1];o[2]=n[2]}else{return false}if(s[0]===r[1]&&s[1]===a[1]||s[0]===a[1]&&s[1]===r[1]){o[1]=s[1];o[3]=s[2]}else{return false}return o};t.sign=function e(t){return t<0?-1:1};var a=["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM","","X","XX","XXX","XL","L","LX","LXX","LXXX","XC","","I","II","III","IV","V","VI","VII","VIII","IX"];t.toRoman=function e(t,r){w(se(t)&&t>0,"The number should be a positive integer.");var i,n=[];while(t>=1e3){t-=1e3;n.push("M")}i=t/100|0;t%=100;n.push(a[i]);i=t/10|0;t%=10;n.push(a[10+i]);n.push(a[20+t]);var s=n.join("");return r?s.toLowerCase():s};t.appendToArray=function e(t,r){Array.prototype.push.apply(t,r)};t.prependToArray=function e(t,r){Array.prototype.unshift.apply(t,r)};t.extendObj=function e(t,r){for(var a in r){t[a]=r[a]}};t.getInheritableProperty=function e(t,r,a){while(t&&!t.has(r)){t=t.get("Parent")}if(!t){return null}return a?t.getArray(r):t.get(r)};t.inherit=function e(t,r,a){t.prototype=Object.create(r.prototype);t.prototype.constructor=t;for(var i in a){t.prototype[i]=a[i]}};t.loadScript=function e(t,r){var a=document.createElement("script");var i=false;a.setAttribute("src",t);if(r){a.onload=function(){if(!i){r()}i=true}}document.getElementsByTagName("head")[0].appendChild(a)};return t}();var $=function e(){function t(e,t,r,a,i,n){this.viewBox=e;this.scale=t;this.rotation=r;this.offsetX=a;this.offsetY=i;var s=(e[2]+e[0])/2;var o=(e[3]+e[1])/2;var l,c,h,u;r=r%360;r=r<0?r+360:r;switch(r){case 180:l=-1;c=0;h=0;u=1;break;case 90:l=0;c=1;h=1;u=0;break;case 270:l=0;c=-1;h=-1;u=0;break;default:l=1;c=0;h=0;u=-1;break}if(n){h=-h;u=-u}var f,d;var g,v;if(l===0){f=Math.abs(o-e[1])*t+a;d=Math.abs(s-e[0])*t+i;g=Math.abs(e[3]-e[1])*t;v=Math.abs(e[2]-e[0])*t}else{f=Math.abs(s-e[0])*t+a;d=Math.abs(o-e[1])*t+i;g=Math.abs(e[2]-e[0])*t;v=Math.abs(e[3]-e[1])*t}this.transform=[l*t,c*t,h*t,u*t,f-l*t*s-h*t*o,d-c*t*s-u*t*o];this.width=g;this.height=v;this.fontScale=t}t.prototype={clone:function e(r){r=r||{};var a="scale"in r?r.scale:this.scale;var i="rotation"in r?r.rotation:this.rotation;return new t(this.viewBox.slice(),a,i,this.offsetX,this.offsetY,r.dontFlip)},convertToViewportPoint:function e(t,r){return Q.applyTransform([t,r],this.transform)},convertToViewportRectangle:function e(t){var r=Q.applyTransform([t[0],t[1]],this.transform);var a=Q.applyTransform([t[2],t[3]],this.transform);return[r[0],r[1],a[0],a[1]]},convertToPdfPoint:function e(t,r){return Q.applyInverseTransform([t,r],this.transform)}};return t}();var ee=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];function te(e){var t,r=e.length,a=[];if(e[0]==="þ"&&e[1]==="ÿ"){for(t=2;t0){var n=this.handlers.shift();var s=n.thisPromise._status;var o=n.thisPromise._value;try{if(s===a){if(typeof n.onResolve==="function"){o=n.onResolve(o)}}else if(typeof n.onReject==="function"){o=n.onReject(o);s=a;if(n.thisPromise._unhandledRejection){this.removeUnhandeledRejection(n.thisPromise)}}}catch(e){s=i;o=e}n.nextPromise._updateStatus(s,o);if(Date.now()>=r){break}}if(this.handlers.length>0){setTimeout(this.runHandlers.bind(this),0);return}this.running=false},addUnhandledRejection:function e(t){this.unhandledRejections.push({promise:t,time:Date.now()});this.scheduleRejectionCheck()},removeUnhandeledRejection:function e(t){t._unhandledRejection=false;for(var r=0;rn){var a=this.unhandledRejections[r].promise._value;var i="Unhandled rejection: "+a;if(a.stack){i+="\n"+a.stack}m(i);this.unhandledRejections.splice(r);r--}}if(this.unhandledRejections.length){this.scheduleRejectionCheck()}}.bind(this),n)}};var o=function e(t){this._status=r;this._handlers=[];try{t.call(this,this._resolve.bind(this),this._reject.bind(this))}catch(e){this._reject(e)}};o.all=function e(t){var r,a;var n=new o(function(e,t){r=e;a=t});var s=t.length;var l=[];if(s===0){r(l);return n}function c(e){if(n._status===i){return}l=[];a(e)}for(var h=0,u=t.length;hs){s=o.length}}for(r=0,a=i.length;r>2,d=(c&3)<<4|h>>4;var g=o+1>6:64;var v=o+232&&t<127&&[34,35,60,62,63,96].indexOf(t)===-1){return e}return encodeURIComponent(e)}function h(e){var t=e.charCodeAt(0);if(t>32&&t<127&&[34,35,60,62,96].indexOf(t)===-1){return e}return encodeURIComponent(e)}var u,f=/[a-zA-Z]/,d=/[a-zA-Z0-9\+\-\.]/;function g(e,t,r){function a(e){y.push(e)}var g=t||"scheme start",v=0,p="",m=false,b=false,y=[];e:while((e[v-1]!==u||v===0)&&!this._isInvalid){var k=e[v];switch(g){case"scheme start":if(k&&f.test(k)){p+=k.toLowerCase();g="scheme"}else if(!t){p="";g="no scheme";continue}else{a("Invalid scheme.");break e}break;case"scheme":if(k&&d.test(k)){p+=k.toLowerCase()}else if(k===":"){this._scheme=p;p="";if(t){break e}if(s(this._scheme)){this._isRelative=true}if(this._scheme==="file"){g="relative"}else if(this._isRelative&&r&&r._scheme===this._scheme){g="relative or authority"}else if(this._isRelative){g="authority first slash"}else{g="scheme data"}}else if(!t){p="";v=0;g="no scheme";continue}else if(u===k){break e}else{a("Code point not allowed in scheme: "+k);break e}break;case"scheme data":if(k==="?"){this._query="?";g="query"}else if(k==="#"){this._fragment="#";g="fragment"}else{if(u!==k&&"\t"!==k&&"\n"!==k&&"\r"!==k){this._schemeData+=c(k)}}break;case"no scheme":if(!r||!s(r._scheme)){a("Missing scheme.");o.call(this)}else{g="relative";continue}break;case"relative or authority":if(k==="/"&&e[v+1]==="/"){g="authority ignore slashes"}else{a("Expected /, got: "+k);g="relative";continue}break;case"relative":this._isRelative=true;if("file"!==this._scheme){this._scheme=r._scheme}if(u===k){this._host=r._host;this._port=r._port;this._path=r._path.slice();this._query=r._query;this._username=r._username;this._password=r._password;break e}else if(k==="/"||k==="\\"){if(k==="\\"){a("\\ is an invalid code point.")}g="relative slash"}else if(k==="?"){this._host=r._host;this._port=r._port;this._path=r._path.slice();this._query="?";this._username=r._username;this._password=r._password;g="query"}else if(k==="#"){this._host=r._host;this._port=r._port;this._path=r._path.slice();this._query=r._query;this._fragment="#";this._username=r._username;this._password=r._password;g="fragment"}else{var w=e[v+1];var C=e[v+2];if("file"!==this._scheme||!f.test(k)||w!==":"&&w!=="|"||u!==C&&"/"!==C&&"\\"!==C&&"?"!==C&&"#"!==C){this._host=r._host;this._port=r._port;this._username=r._username;this._password=r._password;this._path=r._path.slice();this._path.pop()}g="relative path";continue}break;case"relative slash":if(k==="/"||k==="\\"){if(k==="\\"){a("\\ is an invalid code point.")}if(this._scheme==="file"){g="file host"}else{g="authority ignore slashes"}}else{if("file"!==this._scheme){this._host=r._host;this._port=r._port;this._username=r._username;this._password=r._password}g="relative path";continue}break;case"authority first slash":if(k==="/"){g="authority second slash"}else{a("Expected '/', got: "+k);g="authority ignore slashes";continue}break;case"authority second slash":g="authority ignore slashes";if("/"!==k){a("Expected '/', got: "+k);continue}break;case"authority ignore slashes":if("/"!==k&&"\\"!==k){g="authority";continue}else{a("Expected authority, got: "+k)}break;case"authority":if(k==="@"){if(m){a("@ already seen.");p+="%40"}m=true;for(var x=0;x=0;--B){if(f[B]!=="ET"){break}f[B]="EN"}for(B=m+1;B0){T=f[m-1]}var O=S;if(R+1M&&n(M)){E=M}}for(M=P;M>=E;--M){var L=-1;for(m=0,b=w.length;m=0){c(u,L,m);L=-1}}else if(L<0){L=m}}if(L>=0){c(u,L,w.length)}}for(m=0,b=u.length;m"){u[m]=""}}return h(u.join(""),g)}e.bidi=d});(function(e,t){t(e.pdfjsCoreCFFParser={},e.pdfjsSharedUtil,e.pdfjsCoreCharsets,e.pdfjsCoreEncodings)})(this,function(e,t,r,a){var i=t.error;var n=t.info;var s=t.bytesToString;var o=t.warn;var l=t.isArray;var c=t.Util;var h=t.stringToBytes;var u=t.assert;var f=r.ISOAdobeCharset;var d=r.ExpertCharset;var g=r.ExpertSubsetCharset;var v=a.StandardEncoding;var p=a.ExpertEncoding;var m=10;var b=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"];var y=function e(){var t=[null,{id:"hstem",min:2,stackClearing:true,stem:true},null,{id:"vstem",min:2,stackClearing:true,stem:true},{id:"vmoveto",min:1,stackClearing:true},{id:"rlineto",min:2,resetStack:true},{id:"hlineto",min:1,resetStack:true},{id:"vlineto",min:1,resetStack:true},{id:"rrcurveto",min:6,resetStack:true},null,{id:"callsubr",min:1,undefStack:true},{id:"return",min:0,undefStack:true},null,null,{id:"endchar",min:0,stackClearing:true},null,null,null,{id:"hstemhm",min:2,stackClearing:true,stem:true},{id:"hintmask",min:0,stackClearing:true},{id:"cntrmask",min:0,stackClearing:true},{id:"rmoveto",min:2,stackClearing:true},{id:"hmoveto",min:1,stackClearing:true},{id:"vstemhm",min:2,stackClearing:true,stem:true},{id:"rcurveline",min:8,resetStack:true},{id:"rlinecurve",min:8,resetStack:true},{id:"vvcurveto",min:4,resetStack:true},{id:"hhcurveto",min:4,resetStack:true},null,{id:"callgsubr",min:1,undefStack:true},{id:"vhcurveto",min:4,resetStack:true},{id:"hvcurveto",min:4,resetStack:true}];var r=[null,null,null,{id:"and",min:2,stackDelta:-1},{id:"or",min:2,stackDelta:-1},{id:"not",min:1,stackDelta:0},null,null,null,{id:"abs",min:1,stackDelta:0},{id:"add",min:2,stackDelta:-1,stackFn:function e(t,r){t[r-2]=t[r-2]+t[r-1]}},{id:"sub",min:2,stackDelta:-1,stackFn:function e(t,r){t[r-2]=t[r-2]-t[r-1]}},{id:"div",min:2,stackDelta:-1,stackFn:function e(t,r){t[r-2]=t[r-2]/t[r-1]}},null,{id:"neg",min:1,stackDelta:0,stackFn:function e(t,r){t[r-1]=-t[r-1]}},{id:"eq",min:2,stackDelta:-1},null,null,{id:"drop",min:1,stackDelta:-1},null,{id:"put",min:2,stackDelta:-2},{id:"get",min:1,stackDelta:0},{id:"ifelse",min:4,stackDelta:-3},{id:"random",min:0,stackDelta:1},{id:"mul",min:2,stackDelta:-1,stackFn:function e(t,r){t[r-2]=t[r-2]*t[r-1]}},null,{id:"sqrt",min:1,stackDelta:0},{id:"dup",min:1,stackDelta:1},{id:"exch",min:2,stackDelta:0},{id:"index",min:2,stackDelta:0},{id:"roll",min:3,stackDelta:-2},null,null,null,{id:"hflex",min:7,resetStack:true},{id:"flex",min:13,resetStack:true},{id:"hflex1",min:9,resetStack:true},{id:"flex1",min:11,resetStack:true}];function a(e,t,r){this.bytes=e.getBytes();this.properties=t;this.seacAnalysisEnabled=!!r}a.prototype={parse:function e(){var t=this.properties;var r=new k;this.cff=r;var a=this.parseHeader();var i=this.parseIndex(a.endPos);var n=this.parseIndex(i.endPos);var s=this.parseIndex(n.endPos);var o=this.parseIndex(s.endPos);var l=this.parseDict(n.obj.get(0));var c=this.createDict(A,l,r.strings);r.header=a.obj;r.names=this.parseNameIndex(i.obj);r.strings=this.parseStringIndex(s.obj);r.topDict=c;r.globalSubrIndex=o.obj;this.parsePrivateDict(r.topDict);r.isCIDFont=c.hasName("ROS");var h=c.getByName("CharStrings");var u=this.parseIndex(h).obj;var f=c.getByName("FontMatrix");if(f){t.fontMatrix=f}var d=c.getByName("FontBBox");if(d){t.ascent=d[3];t.descent=d[1];t.ascentScaled=true}var g,v;if(r.isCIDFont){var p=this.parseIndex(c.getByName("FDArray")).obj;for(var m=0,b=p.count;m=r){i("Invalid CFF header")}else if(a!==0){n("cff data is shifted");t=t.subarray(a);this.bytes=t}var s=t[0];var o=t[1];var l=t[2];var c=t[3];var h=new w(s,o,l,c);return{obj:h,endPos:l}},parseDict:function e(t){var r=0;function a(){var e=t[r++];if(e===30){return i()}else if(e===28){e=t[r++];e=(e<<24|t[r++]<<16)>>16;return e}else if(e===29){e=t[r++];e=e<<8|t[r++];e=e<<8|t[r++];e=e<<8|t[r++];return e}else if(e>=32&&e<=246){return e-139}else if(e>=247&&e<=250){return(e-247)*256+t[r++]+108}else if(e>=251&&e<=254){return-((e-251)*256)-t[r++]-108}o('CFFParser_parseDict: "'+e+'" is a reserved command.');return NaN}function i(){var e="";var a=15;var i=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"];var n=t.length;while(r>4;var l=s&15;if(o===a){break}e+=i[o];if(l===a){break}e+=i[l]}return parseFloat(e)}var n=[];var s=[];r=0;var l=t.length;while(r126||h===91||h===93||h===40||h===41||h===123||h===125||h===60||h===62||h===47||h===37||h===35){l[c]=95;continue}l[c]=h}r.push(s(l))}return r},parseStringIndex:function e(t){var r=new C;for(var a=0,i=t.count;am){return false}var l=a.stackSize;var c=a.stack;var h=i.length;for(var u=0;u>16;u+=2;l++}else if(f===14){if(l>=4){l-=4;if(this.seacAnalysisEnabled){a.seac=c.slice(l,l+4);return false}}d=t[f]}else if(f>=32&&f<=246){c[l]=f-139;l++}else if(f>=247&&f<=254){c[l]=f<251?(f-247<<8)+i[u]+108:-(f-251<<8)-i[u]-108;u++;l++}else if(f===255){c[l]=(i[u]<<24|i[u+1]<<16|i[u+2]<<8|i[u+3])/65536;u+=4;l++}else if(f===19||f===20){a.hints+=l>>1;u+=a.hints+7>>3;l%=2;d=t[f]}else if(f===10||f===29){var v;if(f===10){v=n}else{v=s}if(!v){d=t[f];o("Missing subrsIndex for "+d.id);return false}var p=32768;if(v.count<1240){p=107}else if(v.count<33900){p=1131}var b=c[--l]+p;if(b<0||b>=v.count){d=t[f];o("Out of bounds subrIndex for "+d.id);return false}a.stackSize=l;a.callDepth++;var y=this.parseCharString(a,v.get(b),n,s);if(!y){return false}a.callDepth--;l=a.stackSize;continue}else if(f===11){a.stackSize=l;return true}else{d=t[f]}if(d){if(d.stem){a.hints+=l>>1}if("min"in d){if(!a.undefStack&&l=2&&d.stem){l%=2}else if(l>1){o("Found too many parameters for stack-clearing command")}if(l>0&&c[l-1]>=0){a.width=c[l-1]}}if("stackDelta"in d){if("stackFn"in d){d.stackFn(c,l)}l+=d.stackDelta}else if(d.stackClearing){l=0}else if(d.resetStack){l=0;a.undefStack=false}else if(d.undefStack){l=0;a.undefStack=true;a.firstStackClearing=false}}}a.stackSize=l;return true},parseCharStrings:function e(t,r,a,i,n){var s=[];var l=[];var c=t.count;for(var h=0;h=n.length){o("Invalid fd index for glyph index.");d=false}if(d){g=n[v].privateDict.subrsIndex}}else if(r){g=r}if(d){d=this.parseCharString(f,u,g,a)}if(f.width!==null){l[h]=f.width}if(f.seac!==null){s[h]=f.seac}if(!d){t.set(h,new Uint8Array([14]))}}return{charStrings:t,seacs:s,widths:l}},emptyPrivateDictionary:function e(t){var r=this.createDict(I,[],t.strings);t.setByKey(18,[0,0]);t.privateDict=r},parsePrivateDict:function e(t){if(!t.hasName("Private")){this.emptyPrivateDictionary(t);return}var r=t.getByName("Private");if(!l(r)||r.length!==2){t.removeByName("Private");return}var a=r[0];var i=r[1];if(a===0||i>=this.bytes.length){this.emptyPrivateDictionary(t);return}var n=i+a;var s=this.bytes.subarray(i,n);var o=this.parseDict(s);var c=this.createDict(I,o,t.strings);t.privateDict=c;if(!c.getByName("Subrs")){return}var h=c.getByName("Subrs");var u=i+h;if(h===0||u>=this.bytes.length){this.emptyPrivateDictionary(t);return}var f=this.parseIndex(u);c.subrsIndex=f.obj},parseCharsets:function e(t,r,a,n){if(t===0){return new R(true,B.ISO_ADOBE,f)}else if(t===1){return new R(true,B.EXPERT,d)}else if(t===2){return new R(true,B.EXPERT_SUBSET,g)}var s=this.bytes;var o=t;var l=s[t++];var c=[".notdef"];var h,u,v;r-=1;switch(l){case 0:for(v=0;v=0&&t<=390){return b[t]}if(t-391<=this.strings.length){return this.strings[t-391]}return b[0]},add:function e(t){this.strings.push(t)},get count(){return this.strings.length}};return t}();var x=function e(){function t(){this.objects=[];this.length=0}t.prototype={add:function e(t){this.length+=t.length;this.objects.push(t)},set:function e(t,r){this.length+=r.length-this.objects[t].length;this.objects[t]=r},get:function e(t){return this.objects[t]},get count(){return this.objects.length}};return t}();var S=function e(){function t(e,t){this.keyToNameMap=e.keyToNameMap;this.nameToKeyMap=e.nameToKeyMap;this.defaults=e.defaults;this.types=e.types;this.opcodes=e.opcodes;this.order=e.order;this.strings=t;this.values=Object.create(null)}t.prototype={setByKey:function e(t,r){if(!(t in this.keyToNameMap)){return false}var a=r.length;if(a===0){return true}for(var i=0;i=this.fdSelect.length){return-1}return this.fdSelect[t]}};return t}();var P=function e(){function t(){this.offsets=Object.create(null)}t.prototype={isTracking:function e(t){return t in this.offsets},track:function e(t,r){if(t in this.offsets){i("Already tracking location of "+t)}this.offsets[t]=r},offset:function e(t){for(var r in this.offsets){this.offsets[r]+=t}},setEntryLocation:function e(t,r,a){if(!(t in this.offsets)){i("Not tracking location of "+t)}var n=a.data;var s=this.offsets[t];var o=5;for(var l=0,c=r.length;l>24&255;n[f]=v>>16&255;n[d]=v>>8&255;n[g]=v&255}}};return t}();var E=function e(){function t(e){this.cff=e}t.prototype={compile:function e(){var t=this.cff;var r={data:[],length:0,add:function e(t){this.data=this.data.concat(t);this.length=this.data.length}};var a=this.compileHeader(t.header);r.add(a);var i=this.compileNameIndex(t.names);r.add(i);if(t.isCIDFont){if(t.topDict.hasName("FontMatrix")){var n=t.topDict.getByName("FontMatrix");t.topDict.removeByName("FontMatrix");for(var s=0,o=t.fdArray.length;s=-107&&t<=107){r=[t+139]}else if(t>=108&&t<=1131){t=t-108;r=[(t>>8)+247,t&255]}else if(t>=-1131&&t<=-108){t=-t-108;r=[(t>>8)+251,t&255]}else if(t>=-32768&&t<=32767){r=[28,t>>8&255,t&255]}else{r=[29,t>>24&255,t>>16&255,t>>8&255,t&255]}return r},compileHeader:function e(t){return[t.major,t.minor,t.hdrSize,t.offSize]},compileNameIndex:function e(t){var r=new x;for(var a=0,i=t.length;a>8&255,i&255];var s=1,o;for(o=0;o>8&255,c&255)}else if(l===3){n.push(c>>16&255,c>>8&255,c&255)}else{n.push(c>>>24&255,c>>16&255,c>>8&255,c&255)}if(a[o]){c+=a[o].length}}for(o=0;o=this.end?this.numChunks:Math.floor(r/this.chunkSize);var n;for(n=a;n=a){return}if(a<=this.progressiveDataLength){return}var i=this.chunkSize;var n=Math.floor(t/i);var s=Math.floor((a-1)/i)+1;for(var o=n;o=this.end){return-1}this.ensureByte(t);return this.bytes[this.pos++]},getUint16:function e(){var t=this.getByte();var r=this.getByte();if(t===-1||r===-1){return-1}return(t<<8)+r},getInt32:function e(){var t=this.getByte();var r=this.getByte();var a=this.getByte();var i=this.getByte();return(t<<24)+(r<<16)+(a<<8)+i},getBytes:function e(t){var r=this.bytes;var a=this.pos;var i=this.end;if(!t){this.ensureRange(a,i);return r.subarray(a,i)}var n=a+t;if(n>i){n=i}this.ensureRange(a,n);this.pos=n;return r.subarray(a,n)},peekByte:function e(){var t=this.getByte();this.pos--;return t},peekBytes:function e(t){var r=this.getBytes(t);this.pos-=r.length;return r},getByteRange:function e(t,r){this.ensureRange(t,r);return this.bytes.subarray(t,r)},skip:function e(t){if(!t){t=1}this.pos+=t},reset:function e(){this.pos=this.start},moveStart:function e(){this.start=this.pos},makeSubStream:function e(t,r,a){this.ensureRange(t,t+r);function i(){}i.prototype=Object.create(this);i.prototype.getMissingChunks=function(){var e=this.chunkSize;var t=Math.floor(this.start/e);var r=Math.floor((this.end-1)/e)+1;var a=[];for(var i=t;i=0&&i+1!==s){r.push({beginChunk:a,endChunk:i+1});a=s}if(n+1===t.length){r.push({beginChunk:a,endChunk:s+1})}i=s}return r},onProgress:function e(t){var r=this.stream.numChunksLoaded*this.chunkSize+t.loaded;this.msgHandler.send("DocProgress",{loaded:r,total:this.length})},onReceiveData:function e(t){var r=t.chunk;var a=t.begin===undefined;var i=a?this.progressiveDataLength:t.begin;var n=i+r.byteLength;var s=Math.floor(i/this.chunkSize);var c=n>>0}var s=n(1);var o=n(1)?n(1)?n(1)?n(1)?n(1)?n(32)+4436:n(12)+340:n(8)+84:n(6)+20:n(4)+4:n(2);return s===0?o:o>0?-o:null}function u(e,t,r){var a=e.getContexts("IAID");var i=1;for(var n=0;n=R&&U=T){N=N<<1&b;for(x=0;x=0&&q=0){_=M[j][q];if(_){N|=_<=e){L<<=1}else{L=L<<1|S[E][M]}}for(v=0;v=C||M<0||M>=w){L<<=1}else{L=L<<1|i[E][M]}}var D=A.readBit(I,L);O[P]=D}}return S}function k(e,t,r,n,s,o,l,c,f,d,g){if(e){a("JBIG2 error: huffman is not supported")}var v=[];var p=0;var m=i(r.length+n);var k=g.decoder;var C=g.contextCache;while(v.length1){B=w(e,t,S,p,0,R,1,r.concat(v),m,0,0,1,0,o,f,d,g)}else{var T=u(C,k,m);var O=h(C,"IARDX",k);var P=h(C,"IARDY",k);var E=T>1)+_,(N>>1)+z,false,b,k)}var H=M-(g&1?0:j);var G=P-(g&2?U:0);var X,W,V;if(f){for(X=0;X>5&7;var u=[c&31];var d=t+6;if(c===7){h=o(e,d-1)&536870911;d+=3;var g=h+7>>3;u[0]=e[d++];while(--g>0){u.push(e[d++])}}else if(c===5||c===6){a("JBIG2 error: invalid referred-to flags")}r.retainBits=u;var v=r.number<=256?1:r.number<=65536?2:4;var p=[];var m,b;for(m=0;m>>24&255;I[3]=k.height>>16&255;I[4]=k.height>>8&255;I[5]=k.height&255;for(m=d,b=e.length;m>2&3;g.huffmanDWSelector=v>>4&3;g.bitmapSizeSelector=v>>6&1;g.aggregationInstancesSelector=v>>7&1;g.bitmapCodingContextUsed=!!(v&256);g.bitmapCodingContextRetained=!!(v&512);g.template=v>>10&3;g.refinementTemplate=v>>12&1;l+=2;if(!g.huffman){d=g.template===0?4:1;u=[];for(f=0;f>2&3);p.referenceCorner=m>>4&3;p.transposed=!!(m&64);p.combinationOperator=m>>7&3;p.defaultPixelValue=m>>9&1;p.dsOffset=m<<17>>27;p.refinementTemplate=m>>15&1;if(p.huffman){var b=s(i,l);l+=2;p.huffmanFS=b&3;p.huffmanDS=b>>2&3;p.huffmanDT=b>>4&3;p.huffmanRefinementDW=b>>6&3;p.huffmanRefinementDH=b>>8&3;p.huffmanRefinementDX=b>>10&3;p.huffmanRefinementDY=b>>12&3;p.huffmanRefinementSizeSelector=!!(b&14)}if(p.refinement&&!p.refinementTemplate){u=[];for(f=0;f<2;f++){u.push({x:n(i,l),y:n(i,l+1)});l+=2}p.refinementAt=u}p.numberOfSymbolInstances=o(i,l);l+=4;if(p.huffman){a("JBIG2 error: huffman is not supported")}h=[p,r.referredTo,i,l,c];break;case 38:case 39:var y={};y.info=S(i,l);l+=A;var k=i[l++];y.mmr=!!(k&1);y.template=k>>1&3;y.prediction=!!(k&8);if(!y.mmr){d=y.template===0?4:1;u=[];for(f=0;f>2&1;w.combinationOperator=C>>3&3;w.requiresBuffer=!!(C&32);w.combinationOperatorOverride=!!(C&64);h=[w];break;case 49:break;case 50:break;case 51:break;case 62:break;default:a("JBIG2 error: segment type "+r.typeName+"("+r.type+") is not implemented")}var I="on"+r.typeName;if(I in t){t[I].apply(t,h)}}function B(e,t){for(var r=0,a=e.length;r>3;var a=new Uint8Array(r*t.height);if(t.defaultPixelValue){for(var i=0,n=a.length;i>3;var l=i.combinationOperatorOverride?t.combinationOperator:i.combinationOperator;var c=this.buffer;var h=128>>(t.x&7);var u=t.y*o+(t.x>>3);var f,d,g,v;switch(l){case 0:for(f=0;f>=1;if(!g){g=128;v++}}u+=o}break;case 2:for(f=0;f>=1;if(!g){g=128;v++}}u+=o}break;default:a("JBIG2 error: operator "+l+" is not supported")}},onImmediateGenericRegion:function e(t,a,i,n){var s=t.info;var o=new r(a,i,n);var l=b(t.mmr,s.width,s.height,t.template,t.prediction,null,t.at,o);this.drawBitmap(s,l)},onImmediateLosslessGenericRegion:function e(){this.onImmediateGenericRegion.apply(this,arguments)},onSymbolDictionary:function e(t,i,n,s,o,l){var c;if(t.huffman){a("JBIG2 error: huffman is not supported")}var h=this.symbols;if(!h){this.symbols=h={}}var u=[];for(var f=0,d=n.length;f0&&!e[s-1]){s--}a.push({children:[],index:0});var o=a[0],l;for(i=0;i0){o=a.pop()}o.index++;a.push(o);while(a.length<=i){a.push(l={children:[],index:0});o.children[o.index]=l.children;o=l}r++}if(i+10){p--;return v>>p&1}v=e[a++];if(v===255){var t=e[a++];if(t){r("JPEG error: unexpected marker "+(v<<8|t).toString(16))}}p=7;return v>>>7}function b(e){var t=e;while(true){t=t[m()];if(typeof t==="number"){return t}if(typeof t!=="object"){r("JPEG error: invalid huffman sequence")}}}function y(e){var t=0;while(e>0){t=t<<1|m();e--}return t}function k(e){if(e===1){return m()===1?1:-1}var t=y(e);if(t>=1<>4;if(o===0){if(l<15){break}n+=16;continue}n+=l;var c=t[n];e.blockData[r+c]=k(o);n++}}function C(e,t){var r=b(e.huffmanTableDC);var a=r===0?0:k(r)<0){S--;return}var a=o,i=l;while(a<=i){var n=b(e.huffmanTableAC);var s=n&15,c=n>>4;if(s===0){if(c<15){S=y(c)+(1<>4;if(c===0){if(s<15){S=y(s)+(1<=65488&&q<=65495){a+=2}else{break}}return a-g}function v(e,t,u){var f=e.quantizationTable,d=e.blockData;var g,v,p,m,b,y,k,w;var C,x,S,A,I,B,R,T;var O;if(!f){r("JPEG error: missing required Quantization Table.")}for(var P=0;P<64;P+=8){C=d[t+P];x=d[t+P+1];S=d[t+P+2];A=d[t+P+3];I=d[t+P+4];B=d[t+P+5];R=d[t+P+6];T=d[t+P+7];C*=f[P];if((x|S|A|I|B|R|T)===0){O=c*C+512>>10;u[P]=O;u[P+1]=O;u[P+2]=O;u[P+3]=O;u[P+4]=O;u[P+5]=O;u[P+6]=O;u[P+7]=O;continue}x*=f[P+1];S*=f[P+2];A*=f[P+3];I*=f[P+4];B*=f[P+5];R*=f[P+6];T*=f[P+7];g=c*C+128>>8;v=c*I+128>>8;p=S;m=R;b=h*(x-T)+128>>8;w=h*(x+T)+128>>8;y=A<<4;k=B<<4;g=g+v+1>>1;v=g-v;O=p*l+m*o+128>>8;p=p*o-m*l+128>>8;m=O;b=b+k+1>>1;k=b-k;w=w+y+1>>1;y=w-y;g=g+m+1>>1;m=g-m;v=v+p+1>>1;p=v-p;O=b*s+w*n+2048>>12;b=b*n-w*s+2048>>12;w=O;O=y*i+k*a+2048>>12;y=y*a-k*i+2048>>12;k=O;u[P]=g+w;u[P+7]=g-w;u[P+1]=v+k;u[P+6]=v-k;u[P+2]=p+y;u[P+5]=p-y;u[P+3]=m+b;u[P+4]=m-b}for(var E=0;E<8;++E){C=u[E];x=u[E+8];S=u[E+16];A=u[E+24];I=u[E+32];B=u[E+40];R=u[E+48];T=u[E+56];if((x|S|A|I|B|R|T)===0){O=c*C+8192>>14;O=O<-2040?0:O>=2024?255:O+2056>>4;d[t+E]=O;d[t+E+8]=O;d[t+E+16]=O;d[t+E+24]=O;d[t+E+32]=O;d[t+E+40]=O;d[t+E+48]=O;d[t+E+56]=O;continue}g=c*C+2048>>12;v=c*I+2048>>12;p=S;m=R;b=h*(x-T)+2048>>12;w=h*(x+T)+2048>>12;y=A;k=B;g=(g+v+1>>1)+4112;v=g-v;O=p*l+m*o+2048>>12;p=p*o-m*l+2048>>12;m=O;b=b+k+1>>1;k=b-k;w=w+y+1>>1;y=w-y;g=g+m+1>>1;m=g-m;v=v+p+1>>1;p=v-p;O=b*s+w*n+2048>>12;b=b*n-w*s+2048>>12;w=O;O=y*i+k*a+2048>>12;y=y*a-k*i+2048>>12;k=O;C=g+w;T=g-w;x=v+k;R=v-k;S=p+y;B=p-y;A=m+b;I=m-b;C=C<16?0:C>=4080?255:C>>4;x=x<16?0:x>=4080?255:x>>4;S=S<16?0:S>=4080?255:S>>4;A=A<16?0:A>=4080?255:A>>4;I=I<16?0:I>=4080?255:I>>4;B=B<16?0:B>=4080?255:B>>4;R=R<16?0:R>=4080?255:R>>4;T=T<16?0:T>=4080?255:T>>4;d[t+E]=C;d[t+E+8]=x;d[t+E+16]=S;d[t+E+24]=A;d[t+E+32]=I;d[t+E+40]=B;d[t+E+48]=R;d[t+E+56]=T}}function p(e,t){var r=t.blocksPerLine;var a=t.blocksPerColumn;var i=new Int16Array(64);for(var n=0;n=255?255:e}u.prototype={parse:function e(a){function i(){var e=a[o]<<8|a[o+1];o+=2;return e}function n(){var e=i();var t=a.subarray(o,o+e-2);o+=t.length;return t}function s(e){var t=Math.ceil(e.samplesPerLine/8/e.maxH);var r=Math.ceil(e.scanLines/8/e.maxV);for(var a=0;a>4===0){for(k=0;k<64;k++){A=t[k];B[A]=a[o++]}}else if(I>>4===1){for(k=0;k<64;k++){A=t[k];B[A]=i()}}else{r("JPEG error: DQT - invalid table spec")}d[I&15]=B}break;case 65472:case 65473:case 65474:if(h){r("JPEG error: Only single frame JPEGs supported")}i();h={};h.extended=b===65473;h.progressive=b===65474;h.precision=a[o++];h.scanLines=i();h.samplesPerLine=i();h.components=[];h.componentIds={};var R=a[o++],T;var O=0,P=0;for(y=0;y>4;var M=a[o+1]&15;if(O>4===0?m:v)[F&15]=f(U,q)}break;case 65501:i();u=i();break;case 65498:var N=i();var _=a[o++];var z=[],H;for(y=0;y<_;y++){var G=h.componentIds[a[o++]];H=h.components[G];var X=a[o++];H.huffmanTableDC=m[X>>4];H.huffmanTableAC=v[X&15];z.push(H)}var W=a[o++];var V=a[o++];var K=a[o++];var Y=g(a,o,h,z,u,W,V,K>>4,K&15);o+=Y;break;case 65535:if(a[o]!==255){o--}break;default:if(a[o-3]===255&&a[o-2]>=192&&a[o-2]<=254){o-=3;break}r("JPEG error: unknown marker "+b.toString(16))}b=i()}this.width=h.samplesPerLine;this.height=h.scanLines;this.jfif=l;this.adobe=c;this.components=[];for(y=0;y>8)+C[d+1]}}}return y},_isColorConversionNeeded:function e(){if(this.adobe&&this.adobe.transformCode){return true}else if(this.numComponents===3){if(!this.adobe&&this.colorTransform===0){return false}return true}if(!this.adobe&&this.colorTransform===1){return true}return false},_convertYccToRgb:function e(t){var r,a,i;for(var n=0,s=t.length;n=0?255:u<=o?0:255+u*l|0;t[s++]=f>=0?255:f<=o?0:255+f*l|0;t[s++]=d>=0?255:d<=o?0:255+d*l|0}return t},getData:function e(t,a,i){if(this.numComponents>4){r("JPEG error: Unsupported color mode")}var n=this._getLinearizedBlockData(t,a);if(this.numComponents===1&&i){var s=n.length;var o=new Uint8Array(s*3);var l=0;for(var c=0;c>24&255,f>>16&255,f>>8&255,f&255);i("Unsupported header type "+f+" ("+m+")");break}if(g){s+=d}}},parseImageProperties:function e(t){var r=t.getByte();while(r>=0){var a=r;r=t.getByte();var i=a<<8|r;if(i===65361){t.skip(4);var s=t.getInt32()>>>0;var o=t.getInt32()>>>0;var l=t.getInt32()>>>0;var c=t.getInt32()>>>0;t.skip(16);var h=t.getUint16();this.width=s-l;this.height=o-c;this.componentsCount=h;this.bitsPerComponent=8;return}}n("JPX Error: No size marker found in JPX stream")},parseCodestream:function e(t,r,a){var s={};var c=false;try{var f=r;while(f+1>5;m=[];while(v>3;P.mu=0}else{P.epsilon=t[v]>>3;P.mu=(t[v]&7)<<8|t[v+1];v+=2}m.push(P)}O.SPqcds=m;if(s.mainHeader){s.QCD=O}else{s.currentTile.QCD=O;s.currentTile.QCC=[]}break;case 65373:g=o(t,f);var E={};v=f+2;var M;if(s.SIZ.Csiz<257){M=t[v++]}else{M=o(t,v);v+=2}p=t[v++];switch(p&31){case 0:b=8;y=true;break;case 1:b=16;y=false;break;case 2:b=16;y=true;break;default:throw new Error("Invalid SQcd value "+p)}E.noQuantization=b===8;E.scalarExpounded=y;E.guardBits=p>>5;m=[];while(v>3;P.mu=0}else{P.epsilon=t[v]>>3;P.mu=(t[v]&7)<<8|t[v+1];v+=2}m.push(P)}E.SPqcds=m;if(s.mainHeader){s.QCC[M]=E}else{s.currentTile.QCC[M]=E}break;case 65362:g=o(t,f);var L={};v=f+2;var D=t[v++];L.entropyCoderWithCustomPrecincts=!!(D&1);L.sopMarkerUsed=!!(D&2);L.ephMarkerUsed=!!(D&4);L.progressionOrder=t[v++];L.layersCount=o(t,v);v+=2;L.multipleComponentTransform=t[v++];L.decompositionLevelsCount=t[v++];L.xcb=(t[v++]&15)+2;L.ycb=(t[v++]&15)+2;var F=t[v++];L.selectiveArithmeticCodingBypass=!!(F&1);L.resetContextProbabilities=!!(F&2);L.terminationOnEachCodingPass=!!(F&4);L.verticalyStripe=!!(F&8);L.predictableTermination=!!(F&16);L.segmentationSymbolUsed=!!(F&32);L.reversibleTransformation=t[v++];if(L.entropyCoderWithCustomPrecincts){var U=[];while(v>4})}L.precinctsSizes=U}var q=[];if(L.selectiveArithmeticCodingBypass){q.push("selectiveArithmeticCodingBypass")}if(L.resetContextProbabilities){q.push("resetContextProbabilities")}if(L.terminationOnEachCodingPass){q.push("terminationOnEachCodingPass")}if(L.verticalyStripe){q.push("verticalyStripe")}if(L.predictableTermination){q.push("predictableTermination")}if(q.length>0){c=true;throw new Error("Unsupported COD options ("+q.join(", ")+")")}if(s.mainHeader){s.COD=L}else{s.currentTile.COD=L;s.currentTile.COC=[]}break;case 65424:g=o(t,f);k={};k.index=o(t,f+2);k.length=l(t,f+4);k.dataEnd=k.length+f-2;k.partIndex=t[f+8];k.partsCount=t[f+9];s.mainHeader=false;if(k.partIndex===0){k.COD=s.COD;k.COC=s.COC.slice(0);k.QCD=s.QCD;k.QCC=s.QCC.slice(0)}s.currentTile=k;break;case 65427:k=s.currentTile;if(k.partIndex===0){R(s,k.index);x(s)}g=k.dataEnd-f;S(s,t,f,g);break;case 65365:case 65367:case 65368:case 65380:g=o(t,f);break;case 65363:throw new Error("Codestream code 0xFF53 (COC) is "+"not implemented");default:throw new Error("Unknown codestream code: "+d.toString(16))}f+=g}}catch(e){if(c||this.failOnCorruptedImage){n("JPX Error: "+e.message)}else{i("JPX: Trying to recover from: "+e.message)}}this.tiles=B(s);this.width=s.SIZ.Xsiz-s.SIZ.XOsiz;this.height=s.SIZ.Ysiz-s.SIZ.YOsiz;this.componentsCount=s.SIZ.Csiz}};function h(e,t){e.x0=Math.ceil(t.XOsiz/e.XRsiz);e.x1=Math.ceil(t.Xsiz/e.XRsiz);e.y0=Math.ceil(t.YOsiz/e.YRsiz);e.y1=Math.ceil(t.Ysiz/e.YRsiz);e.width=e.x1-e.x0;e.height=e.y1-e.y0}function u(e,t){var r=e.SIZ;var a,i=[];var n=Math.ceil((r.Xsiz-r.XTOsiz)/r.XTsiz);var s=Math.ceil((r.Ysiz-r.YTOsiz)/r.YTsiz);for(var o=0;o0?Math.min(a.xcb,i.PPx-1):Math.min(a.xcb,i.PPx);i.ycb_=r>0?Math.min(a.ycb,i.PPy-1):Math.min(a.ycb,i.PPy);return i}function d(e,t,r){var a=1<t.trx0?Math.ceil(t.trx1/a)-Math.floor(t.trx0/a):0;var c=t.try1>t.try0?Math.ceil(t.try1/i)-Math.floor(t.try0/i):0;var h=l*c;t.precinctParameters={precinctWidth:a,precinctHeight:i,numprecinctswide:l,numprecinctshigh:c,numprecincts:h,precinctWidthInSubband:s,precinctHeightInSubband:o}}function g(e,t,r){var a=r.xcb_;var i=r.ycb_;var n=1<>a;var l=t.tby0>>i;var c=t.tbx1+n-1>>a;var h=t.tby1+s-1>>i;var u=t.resolution.precinctParameters;var f=[];var d=[];var g,v,p,m;for(v=l;vk.cbxMax){k.cbxMax=g}if(vk.cbyMax){k.cbyMax=v}}else{d[m]=k={cbxMin:g,cbyMin:v,cbxMax:g,cbyMax:v}}p.precinct=k}}t.codeblockParameters={codeblockWidth:a,codeblockHeight:i,numcodeblockwide:c-o+1,numcodeblockhigh:h-l+1};t.codeblocks=f;t.precincts=d}function v(e,t,r){var a=[];var i=e.subbands;for(var n=0,s=i.length;nt.codingStyleParameters.decompositionLevelsCount){continue}var r=t.resolutions[h];var l=r.precinctParameters.numprecincts;for(;ft.codingStyleParameters.decompositionLevelsCount){continue}var r=t.resolutions[c];var l=r.precinctParameters.numprecincts;for(;ft.codingStyleParameters.decompositionLevelsCount){continue}var r=t.resolutions[l];var f=r.precinctParameters.numprecincts;if(h>=f){continue}for(;o=0;--p){var m=l.resolutions[p];var b=v*m.precinctParameters.precinctWidth;var y=v*m.precinctParameters.precinctHeight;u=Math.min(u,b);f=Math.min(f,y);d=Math.max(d,m.precinctParameters.numprecinctswide);g=Math.max(g,m.precinctParameters.numprecinctshigh);h[p]={width:b,height:y};v<<=1}r=Math.min(r,u);a=Math.min(a,f);i=Math.max(i,d);n=Math.max(n,g);s[o]={resolutions:h,minWidth:u,minHeight:f,maxNumWide:d,maxNumHigh:g}}return{components:s,minWidth:r,minHeight:a,maxNumWide:i,maxNumHigh:n}}function x(e){var t=e.SIZ;var r=e.currentTile.index;var a=e.tiles[r];var i=t.Csiz;for(var s=0;s>>o&(1<0){var _=w.shift();C=_.codeblock;if(C["data"]===undefined){C.data=[]}C.data.push({data:t,start:r+i,end:r+i+_.dataLength,codingpasses:_.codingpasses});i+=_.dataLength}}return i}function A(e,t,r,a,i,n,s,o){var l=a.tbx0;var h=a.tby0;var u=a.tbx1-a.tbx0;var f=a.codeblocks;var d=a.type.charAt(0)==="H"?1:0;var g=a.type.charAt(1)==="H"?t:0;for(var v=0,p=f.length;v=n){e[G]=q}else{e[G]=q*(1<0?1-m:0)}else{S=l[p].mu;I=l[p].epsilon;p++}var B=b.subbands[C];var R=t[B.type];var T=d?1:Math.pow(2,f+R-I)*(1+S/2048);var O=h+I-1;A(w,y,k,B,T,O,d,u)}v.push({width:y,height:k,items:w})}var P=g.calculate(v,i.tcx0,i.tcy0);return{left:i.tcx0,top:i.tcy0,width:P.width,height:P.height,items:P.items}}function B(e){var t=e.SIZ;var r=e.components;var a=t.Csiz;var i=[];for(var n=0,s=e.tiles.length;n=v?255:S>>d;u[b++]=A<=0?0:A>=v?255:A>>d;u[b++]=B<=0?0:B>=v?255:B>>d}}else{for(y=0;y>2);S=A+x;B=A+C;u[b++]=S<=0?0:S>=v?255:S>>d;u[b++]=A<=0?0:A>=v?255:A>>d;u[b++]=B<=0?0:B>=v?255:B>>d}}if(O){for(y=0,b=3;y=m?255:R+g>>d}}}else{for(c=0;c=v?255:T+g>>d;b+=a}}}i.push(f)}return i}function R(e,t){var r=e.SIZ;var a=r.Csiz;var i=e.tiles[t];for(var n=0;n>=1;r>>=1;a++}a--;n=this.levels[a];n.items[n.index]=i;this.currentLevel=a;delete this.value},incrementValue:function e(){var t=this.levels[this.currentLevel];t.items[t.index]++},nextLevel:function e(){var t=this.currentLevel;var r=this.levels[t];var a=r.items[r.index];t--;if(t<0){this.value=a;return false}this.currentLevel=t;r=this.levels[t];r.items[r.index]=a;return true}};return t}();var O=function e(){function t(e,t,r){var a=s(Math.max(e,t))+1;this.levels=[];for(var i=0;ia){this.currentLevel=i;this.propagateValues();return false}t>>=1;r>>=1;i++}this.currentLevel=i-1;return true},incrementValue:function e(t){var r=this.levels[this.currentLevel];r.items[r.index]=t+1;this.propagateValues()},propagateValues:function e(){var t=this.currentLevel;var r=this.levels[t];var a=r.items[r.index];while(--t>=0){r=this.levels[t];r.items[r.index]=a}},nextLevel:function e(){var t=this.currentLevel;var r=this.levels[t];var a=r.items[r.index];r.items[r.index]=255;t--;if(t<0){return false}this.currentLevel=t;r=this.levels[t];r.items[r.index]=a;return true}};return t}();var P=function e(){var t=17;var r=18;var a=new Uint8Array([0,5,8,0,3,7,8,0,4,7,8,0,0,0,0,0,1,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8]);var i=new Uint8Array([0,3,4,0,5,7,7,0,8,8,8,0,0,0,0,0,1,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8]);var s=new Uint8Array([0,1,2,0,1,2,2,0,2,2,2,0,0,0,0,0,3,4,5,0,4,5,5,0,5,5,5,0,0,0,0,0,6,7,7,0,7,7,7,0,7,7,7,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8]);function o(e,t,r,n,o){this.width=e;this.height=t;this.contextLabelTable=r==="HH"?s:r==="HL"?i:a;var l=e*t;this.neighborsSignificance=new Uint8Array(l);this.coefficentsSign=new Uint8Array(l);this.coefficentsMagnitude=o>14?new Uint32Array(l):o>6?new Uint16Array(l):new Uint8Array(l);this.processingFlags=new Uint8Array(l);var c=new Uint8Array(l);if(n!==0){for(var h=0;h0;var l=r+10){c=a-n;if(o){i[c-1]+=16}if(l){i[c+1]+=16}i[c]+=4}if(t+1=a){break}o[p]&=u;if(i[p]||!s[p]){continue}var y=c[s[p]];var k=t.readBit(l,y);if(k){var w=this.decodeSignBit(b,v,p);n[p]=w;i[p]=1;this.setNeighborsSignificance(b,v,p);o[p]|=d}h[p]++;o[p]|=f}}}},decodeSignBit:function e(t,r,a){var i=this.width,n=this.height;var s=this.coefficentsMagnitude;var o=this.coefficentsSign;var l,c,h,u;var f,d;u=r>0&&s[a-1]!==0;if(r+10&&s[a-i]!==0;if(t+1=0){f=9+l;d=this.decoder.readBit(this.contexts,f)}else{f=9-l;d=this.decoder.readBit(this.contexts,f)^1}return d},runMagnitudeRefinementPass:function e(){var t=this.decoder;var r=this.width,a=this.height;var i=this.coefficentsMagnitude;var n=this.neighborsSignificance;var s=this.contexts;var o=this.bitsDecoded;var l=this.processingFlags;var c=1;var h=2;var u=r*a;var f=r*4;for(var d=0,g;d>1;r=r|0;var n,s,o,l;var c=-1.586134342059924;var h=-.052980118572961;var u=.882911075530934;var f=.443506852043971;var d=1.230174104914001;var g=1/d;n=r-3;for(s=i+4;s--;n+=2){t[n]*=g}n=r-2;o=f*t[n-1];for(s=i+3;s--;n+=2){l=f*t[n+1];t[n]=d*t[n]-o-l;if(s--){n+=2;o=f*t[n+1];t[n]=d*t[n]-o-l}else{break}}n=r-1;o=u*t[n-1];for(s=i+2;s--;n+=2){l=u*t[n+1];t[n]-=o+l;if(s--){n+=2;o=u*t[n+1];t[n]-=o+l}else{break}}n=r;o=h*t[n-1];for(s=i+1;s--;n+=2){l=h*t[n+1];t[n]-=o+l;if(s--){n+=2;o=h*t[n+1];t[n]-=o+l}else{break}}if(i!==0){n=r+1;o=c*t[n-1];for(s=i;s--;n+=2){l=c*t[n+1];t[n]-=o+l;if(s--){n+=2;o=c*t[n+1];t[n]-=o+l}else{break}}}};return t}();var L=function e(){function t(){E.call(this)}t.prototype=Object.create(E.prototype);t.prototype.filter=function e(t,r,a){var i=a>>1;r=r|0;var n,s;for(n=r,s=i+1;s--;n+=2){t[n]-=t[n-1]+t[n+1]+2>>2}for(n=r+1,s=i;s--;n+=2){t[n]+=t[n-1]+t[n+1]>>1}};return t}();return r}();e.JpxImage=h});(function(e,t){t(e.pdfjsCoreMetrics={},e.pdfjsSharedUtil)})(this,function(e,t){var r=t.getLookupTableFactory;var a=r(function(e){e["Courier"]=600;e["Courier-Bold"]=600;e["Courier-BoldOblique"]=600;e["Courier-Oblique"]=600;e["Helvetica"]=r(function(e){e["space"]=278;e["exclam"]=278;e["quotedbl"]=355;e["numbersign"]=556;e["dollar"]=556;e["percent"]=889;e["ampersand"]=667;e["quoteright"]=222;e["parenleft"]=333;e["parenright"]=333;e["asterisk"]=389;e["plus"]=584;e["comma"]=278;e["hyphen"]=333;e["period"]=278;e["slash"]=278;e["zero"]=556;e["one"]=556;e["two"]=556;e["three"]=556;e["four"]=556;e["five"]=556;e["six"]=556;e["seven"]=556;e["eight"]=556;e["nine"]=556;e["colon"]=278;e["semicolon"]=278;e["less"]=584;e["equal"]=584;e["greater"]=584;e["question"]=556;e["at"]=1015;e["A"]=667;e["B"]=667;e["C"]=722;e["D"]=722;e["E"]=667;e["F"]=611;e["G"]=778;e["H"]=722;e["I"]=278;e["J"]=500;e["K"]=667;e["L"]=556;e["M"]=833;e["N"]=722;e["O"]=778;e["P"]=667;e["Q"]=778;e["R"]=722;e["S"]=667;e["T"]=611;e["U"]=722;e["V"]=667;e["W"]=944;e["X"]=667;e["Y"]=667;e["Z"]=611;e["bracketleft"]=278;e["backslash"]=278;e["bracketright"]=278;e["asciicircum"]=469;e["underscore"]=556;e["quoteleft"]=222;e["a"]=556;e["b"]=556;e["c"]=500;e["d"]=556;e["e"]=556;e["f"]=278;e["g"]=556;e["h"]=556;e["i"]=222;e["j"]=222;e["k"]=500;e["l"]=222;e["m"]=833;e["n"]=556;e["o"]=556;e["p"]=556;e["q"]=556;e["r"]=333;e["s"]=500;e["t"]=278;e["u"]=556;e["v"]=500;e["w"]=722;e["x"]=500;e["y"]=500;e["z"]=500;e["braceleft"]=334;e["bar"]=260;e["braceright"]=334;e["asciitilde"]=584;e["exclamdown"]=333;e["cent"]=556;e["sterling"]=556;e["fraction"]=167;e["yen"]=556;e["florin"]=556;e["section"]=556;e["currency"]=556;e["quotesingle"]=191;e["quotedblleft"]=333;e["guillemotleft"]=556;e["guilsinglleft"]=333;e["guilsinglright"]=333;e["fi"]=500;e["fl"]=500;e["endash"]=556;e["dagger"]=556;e["daggerdbl"]=556;e["periodcentered"]=278;e["paragraph"]=537;e["bullet"]=350;e["quotesinglbase"]=222;e["quotedblbase"]=333;e["quotedblright"]=333;e["guillemotright"]=556;e["ellipsis"]=1e3;e["perthousand"]=1e3;e["questiondown"]=611;e["grave"]=333;e["acute"]=333;e["circumflex"]=333;e["tilde"]=333;e["macron"]=333;e["breve"]=333;e["dotaccent"]=333;e["dieresis"]=333;e["ring"]=333;e["cedilla"]=333;e["hungarumlaut"]=333;e["ogonek"]=333;e["caron"]=333;e["emdash"]=1e3;e["AE"]=1e3;e["ordfeminine"]=370;e["Lslash"]=556;e["Oslash"]=778;e["OE"]=1e3;e["ordmasculine"]=365;e["ae"]=889;e["dotlessi"]=278;e["lslash"]=222;e["oslash"]=611;e["oe"]=944;e["germandbls"]=611;e["Idieresis"]=278;e["eacute"]=556;e["abreve"]=556;e["uhungarumlaut"]=556;e["ecaron"]=556;e["Ydieresis"]=667;e["divide"]=584;e["Yacute"]=667;e["Acircumflex"]=667;e["aacute"]=556;e["Ucircumflex"]=722;e["yacute"]=500;e["scommaaccent"]=500;e["ecircumflex"]=556;e["Uring"]=722;e["Udieresis"]=722;e["aogonek"]=556;e["Uacute"]=722;e["uogonek"]=556;e["Edieresis"]=667;e["Dcroat"]=722;e["commaaccent"]=250;e["copyright"]=737;e["Emacron"]=667;e["ccaron"]=500;e["aring"]=556;e["Ncommaaccent"]=722;e["lacute"]=222;e["agrave"]=556;e["Tcommaaccent"]=611;e["Cacute"]=722;e["atilde"]=556;e["Edotaccent"]=667;e["scaron"]=500;e["scedilla"]=500;e["iacute"]=278;e["lozenge"]=471;e["Rcaron"]=722;e["Gcommaaccent"]=778;e["ucircumflex"]=556;e["acircumflex"]=556;e["Amacron"]=667;e["rcaron"]=333;e["ccedilla"]=500;e["Zdotaccent"]=611;e["Thorn"]=667;e["Omacron"]=778;e["Racute"]=722;e["Sacute"]=667;e["dcaron"]=643;e["Umacron"]=722;e["uring"]=556;e["threesuperior"]=333;e["Ograve"]=778;e["Agrave"]=667;e["Abreve"]=667;e["multiply"]=584;e["uacute"]=556;e["Tcaron"]=611;e["partialdiff"]=476;e["ydieresis"]=500;e["Nacute"]=722;e["icircumflex"]=278;e["Ecircumflex"]=667;e["adieresis"]=556;e["edieresis"]=556;e["cacute"]=500;e["nacute"]=556;e["umacron"]=556;e["Ncaron"]=722;e["Iacute"]=278;e["plusminus"]=584;e["brokenbar"]=260;e["registered"]=737;e["Gbreve"]=778;e["Idotaccent"]=278;e["summation"]=600;e["Egrave"]=667;e["racute"]=333;e["omacron"]=556;e["Zacute"]=611;e["Zcaron"]=611;e["greaterequal"]=549;e["Eth"]=722;e["Ccedilla"]=722;e["lcommaaccent"]=222;e["tcaron"]=317;e["eogonek"]=556;e["Uogonek"]=722;e["Aacute"]=667;e["Adieresis"]=667;e["egrave"]=556;e["zacute"]=500;e["iogonek"]=222;e["Oacute"]=778;e["oacute"]=556;e["amacron"]=556;e["sacute"]=500;e["idieresis"]=278;e["Ocircumflex"]=778;e["Ugrave"]=722;e["Delta"]=612;e["thorn"]=556;e["twosuperior"]=333;e["Odieresis"]=778;e["mu"]=556;e["igrave"]=278;e["ohungarumlaut"]=556;e["Eogonek"]=667;e["dcroat"]=556;e["threequarters"]=834;e["Scedilla"]=667;e["lcaron"]=299;e["Kcommaaccent"]=667;e["Lacute"]=556;e["trademark"]=1e3;e["edotaccent"]=556;e["Igrave"]=278;e["Imacron"]=278;e["Lcaron"]=556;e["onehalf"]=834;e["lessequal"]=549;e["ocircumflex"]=556;e["ntilde"]=556;e["Uhungarumlaut"]=722;e["Eacute"]=667;e["emacron"]=556;e["gbreve"]=556;e["onequarter"]=834;e["Scaron"]=667;e["Scommaaccent"]=667;e["Ohungarumlaut"]=778;e["degree"]=400;e["ograve"]=556;e["Ccaron"]=722;e["ugrave"]=556;e["radical"]=453;e["Dcaron"]=722;e["rcommaaccent"]=333;e["Ntilde"]=722;e["otilde"]=556;e["Rcommaaccent"]=722;e["Lcommaaccent"]=556;e["Atilde"]=667;e["Aogonek"]=667;e["Aring"]=667;e["Otilde"]=778;e["zdotaccent"]=500;e["Ecaron"]=667;e["Iogonek"]=278;e["kcommaaccent"]=500;e["minus"]=584;e["Icircumflex"]=278;e["ncaron"]=556;e["tcommaaccent"]=278;e["logicalnot"]=584;e["odieresis"]=556;e["udieresis"]=556;e["notequal"]=549;e["gcommaaccent"]=556;e["eth"]=556;e["zcaron"]=500;e["ncommaaccent"]=556;e["onesuperior"]=333;e["imacron"]=278;e["Euro"]=556});e["Helvetica-Bold"]=r(function(e){e["space"]=278;e["exclam"]=333;e["quotedbl"]=474;e["numbersign"]=556;e["dollar"]=556;e["percent"]=889;e["ampersand"]=722;e["quoteright"]=278;e["parenleft"]=333;e["parenright"]=333;e["asterisk"]=389;e["plus"]=584;e["comma"]=278;e["hyphen"]=333;e["period"]=278;e["slash"]=278;e["zero"]=556;e["one"]=556;e["two"]=556;e["three"]=556;e["four"]=556;e["five"]=556;e["six"]=556;e["seven"]=556;e["eight"]=556;e["nine"]=556;e["colon"]=333;e["semicolon"]=333;e["less"]=584;e["equal"]=584;e["greater"]=584;e["question"]=611;e["at"]=975;e["A"]=722;e["B"]=722;e["C"]=722;e["D"]=722;e["E"]=667;e["F"]=611;e["G"]=778;e["H"]=722;e["I"]=278;e["J"]=556;e["K"]=722;e["L"]=611;e["M"]=833;e["N"]=722;e["O"]=778;e["P"]=667;e["Q"]=778;e["R"]=722;e["S"]=667;e["T"]=611;e["U"]=722;e["V"]=667;e["W"]=944;e["X"]=667;e["Y"]=667;e["Z"]=611;e["bracketleft"]=333;e["backslash"]=278;e["bracketright"]=333;e["asciicircum"]=584;e["underscore"]=556;e["quoteleft"]=278;e["a"]=556;e["b"]=611;e["c"]=556;e["d"]=611;e["e"]=556;e["f"]=333;e["g"]=611;e["h"]=611;e["i"]=278;e["j"]=278;e["k"]=556;e["l"]=278;e["m"]=889;e["n"]=611;e["o"]=611;e["p"]=611;e["q"]=611;e["r"]=389;e["s"]=556;e["t"]=333;e["u"]=611;e["v"]=556;e["w"]=778;e["x"]=556;e["y"]=556;e["z"]=500;e["braceleft"]=389;e["bar"]=280;e["braceright"]=389;e["asciitilde"]=584;e["exclamdown"]=333;e["cent"]=556;e["sterling"]=556;e["fraction"]=167;e["yen"]=556;e["florin"]=556;e["section"]=556;e["currency"]=556;e["quotesingle"]=238;e["quotedblleft"]=500;e["guillemotleft"]=556;e["guilsinglleft"]=333;e["guilsinglright"]=333;e["fi"]=611;e["fl"]=611;e["endash"]=556;e["dagger"]=556;e["daggerdbl"]=556;e["periodcentered"]=278;e["paragraph"]=556;e["bullet"]=350;e["quotesinglbase"]=278;e["quotedblbase"]=500;e["quotedblright"]=500;e["guillemotright"]=556;e["ellipsis"]=1e3;e["perthousand"]=1e3;e["questiondown"]=611;e["grave"]=333;e["acute"]=333;e["circumflex"]=333;e["tilde"]=333;e["macron"]=333;e["breve"]=333;e["dotaccent"]=333;e["dieresis"]=333;e["ring"]=333;e["cedilla"]=333;e["hungarumlaut"]=333;e["ogonek"]=333;e["caron"]=333;e["emdash"]=1e3;e["AE"]=1e3;e["ordfeminine"]=370;e["Lslash"]=611;e["Oslash"]=778;e["OE"]=1e3;e["ordmasculine"]=365;e["ae"]=889;e["dotlessi"]=278;e["lslash"]=278;e["oslash"]=611;e["oe"]=944;e["germandbls"]=611;e["Idieresis"]=278;e["eacute"]=556;e["abreve"]=556;e["uhungarumlaut"]=611;e["ecaron"]=556;e["Ydieresis"]=667;e["divide"]=584;e["Yacute"]=667;e["Acircumflex"]=722;e["aacute"]=556;e["Ucircumflex"]=722;e["yacute"]=556;e["scommaaccent"]=556;e["ecircumflex"]=556;e["Uring"]=722;e["Udieresis"]=722;e["aogonek"]=556;e["Uacute"]=722;e["uogonek"]=611;e["Edieresis"]=667;e["Dcroat"]=722;e["commaaccent"]=250;e["copyright"]=737;e["Emacron"]=667;e["ccaron"]=556;e["aring"]=556;e["Ncommaaccent"]=722;e["lacute"]=278;e["agrave"]=556;e["Tcommaaccent"]=611;e["Cacute"]=722;e["atilde"]=556;e["Edotaccent"]=667;e["scaron"]=556;e["scedilla"]=556;e["iacute"]=278;e["lozenge"]=494;e["Rcaron"]=722;e["Gcommaaccent"]=778;e["ucircumflex"]=611;e["acircumflex"]=556;e["Amacron"]=722;e["rcaron"]=389;e["ccedilla"]=556;e["Zdotaccent"]=611;e["Thorn"]=667;e["Omacron"]=778;e["Racute"]=722;e["Sacute"]=667;e["dcaron"]=743;e["Umacron"]=722;e["uring"]=611;e["threesuperior"]=333;e["Ograve"]=778;e["Agrave"]=722;e["Abreve"]=722;e["multiply"]=584;e["uacute"]=611;e["Tcaron"]=611;e["partialdiff"]=494;e["ydieresis"]=556;e["Nacute"]=722;e["icircumflex"]=278;e["Ecircumflex"]=667;e["adieresis"]=556;e["edieresis"]=556;e["cacute"]=556;e["nacute"]=611;e["umacron"]=611;e["Ncaron"]=722;e["Iacute"]=278;e["plusminus"]=584;e["brokenbar"]=280;e["registered"]=737;e["Gbreve"]=778;e["Idotaccent"]=278;e["summation"]=600;e["Egrave"]=667;e["racute"]=389;e["omacron"]=611;e["Zacute"]=611;e["Zcaron"]=611;e["greaterequal"]=549;e["Eth"]=722;e["Ccedilla"]=722;e["lcommaaccent"]=278;e["tcaron"]=389;e["eogonek"]=556;e["Uogonek"]=722;e["Aacute"]=722;e["Adieresis"]=722;e["egrave"]=556;e["zacute"]=500;e["iogonek"]=278;e["Oacute"]=778;e["oacute"]=611;e["amacron"]=556;e["sacute"]=556;e["idieresis"]=278;e["Ocircumflex"]=778;e["Ugrave"]=722;e["Delta"]=612;e["thorn"]=611;e["twosuperior"]=333;e["Odieresis"]=778;e["mu"]=611;e["igrave"]=278;e["ohungarumlaut"]=611;e["Eogonek"]=667;e["dcroat"]=611;e["threequarters"]=834;e["Scedilla"]=667;e["lcaron"]=400;e["Kcommaaccent"]=722;e["Lacute"]=611;e["trademark"]=1e3;e["edotaccent"]=556;e["Igrave"]=278;e["Imacron"]=278;e["Lcaron"]=611;e["onehalf"]=834;e["lessequal"]=549;e["ocircumflex"]=611;e["ntilde"]=611;e["Uhungarumlaut"]=722;e["Eacute"]=667;e["emacron"]=556;e["gbreve"]=611;e["onequarter"]=834;e["Scaron"]=667;e["Scommaaccent"]=667;e["Ohungarumlaut"]=778;e["degree"]=400;e["ograve"]=611;e["Ccaron"]=722;e["ugrave"]=611;e["radical"]=549;e["Dcaron"]=722;e["rcommaaccent"]=389;e["Ntilde"]=722;e["otilde"]=611;e["Rcommaaccent"]=722;e["Lcommaaccent"]=611;e["Atilde"]=722;e["Aogonek"]=722;e["Aring"]=722;e["Otilde"]=778;e["zdotaccent"]=500;e["Ecaron"]=667;e["Iogonek"]=278;e["kcommaaccent"]=556;e["minus"]=584;e["Icircumflex"]=278;e["ncaron"]=611;e["tcommaaccent"]=333;e["logicalnot"]=584;e["odieresis"]=611;e["udieresis"]=611;e["notequal"]=549;e["gcommaaccent"]=611;e["eth"]=611;e["zcaron"]=500;e["ncommaaccent"]=611;e["onesuperior"]=333;e["imacron"]=278;e["Euro"]=556});e["Helvetica-BoldOblique"]=r(function(e){e["space"]=278;e["exclam"]=333;e["quotedbl"]=474;e["numbersign"]=556;e["dollar"]=556;e["percent"]=889;e["ampersand"]=722;e["quoteright"]=278;e["parenleft"]=333;e["parenright"]=333;e["asterisk"]=389;e["plus"]=584;e["comma"]=278;e["hyphen"]=333;e["period"]=278;e["slash"]=278;e["zero"]=556;e["one"]=556;e["two"]=556;e["three"]=556;e["four"]=556;e["five"]=556;e["six"]=556;e["seven"]=556;e["eight"]=556;e["nine"]=556;e["colon"]=333;e["semicolon"]=333;e["less"]=584;e["equal"]=584;e["greater"]=584;e["question"]=611;e["at"]=975;e["A"]=722;e["B"]=722;e["C"]=722;e["D"]=722;e["E"]=667;e["F"]=611;e["G"]=778;e["H"]=722;e["I"]=278;e["J"]=556;e["K"]=722;e["L"]=611;e["M"]=833;e["N"]=722;e["O"]=778;e["P"]=667;e["Q"]=778;e["R"]=722;e["S"]=667;e["T"]=611;e["U"]=722;e["V"]=667;e["W"]=944;e["X"]=667;e["Y"]=667;e["Z"]=611;e["bracketleft"]=333;e["backslash"]=278;e["bracketright"]=333;e["asciicircum"]=584;e["underscore"]=556;e["quoteleft"]=278;e["a"]=556;e["b"]=611;e["c"]=556;e["d"]=611;e["e"]=556;e["f"]=333;e["g"]=611;e["h"]=611;e["i"]=278;e["j"]=278;e["k"]=556;e["l"]=278;e["m"]=889;e["n"]=611;e["o"]=611;e["p"]=611;e["q"]=611;e["r"]=389;e["s"]=556;e["t"]=333;e["u"]=611;e["v"]=556;e["w"]=778;e["x"]=556;e["y"]=556;e["z"]=500;e["braceleft"]=389;e["bar"]=280;e["braceright"]=389;e["asciitilde"]=584;e["exclamdown"]=333;e["cent"]=556;e["sterling"]=556;e["fraction"]=167;e["yen"]=556;e["florin"]=556;e["section"]=556;e["currency"]=556;e["quotesingle"]=238;e["quotedblleft"]=500;e["guillemotleft"]=556;e["guilsinglleft"]=333;e["guilsinglright"]=333;e["fi"]=611;e["fl"]=611;e["endash"]=556;e["dagger"]=556;e["daggerdbl"]=556;e["periodcentered"]=278;e["paragraph"]=556;e["bullet"]=350;e["quotesinglbase"]=278;e["quotedblbase"]=500;e["quotedblright"]=500;e["guillemotright"]=556;e["ellipsis"]=1e3;e["perthousand"]=1e3;e["questiondown"]=611;e["grave"]=333;e["acute"]=333;e["circumflex"]=333;e["tilde"]=333;e["macron"]=333;e["breve"]=333;e["dotaccent"]=333;e["dieresis"]=333;e["ring"]=333;e["cedilla"]=333;e["hungarumlaut"]=333;e["ogonek"]=333;e["caron"]=333;e["emdash"]=1e3;e["AE"]=1e3;e["ordfeminine"]=370;e["Lslash"]=611;e["Oslash"]=778;e["OE"]=1e3;e["ordmasculine"]=365;e["ae"]=889;e["dotlessi"]=278;e["lslash"]=278;e["oslash"]=611;e["oe"]=944;e["germandbls"]=611;e["Idieresis"]=278;e["eacute"]=556;e["abreve"]=556;e["uhungarumlaut"]=611;e["ecaron"]=556;e["Ydieresis"]=667;e["divide"]=584;e["Yacute"]=667;e["Acircumflex"]=722;e["aacute"]=556;e["Ucircumflex"]=722;e["yacute"]=556;e["scommaaccent"]=556;e["ecircumflex"]=556;e["Uring"]=722;e["Udieresis"]=722;e["aogonek"]=556;e["Uacute"]=722;e["uogonek"]=611;e["Edieresis"]=667;e["Dcroat"]=722;e["commaaccent"]=250;e["copyright"]=737;e["Emacron"]=667;e["ccaron"]=556;e["aring"]=556;e["Ncommaaccent"]=722;e["lacute"]=278;e["agrave"]=556;e["Tcommaaccent"]=611;e["Cacute"]=722;e["atilde"]=556;e["Edotaccent"]=667;e["scaron"]=556;e["scedilla"]=556;e["iacute"]=278;e["lozenge"]=494;e["Rcaron"]=722;e["Gcommaaccent"]=778;e["ucircumflex"]=611;e["acircumflex"]=556;e["Amacron"]=722;e["rcaron"]=389;e["ccedilla"]=556;e["Zdotaccent"]=611;e["Thorn"]=667;e["Omacron"]=778;e["Racute"]=722;e["Sacute"]=667;e["dcaron"]=743;e["Umacron"]=722;e["uring"]=611;e["threesuperior"]=333;e["Ograve"]=778;e["Agrave"]=722;e["Abreve"]=722;e["multiply"]=584;e["uacute"]=611;e["Tcaron"]=611;e["partialdiff"]=494;e["ydieresis"]=556;e["Nacute"]=722;e["icircumflex"]=278;e["Ecircumflex"]=667;e["adieresis"]=556;e["edieresis"]=556;e["cacute"]=556;e["nacute"]=611;e["umacron"]=611;e["Ncaron"]=722;e["Iacute"]=278;e["plusminus"]=584;e["brokenbar"]=280;e["registered"]=737;e["Gbreve"]=778;e["Idotaccent"]=278;e["summation"]=600;e["Egrave"]=667;e["racute"]=389;e["omacron"]=611;e["Zacute"]=611;e["Zcaron"]=611;e["greaterequal"]=549;e["Eth"]=722;e["Ccedilla"]=722;e["lcommaaccent"]=278;e["tcaron"]=389;e["eogonek"]=556;e["Uogonek"]=722;e["Aacute"]=722;e["Adieresis"]=722;e["egrave"]=556;e["zacute"]=500;e["iogonek"]=278;e["Oacute"]=778;e["oacute"]=611;e["amacron"]=556;e["sacute"]=556;e["idieresis"]=278;e["Ocircumflex"]=778;e["Ugrave"]=722;e["Delta"]=612;e["thorn"]=611;e["twosuperior"]=333;e["Odieresis"]=778;e["mu"]=611;e["igrave"]=278;e["ohungarumlaut"]=611;e["Eogonek"]=667;e["dcroat"]=611;e["threequarters"]=834;e["Scedilla"]=667;e["lcaron"]=400;e["Kcommaaccent"]=722;e["Lacute"]=611;e["trademark"]=1e3;e["edotaccent"]=556;e["Igrave"]=278;e["Imacron"]=278;e["Lcaron"]=611;e["onehalf"]=834;e["lessequal"]=549;e["ocircumflex"]=611;e["ntilde"]=611;e["Uhungarumlaut"]=722;e["Eacute"]=667;e["emacron"]=556;e["gbreve"]=611;e["onequarter"]=834;e["Scaron"]=667;e["Scommaaccent"]=667;e["Ohungarumlaut"]=778;e["degree"]=400;e["ograve"]=611;e["Ccaron"]=722;e["ugrave"]=611;e["radical"]=549;e["Dcaron"]=722;e["rcommaaccent"]=389;e["Ntilde"]=722;e["otilde"]=611;e["Rcommaaccent"]=722;e["Lcommaaccent"]=611;e["Atilde"]=722;e["Aogonek"]=722;e["Aring"]=722;e["Otilde"]=778;e["zdotaccent"]=500;e["Ecaron"]=667;e["Iogonek"]=278;e["kcommaaccent"]=556;e["minus"]=584;e["Icircumflex"]=278;e["ncaron"]=611;e["tcommaaccent"]=333;e["logicalnot"]=584;e["odieresis"]=611;e["udieresis"]=611;e["notequal"]=549;e["gcommaaccent"]=611;e["eth"]=611;e["zcaron"]=500;e["ncommaaccent"]=611;e["onesuperior"]=333;e["imacron"]=278;e["Euro"]=556});e["Helvetica-Oblique"]=r(function(e){e["space"]=278;e["exclam"]=278;e["quotedbl"]=355;e["numbersign"]=556;e["dollar"]=556;e["percent"]=889;e["ampersand"]=667;e["quoteright"]=222;e["parenleft"]=333;e["parenright"]=333;e["asterisk"]=389;e["plus"]=584;e["comma"]=278;e["hyphen"]=333;e["period"]=278;e["slash"]=278;e["zero"]=556;e["one"]=556;e["two"]=556;e["three"]=556;e["four"]=556;e["five"]=556;e["six"]=556;e["seven"]=556;e["eight"]=556;e["nine"]=556;e["colon"]=278;e["semicolon"]=278;e["less"]=584;e["equal"]=584;e["greater"]=584;e["question"]=556;e["at"]=1015;e["A"]=667;e["B"]=667;e["C"]=722;e["D"]=722;e["E"]=667;e["F"]=611;e["G"]=778;e["H"]=722;e["I"]=278;e["J"]=500;e["K"]=667;e["L"]=556;e["M"]=833;e["N"]=722;e["O"]=778;e["P"]=667;e["Q"]=778;e["R"]=722;e["S"]=667;e["T"]=611;e["U"]=722;e["V"]=667;e["W"]=944;e["X"]=667;e["Y"]=667;e["Z"]=611;e["bracketleft"]=278;e["backslash"]=278;e["bracketright"]=278;e["asciicircum"]=469;e["underscore"]=556;e["quoteleft"]=222;e["a"]=556;e["b"]=556;e["c"]=500;e["d"]=556;e["e"]=556;e["f"]=278;e["g"]=556;e["h"]=556;e["i"]=222;e["j"]=222;e["k"]=500;e["l"]=222;e["m"]=833;e["n"]=556;e["o"]=556;e["p"]=556;e["q"]=556;e["r"]=333;e["s"]=500;e["t"]=278;e["u"]=556;e["v"]=500;e["w"]=722;e["x"]=500;e["y"]=500;e["z"]=500;e["braceleft"]=334;e["bar"]=260;e["braceright"]=334;e["asciitilde"]=584;e["exclamdown"]=333;e["cent"]=556;e["sterling"]=556;e["fraction"]=167;e["yen"]=556;e["florin"]=556;e["section"]=556;e["currency"]=556;e["quotesingle"]=191;e["quotedblleft"]=333;e["guillemotleft"]=556;e["guilsinglleft"]=333;e["guilsinglright"]=333;e["fi"]=500;e["fl"]=500;e["endash"]=556;e["dagger"]=556;e["daggerdbl"]=556;e["periodcentered"]=278;e["paragraph"]=537;e["bullet"]=350;e["quotesinglbase"]=222;e["quotedblbase"]=333;e["quotedblright"]=333;e["guillemotright"]=556;e["ellipsis"]=1e3;e["perthousand"]=1e3;e["questiondown"]=611;e["grave"]=333;e["acute"]=333;e["circumflex"]=333;e["tilde"]=333;e["macron"]=333;e["breve"]=333;e["dotaccent"]=333;e["dieresis"]=333;e["ring"]=333;e["cedilla"]=333;e["hungarumlaut"]=333;e["ogonek"]=333;e["caron"]=333;e["emdash"]=1e3;e["AE"]=1e3;e["ordfeminine"]=370;e["Lslash"]=556;e["Oslash"]=778;e["OE"]=1e3;e["ordmasculine"]=365;e["ae"]=889;e["dotlessi"]=278;e["lslash"]=222;e["oslash"]=611;e["oe"]=944;e["germandbls"]=611;e["Idieresis"]=278;e["eacute"]=556;e["abreve"]=556;e["uhungarumlaut"]=556;e["ecaron"]=556;e["Ydieresis"]=667;e["divide"]=584;e["Yacute"]=667;e["Acircumflex"]=667;e["aacute"]=556;e["Ucircumflex"]=722;e["yacute"]=500;e["scommaaccent"]=500;e["ecircumflex"]=556;e["Uring"]=722;e["Udieresis"]=722;e["aogonek"]=556;e["Uacute"]=722;e["uogonek"]=556;e["Edieresis"]=667;e["Dcroat"]=722;e["commaaccent"]=250;e["copyright"]=737;e["Emacron"]=667;e["ccaron"]=500;e["aring"]=556;e["Ncommaaccent"]=722;e["lacute"]=222;e["agrave"]=556;e["Tcommaaccent"]=611;e["Cacute"]=722;e["atilde"]=556;e["Edotaccent"]=667;e["scaron"]=500;e["scedilla"]=500;e["iacute"]=278;e["lozenge"]=471;e["Rcaron"]=722;e["Gcommaaccent"]=778;e["ucircumflex"]=556;e["acircumflex"]=556;e["Amacron"]=667;e["rcaron"]=333;e["ccedilla"]=500;e["Zdotaccent"]=611;e["Thorn"]=667;e["Omacron"]=778;e["Racute"]=722;e["Sacute"]=667;e["dcaron"]=643;e["Umacron"]=722;e["uring"]=556;e["threesuperior"]=333;e["Ograve"]=778;e["Agrave"]=667;e["Abreve"]=667;e["multiply"]=584;e["uacute"]=556;e["Tcaron"]=611;e["partialdiff"]=476;e["ydieresis"]=500;e["Nacute"]=722;e["icircumflex"]=278;e["Ecircumflex"]=667;e["adieresis"]=556;e["edieresis"]=556;e["cacute"]=500;e["nacute"]=556;e["umacron"]=556;e["Ncaron"]=722;e["Iacute"]=278;e["plusminus"]=584;e["brokenbar"]=260;e["registered"]=737;e["Gbreve"]=778;e["Idotaccent"]=278;e["summation"]=600;e["Egrave"]=667;e["racute"]=333;e["omacron"]=556;e["Zacute"]=611;e["Zcaron"]=611;e["greaterequal"]=549;e["Eth"]=722;e["Ccedilla"]=722;e["lcommaaccent"]=222;e["tcaron"]=317;e["eogonek"]=556;e["Uogonek"]=722;e["Aacute"]=667;e["Adieresis"]=667;e["egrave"]=556;e["zacute"]=500;e["iogonek"]=222;e["Oacute"]=778;e["oacute"]=556;e["amacron"]=556;e["sacute"]=500;e["idieresis"]=278;e["Ocircumflex"]=778;e["Ugrave"]=722;e["Delta"]=612;e["thorn"]=556;e["twosuperior"]=333;e["Odieresis"]=778;e["mu"]=556;e["igrave"]=278;e["ohungarumlaut"]=556;e["Eogonek"]=667;e["dcroat"]=556;e["threequarters"]=834;e["Scedilla"]=667;e["lcaron"]=299;e["Kcommaaccent"]=667;e["Lacute"]=556;e["trademark"]=1e3;e["edotaccent"]=556;e["Igrave"]=278;e["Imacron"]=278;e["Lcaron"]=556;e["onehalf"]=834;e["lessequal"]=549;e["ocircumflex"]=556;e["ntilde"]=556;e["Uhungarumlaut"]=722;e["Eacute"]=667;e["emacron"]=556;e["gbreve"]=556;e["onequarter"]=834;e["Scaron"]=667;e["Scommaaccent"]=667;e["Ohungarumlaut"]=778;e["degree"]=400;e["ograve"]=556;e["Ccaron"]=722;e["ugrave"]=556;e["radical"]=453;e["Dcaron"]=722;e["rcommaaccent"]=333;e["Ntilde"]=722;e["otilde"]=556;e["Rcommaaccent"]=722;e["Lcommaaccent"]=556;e["Atilde"]=667;e["Aogonek"]=667;e["Aring"]=667;e["Otilde"]=778;e["zdotaccent"]=500;e["Ecaron"]=667;e["Iogonek"]=278;e["kcommaaccent"]=500;e["minus"]=584;e["Icircumflex"]=278;e["ncaron"]=556;e["tcommaaccent"]=278;e["logicalnot"]=584;e["odieresis"]=556;e["udieresis"]=556;e["notequal"]=549;e["gcommaaccent"]=556;e["eth"]=556;e["zcaron"]=500;e["ncommaaccent"]=556;e["onesuperior"]=333;e["imacron"]=278;e["Euro"]=556});e["Symbol"]=r(function(e){e["space"]=250;e["exclam"]=333;e["universal"]=713;e["numbersign"]=500;e["existential"]=549;e["percent"]=833;e["ampersand"]=778;e["suchthat"]=439;e["parenleft"]=333;e["parenright"]=333;e["asteriskmath"]=500;e["plus"]=549;e["comma"]=250;e["minus"]=549;e["period"]=250;e["slash"]=278;e["zero"]=500;e["one"]=500;e["two"]=500;e["three"]=500;e["four"]=500;e["five"]=500;e["six"]=500;e["seven"]=500;e["eight"]=500;e["nine"]=500;e["colon"]=278;e["semicolon"]=278;e["less"]=549;e["equal"]=549;e["greater"]=549;e["question"]=444;e["congruent"]=549;e["Alpha"]=722;e["Beta"]=667;e["Chi"]=722;e["Delta"]=612;e["Epsilon"]=611;e["Phi"]=763;e["Gamma"]=603;e["Eta"]=722;e["Iota"]=333;e["theta1"]=631;e["Kappa"]=722;e["Lambda"]=686;e["Mu"]=889;e["Nu"]=722;e["Omicron"]=722;e["Pi"]=768;e["Theta"]=741;e["Rho"]=556;e["Sigma"]=592;e["Tau"]=611;e["Upsilon"]=690;e["sigma1"]=439;e["Omega"]=768;e["Xi"]=645;e["Psi"]=795;e["Zeta"]=611;e["bracketleft"]=333;e["therefore"]=863;e["bracketright"]=333;e["perpendicular"]=658;e["underscore"]=500;e["radicalex"]=500;e["alpha"]=631;e["beta"]=549;e["chi"]=549;e["delta"]=494;e["epsilon"]=439;e["phi"]=521;e["gamma"]=411;e["eta"]=603;e["iota"]=329;e["phi1"]=603;e["kappa"]=549;e["lambda"]=549;e["mu"]=576;e["nu"]=521;e["omicron"]=549;e["pi"]=549;e["theta"]=521;e["rho"]=549;e["sigma"]=603;e["tau"]=439;e["upsilon"]=576;e["omega1"]=713;e["omega"]=686;e["xi"]=493;e["psi"]=686;e["zeta"]=494;e["braceleft"]=480;e["bar"]=200;e["braceright"]=480;e["similar"]=549;e["Euro"]=750;e["Upsilon1"]=620;e["minute"]=247;e["lessequal"]=549;e["fraction"]=167;e["infinity"]=713;e["florin"]=500;e["club"]=753;e["diamond"]=753;e["heart"]=753;e["spade"]=753;e["arrowboth"]=1042;e["arrowleft"]=987;e["arrowup"]=603;e["arrowright"]=987;e["arrowdown"]=603;e["degree"]=400;e["plusminus"]=549;e["second"]=411;e["greaterequal"]=549;e["multiply"]=549;e["proportional"]=713;e["partialdiff"]=494;e["bullet"]=460;e["divide"]=549;e["notequal"]=549;e["equivalence"]=549;e["approxequal"]=549;e["ellipsis"]=1e3;e["arrowvertex"]=603;e["arrowhorizex"]=1e3;e["carriagereturn"]=658;e["aleph"]=823;e["Ifraktur"]=686;e["Rfraktur"]=795;e["weierstrass"]=987;e["circlemultiply"]=768;e["circleplus"]=768;e["emptyset"]=823;e["intersection"]=768;e["union"]=768;e["propersuperset"]=713;e["reflexsuperset"]=713;e["notsubset"]=713;e["propersubset"]=713;e["reflexsubset"]=713;e["element"]=713;e["notelement"]=713;e["angle"]=768;e["gradient"]=713;e["registerserif"]=790;e["copyrightserif"]=790;e["trademarkserif"]=890;e["product"]=823;e["radical"]=549;e["dotmath"]=250;e["logicalnot"]=713;e["logicaland"]=603;e["logicalor"]=603;e["arrowdblboth"]=1042;e["arrowdblleft"]=987;e["arrowdblup"]=603;e["arrowdblright"]=987;e["arrowdbldown"]=603;e["lozenge"]=494;e["angleleft"]=329;e["registersans"]=790;e["copyrightsans"]=790;e["trademarksans"]=786;e["summation"]=713;e["parenlefttp"]=384;e["parenleftex"]=384;e["parenleftbt"]=384;e["bracketlefttp"]=384;e["bracketleftex"]=384;e["bracketleftbt"]=384;e["bracelefttp"]=494;e["braceleftmid"]=494;e["braceleftbt"]=494;e["braceex"]=494;e["angleright"]=329;e["integral"]=274;e["integraltp"]=686;e["integralex"]=686;e["integralbt"]=686;e["parenrighttp"]=384;e["parenrightex"]=384;e["parenrightbt"]=384;e["bracketrighttp"]=384;e["bracketrightex"]=384;e["bracketrightbt"]=384;e["bracerighttp"]=494;e["bracerightmid"]=494;e["bracerightbt"]=494;e["apple"]=790});e["Times-Roman"]=r(function(e){e["space"]=250;e["exclam"]=333;e["quotedbl"]=408;e["numbersign"]=500;e["dollar"]=500;e["percent"]=833;e["ampersand"]=778;e["quoteright"]=333;e["parenleft"]=333;e["parenright"]=333;e["asterisk"]=500;e["plus"]=564;e["comma"]=250;e["hyphen"]=333;e["period"]=250;e["slash"]=278;e["zero"]=500;e["one"]=500;e["two"]=500;e["three"]=500;e["four"]=500;e["five"]=500;e["six"]=500;e["seven"]=500;e["eight"]=500;e["nine"]=500;e["colon"]=278;e["semicolon"]=278;e["less"]=564;e["equal"]=564;e["greater"]=564;e["question"]=444;e["at"]=921;e["A"]=722;e["B"]=667;e["C"]=667;e["D"]=722;e["E"]=611;e["F"]=556;e["G"]=722;e["H"]=722;e["I"]=333;e["J"]=389;e["K"]=722;e["L"]=611;e["M"]=889;e["N"]=722;e["O"]=722;e["P"]=556;e["Q"]=722;e["R"]=667;e["S"]=556;e["T"]=611;e["U"]=722;e["V"]=722;e["W"]=944;e["X"]=722;e["Y"]=722;e["Z"]=611;e["bracketleft"]=333;e["backslash"]=278;e["bracketright"]=333;e["asciicircum"]=469;e["underscore"]=500;e["quoteleft"]=333;e["a"]=444;e["b"]=500;e["c"]=444;e["d"]=500;e["e"]=444;e["f"]=333;e["g"]=500;e["h"]=500;e["i"]=278;e["j"]=278;e["k"]=500;e["l"]=278;e["m"]=778;e["n"]=500;e["o"]=500;e["p"]=500;e["q"]=500;e["r"]=333;e["s"]=389;e["t"]=278;e["u"]=500;e["v"]=500;e["w"]=722;e["x"]=500;e["y"]=500;e["z"]=444;e["braceleft"]=480;e["bar"]=200;e["braceright"]=480;e["asciitilde"]=541;e["exclamdown"]=333;e["cent"]=500;e["sterling"]=500;e["fraction"]=167;e["yen"]=500;e["florin"]=500;e["section"]=500;e["currency"]=500;e["quotesingle"]=180;e["quotedblleft"]=444;e["guillemotleft"]=500;e["guilsinglleft"]=333;e["guilsinglright"]=333;e["fi"]=556;e["fl"]=556;e["endash"]=500;e["dagger"]=500;e["daggerdbl"]=500;e["periodcentered"]=250;e["paragraph"]=453;e["bullet"]=350;e["quotesinglbase"]=333;e["quotedblbase"]=444;e["quotedblright"]=444;e["guillemotright"]=500;e["ellipsis"]=1e3;e["perthousand"]=1e3;e["questiondown"]=444;e["grave"]=333;e["acute"]=333;e["circumflex"]=333;e["tilde"]=333;e["macron"]=333;e["breve"]=333;e["dotaccent"]=333;e["dieresis"]=333;e["ring"]=333;e["cedilla"]=333;e["hungarumlaut"]=333;e["ogonek"]=333;e["caron"]=333;e["emdash"]=1e3;e["AE"]=889;e["ordfeminine"]=276;e["Lslash"]=611;e["Oslash"]=722;e["OE"]=889;e["ordmasculine"]=310;e["ae"]=667;e["dotlessi"]=278;e["lslash"]=278;e["oslash"]=500;e["oe"]=722;e["germandbls"]=500;e["Idieresis"]=333;e["eacute"]=444;e["abreve"]=444;e["uhungarumlaut"]=500;e["ecaron"]=444;e["Ydieresis"]=722;e["divide"]=564;e["Yacute"]=722;e["Acircumflex"]=722;e["aacute"]=444;e["Ucircumflex"]=722;e["yacute"]=500;e["scommaaccent"]=389;e["ecircumflex"]=444;e["Uring"]=722;e["Udieresis"]=722;e["aogonek"]=444;e["Uacute"]=722;e["uogonek"]=500;e["Edieresis"]=611;e["Dcroat"]=722;e["commaaccent"]=250;e["copyright"]=760;e["Emacron"]=611;e["ccaron"]=444;e["aring"]=444;e["Ncommaaccent"]=722;e["lacute"]=278;e["agrave"]=444;e["Tcommaaccent"]=611;e["Cacute"]=667;e["atilde"]=444;e["Edotaccent"]=611;e["scaron"]=389;e["scedilla"]=389;e["iacute"]=278;e["lozenge"]=471;e["Rcaron"]=667;e["Gcommaaccent"]=722;e["ucircumflex"]=500;e["acircumflex"]=444;e["Amacron"]=722;e["rcaron"]=333;e["ccedilla"]=444;e["Zdotaccent"]=611;e["Thorn"]=556;e["Omacron"]=722;e["Racute"]=667;e["Sacute"]=556;e["dcaron"]=588;e["Umacron"]=722;e["uring"]=500;e["threesuperior"]=300;e["Ograve"]=722;e["Agrave"]=722;e["Abreve"]=722;e["multiply"]=564;e["uacute"]=500;e["Tcaron"]=611;e["partialdiff"]=476;e["ydieresis"]=500;e["Nacute"]=722;e["icircumflex"]=278;e["Ecircumflex"]=611;e["adieresis"]=444;e["edieresis"]=444;e["cacute"]=444;e["nacute"]=500;e["umacron"]=500;e["Ncaron"]=722;e["Iacute"]=333;e["plusminus"]=564;e["brokenbar"]=200;e["registered"]=760;e["Gbreve"]=722;e["Idotaccent"]=333;e["summation"]=600;e["Egrave"]=611;e["racute"]=333;e["omacron"]=500;e["Zacute"]=611;e["Zcaron"]=611;e["greaterequal"]=549;e["Eth"]=722;e["Ccedilla"]=667;e["lcommaaccent"]=278;e["tcaron"]=326;e["eogonek"]=444;e["Uogonek"]=722;e["Aacute"]=722;e["Adieresis"]=722;e["egrave"]=444;e["zacute"]=444;e["iogonek"]=278;e["Oacute"]=722;e["oacute"]=500;e["amacron"]=444;e["sacute"]=389;e["idieresis"]=278;e["Ocircumflex"]=722;e["Ugrave"]=722;e["Delta"]=612;e["thorn"]=500;e["twosuperior"]=300;e["Odieresis"]=722;e["mu"]=500;e["igrave"]=278;e["ohungarumlaut"]=500;e["Eogonek"]=611;e["dcroat"]=500;e["threequarters"]=750;e["Scedilla"]=556;e["lcaron"]=344;e["Kcommaaccent"]=722;e["Lacute"]=611;e["trademark"]=980;e["edotaccent"]=444;e["Igrave"]=333;e["Imacron"]=333;e["Lcaron"]=611;e["onehalf"]=750;e["lessequal"]=549;e["ocircumflex"]=500;e["ntilde"]=500;e["Uhungarumlaut"]=722;e["Eacute"]=611;e["emacron"]=444;e["gbreve"]=500;e["onequarter"]=750;e["Scaron"]=556;e["Scommaaccent"]=556;e["Ohungarumlaut"]=722;e["degree"]=400;e["ograve"]=500;e["Ccaron"]=667;e["ugrave"]=500;e["radical"]=453;e["Dcaron"]=722;e["rcommaaccent"]=333;e["Ntilde"]=722;e["otilde"]=500;e["Rcommaaccent"]=667;e["Lcommaaccent"]=611;e["Atilde"]=722;e["Aogonek"]=722;e["Aring"]=722;e["Otilde"]=722;e["zdotaccent"]=444;e["Ecaron"]=611;e["Iogonek"]=333;e["kcommaaccent"]=500;e["minus"]=564;e["Icircumflex"]=333;e["ncaron"]=500;e["tcommaaccent"]=278;e["logicalnot"]=564;e["odieresis"]=500;e["udieresis"]=500;e["notequal"]=549;e["gcommaaccent"]=500;e["eth"]=500;e["zcaron"]=444;e["ncommaaccent"]=500;e["onesuperior"]=300;e["imacron"]=278;e["Euro"]=500});e["Times-Bold"]=r(function(e){e["space"]=250;e["exclam"]=333;e["quotedbl"]=555;e["numbersign"]=500;e["dollar"]=500;e["percent"]=1e3;e["ampersand"]=833;e["quoteright"]=333;e["parenleft"]=333;e["parenright"]=333;e["asterisk"]=500;e["plus"]=570;e["comma"]=250;e["hyphen"]=333;e["period"]=250;e["slash"]=278;e["zero"]=500;e["one"]=500;e["two"]=500;e["three"]=500;e["four"]=500;e["five"]=500;e["six"]=500;e["seven"]=500;e["eight"]=500;e["nine"]=500;e["colon"]=333;e["semicolon"]=333;e["less"]=570;e["equal"]=570;e["greater"]=570;e["question"]=500;e["at"]=930;e["A"]=722;e["B"]=667;e["C"]=722;e["D"]=722;e["E"]=667;e["F"]=611;e["G"]=778;e["H"]=778;e["I"]=389;e["J"]=500;e["K"]=778;e["L"]=667;e["M"]=944;e["N"]=722;e["O"]=778;e["P"]=611;e["Q"]=778;e["R"]=722;e["S"]=556;e["T"]=667;e["U"]=722;e["V"]=722;e["W"]=1e3;e["X"]=722;e["Y"]=722;e["Z"]=667;e["bracketleft"]=333;e["backslash"]=278;e["bracketright"]=333;e["asciicircum"]=581;e["underscore"]=500;e["quoteleft"]=333;e["a"]=500;e["b"]=556;e["c"]=444;e["d"]=556;e["e"]=444;e["f"]=333;e["g"]=500;e["h"]=556;e["i"]=278;e["j"]=333;e["k"]=556;e["l"]=278;e["m"]=833;e["n"]=556;e["o"]=500;e["p"]=556;e["q"]=556;e["r"]=444;e["s"]=389;e["t"]=333;e["u"]=556;e["v"]=500;e["w"]=722;e["x"]=500;e["y"]=500;e["z"]=444;e["braceleft"]=394;e["bar"]=220;e["braceright"]=394;e["asciitilde"]=520;e["exclamdown"]=333;e["cent"]=500;e["sterling"]=500;e["fraction"]=167;e["yen"]=500;e["florin"]=500;e["section"]=500;e["currency"]=500;e["quotesingle"]=278;e["quotedblleft"]=500;e["guillemotleft"]=500;e["guilsinglleft"]=333;e["guilsinglright"]=333;e["fi"]=556;e["fl"]=556;e["endash"]=500;e["dagger"]=500;e["daggerdbl"]=500;e["periodcentered"]=250;e["paragraph"]=540;e["bullet"]=350;e["quotesinglbase"]=333;e["quotedblbase"]=500;e["quotedblright"]=500;e["guillemotright"]=500;e["ellipsis"]=1e3;e["perthousand"]=1e3;e["questiondown"]=500;e["grave"]=333;e["acute"]=333;e["circumflex"]=333;e["tilde"]=333;e["macron"]=333;e["breve"]=333;e["dotaccent"]=333;e["dieresis"]=333;e["ring"]=333;e["cedilla"]=333;e["hungarumlaut"]=333;e["ogonek"]=333;e["caron"]=333;e["emdash"]=1e3;e["AE"]=1e3;e["ordfeminine"]=300;e["Lslash"]=667;e["Oslash"]=778;e["OE"]=1e3;e["ordmasculine"]=330;e["ae"]=722;e["dotlessi"]=278;e["lslash"]=278;e["oslash"]=500;e["oe"]=722;e["germandbls"]=556;e["Idieresis"]=389;e["eacute"]=444;e["abreve"]=500;e["uhungarumlaut"]=556;e["ecaron"]=444;e["Ydieresis"]=722;e["divide"]=570;e["Yacute"]=722;e["Acircumflex"]=722;e["aacute"]=500;e["Ucircumflex"]=722;e["yacute"]=500;e["scommaaccent"]=389;e["ecircumflex"]=444;e["Uring"]=722;e["Udieresis"]=722;e["aogonek"]=500;e["Uacute"]=722;e["uogonek"]=556;e["Edieresis"]=667;e["Dcroat"]=722;e["commaaccent"]=250;e["copyright"]=747;e["Emacron"]=667;e["ccaron"]=444;e["aring"]=500;e["Ncommaaccent"]=722;e["lacute"]=278;e["agrave"]=500;e["Tcommaaccent"]=667;e["Cacute"]=722;e["atilde"]=500;e["Edotaccent"]=667;e["scaron"]=389;e["scedilla"]=389;e["iacute"]=278;e["lozenge"]=494;e["Rcaron"]=722;e["Gcommaaccent"]=778;e["ucircumflex"]=556;e["acircumflex"]=500;e["Amacron"]=722;e["rcaron"]=444;e["ccedilla"]=444;e["Zdotaccent"]=667;e["Thorn"]=611;e["Omacron"]=778;e["Racute"]=722;e["Sacute"]=556;e["dcaron"]=672;e["Umacron"]=722;e["uring"]=556;e["threesuperior"]=300;e["Ograve"]=778;e["Agrave"]=722;e["Abreve"]=722;e["multiply"]=570;e["uacute"]=556;e["Tcaron"]=667;e["partialdiff"]=494;e["ydieresis"]=500;e["Nacute"]=722;e["icircumflex"]=278;e["Ecircumflex"]=667;e["adieresis"]=500;e["edieresis"]=444;e["cacute"]=444;e["nacute"]=556;e["umacron"]=556;e["Ncaron"]=722;e["Iacute"]=389;e["plusminus"]=570;e["brokenbar"]=220;e["registered"]=747;e["Gbreve"]=778;e["Idotaccent"]=389;e["summation"]=600;e["Egrave"]=667;e["racute"]=444;e["omacron"]=500;e["Zacute"]=667;e["Zcaron"]=667;e["greaterequal"]=549;e["Eth"]=722;e["Ccedilla"]=722;e["lcommaaccent"]=278;e["tcaron"]=416;e["eogonek"]=444;e["Uogonek"]=722;e["Aacute"]=722;e["Adieresis"]=722;e["egrave"]=444;e["zacute"]=444;e["iogonek"]=278;e["Oacute"]=778;e["oacute"]=500;e["amacron"]=500;e["sacute"]=389;e["idieresis"]=278;e["Ocircumflex"]=778;e["Ugrave"]=722;e["Delta"]=612;e["thorn"]=556;e["twosuperior"]=300;e["Odieresis"]=778;e["mu"]=556;e["igrave"]=278;e["ohungarumlaut"]=500;e["Eogonek"]=667;e["dcroat"]=556;e["threequarters"]=750;e["Scedilla"]=556;e["lcaron"]=394;e["Kcommaaccent"]=778;e["Lacute"]=667;e["trademark"]=1e3;e["edotaccent"]=444;e["Igrave"]=389;e["Imacron"]=389;e["Lcaron"]=667;e["onehalf"]=750;e["lessequal"]=549;e["ocircumflex"]=500;e["ntilde"]=556;e["Uhungarumlaut"]=722;e["Eacute"]=667;e["emacron"]=444;e["gbreve"]=500;e["onequarter"]=750;e["Scaron"]=556;e["Scommaaccent"]=556;e["Ohungarumlaut"]=778;e["degree"]=400;e["ograve"]=500;e["Ccaron"]=722;e["ugrave"]=556;e["radical"]=549;e["Dcaron"]=722;e["rcommaaccent"]=444;e["Ntilde"]=722;e["otilde"]=500;e["Rcommaaccent"]=722;e["Lcommaaccent"]=667;e["Atilde"]=722;e["Aogonek"]=722;e["Aring"]=722;e["Otilde"]=778;e["zdotaccent"]=444;e["Ecaron"]=667;e["Iogonek"]=389;e["kcommaaccent"]=556;e["minus"]=570;e["Icircumflex"]=389;e["ncaron"]=556;e["tcommaaccent"]=333;e["logicalnot"]=570;e["odieresis"]=500;e["udieresis"]=556;e["notequal"]=549;e["gcommaaccent"]=500;e["eth"]=500;e["zcaron"]=444;e["ncommaaccent"]=556;e["onesuperior"]=300;e["imacron"]=278;e["Euro"]=500});e["Times-BoldItalic"]=r(function(e){e["space"]=250;e["exclam"]=389;e["quotedbl"]=555;e["numbersign"]=500;e["dollar"]=500;e["percent"]=833;e["ampersand"]=778;e["quoteright"]=333;e["parenleft"]=333;e["parenright"]=333;e["asterisk"]=500;e["plus"]=570;e["comma"]=250;e["hyphen"]=333;e["period"]=250;e["slash"]=278;e["zero"]=500;e["one"]=500;e["two"]=500;e["three"]=500;e["four"]=500;e["five"]=500;e["six"]=500;e["seven"]=500;e["eight"]=500;e["nine"]=500;e["colon"]=333;e["semicolon"]=333;e["less"]=570;e["equal"]=570;e["greater"]=570;e["question"]=500;e["at"]=832;e["A"]=667;e["B"]=667;e["C"]=667;e["D"]=722;e["E"]=667;e["F"]=667;e["G"]=722;e["H"]=778;e["I"]=389;e["J"]=500;e["K"]=667;e["L"]=611;e["M"]=889;e["N"]=722;e["O"]=722;e["P"]=611;e["Q"]=722;e["R"]=667;e["S"]=556;e["T"]=611;e["U"]=722;e["V"]=667;e["W"]=889;e["X"]=667;e["Y"]=611;e["Z"]=611;e["bracketleft"]=333;e["backslash"]=278;e["bracketright"]=333;e["asciicircum"]=570;e["underscore"]=500;e["quoteleft"]=333;e["a"]=500;e["b"]=500;e["c"]=444;e["d"]=500;e["e"]=444;e["f"]=333;e["g"]=500;e["h"]=556;e["i"]=278;e["j"]=278;e["k"]=500;e["l"]=278;e["m"]=778;e["n"]=556;e["o"]=500;e["p"]=500;e["q"]=500;e["r"]=389;e["s"]=389;e["t"]=278;e["u"]=556;e["v"]=444;e["w"]=667;e["x"]=500;e["y"]=444;e["z"]=389;e["braceleft"]=348;e["bar"]=220;e["braceright"]=348;e["asciitilde"]=570;e["exclamdown"]=389;e["cent"]=500;e["sterling"]=500;e["fraction"]=167;e["yen"]=500;e["florin"]=500;e["section"]=500;e["currency"]=500;e["quotesingle"]=278;e["quotedblleft"]=500;e["guillemotleft"]=500;e["guilsinglleft"]=333;e["guilsinglright"]=333;e["fi"]=556;e["fl"]=556;e["endash"]=500;e["dagger"]=500;e["daggerdbl"]=500;e["periodcentered"]=250;e["paragraph"]=500;e["bullet"]=350;e["quotesinglbase"]=333;e["quotedblbase"]=500;e["quotedblright"]=500;e["guillemotright"]=500;e["ellipsis"]=1e3;e["perthousand"]=1e3;e["questiondown"]=500;e["grave"]=333;e["acute"]=333;e["circumflex"]=333;e["tilde"]=333;e["macron"]=333;e["breve"]=333;e["dotaccent"]=333;e["dieresis"]=333;e["ring"]=333;e["cedilla"]=333;e["hungarumlaut"]=333;e["ogonek"]=333;e["caron"]=333;e["emdash"]=1e3;e["AE"]=944;e["ordfeminine"]=266;e["Lslash"]=611;e["Oslash"]=722;e["OE"]=944;e["ordmasculine"]=300;e["ae"]=722;e["dotlessi"]=278;e["lslash"]=278;e["oslash"]=500;e["oe"]=722;e["germandbls"]=500;e["Idieresis"]=389;e["eacute"]=444;e["abreve"]=500;e["uhungarumlaut"]=556;e["ecaron"]=444;e["Ydieresis"]=611;e["divide"]=570;e["Yacute"]=611;e["Acircumflex"]=667;e["aacute"]=500;e["Ucircumflex"]=722;e["yacute"]=444;e["scommaaccent"]=389;e["ecircumflex"]=444;e["Uring"]=722;e["Udieresis"]=722;e["aogonek"]=500;e["Uacute"]=722;e["uogonek"]=556;e["Edieresis"]=667;e["Dcroat"]=722;e["commaaccent"]=250;e["copyright"]=747;e["Emacron"]=667;e["ccaron"]=444;e["aring"]=500;e["Ncommaaccent"]=722;e["lacute"]=278;e["agrave"]=500;e["Tcommaaccent"]=611;e["Cacute"]=667;e["atilde"]=500;e["Edotaccent"]=667;e["scaron"]=389;e["scedilla"]=389;e["iacute"]=278;e["lozenge"]=494;e["Rcaron"]=667;e["Gcommaaccent"]=722;e["ucircumflex"]=556;e["acircumflex"]=500;e["Amacron"]=667;e["rcaron"]=389;e["ccedilla"]=444;e["Zdotaccent"]=611;e["Thorn"]=611;e["Omacron"]=722;e["Racute"]=667;e["Sacute"]=556;e["dcaron"]=608;e["Umacron"]=722;e["uring"]=556;e["threesuperior"]=300;e["Ograve"]=722;e["Agrave"]=667;e["Abreve"]=667;e["multiply"]=570;e["uacute"]=556;e["Tcaron"]=611;e["partialdiff"]=494;e["ydieresis"]=444;e["Nacute"]=722;e["icircumflex"]=278;e["Ecircumflex"]=667;e["adieresis"]=500;e["edieresis"]=444;e["cacute"]=444;e["nacute"]=556;e["umacron"]=556;e["Ncaron"]=722;e["Iacute"]=389;e["plusminus"]=570;e["brokenbar"]=220;e["registered"]=747;e["Gbreve"]=722;e["Idotaccent"]=389;e["summation"]=600;e["Egrave"]=667;e["racute"]=389;e["omacron"]=500;e["Zacute"]=611;e["Zcaron"]=611;e["greaterequal"]=549;e["Eth"]=722;e["Ccedilla"]=667;e["lcommaaccent"]=278;e["tcaron"]=366;e["eogonek"]=444;e["Uogonek"]=722;e["Aacute"]=667;e["Adieresis"]=667;e["egrave"]=444;e["zacute"]=389;e["iogonek"]=278;e["Oacute"]=722;e["oacute"]=500;e["amacron"]=500;e["sacute"]=389;e["idieresis"]=278;e["Ocircumflex"]=722;e["Ugrave"]=722;e["Delta"]=612;e["thorn"]=500;e["twosuperior"]=300;e["Odieresis"]=722;e["mu"]=576;e["igrave"]=278;e["ohungarumlaut"]=500;e["Eogonek"]=667;e["dcroat"]=500;e["threequarters"]=750;e["Scedilla"]=556;e["lcaron"]=382;e["Kcommaaccent"]=667;e["Lacute"]=611;e["trademark"]=1e3;e["edotaccent"]=444;e["Igrave"]=389;e["Imacron"]=389;e["Lcaron"]=611;e["onehalf"]=750;e["lessequal"]=549;e["ocircumflex"]=500;e["ntilde"]=556;e["Uhungarumlaut"]=722;e["Eacute"]=667;e["emacron"]=444;e["gbreve"]=500;e["onequarter"]=750;e["Scaron"]=556;e["Scommaaccent"]=556;e["Ohungarumlaut"]=722;e["degree"]=400;e["ograve"]=500;e["Ccaron"]=667;e["ugrave"]=556;e["radical"]=549;e["Dcaron"]=722;e["rcommaaccent"]=389;e["Ntilde"]=722;e["otilde"]=500;e["Rcommaaccent"]=667;e["Lcommaaccent"]=611;e["Atilde"]=667;e["Aogonek"]=667;e["Aring"]=667;e["Otilde"]=722;e["zdotaccent"]=389;e["Ecaron"]=667;e["Iogonek"]=389;e["kcommaaccent"]=500;e["minus"]=606;e["Icircumflex"]=389;e["ncaron"]=556;e["tcommaaccent"]=278;e["logicalnot"]=606;e["odieresis"]=500;e["udieresis"]=556;e["notequal"]=549;e["gcommaaccent"]=500;e["eth"]=500;e["zcaron"]=389;e["ncommaaccent"]=556;e["onesuperior"]=300;e["imacron"]=278;e["Euro"]=500});e["Times-Italic"]=r(function(e){e["space"]=250;e["exclam"]=333;e["quotedbl"]=420;e["numbersign"]=500;e["dollar"]=500;e["percent"]=833;e["ampersand"]=778;e["quoteright"]=333;e["parenleft"]=333;e["parenright"]=333;e["asterisk"]=500;e["plus"]=675;e["comma"]=250;e["hyphen"]=333;e["period"]=250;e["slash"]=278;e["zero"]=500;e["one"]=500;e["two"]=500;e["three"]=500;e["four"]=500;e["five"]=500;e["six"]=500;e["seven"]=500;e["eight"]=500;e["nine"]=500;e["colon"]=333;e["semicolon"]=333;e["less"]=675;e["equal"]=675;e["greater"]=675;e["question"]=500;e["at"]=920;e["A"]=611;e["B"]=611;e["C"]=667;e["D"]=722;e["E"]=611;e["F"]=611;e["G"]=722;e["H"]=722;e["I"]=333;e["J"]=444;e["K"]=667;e["L"]=556;e["M"]=833;e["N"]=667;e["O"]=722;e["P"]=611;e["Q"]=722;e["R"]=611;e["S"]=500;e["T"]=556;e["U"]=722;e["V"]=611;e["W"]=833;e["X"]=611;e["Y"]=556;e["Z"]=556;e["bracketleft"]=389;e["backslash"]=278;e["bracketright"]=389;e["asciicircum"]=422;e["underscore"]=500;e["quoteleft"]=333;e["a"]=500;e["b"]=500;e["c"]=444;e["d"]=500;e["e"]=444;e["f"]=278;e["g"]=500;e["h"]=500;e["i"]=278;e["j"]=278;e["k"]=444;e["l"]=278;e["m"]=722;e["n"]=500;e["o"]=500;e["p"]=500;e["q"]=500;e["r"]=389;e["s"]=389;e["t"]=278;e["u"]=500;e["v"]=444;e["w"]=667;e["x"]=444;e["y"]=444;e["z"]=389;e["braceleft"]=400;e["bar"]=275;e["braceright"]=400;e["asciitilde"]=541;e["exclamdown"]=389;e["cent"]=500;e["sterling"]=500;e["fraction"]=167;e["yen"]=500;e["florin"]=500;e["section"]=500;e["currency"]=500;e["quotesingle"]=214;e["quotedblleft"]=556;e["guillemotleft"]=500;e["guilsinglleft"]=333;e["guilsinglright"]=333;e["fi"]=500;e["fl"]=500;e["endash"]=500;e["dagger"]=500;e["daggerdbl"]=500;e["periodcentered"]=250;e["paragraph"]=523;e["bullet"]=350;e["quotesinglbase"]=333;e["quotedblbase"]=556;e["quotedblright"]=556;e["guillemotright"]=500;e["ellipsis"]=889;e["perthousand"]=1e3;e["questiondown"]=500;e["grave"]=333;e["acute"]=333;e["circumflex"]=333;e["tilde"]=333;e["macron"]=333;e["breve"]=333;e["dotaccent"]=333;e["dieresis"]=333;e["ring"]=333;e["cedilla"]=333;e["hungarumlaut"]=333;e["ogonek"]=333;e["caron"]=333;e["emdash"]=889;e["AE"]=889;e["ordfeminine"]=276;e["Lslash"]=556;e["Oslash"]=722;e["OE"]=944;e["ordmasculine"]=310;e["ae"]=667;e["dotlessi"]=278;e["lslash"]=278;e["oslash"]=500;e["oe"]=667;e["germandbls"]=500;e["Idieresis"]=333;e["eacute"]=444;e["abreve"]=500;e["uhungarumlaut"]=500;e["ecaron"]=444;e["Ydieresis"]=556;e["divide"]=675;e["Yacute"]=556;e["Acircumflex"]=611;e["aacute"]=500;e["Ucircumflex"]=722;e["yacute"]=444;e["scommaaccent"]=389;e["ecircumflex"]=444;e["Uring"]=722;e["Udieresis"]=722;e["aogonek"]=500;e["Uacute"]=722;e["uogonek"]=500;e["Edieresis"]=611;e["Dcroat"]=722;e["commaaccent"]=250;e["copyright"]=760;e["Emacron"]=611;e["ccaron"]=444;e["aring"]=500;e["Ncommaaccent"]=667;e["lacute"]=278;e["agrave"]=500;e["Tcommaaccent"]=556;e["Cacute"]=667;e["atilde"]=500;e["Edotaccent"]=611;e["scaron"]=389;e["scedilla"]=389;e["iacute"]=278;e["lozenge"]=471;e["Rcaron"]=611;e["Gcommaaccent"]=722;e["ucircumflex"]=500;e["acircumflex"]=500;e["Amacron"]=611;e["rcaron"]=389;e["ccedilla"]=444;e["Zdotaccent"]=556;e["Thorn"]=611;e["Omacron"]=722;e["Racute"]=611;e["Sacute"]=500;e["dcaron"]=544;e["Umacron"]=722;e["uring"]=500;e["threesuperior"]=300;e["Ograve"]=722;e["Agrave"]=611;e["Abreve"]=611;e["multiply"]=675;e["uacute"]=500;e["Tcaron"]=556;e["partialdiff"]=476;e["ydieresis"]=444;e["Nacute"]=667;e["icircumflex"]=278;e["Ecircumflex"]=611;e["adieresis"]=500;e["edieresis"]=444;e["cacute"]=444;e["nacute"]=500;e["umacron"]=500;e["Ncaron"]=667;e["Iacute"]=333;e["plusminus"]=675;e["brokenbar"]=275;e["registered"]=760;e["Gbreve"]=722;e["Idotaccent"]=333;e["summation"]=600;e["Egrave"]=611;e["racute"]=389;e["omacron"]=500;e["Zacute"]=556;e["Zcaron"]=556;e["greaterequal"]=549;e["Eth"]=722;e["Ccedilla"]=667;e["lcommaaccent"]=278;e["tcaron"]=300;e["eogonek"]=444;e["Uogonek"]=722;e["Aacute"]=611;e["Adieresis"]=611;e["egrave"]=444;e["zacute"]=389;e["iogonek"]=278;e["Oacute"]=722;e["oacute"]=500;e["amacron"]=500;e["sacute"]=389;e["idieresis"]=278;e["Ocircumflex"]=722;e["Ugrave"]=722;e["Delta"]=612;e["thorn"]=500;e["twosuperior"]=300;e["Odieresis"]=722;e["mu"]=500;e["igrave"]=278;e["ohungarumlaut"]=500;e["Eogonek"]=611;e["dcroat"]=500;e["threequarters"]=750;e["Scedilla"]=500;e["lcaron"]=300;e["Kcommaaccent"]=667;e["Lacute"]=556;e["trademark"]=980;e["edotaccent"]=444;e["Igrave"]=333;e["Imacron"]=333;e["Lcaron"]=611;e["onehalf"]=750;e["lessequal"]=549;e["ocircumflex"]=500;e["ntilde"]=500;e["Uhungarumlaut"]=722;e["Eacute"]=611;e["emacron"]=444;e["gbreve"]=500;e["onequarter"]=750;e["Scaron"]=500;e["Scommaaccent"]=500;e["Ohungarumlaut"]=722;e["degree"]=400;e["ograve"]=500;e["Ccaron"]=667;e["ugrave"]=500;e["radical"]=453;e["Dcaron"]=722;e["rcommaaccent"]=389;e["Ntilde"]=667;e["otilde"]=500;e["Rcommaaccent"]=611;e["Lcommaaccent"]=556;e["Atilde"]=611;e["Aogonek"]=611;e["Aring"]=611;e["Otilde"]=722;e["zdotaccent"]=389;e["Ecaron"]=611;e["Iogonek"]=333;e["kcommaaccent"]=444;e["minus"]=675;e["Icircumflex"]=333;e["ncaron"]=500;e["tcommaaccent"]=278;e["logicalnot"]=675;e["odieresis"]=500;e["udieresis"]=500;e["notequal"]=549;e["gcommaaccent"]=500;e["eth"]=500;e["zcaron"]=389;e["ncommaaccent"]=500;e["onesuperior"]=300;e["imacron"]=278;e["Euro"]=500});e["ZapfDingbats"]=r(function(e){e["space"]=278;e["a1"]=974;e["a2"]=961;e["a202"]=974;e["a3"]=980;e["a4"]=719;e["a5"]=789;e["a119"]=790;e["a118"]=791;e["a117"]=690;e["a11"]=960;e["a12"]=939;e["a13"]=549;e["a14"]=855;e["a15"]=911;e["a16"]=933;e["a105"]=911;e["a17"]=945;e["a18"]=974;e["a19"]=755;e["a20"]=846;e["a21"]=762;e["a22"]=761;e["a23"]=571;e["a24"]=677;e["a25"]=763;e["a26"]=760;e["a27"]=759;e["a28"]=754;e["a6"]=494;e["a7"]=552;e["a8"]=537;e["a9"]=577;e["a10"]=692;e["a29"]=786;e["a30"]=788;e["a31"]=788;e["a32"]=790;e["a33"]=793;e["a34"]=794;e["a35"]=816;e["a36"]=823;e["a37"]=789;e["a38"]=841;e["a39"]=823;e["a40"]=833;e["a41"]=816;e["a42"]=831;e["a43"]=923;e["a44"]=744;e["a45"]=723;e["a46"]=749;e["a47"]=790;e["a48"]=792;e["a49"]=695;e["a50"]=776;e["a51"]=768;e["a52"]=792;e["a53"]=759;e["a54"]=707;e["a55"]=708;e["a56"]=682;e["a57"]=701;e["a58"]=826;e["a59"]=815;e["a60"]=789;e["a61"]=789;e["a62"]=707;e["a63"]=687;e["a64"]=696;e["a65"]=689;e["a66"]=786;e["a67"]=787;e["a68"]=713;e["a69"]=791;e["a70"]=785;e["a71"]=791;e["a72"]=873;e["a73"]=761;e["a74"]=762;e["a203"]=762;e["a75"]=759;e["a204"]=759;e["a76"]=892;e["a77"]=892;e["a78"]=788;e["a79"]=784;e["a81"]=438;e["a82"]=138;e["a83"]=277;e["a84"]=415;e["a97"]=392;e["a98"]=392;e["a99"]=668;e["a100"]=668;e["a89"]=390;e["a90"]=390;e["a93"]=317;e["a94"]=317;e["a91"]=276;e["a92"]=276;e["a205"]=509;e["a85"]=509;e["a206"]=410;e["a86"]=410;e["a87"]=234;e["a88"]=234;e["a95"]=334;e["a96"]=334;e["a101"]=732;e["a102"]=544;e["a103"]=544;e["a104"]=910;e["a106"]=667;e["a107"]=760;e["a108"]=760;e["a112"]=776;e["a111"]=595;e["a110"]=694;e["a109"]=626;e["a120"]=788;e["a121"]=788;e["a122"]=788;e["a123"]=788;e["a124"]=788;e["a125"]=788;e["a126"]=788;e["a127"]=788;e["a128"]=788;e["a129"]=788;e["a130"]=788;e["a131"]=788;e["a132"]=788;e["a133"]=788;e["a134"]=788;e["a135"]=788;e["a136"]=788;e["a137"]=788;e["a138"]=788;e["a139"]=788;e["a140"]=788;e["a141"]=788;e["a142"]=788;e["a143"]=788;e["a144"]=788;e["a145"]=788;e["a146"]=788;e["a147"]=788;e["a148"]=788;e["a149"]=788;e["a150"]=788;e["a151"]=788;e["a152"]=788;e["a153"]=788;e["a154"]=788;e["a155"]=788;e["a156"]=788;e["a157"]=788;e["a158"]=788;e["a159"]=788;e["a160"]=894;e["a161"]=838;e["a163"]=1016;e["a164"]=458;e["a196"]=748;e["a165"]=924;e["a192"]=748;e["a166"]=918;e["a167"]=927;e["a168"]=928;e["a169"]=928;e["a170"]=834;e["a171"]=873;e["a172"]=828;e["a173"]=924;e["a162"]=924;e["a174"]=917;e["a175"]=930;e["a176"]=931;e["a177"]=463;e["a178"]=883;e["a179"]=836;e["a193"]=836;e["a180"]=867;e["a199"]=867;e["a181"]=696;e["a200"]=696;e["a182"]=874;e["a201"]=874;e["a183"]=760;e["a184"]=946;e["a197"]=771;e["a185"]=865;e["a194"]=771;e["a198"]=888;e["a186"]=967;e["a195"]=888;e["a187"]=831;e["a188"]=873;e["a189"]=927;e["a190"]=970;e["a191"]=918})});e.getMetrics=a});(function(e,t){t(e.pdfjsCoreMurmurHash3={},e.pdfjsSharedUtil)})(this,function(e,t){var r=t.Uint32ArrayView;var a=function e(t){var a=4294901760;var i=65535;function n(e){var t=3285377520;this.h1=e?e&4294967295:t;this.h2=e?e&4294967295:t}var s=false;try{new Uint32Array(new Uint8Array(5).buffer,0,1)}catch(e){s=true}n.prototype={update:function e(t){var n=s;var o;if(typeof t==="string"){var l=new Uint8Array(t.length*2);var c=0;for(o=0;o>>8;l[c++]=h&255}}}else if(t instanceof Uint8Array){l=t;c=l.length}else if(typeof t==="object"&&"length"in t){l=t;c=l.length;n=true}else{throw new Error("Wrong data format in MurmurHash3_64_update. "+"Input must be a string or array.")}var u=c>>2;var f=c-u*4;var d=n?new r(l,u):new Uint32Array(l.buffer,0,u);var g=0;var v=0;var p=this.h1;var m=this.h2;var b=3432918353;var y=461845907;var k=b&i;var w=y&i;for(o=0;o>>17;g=g*y&a|g*w&i;p^=g;p=p<<13|p>>>19;p=p*5+3864292196}else{v=d[o];v=v*b&a|v*k&i;v=v<<15|v>>>17;v=v*y&a|v*w&i;m^=v;m=m<<13|m>>>19;m=m*5+3864292196}}g=0;switch(f){case 3:g^=l[u*4+2]<<16;case 2:g^=l[u*4+1]<<8;case 1:g^=l[u*4];g=g*b&a|g*k&i;g=g<<15|g>>>17;g=g*y&a|g*w&i;if(u&1){p^=g}else{m^=g}}this.h1=p;this.h2=m;return this},hexdigest:function e(){var t=this.h1;var r=this.h2;t^=r>>>1;t=t*3981806797&a|t*36045&i;r=r*4283543511&a|((r<<16|t>>>16)*2950163797&a)>>>16;t^=r>>>1;t=t*444984403&a|t*60499&i;r=r*3301882366&a|((r<<16|t>>>16)*3120437893&a)>>>16;t^=r>>>1;for(var n=0,s=[t,r],o="";n>>0).toString(16);while(l.length<8){l="0"+l}o+=l}return o}};return n}();e.MurmurHash3_64=a});(function(e,t){t(e.pdfjsCorePrimitives={},e.pdfjsSharedUtil)})(this,function(e,t){var r=t.isArray;var a=function e(){function t(e){this.name=e}t.prototype={};var r=Object.create(null);t.get=function e(a){var i=r[a];return i?i:r[a]=new t(a)};return t}();var i=function e(){function t(e){this.cmd=e}t.prototype={};var r=Object.create(null);t.get=function e(a){var i=r[a];return i?i:r[a]=new t(a)};return t}();var n=function e(){var t=function e(){return t};function a(e){this.map=Object.create(null);this.xref=e;this.objId=null;this.suppressEncryption=false;this.__nonSerializable__=t}a.prototype={assignXref:function e(t){this.xref=t},get:function e(t,r,a){var i;var n=this.xref,s=this.suppressEncryption;if(typeof(i=this.map[t])!=="undefined"||t in this.map||typeof r==="undefined"){return n?n.fetchIfRef(i,s):i}if(typeof(i=this.map[r])!=="undefined"||r in this.map||typeof a==="undefined"){return n?n.fetchIfRef(i,s):i}i=this.map[a]||null;return n?n.fetchIfRef(i,s):i},getAsync:function e(t,r,a){var i;var n=this.xref,s=this.suppressEncryption;if(typeof(i=this.map[t])!=="undefined"||t in this.map||typeof r==="undefined"){if(n){return n.fetchIfRefAsync(i,s)}return Promise.resolve(i)}if(typeof(i=this.map[r])!=="undefined"||r in this.map||typeof a==="undefined"){if(n){return n.fetchIfRefAsync(i,s)}return Promise.resolve(i)}i=this.map[a]||null;if(n){return n.fetchIfRefAsync(i,s)}return Promise.resolve(i)},getArray:function e(t,a,i){var n=this.get(t,a,i);var s=this.xref,o=this.suppressEncryption;if(!r(n)||!s){return n}n=n.slice();for(var l=0,c=n.length;l=65520&&e<=65535){return 0}else if(e>=62976&&e<=63743){return a()[e]||e}return e}function n(e,t){var r=t[e];if(r!==undefined){return r}if(!e){return-1}if(e[0]==="u"){var a=e.length,i;if(a===7&&e[1]==="n"&&e[2]==="i"){i=e.substr(3)}else if(a>=5&&a<=7){i=e.substr(1)}else{return-1}if(i===i.toUpperCase()){r=parseInt(i,16);if(r>=0){return r}}}return-1}var s=[{begin:0,end:127},{begin:128,end:255},{begin:256,end:383},{begin:384,end:591},{begin:592,end:687},{begin:688,end:767},{begin:768,end:879},{begin:880,end:1023},{begin:11392,end:11519},{begin:1024,end:1279},{begin:1328,end:1423},{begin:1424,end:1535},{begin:42240,end:42559},{begin:1536,end:1791},{begin:1984,end:2047},{begin:2304,end:2431},{begin:2432,end:2559},{begin:2560,end:2687},{begin:2688,end:2815},{begin:2816,end:2943},{begin:2944,end:3071},{begin:3072,end:3199},{begin:3200,end:3327},{begin:3328,end:3455},{begin:3584,end:3711},{begin:3712,end:3839},{begin:4256,end:4351},{begin:6912,end:7039},{begin:4352,end:4607},{begin:7680,end:7935},{begin:7936,end:8191},{begin:8192,end:8303},{begin:8304,end:8351},{begin:8352,end:8399},{begin:8400,end:8447},{begin:8448,end:8527},{begin:8528,end:8591},{begin:8592,end:8703},{begin:8704,end:8959},{begin:8960,end:9215},{begin:9216,end:9279},{begin:9280,end:9311},{begin:9312,end:9471},{begin:9472,end:9599},{begin:9600,end:9631},{begin:9632,end:9727},{begin:9728,end:9983},{begin:9984,end:10175},{begin:12288,end:12351},{begin:12352,end:12447},{begin:12448,end:12543},{begin:12544,end:12591},{begin:12592,end:12687},{begin:43072,end:43135},{begin:12800,end:13055},{begin:13056,end:13311},{begin:44032,end:55215},{begin:55296,end:57343},{begin:67840,end:67871},{begin:19968,end:40959},{begin:57344,end:63743},{begin:12736,end:12783},{begin:64256,end:64335},{begin:64336,end:65023},{begin:65056,end:65071},{begin:65040,end:65055},{begin:65104,end:65135},{begin:65136,end:65279},{begin:65280,end:65519},{begin:65520,end:65535},{begin:3840,end:4095},{begin:1792,end:1871},{begin:1920,end:1983},{begin:3456,end:3583},{begin:4096,end:4255},{begin:4608,end:4991},{begin:5024,end:5119},{begin:5120,end:5759},{begin:5760,end:5791},{begin:5792,end:5887},{begin:6016,end:6143},{begin:6144,end:6319},{begin:10240,end:10495},{begin:40960,end:42127},{begin:5888,end:5919},{begin:66304,end:66351},{begin:66352,end:66383},{begin:66560,end:66639},{begin:118784,end:119039},{begin:119808,end:120831},{begin:1044480,end:1048573},{begin:65024,end:65039},{begin:917504,end:917631},{begin:6400,end:6479},{begin:6480,end:6527},{begin:6528,end:6623},{begin:6656,end:6687},{begin:11264,end:11359},{begin:11568,end:11647},{begin:19904,end:19967},{begin:43008,end:43055},{begin:65536,end:65663},{begin:65856,end:65935},{begin:66432,end:66463},{begin:66464,end:66527},{begin:66640,end:66687},{begin:66688,end:66735},{begin:67584,end:67647},{begin:68096,end:68191},{begin:119552,end:119647},{begin:73728,end:74751},{begin:119648,end:119679},{begin:7040,end:7103},{begin:7168,end:7247},{begin:7248,end:7295},{begin:43136,end:43231},{begin:43264,end:43311},{begin:43312,end:43359},{begin:43520,end:43615},{begin:65936,end:65999},{begin:66e3,end:66047},{begin:66208,end:66271},{begin:127024,end:127135}];function o(e){for(var t=0,r=s.length;t=a.begin&&e=t.begin&&e=t.begin&&e=0;a--){r+=e[a]}return r}e.mapSpecialUnicodeValues=i;e.reverseIfRtl=h;e.getUnicodeRangeFor=o;e.getNormalizedUnicodes=c;e.getUnicodeForGlyph=n});(function(e,t){t(e.pdfjsCoreStream={},e.pdfjsSharedUtil,e.pdfjsCorePrimitives,e.pdfjsCoreJbig2,e.pdfjsCoreJpg,e.pdfjsCoreJpx)})(this,function(e,t,r,a,i,n){var s=t.Util;var o=t.error;var l=t.info;var c=t.isInt;var h=t.isArray;var u=t.createObjectURL;var f=t.shadow;var d=t.warn;var g=t.isSpace;var v=r.Dict;var p=r.isDict;var m=r.isStream;var b=a.Jbig2Image;var y=i.JpegImage;var k=n.JpxImage;var w=function e(){function t(e,t,r,a){this.bytes=e instanceof Uint8Array?e:new Uint8Array(e);this.start=t||0;this.pos=this.start;this.end=t+r||this.bytes.length;this.dict=a}t.prototype={get length(){return this.end-this.start},get isEmpty(){return this.length===0},getByte:function e(){if(this.pos>=this.end){return-1}return this.bytes[this.pos++]},getUint16:function e(){var t=this.getByte();var r=this.getByte();if(t===-1||r===-1){return-1}return(t<<8)+r},getInt32:function e(){var t=this.getByte();var r=this.getByte();var a=this.getByte();var i=this.getByte();return(t<<24)+(r<<16)+(a<<8)+i},getBytes:function e(t){var r=this.bytes;var a=this.pos;var i=this.end;if(!t){return r.subarray(a,i)}var n=a+t;if(n>i){n=i}this.pos=n;return r.subarray(a,n)},peekByte:function e(){var t=this.getByte();this.pos--;return t},peekBytes:function e(t){var r=this.getBytes(t);this.pos-=r.length;return r},skip:function e(t){if(!t){t=1}this.pos+=t},reset:function e(){this.pos=this.start},moveStart:function e(){this.start=this.pos},makeSubStream:function e(r,a,i){return new t(this.bytes.buffer,r,a,i)},isStream:true};return t}();var C=function e(){function t(e){var t=e.length;var r=new Uint8Array(t);for(var a=0;ai){r=i}}else{while(!this.eof){this.readBlock()}r=this.bufferLength}this.pos=r;return this.buffer.subarray(a,r)},peekByte:function e(){var t=this.getByte();this.pos--;return t},peekBytes:function e(t){var r=this.getBytes(t);this.pos-=r.length;return r},makeSubStream:function e(t,r,a){var i=t+r;while(this.bufferLength<=i&&!this.eof){this.readBlock()}return new w(this.buffer,t,r,a)},skip:function e(t){if(!t){t=1}this.pos+=t},reset:function e(){this.pos=0},getBaseStreams:function e(){if(this.str&&this.str.getBaseStreams){return this.str.getBaseStreams()}return[]}};return r}();var S=function e(){function t(e){this.streams=e;x.call(this,null)}t.prototype=Object.create(x.prototype);t.prototype.readBlock=function e(){var t=this.streams;if(t.length===0){this.eof=true;return}var r=t.shift();var a=r.getBytes();var i=this.bufferLength;var n=i+a.length;var s=this.ensureBuffer(n);s.set(a,i);this.bufferLength=n};t.prototype.getBaseStreams=function e(){var t=[];for(var r=0,a=this.streams.length;r>t;this.codeSize=a-=t;return n};s.prototype.getCode=function e(t){var r=this.str;var a=t[0];var i=t[1];var n=this.codeSize;var s=this.codeBuf;var l;while(n>16;var u=c&65535;if(h<1||n>h;this.codeSize=n-h;return u};s.prototype.generateHuffmanTable=function e(t){var r=t.length;var a=0;var i;for(i=0;ia){a=t[i]}}var n=1<>=1}for(i=u;i>=1;if(h===0){var u;if((u=c.getByte())===-1){o("Bad block header in flate stream")}var f=u;if((u=c.getByte())===-1){o("Bad block header in flate stream")}f|=u<<8;if((u=c.getByte())===-1){o("Bad block header in flate stream")}var d=u;if((u=c.getByte())===-1){o("Bad block header in flate stream")}d|=u<<8;if(d!==(~f&65535)&&(f!==0||d!==0)){o("Bad uncompressed block length in flate stream")}this.codeBuf=0;this.codeSize=0;var g=this.bufferLength;s=this.ensureBuffer(g+f);var v=g+f;this.bufferLength=v;if(f===0){if(c.peekByte()===-1){this.eof=true}}else{for(var p=g;p0){I[x++]=T}}m=this.generateHuffmanTable(I.subarray(0,y));b=this.generateHuffmanTable(I.subarray(y,A))}else{o("Unknown block type in flate stream")}s=this.buffer;var E=s?s.length:0;var M=this.bufferLength;while(true){var L=this.getCode(m);if(L<256){if(M+1>=E){s=this.ensureBuffer(M+1);E=s.length}s[M++]=L;continue}if(L===256){this.bufferLength=M;return}L-=257;L=r[L];var D=L>>16;if(D>0){D=this.getBits(D)}l=(L&65535)+D;L=this.getCode(b);L=a[L];D=L>>16;if(D>0){D=this.getBits(D)}var F=(L&65535)+D;if(M+l>=E){s=this.ensureBuffer(M+l);E=s.length}for(var U=0;U15)){o("Unsupported predictor: "+a)}if(a===2){this.readBlock=this.readBlockTiff}else{this.readBlock=this.readBlockPng}this.str=e;this.dict=e.dict;var i=this.colors=r.get("Colors")||1;var n=this.bits=r.get("BitsPerComponent")||8;var s=this.columns=r.get("Columns")||1;this.pixBytes=i*n+7>>3;this.rowBytes=s*i*n+7>>3;x.call(this,t);return this}t.prototype=Object.create(x.prototype);t.prototype.readBlockTiff=function e(){var t=this.rowBytes;var r=this.bufferLength;var a=this.ensureBuffer(r+t);var i=this.bits;var n=this.colors;var s=this.str.getBytes(t);this.eof=!s.length;if(this.eof){return}var o=0,l=0;var c=0,h=0;var u=r;var f;if(i===1&&n===1){for(f=0;f>1;d^=d>>2;d^=d>>4;o=(d&1)<<7;a[u++]=d}}else if(i===8){for(f=0;f>c-i)&v;c-=i;l=l<=8){a[m++]=l>>h-8&255;h-=8}}}if(h>0){a[m++]=(l<<8-h)+(o&(1<<8-h)-1)}}this.bufferLength+=t};t.prototype.readBlockPng=function e(){var t=this.rowBytes;var r=this.pixBytes;var a=this.str.getByte();var i=this.str.getBytes(t);this.eof=!i.length;if(this.eof){return}var n=this.bufferLength;var s=this.ensureBuffer(n+t);var l=s.subarray(n-t,n);if(l.length===0){l=new Uint8Array(t)}var c,h=n,u,f;switch(a){case 0:for(c=0;c>1)+i[c]}for(;c>1)+i[c]&255;h++}break;case 4:for(c=0;c0;var i=this.decrypt;t=i(t,!a);var n=this.bufferLength;var s,o=t.length;var l=this.ensureBuffer(n+o);for(s=0;s=0;--l){o[s+l]=h&255;h>>=8}}};return t}();var E=function e(){function t(e,t){this.str=e;this.dict=e.dict;this.firstDigit=-1;if(t){t=.5*t}x.call(this,t)}t.prototype=Object.create(x.prototype);t.prototype.readBlock=function e(){var t=8e3;var r=this.str.getBytes(t);if(!r.length){this.eof=true;return}var a=r.length+1>>1;var i=this.ensureBuffer(this.bufferLength+a);var n=this.bufferLength;var s=this.firstDigit;for(var o=0,l=r.length;o=48&&c<=57){h=c&15}else if(c>=65&&c<=70||c>=97&&c<=102){h=(c&15)+9}else if(c===62){this.eof=true;break}else{continue}if(s<0){s=h}else{i[n++]=s<<4|h;s=-1}}if(s>=0&&this.eof){i[n++]=s<<4;s=-1}this.firstDigit=s;this.bufferLength=n};return t}();var M=function e(){function t(e,t){this.str=e;this.dict=e.dict;x.call(this,t)}t.prototype=Object.create(x.prototype);t.prototype.readBlock=function e(){var t=this.str.getBytes(2);if(!t||t.length<2||t[0]===128){this.eof=true;return}var r;var a=this.bufferLength;var i=t[0];if(i<128){r=this.ensureBuffer(a+i+1);r[a++]=t[1];if(i>0){var n=this.str.getBytes(i);r.set(n,a);a+=i}}else{i=257-i;var s=t[1];r=this.ensureBuffer(a+i+1);for(var o=0;o0){this.nextLine2D=!this.lookBits(1);this.eatBits(1)}x.call(this,t)}k.prototype=Object.create(x.prototype);k.prototype.readBlock=function e(){while(!this.eof){var t=this.lookChar();this.ensureBuffer(this.bufferLength+1);this.buffer[this.bufferLength++]=t}};k.prototype.addPixels=function e(t,r){var a=this.codingLine;var i=this.codingPos;if(t>a[i]){if(t>this.columns){l("row is wrong length");this.err=true;t=this.columns}if(i&1^r){++i}a[i]=t}this.codingPos=i};k.prototype.addPixelsNeg=function e(t,r){var a=this.codingLine;var i=this.codingPos;if(t>a[i]){if(t>this.columns){l("row is wrong length");this.err=true;t=this.columns}if(i&1^r){++i}a[i]=t}else if(t0&&t=64);do{k+=w=this.getWhiteCode()}while(w>=64)}else{do{y+=w=this.getWhiteCode()}while(w>=64);do{k+=w=this.getBlackCode()}while(w>=64)}this.addPixels(d[this.codingPos]+y,p);if(d[this.codingPos]0){--v}else{++v}while(t[v]<=d[this.codingPos]&&t[v]0){--v}else{++v}while(t[v]<=d[this.codingPos]&&t[v]0){--v}else{++v}while(t[v]<=d[this.codingPos]&&t[v]=64)}else{do{y+=w=this.getWhiteCode()}while(w>=64)}this.addPixels(d[this.codingPos]+y,p);p^=1}}var C=false;if(this.byteAlign){this.inputBits&=~7}if(!this.eoblock&&this.row===this.rows-1){this.eof=true}else{y=this.lookBits(12);if(this.eoline){while(y!==r&&y!==1){this.eatBits(1);y=this.lookBits(12)}}else{while(y===0){this.eatBits(1);y=this.lookBits(12)}}if(y===1){this.eatBits(12);C=true}else if(y===r){this.eof=true}}if(!this.eof&&this.encoding>0){this.nextLine2D=!this.lookBits(1);this.eatBits(1)}if(this.eoblock&&C&&this.byteAlign){y=this.lookBits(12);if(y===1){this.eatBits(12);if(this.encoding>0){this.lookBits(1);this.eatBits(1)}if(this.encoding>=0){for(b=0;b<4;++b){y=this.lookBits(12);if(y!==1){l("bad rtc code: "+y)}this.eatBits(12);if(this.encoding>0){this.lookBits(1);this.eatBits(1)}}}this.eof=true}}else if(this.err&&this.eoline){while(true){y=this.lookBits(13);if(y===r){this.eof=true;return null}if(y>>1===1){break}this.eatBits(1)}this.eatBits(12);if(this.encoding>0){this.eatBits(1);this.nextLine2D=!(y&1)}}if(d[0]>0){this.outputBits=d[this.codingPos=0]}else{this.outputBits=d[this.codingPos=1]}this.row++}var x;if(this.outputBits>=8){x=this.codingPos&1?0:255;this.outputBits-=8;if(this.outputBits===0&&d[this.codingPos]m){x<<=m;if(!(this.codingPos&1)){x|=255>>8-m}this.outputBits-=m;m=0}else{x<<=this.outputBits;if(!(this.codingPos&1)){x|=255>>8-this.outputBits}m-=this.outputBits;this.outputBits=0;if(d[this.codingPos]0){x<<=m;m=0}}}while(m)}if(this.black){x^=255}return x};k.prototype.findTableCode=function e(t,a,i,n){var s=n||0;for(var o=t;o<=a;++o){var l=this.lookBits(o);if(l===r){return[true,1,false]}if(o=s){var c=i[l-s];if(c[0]===o){this.eatBits(o);return[true,c[1],true]}}}return[false,0,false]};k.prototype.getTwoDimCode=function e(){var t=0;var a;if(this.eoblock){t=this.lookBits(7);a=d[t];if(a&&a[0]>0){this.eatBits(a[0]);return a[1]}}else{var i=this.findTableCode(1,7,d);if(i[0]&&i[2]){return i[1]}}l("Bad two dim code");return r};k.prototype.getWhiteCode=function e(){var t=0;var a;if(this.eoblock){t=this.lookBits(12);if(t===r){return 1}if(t>>5===0){a=g[t]}else{a=p[t>>3]}if(a[0]>0){this.eatBits(a[0]);return a[1]}}else{var i=this.findTableCode(1,9,p);if(i[0]){return i[1]}i=this.findTableCode(11,12,g);if(i[0]){return i[1]}}l("bad white code");this.eatBits(1);return 1};k.prototype.getBlackCode=function e(){var t,a;if(this.eoblock){t=this.lookBits(13);if(t===r){return 1}if(t>>7===0){a=m[t]}else if(t>>9===0&&t>>7!==0){a=b[(t>>1)-64]}else{a=y[t>>7]}if(a[0]>0){this.eatBits(a[0]);return a[1]}}else{var i=this.findTableCode(2,6,y);if(i[0]){return i[1]}i=this.findTableCode(7,12,b,64);if(i[0]){return i[1]}i=this.findTableCode(10,13,m);if(i[0]){return i[1]}}l("bad black code");this.eatBits(1);return 1};k.prototype.lookBits=function e(t){var a;while(this.inputBits>16-t}this.inputBuf=this.inputBuf<<8|a;this.inputBits+=8}return this.inputBuf>>this.inputBits-t&65535>>16-t};k.prototype.eatBits=function e(t){if((this.inputBits-=t)<0){this.inputBits=0}};return k}();var D=function e(){function t(e,t,r){this.str=e;this.dict=e.dict;this.cachedData=0;this.bitsCached=0;var a=4096;var i={earlyChange:r,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(a),dictionaryLengths:new Uint16Array(a),dictionaryPrevCodes:new Uint16Array(a),currentSequence:new Uint8Array(a),currentSequenceLength:0};for(var n=0;n<256;++n){i.dictionaryValues[n]=n;i.dictionaryLengths[n]=1}this.lzwState=i;x.call(this,t)}t.prototype=Object.create(x.prototype);t.prototype.readBits=function e(t){var r=this.bitsCached;var a=this.cachedData;while(r>>r&(1<0;if(k<256){v[0]=k;p=1}else if(k>=258){if(k=0;n--){v[n]=h[s];s=f[s]}}else{v[p++]=v[0]}}else if(k===256){d=9;c=258;p=0;continue}else{this.eof=true;delete this.lzwState;break}if(w){f[c]=g;u[c]=u[g]+1;h[c]=v[0];c++;d=c+l&c+l-1?d:Math.min(Math.log(c+l)/.6931471805599453+1,12)|0}g=k;m+=p;if(r>5&255;h[u++]=i>>13&255;h[u++]=i>>21&255;h[u++]=i>>>29&255;h[u++]=0;h[u++]=0;h[u++]=0;var g=new Int32Array(16);for(u=0;u>>32-x)|0;v=w}n=n+v|0;s=s+p|0;o=o+m|0;l=l+b|0}return new Uint8Array([n&255,n>>8&255,n>>16&255,n>>>24&255,s&255,s>>8&255,s>>16&255,s>>>24&255,o&255,o>>8&255,o>>16&255,o>>>24&255,l&255,l>>8&255,l>>16&255,l>>>24&255])}return a}();var y=function e(){function t(e,t){this.high=e|0;this.low=t|0}t.prototype={and:function e(t){this.high&=t.high;this.low&=t.low},xor:function e(t){this.high^=t.high;this.low^=t.low},or:function e(t){this.high|=t.high;this.low|=t.low},shiftRight:function e(t){if(t>=32){this.low=this.high>>>t-32|0;this.high=0}else{this.low=this.low>>>t|this.high<<32-t;this.high=this.high>>>t|0}},shiftLeft:function e(t){if(t>=32){this.high=this.low<>>32-t;this.low=this.low<>>t|a<<32-t;this.high=a>>>t|r<<32-t},not:function e(){this.high=~this.high;this.low=~this.low},add:function e(t){var r=(this.low>>>0)+(t.low>>>0);var a=(this.high>>>0)+(t.high>>>0);if(r>4294967295){a+=1}this.low=r|0;this.high=a|0},copyTo:function e(t,r){t[r]=this.high>>>24&255;t[r+1]=this.high>>16&255;t[r+2]=this.high>>8&255;t[r+3]=this.high&255;t[r+4]=this.low>>>24&255;t[r+5]=this.low>>16&255;t[r+6]=this.low>>8&255;t[r+7]=this.low&255},assign:function e(t){this.high=t.high;this.low=t.low}};return t}();var k=function e(){function t(e,t){return e>>>t|e<<32-t}function r(e,t,r){return e&t^~e&r}function a(e,t,r){return e&t^e&r^t&r}function i(e){return t(e,2)^t(e,13)^t(e,22)}function n(e){return t(e,6)^t(e,11)^t(e,25)}function s(e){return t(e,7)^t(e,18)^e>>>3}function o(e){return t(e,17)^t(e,19)^e>>>10}var l=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function c(e,t,c){var h=1779033703,u=3144134277,f=1013904242,d=2773480762,g=1359893119,v=2600822924,p=528734635,m=1541459225;var b=Math.ceil((c+9)/64)*64;var y=new Uint8Array(b);var k,w,C;for(k=0;k>>29&255;y[k++]=c>>21&255;y[k++]=c>>13&255;y[k++]=c>>5&255;y[k++]=c<<3&255;var x=new Uint32Array(64);for(k=0;k>24&255,h>>16&255,h>>8&255,h&255,u>>24&255,u>>16&255,u>>8&255,u&255,f>>24&255,f>>16&255,f>>8&255,f&255,d>>24&255,d>>16&255,d>>8&255,d&255,g>>24&255,g>>16&255,g>>8&255,g&255,v>>24&255,v>>16&255,v>>8&255,v&255,p>>24&255,p>>16&255,p>>8&255,p&255,m>>24&255,m>>16&255,m>>8&255,m&255])}return c}();var w=function e(){function t(e,t,r,a,i){e.assign(t);e.and(r);i.assign(t);i.not();i.and(a);e.xor(i)}function r(e,t,r,a,i){e.assign(t);e.and(r);i.assign(t);i.and(a);e.xor(i);i.assign(r);i.and(a);e.xor(i)}function a(e,t,r){e.assign(t);e.rotateRight(28);r.assign(t);r.rotateRight(34);e.xor(r);r.assign(t);r.rotateRight(39);e.xor(r)}function i(e,t,r){e.assign(t);e.rotateRight(14);r.assign(t);r.rotateRight(18);e.xor(r);r.assign(t);r.rotateRight(41);e.xor(r)}function n(e,t,r){e.assign(t);e.rotateRight(1);r.assign(t);r.rotateRight(8);e.xor(r);r.assign(t);r.shiftRight(7);e.xor(r)}function s(e,t,r){e.assign(t);e.rotateRight(19);r.assign(t);r.rotateRight(61);e.xor(r);r.assign(t);r.shiftRight(6);e.xor(r)}var o=[new y(1116352408,3609767458),new y(1899447441,602891725),new y(3049323471,3964484399),new y(3921009573,2173295548),new y(961987163,4081628472),new y(1508970993,3053834265),new y(2453635748,2937671579),new y(2870763221,3664609560),new y(3624381080,2734883394),new y(310598401,1164996542),new y(607225278,1323610764),new y(1426881987,3590304994),new y(1925078388,4068182383),new y(2162078206,991336113),new y(2614888103,633803317),new y(3248222580,3479774868),new y(3835390401,2666613458),new y(4022224774,944711139),new y(264347078,2341262773),new y(604807628,2007800933),new y(770255983,1495990901),new y(1249150122,1856431235),new y(1555081692,3175218132),new y(1996064986,2198950837),new y(2554220882,3999719339),new y(2821834349,766784016),new y(2952996808,2566594879),new y(3210313671,3203337956),new y(3336571891,1034457026),new y(3584528711,2466948901),new y(113926993,3758326383),new y(338241895,168717936),new y(666307205,1188179964),new y(773529912,1546045734),new y(1294757372,1522805485),new y(1396182291,2643833823),new y(1695183700,2343527390),new y(1986661051,1014477480),new y(2177026350,1206759142),new y(2456956037,344077627),new y(2730485921,1290863460),new y(2820302411,3158454273),new y(3259730800,3505952657),new y(3345764771,106217008),new y(3516065817,3606008344),new y(3600352804,1432725776),new y(4094571909,1467031594),new y(275423344,851169720),new y(430227734,3100823752),new y(506948616,1363258195),new y(659060556,3750685593),new y(883997877,3785050280),new y(958139571,3318307427),new y(1322822218,3812723403),new y(1537002063,2003034995),new y(1747873779,3602036899),new y(1955562222,1575990012),new y(2024104815,1125592928),new y(2227730452,2716904306),new y(2361852424,442776044),new y(2428436474,593698344),new y(2756734187,3733110249),new y(3204031479,2999351573),new y(3329325298,3815920427),new y(3391569614,3928383900),new y(3515267271,566280711),new y(3940187606,3454069534),new y(4118630271,4000239992),new y(116418474,1914138554),new y(174292421,2731055270),new y(289380356,3203993006),new y(460393269,320620315),new y(685471733,587496836),new y(852142971,1086792851),new y(1017036298,365543100),new y(1126000580,2618297676),new y(1288033470,3409855158),new y(1501505948,4234509866),new y(1607167915,987167468),new y(1816402316,1246189591)];function l(e,l,c,h){h=!!h;var u,f,d,g,v,p,m,b;if(!h){u=new y(1779033703,4089235720);f=new y(3144134277,2227873595);d=new y(1013904242,4271175723);g=new y(2773480762,1595750129);v=new y(1359893119,2917565137);p=new y(2600822924,725511199);m=new y(528734635,4215389547);b=new y(1541459225,327033209)}else{u=new y(3418070365,3238371032);f=new y(1654270250,914150663);d=new y(2438529370,812702999);g=new y(355462360,4144912697);v=new y(1731405415,4290775857);p=new y(2394180231,1750603025);m=new y(3675008525,1694076839);b=new y(1203062813,3204075428)}var k=Math.ceil((c+17)/128)*128;var w=new Uint8Array(k);var C,x,S;for(C=0;C>>29&255;w[C++]=c>>21&255;w[C++]=c>>13&255;w[C++]=c>>5&255;w[C++]=c<<3&255;var A=new Array(80);for(C=0;C<80;C++){A[C]=new y(0,0)}var I=new y(0,0),B=new y(0,0),R=new y(0,0);var T=new y(0,0),O=new y(0,0),P=new y(0,0);var E=new y(0,0),M=new y(0,0);var L=new y(0,0),D=new y(0,0);var F=new y(0,0),U=new y(0,0),j;for(C=0;C=1;--i){l=r[13];r[13]=r[9];r[9]=r[5];r[5]=r[1];r[1]=l;l=r[14];c=r[10];r[14]=r[6];r[10]=r[2];r[6]=l;r[2]=c;l=r[15];c=r[11];h=r[7];r[15]=r[3];r[11]=l;r[7]=c;r[3]=h;for(n=0;n<16;++n){r[n]=a[r[n]]}for(n=0,o=i*16;n<16;++n,++o){r[n]^=t[o]}for(n=0;n<16;n+=4){var u=s[r[n]],f=s[r[n+1]],d=s[r[n+2]],g=s[r[n+3]];l=u^f>>>8^f<<24^d>>>16^d<<16^g>>>24^g<<8;r[n]=l>>>24&255;r[n+1]=l>>16&255;r[n+2]=l>>8&255;r[n+3]=l&255}}l=r[13];r[13]=r[9];r[9]=r[5];r[5]=r[1];r[1]=l;l=r[14];c=r[10];r[14]=r[6];r[10]=r[2];r[6]=l;r[2]=c;l=r[15];c=r[11];h=r[7];r[15]=r[3];r[11]=l;r[7]=c;r[3]=h;for(n=0;n<16;++n){r[n]=a[r[n]];r[n]^=t[n]}return r}function c(e,t){var a,s,o,l;var c=new Uint8Array(16);c.set(e);for(h=0;h<16;++h){c[h]^=t[h]}for(n=1;n<10;n++){for(h=0;h<16;++h){c[h]=r[c[h]]}o=c[1];c[1]=c[5];c[5]=c[9];c[9]=c[13];c[13]=o;o=c[2];s=c[6];c[2]=c[10];c[6]=c[14];c[10]=o;c[14]=s;o=c[3];s=c[7];a=c[11];c[3]=c[15];c[7]=o;c[11]=s;c[15]=a;for(var h=0;h<16;h+=4){var u=c[h+0],f=c[h+1];var d=c[h+2],g=c[h+3];a=u^f^d^g;c[h+0]^=a^i[u^f];c[h+1]^=a^i[f^d];c[h+2]^=a^i[d^g];c[h+3]^=a^i[g^u]}for(h=0,l=n*16;h<16;++h,++l){c[h]^=t[l]}}for(h=0;h<16;++h){c[h]=r[c[h]]}o=c[1];c[1]=c[5];c[5]=c[9];c[9]=c[13];c[13]=o;o=c[2];s=c[6];c[2]=c[10];c[6]=c[14];c[10]=o;c[14]=s;o=c[3];s=c[7];a=c[11];c[3]=c[15];c[7]=o;c[11]=s;c[15]=a;for(h=0,l=160;h<16;++h,++l){c[h]^=t[l]}return c}function h(e){this.key=o(e);this.buffer=new Uint8Array(16);this.bufferPosition=0}function u(e,t){var r,a,i,n=e.length,s=this.buffer,o=this.bufferPosition,c=[],h=this.iv;for(r=0;r=i;--r){if(d[r]!==g){g=0;break}}f-=g;c[c.length-1]=d.subarray(0,16-g)}}var v=new Uint8Array(f);for(r=0,a=0,i=c.length;r=256){i=(i^27)&255}}for(var u=0;u<4;++u){a[n]=o^=a[n-32];n++;a[n]=l^=a[n-32];n++;a[n]=c^=a[n-32];n++;a[n]=h^=a[n-32];n++}}return a}function l(e,t){var r=new Uint8Array(16);r.set(e);var i,n,o;var l,c,h;for(n=0,o=224;n<16;++n,++o){r[n]^=t[o]}for(i=13;i>=1;--i){l=r[13];r[13]=r[9];r[9]=r[5];r[5]=r[1];r[1]=l;l=r[14];c=r[10];r[14]=r[6];r[10]=r[2];r[6]=l;r[2]=c;l=r[15];c=r[11];h=r[7];r[15]=r[3];r[11]=l;r[7]=c;r[3]=h;for(n=0;n<16;++n){r[n]=a[r[n]]}for(n=0,o=i*16;n<16;++n,++o){r[n]^=t[o]}for(n=0;n<16;n+=4){var u=s[r[n]],f=s[r[n+1]],d=s[r[n+2]],g=s[r[n+3]];l=u^f>>>8^f<<24^d>>>16^d<<16^g>>>24^g<<8;r[n]=l>>>24&255;r[n+1]=l>>16&255;r[n+2]=l>>8&255;r[n+3]=l&255}}l=r[13];r[13]=r[9];r[9]=r[5];r[5]=r[1];r[1]=l;l=r[14];c=r[10];r[14]=r[6];r[10]=r[2];r[6]=l;r[2]=c;l=r[15];c=r[11];h=r[7];r[15]=r[3];r[11]=l;r[7]=c;r[3]=h;for(n=0;n<16;++n){r[n]=a[r[n]];r[n]^=t[n]}return r}function c(e,t){var a,s,o,l;var c=new Uint8Array(16);c.set(e);for(h=0;h<16;++h){c[h]^=t[h]}for(n=1;n<14;n++){for(h=0;h<16;++h){c[h]=r[c[h]]}o=c[1];c[1]=c[5];c[5]=c[9];c[9]=c[13];c[13]=o;o=c[2];s=c[6];c[2]=c[10];c[6]=c[14];c[10]=o;c[14]=s;o=c[3];s=c[7];a=c[11];c[3]=c[15];c[7]=o;c[11]=s;c[15]=a;for(var h=0;h<16;h+=4){var u=c[h+0],f=c[h+1];var d=c[h+2],g=c[h+3];a=u^f^d^g;c[h+0]^=a^i[u^f];c[h+1]^=a^i[f^d];c[h+2]^=a^i[d^g];c[h+3]^=a^i[g^u]}for(h=0,l=n*16;h<16;++h,++l){c[h]^=t[l]}}for(h=0;h<16;++h){c[h]=r[c[h]]}o=c[1];c[1]=c[5];c[5]=c[9];c[9]=c[13];c[13]=o;o=c[2];s=c[6];c[2]=c[10];c[6]=c[14];c[10]=o;c[14]=s;o=c[3];s=c[7];a=c[11];c[3]=c[15];c[7]=o;c[11]=s;c[15]=a;for(h=0,l=224;h<16;++h,++l){c[h]^=t[l]}return c}function h(e){this.key=o(e);this.buffer=new Uint8Array(16);this.bufferPosition=0}function u(e,t){var r,a,i,n=e.length,s=this.buffer,o=this.bufferPosition,c=[],h=this.iv;for(r=0;r=i;--r){if(d[r]!==g){g=0;break}}f-=g;c[c.length-1]=d.subarray(0,16-g)}}var v=new Uint8Array(f);for(r=0,a=0,i=c.length;rs-32){var o=e.length+i.length+a.length;var l=new Uint8Array(o*64);var c=t(e,i);c=t(c,a);for(var h=0,u=0;h<64;h++,u+=o){l.set(c,u)}var f=new S(i.subarray(0,16));n=f.encrypt(l,i.subarray(16,32));var d=0;for(var g=0;g<16;g++){d*=256%3;d%=3;d+=(n[g]>>>0)%3;d%=3}if(d===0){i=k(n,0,n.length)}else if(d===1){i=C(n,0,n.length)}else if(d===2){i=w(n,0,n.length)}s++}return i.subarray(0,32)}function a(){}function i(e,t){if(e.length!==t.length){return false}for(var r=0;r>8&255;h[u++]=n>>16&255;h[u++]=n>>>24&255;for(f=0,d=e.length;f=4&&!l){h[u++]=255;h[u++]=255;h[u++]=255;h[u++]=255}var g=b(h,0,u);var v=o>>3;if(s>=3){for(f=0;f<50;++f){g=b(g,0,v)}}var p=g.subarray(0,v);var y,k;if(s>=3){for(u=0;u<32;++u){h[u]=t[u]}for(f=0,d=e.length;f>3;if(a>=3){for(o=0;o<50;++o){c=b(c,0,c.length)}}var u,f;if(a>=3){f=r;var d=new Uint8Array(h),g;for(o=19;o>=0;o--){for(g=0;g=4){var q=e.get("CF");if(v(q)){q.suppressEncryption=true}this.cf=q;this.stmf=e.get("StmF")||p;this.strf=e.get("StrF")||p;this.eff=e.get("EFF")||this.stmf}}function k(e,t,r,a){var i=new Uint8Array(r.length+9),n,s;for(n=0,s=r.length;n>8&255;i[n++]=e>>16&255;i[n++]=t&255;i[n++]=t>>8&255;if(a){i[n++]=115;i[n++]=65;i[n++]=108;i[n++]=84}var o=b(i,0,n);return o.subarray(0,Math.min(r.length+5,16))}function w(e,t,r,a,i){c(g(t),"Invalid crypt filter name.");var n=e.get(t.name);var s;if(n!==null&&n!==undefined){s=n.get("CFM")}if(!s||s.name==="None"){return function e(){return new x}}if(s.name==="V2"){return function e(){return new m(k(r,a,i,false))}}if(s.name==="AESV2"){return function e(){return new S(k(r,a,i,true))}}if(s.name==="AESV3"){return function e(){return new A(i)}}l("Unknown crypto method")}y.prototype={createCipherTransform:function e(t,r){if(this.algorithm===4||this.algorithm===5){return new R(w(this.cf,this.stmf,t,r,this.encryptionKey),w(this.cf,this.strf,t,r,this.encryptionKey))}var a=k(t,r,this.encryptionKey,false);var i=function e(){return new m(a)};return new R(i,i)}};return y}();e.AES128Cipher=S;e.AES256Cipher=A;e.ARCFourCipher=m;e.CipherTransformFactory=T;e.PDF17=I;e.PDF20=B;e.calculateMD5=b;e.calculateSHA256=k;e.calculateSHA384=C;e.calculateSHA512=w});(function(e,t){t(e.pdfjsCoreFontRenderer={},e.pdfjsSharedUtil,e.pdfjsCoreStream,e.pdfjsCoreGlyphList,e.pdfjsCoreEncodings,e.pdfjsCoreCFFParser)})(this,function(e,t,r,a,i,n){var s=t.Util;var o=t.bytesToString;var l=t.error;var c=r.Stream;var h=a.getGlyphsUnicode;var u=i.StandardEncoding;var f=n.CFFParser;var d=function e(){function t(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]}function r(e,t){return e[t]<<8|e[t+1]}function a(e,a,i){var n=r(e,a+2)===1?t(e,a+8):t(e,a+16);var s=r(e,a+n);var o,c,h,u;if(s===4){o=r(e,a+n+2);var f=r(e,a+n+6)>>1;h=a+n+14;c=[];for(u=0;u>1;if(r>16;var l;var c=0,h=0;s+=10;if(o<0){do{l=e[s]<<8|e[s+1];var u=e[s+2]<<8|e[s+3];s+=4;var f,d;if(l&1){f=(e[s]<<24|e[s+1]<<16)>>16;d=(e[s+2]<<24|e[s+3]<<16)>>16;s+=4}else{f=e[s++];d=e[s++]}if(l&2){c=f;h=d}else{c=0;h=0}var v=1,p=1,m=0,b=0;if(l&8){v=p=(e[s]<<24|e[s+1]<<16)/1073741824;s+=2}else if(l&64){v=(e[s]<<24|e[s+1]<<16)/1073741824;p=(e[s+2]<<24|e[s+3]<<16)/1073741824;s+=4}else if(l&128){v=(e[s]<<24|e[s+1]<<16)/1073741824;m=(e[s+2]<<24|e[s+3]<<16)/1073741824;b=(e[s+4]<<24|e[s+5]<<16)/1073741824;p=(e[s+6]<<24|e[s+7]<<16)/1073741824;s+=8}var y=r.glyphs[u];if(y){t.push({cmd:"save"});t.push({cmd:"transform",args:[v,m,b,p,c,h]});g(y,t,r);t.push({cmd:"restore"})}}while(l&32)}else{var k=[];var w,C;for(w=0;w0){A.push({flags:l})}}for(w=0;w>16;s+=2;break;case 2:c-=e[s++];break;case 18:c+=e[s++];break}A[w].x=c}for(w=0;w>16;s+=2;break;case 4:h-=e[s++];break;case 36:h+=e[s++];break}A[w].y=h}var B=0;for(s=0;s>1;p=true;break;case 3:s+=a.length>>1;p=true;break;case 4:n+=a.pop();o(i,n);p=true;break;case 5:while(a.length>0){i+=a.shift();n+=a.shift();c(i,n)}break;case 6:while(a.length>0){i+=a.shift();c(i,n);if(a.length===0){break}n+=a.shift();c(i,n)}break;case 7:while(a.length>0){n+=a.shift();c(i,n);if(a.length===0){break}i+=a.shift();c(i,n)}break;case 8:while(a.length>0){b=i+a.shift();k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w+a.shift();h(b,k,y,w,i,n)}break;case 10:A=a.pop()+r.subrsBias;I=r.subrs[A];if(I){f(I)}break;case 11:return;case 12:m=e[g++];switch(m){case 34:b=i+a.shift();y=b+a.shift();C=n+a.shift();i=y+a.shift();h(b,n,y,C,i,C);b=i+a.shift();y=b+a.shift();i=y+a.shift();h(b,C,y,n,i,n);break;case 35:b=i+a.shift();k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w+a.shift();h(b,k,y,w,i,n);b=i+a.shift();k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w+a.shift();h(b,k,y,w,i,n);a.pop();break;case 36:b=i+a.shift();C=n+a.shift();y=b+a.shift();x=C+a.shift();i=y+a.shift();h(b,C,y,x,i,x);b=i+a.shift();y=b+a.shift();S=x+a.shift();i=y+a.shift();h(b,x,y,S,i,n);break;case 37:var B=i,R=n;b=i+a.shift();k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w+a.shift();h(b,k,y,w,i,n);b=i+a.shift();k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y;n=w;if(Math.abs(i-B)>Math.abs(n-R)){i+=a.shift()}else{n+=a.shift()}h(b,k,y,w,i,n);break;default:l("unknown operator: 12 "+m)}break;case 14:if(a.length>=4){var T=a.pop();var O=a.pop();n=a.pop();i=a.pop();t.push({cmd:"save"});t.push({cmd:"translate",args:[i,n]});var P=d(r.cmap,String.fromCharCode(r.glyphNameMap[u[T]]));v(r.glyphs[P.glyphId],t,r);t.push({cmd:"restore"});P=d(r.cmap,String.fromCharCode(r.glyphNameMap[u[O]]));v(r.glyphs[P.glyphId],t,r)}return;case 18:s+=a.length>>1;p=true;break;case 19:s+=a.length>>1;g+=s+7>>3;p=true;break;case 20:s+=a.length>>1;g+=s+7>>3;p=true;break;case 21:n+=a.pop();i+=a.pop();o(i,n);p=true;break;case 22:i+=a.pop();o(i,n);p=true;break;case 23:s+=a.length>>1;p=true;break;case 24:while(a.length>2){b=i+a.shift();k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w+a.shift();h(b,k,y,w,i,n)}i+=a.shift();n+=a.shift();c(i,n);break;case 25:while(a.length>6){i+=a.shift();n+=a.shift();c(i,n)}b=i+a.shift();k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w+a.shift();h(b,k,y,w,i,n);break;case 26:if(a.length%2){i+=a.shift()}while(a.length>0){b=i;k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y;n=w+a.shift();h(b,k,y,w,i,n)}break;case 27:if(a.length%2){n+=a.shift()}while(a.length>0){b=i+a.shift();k=n;y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w;h(b,k,y,w,i,n)}break;case 28:a.push((e[g]<<24|e[g+1]<<16)>>16);g+=2;break;case 29:A=a.pop()+r.gsubrsBias;I=r.gsubrs[A];if(I){f(I)}break;case 30:while(a.length>0){b=i;k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w+(a.length===1?a.shift():0);h(b,k,y,w,i,n);if(a.length===0){break}b=i+a.shift();k=n;y=b+a.shift();w=k+a.shift();n=w+a.shift();i=y+(a.length===1?a.shift():0);h(b,k,y,w,i,n)}break;case 31:while(a.length>0){b=i+a.shift();k=n;y=b+a.shift();w=k+a.shift();n=w+a.shift();i=y+(a.length===1?a.shift():0);h(b,k,y,w,i,n);if(a.length===0){break}b=i;k=n+a.shift();y=b+a.shift();w=k+a.shift();i=y+a.shift();n=w+(a.length===1?a.shift():0);h(b,k,y,w,i,n)}break;default:if(m<32){l("unknown operator: "+m)}if(m<247){a.push(m-139)}else if(m<251){a.push((m-247)*256+e[g++]+108)}else if(m<255){a.push(-(m-251)*256-e[g++]-108)}else{a.push((e[g]<<24|e[g+1]<<16|e[g+2]<<8|e[g+3])/65536);g+=4}break}if(p){a.length=0}}}f(e)}var p="";function m(e){this.compiledGlyphs=Object.create(null);this.compiledCharCodeToGlyphId=Object.create(null);this.fontMatrix=e}m.prototype={getPathJs:function(e){var t=d(this.cmap,e);var r=this.compiledGlyphs[t.glyphId];if(!r){r=this.compileGlyph(this.glyphs[t.glyphId]);this.compiledGlyphs[t.glyphId]=r}if(this.compiledCharCodeToGlyphId[t.charCode]===undefined){this.compiledCharCodeToGlyphId[t.charCode]=t.glyphId}return r},compileGlyph:function(e){if(!e||e.length===0||e[0]===14){return p}var t=[];t.push({cmd:"save"});t.push({cmd:"transform",args:this.fontMatrix.slice()});t.push({cmd:"scale",args:["size","-size"]});this.compileGlyphImpl(e,t);t.push({cmd:"restore"});return t},compileGlyphImpl:function(){l("Children classes should implement this.")},hasBuiltPath:function(e){var t=d(this.cmap,e);return this.compiledGlyphs[t.glyphId]!==undefined&&this.compiledCharCodeToGlyphId[t.charCode]!==undefined}};function b(e,t,r){r=r||[488e-6,0,0,488e-6,0,0];m.call(this,r);this.glyphs=e;this.cmap=t}s.inherit(b,m,{compileGlyphImpl:function(e,t){g(e,t,this)}});function y(e,t,r,a){r=r||[.001,0,0,.001,0,0];m.call(this,r);this.glyphs=e.glyphs;this.gsubrs=e.gsubrs||[];this.subrs=e.subrs||[];this.cmap=t;this.glyphNameMap=a||h();this.gsubrsBias=this.gsubrs.length<1240?107:this.gsubrs.length<33900?1131:32768;this.subrsBias=this.subrs.length<1240?107:this.subrs.length<33900?1131:32768}s.inherit(y,m,{compileGlyphImpl:function(e,t){v(e,t,this)}});return{create:function e(s,l){var c=new Uint8Array(s.data);var h,u,f,d,g,v;var p=r(c,4);for(var m=0,k=12;m>")&&!M(this.buf1)){if(!k(this.buf1)){l("Malformed dictionary: key must be a name object");this.shift();continue}var n=this.buf1.name;this.shift();if(M(this.buf1)){break}i.set(n,this.getObj(t))}if(M(this.buf1)){if(!this.recoveryMode){o("End of file inside dictionary")}return i}if(b(this.buf2,"stream")){return this.allowStreams?this.makeStream(i,t):i}this.shift();return i;default:return r}}if(h(r)){var s=r;if(h(this.buf1)&&b(this.buf2,"R")){var c=new m(s,this.buf1);this.shift();this.shift();return c}return s}if(f(r)){var u=r;if(t){u=t.decryptString(u)}return u}return r},findDefaultInlineStreamEnd:function e(t){var r=69,a=73,i=32,n=10,o=13;var l=t.pos,c=0,h,u,f,d;while((h=t.getByte())!==-1){if(c===0){c=h===r?1:0}else if(c===1){c=h===a?2:0}else{s(c===2);if(h===i||h===n||h===o){f=5;d=t.peekBytes(f);for(u=0;u127)){c=0;break}}if(c===2){break}}else{c=0}}}return t.pos-4-l},findDCTDecodeInlineStreamEnd:function e(t){var r=t.pos,a=false,i,n,s;while((i=t.getByte())!==-1){if(i!==255){continue}switch(t.getByte()){case 0:break;case 255:t.skip(-1);break;case 217:a=true;break;case 192:case 193:case 194:case 195:case 197:case 198:case 199:case 201:case 202:case 203:case 205:case 206:case 207:case 196:case 204:case 218:case 219:case 220:case 221:case 222:case 223:case 224:case 225:case 226:case 227:case 228:case 229:case 230:case 231:case 232:case 233:case 234:case 235:case 236:case 237:case 238:case 239:case 254:n=t.getUint16();if(n>2){t.skip(n-2)}else{t.skip(-2)}break}if(a){break}}s=t.pos-r;if(i===-1){d("Inline DCTDecode image stream: "+"EOI marker not found, searching for /EI/ instead.");t.skip(-s);return this.findDefaultInlineStreamEnd(t)}this.inlineStreamSkipEI(t);return s},findASCII85DecodeInlineStreamEnd:function e(t){var r=126,a=62;var i=t.pos,n,s;while((n=t.getByte())!==-1){if(n===r&&t.peekByte()===a){t.skip();break}}s=t.pos-i;if(n===-1){d("Inline ASCII85Decode image stream: "+"EOD marker not found, searching for /EI/ instead.");t.skip(-s);return this.findDefaultInlineStreamEnd(t)}this.inlineStreamSkipEI(t);return s},findASCIIHexDecodeInlineStreamEnd:function e(t){var r=62;var a=t.pos,i,n;while((i=t.getByte())!==-1){if(i===r){break}}n=t.pos-a;if(i===-1){d("Inline ASCIIHexDecode image stream: "+"EOD marker not found, searching for /EI/ instead.");t.skip(-n);return this.findDefaultInlineStreamEnd(t)}this.inlineStreamSkipEI(t);return n},inlineStreamSkipEI:function e(t){var r=69,a=73;var i=0,n;while((n=t.getByte())!==-1){if(i===0){i=n===r?1:0}else if(i===1){i=n===a?2:0}else if(i===2){break}}},makeInlineImage:function e(t){var r=this.lexer;var a=r.stream;var i=new v(this.xref);while(!b(this.buf1,"ID")&&!M(this.buf1)){if(!k(this.buf1)){o("Dictionary key must be a name object")}var n=this.buf1.name;this.shift();if(M(this.buf1)){break}i.set(n,this.getObj(t))}var s=i.get("Filter","F"),l;if(k(s)){l=s.name}else if(c(s)){var h=this.xref.fetchIfRef(s[0]);if(k(h)){l=h.name}}var u=a.pos,f,d,p;if(l==="DCTDecode"||l==="DCT"){f=this.findDCTDecodeInlineStreamEnd(a)}else if(l==="ASCII85Decide"||l==="A85"){f=this.findASCII85DecodeInlineStreamEnd(a)}else if(l==="ASCIIHexDecode"||l==="AHx"){f=this.findASCIIHexDecodeInlineStreamEnd(a)}else{f=this.findDefaultInlineStreamEnd(a)}var m=a.makeSubStream(u,f,i);var y;if(f=u){g=true;break}v++}if(g){d+=v;i.pos+=v;break}d+=y;i.pos+=y}if(!g){o("Missing endstream")}s=d;a.nextChar();this.shift();this.shift()}this.shift();i=i.makeSubStream(n,s,t);if(r){i=r.createStream(i,s)}i=this.filter(i,t,s);i.dict=t;return i},filter:function e(t,r,a){var i=r.get("Filter","F");var n=r.get("DecodeParms","DP");if(k(i)){if(c(n)){n=this.xref.fetchIfRef(n[0])}return this.makeFilter(t,i.name,a,n)}var s=a;if(c(i)){var l=i;var h=n;for(var u=0,f=l.length;u=48&&e<=57){return e&15}if(e>=65&&e<=70||e>=97&&e<=102){return(e&15)+9}return-1}t.prototype={nextChar:function e(){return this.currentChar=this.stream.getByte()},peekChar:function e(){return this.stream.peekByte()},getNumber:function e(){var t=this.currentChar;var r=false;var a=0;var i=1;if(t===45){i=-1;t=this.nextChar();if(t===45){t=this.nextChar()}}else if(t===43){t=this.nextChar()}if(t===46){a=10;t=this.nextChar()}if(t<48||t>57){o("Invalid number: "+String.fromCharCode(t));return 0}var n=t-48;var s=0;var l=1;while((t=this.nextChar())>=0){if(48<=t&&t<=57){var c=t-48;if(r){s=s*10+c}else{if(a!==0){a*=10}n=n*10+c}}else if(t===46){if(a===0){a=1}else{break}}else if(t===45){d("Badly formatted number")}else if(t===69||t===101){t=this.peekChar();if(t===43||t===45){l=t===45?-1:1;this.nextChar()}else if(t<48||t>57){break}r=true}else{break}}if(a!==0){n/=a}if(r){n*=Math.pow(10,l*s)}return i*n},getString:function e(){var t=1;var r=false;var a=this.strBuf;a.length=0;var i=this.nextChar();while(true){var n=false;switch(i|0){case-1:d("Unterminated string");r=true;break;case 40:++t;a.push("(");break;case 41:if(--t===0){this.nextChar();r=true}else{a.push(")")}break;case 92:i=this.nextChar();switch(i){case-1:d("Unterminated string");r=true;break;case 110:a.push("\n");break;case 114:a.push("\r");break;case 116:a.push("\t");break;case 98:a.push("\b");break;case 102:a.push("\f");break;case 92:case 40:case 41:a.push(String.fromCharCode(i));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:var s=i&15;i=this.nextChar();n=true;if(i>=48&&i<=55){s=(s<<3)+(i&15);i=this.nextChar();if(i>=48&&i<=55){n=false;s=(s<<3)+(i&15)}}a.push(String.fromCharCode(s));break;case 13:if(this.peekChar()===10){this.nextChar()}break;case 10:break;default:a.push(String.fromCharCode(i));break}break;default:a.push(String.fromCharCode(i));break}if(r){break}if(!n){i=this.nextChar()}}return a.join("")},getName:function e(){var t,i;var n=this.strBuf;n.length=0;while((t=this.nextChar())>=0&&!r[t]){if(t===35){t=this.nextChar();if(r[t]){d("Lexer_getName: "+"NUMBER SIGN (#) should be followed by a hexadecimal number.");n.push("#");break}var s=a(t);if(s!==-1){i=t;t=this.nextChar();var o=a(t);if(o===-1){d("Lexer_getName: Illegal digit ("+String.fromCharCode(t)+") in hexadecimal number.");n.push("#",String.fromCharCode(i));if(r[t]){break}n.push(String.fromCharCode(t));continue}n.push(String.fromCharCode(s<<4|o))}else{n.push("#",String.fromCharCode(t))}}else{n.push(String.fromCharCode(t))}}if(n.length>127){d("name token is longer than allowed by the spec: "+n.length)}return p.get(n.join(""))},getHexString:function e(){var t=this.strBuf;t.length=0;var i=this.currentChar;var n=true;var s;var o;while(true){if(i<0){d("Unterminated hex string");break}else if(i===62){this.nextChar();break}else if(r[i]===1){i=this.nextChar();continue}else{if(n){s=a(i);if(s===-1){d('Ignoring invalid character "'+i+'" in hex string');i=this.nextChar();continue}}else{o=a(i);if(o===-1){d('Ignoring invalid character "'+i+'" in hex string');i=this.nextChar();continue}t.push(String.fromCharCode(s<<4|o))}n=!n;i=this.nextChar()}}return t.join("")},getObj:function e(){var t=false;var a=this.currentChar;while(true){if(a<0){return E}if(t){if(a===10||a===13){t=false}}else if(a===37){t=true}else if(r[a]!==1){break}a=this.nextChar()}switch(a|0){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();case 40:return this.getString();case 47:return this.getName();case 91:this.nextChar();return g.get("[");case 93:this.nextChar();return g.get("]");case 60:a=this.nextChar();if(a===60){this.nextChar();return g.get("<<")}return this.getHexString();case 62:a=this.nextChar();if(a===62){this.nextChar();return g.get(">>")}return g.get(">");case 123:this.nextChar();return g.get("{");case 125:this.nextChar();return g.get("}");case 41:o("Illegal character: "+a);break}var i=String.fromCharCode(a);var n=this.knownCommands;var s=n&&n[i]!==undefined;while((a=this.nextChar())>=0&&!r[a]){var l=i+String.fromCharCode(a);if(s&&n[l]===undefined){break}if(i.length===128){o("Command token too long: "+i.length)}i=l;s=n&&n[i]!==undefined}if(i==="true"){return true}if(i==="false"){return false}if(i==="null"){return null}return g.get(i)},skipToNextLine:function e(){var t=this.currentChar;while(t>=0){if(t===13){t=this.nextChar();if(t===10){this.nextChar()}break}else if(t===10){this.nextChar();break}t=this.nextChar()}}};return t}();var U={create:function e(t){function r(e,t){var r=l.get(e);if(h(r)&&(t?r>=0:r>0)){return r}throw new Error('The "'+e+'" parameter in the linearization '+"dictionary is invalid.")}function a(){var e=l.get("H"),t,r;if(c(e)&&((t=e.length)===2||t===4)){for(var a=0;a0)){throw new Error("Hint ("+a+") in the linearization dictionary is invalid.")}}return e}throw new Error("Hint array in the linearization dictionary is invalid.")}var i=new D(new F(t),false,null);var n=i.getObj();var s=i.getObj();var o=i.getObj();var l=i.getObj();var f,d;if(!(h(n)&&h(s)&&b(o,"obj")&&y(l)&&u(f=l.get("Linearized"))&&f>0)){return null}else if((d=r("L"))!==t.length){throw new Error('The "L" parameter in the linearization dictionary '+"does not equal the stream length.")}return{length:d,hints:a(),objectNumberFirst:r("O"),endFirst:r("E"),numPages:r("N"),mainXRefEntriesOffset:r("T"),pageFirst:l.has("P")?r("P",true):0}}};e.EOF=E;e.Lexer=F;e.Linearization=U;e.Parser=D;e.isEOF=M});(function(e,t){t(e.pdfjsCoreType1Parser={},e.pdfjsSharedUtil,e.pdfjsCoreStream,e.pdfjsCoreEncodings)})(this,function(e,t,r,a){var i=t.warn;var n=t.isSpace;var s=r.Stream;var o=a.getEncoding;var l=false;var c=function e(){var t={hstem:[1],vstem:[3],vmoveto:[4],rlineto:[5],hlineto:[6],vlineto:[7],rrcurveto:[8],callsubr:[10],flex:[12,35],drop:[12,18],endchar:[14],rmoveto:[21],hmoveto:[22],vhcurveto:[30],hvcurveto:[31]};function r(){this.width=0;this.lsb=0;this.flexing=false;this.output=[];this.stack=[]}r.prototype={convert:function e(r,a,n){var s=r.length;var o=false;var c,h,u;for(var f=0;fa){return true}var i=a-e;for(var n=i;n>8&255,s&255)}else{s=65536*s|0;this.output.push(255,s>>24&255,s>>16&255,s>>8&255,s&255)}}this.output.push.apply(this.output,t);if(r){this.stack.splice(i,e)}else{this.stack.length=0}return false}};return r}();var h=function e(){var t=55665;var r=4330;function a(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function i(e,t,r){if(r>=e.length){return new Uint8Array(0)}var a=t|0,i=52845,n=22719,s,o;for(s=0;s>8;a=(h+a)*i+n&(1<<16)-1}return c}function h(e,t,r){var i=t|0,n=52845,s=22719;var o=e.length,l=o>>>1;var c=new Uint8Array(l);var h,u;for(h=0,u=0;h>8;i=(g+i)*n+s&(1<<16)-1}}return Array.prototype.slice.call(c,r,u)}function u(e){return e===47||e===91||e===93||e===123||e===125||e===40||e===41}function f(e,r,n){if(r){var o=e.getBytes();var l=!(a(o[0])&&a(o[1])&&a(o[2])&&a(o[3]));e=new s(l?i(o,t,4):h(o,t,4))}this.seacAnalysisEnabled=!!n;this.stream=e;this.nextChar()}f.prototype={readNumberArray:function e(){this.getToken();var t=[];while(true){var r=this.getToken();if(r===null||r==="]"||r==="}"){break}t.push(parseFloat(r||0))}return t},readNumber:function e(){var t=this.getToken();return parseFloat(t||0)},readInt:function e(){var t=this.getToken();return parseInt(t||0,10)|0},readBoolean:function e(){var t=this.getToken();return t==="true"?1:0},nextChar:function e(){return this.currentChar=this.stream.getByte()},getToken:function e(){var t=false;var r=this.currentChar;while(true){if(r===-1){return null}if(t){if(r===10||r===13){t=false}}else if(r===37){t=true}else if(!n(r)){break}r=this.nextChar()}if(u(r)){this.nextChar();return String.fromCharCode(r)}var a="";do{a+=String.fromCharCode(r);r=this.nextChar()}while(r>=0&&!n(r)&&!u(r));return a},extractFontProgram:function e(){var t=this.stream;var a=[],n=[];var s=Object.create(null);s["lenIV"]=4;var o={subrs:[],charstrings:[],properties:{privateData:s}};var h,u,f,d,g;while((h=this.getToken())!==null){if(h!=="/"){continue}h=this.getToken();switch(h){case"CharStrings":this.getToken();this.getToken();this.getToken();this.getToken();while(true){h=this.getToken();if(h===null||h==="end"){break}if(h!=="/"){continue}var v=this.getToken();u=this.readInt();this.getToken();f=t.makeSubStream(t.pos,u);d=o.properties.privateData["lenIV"];g=i(f.getBytes(),r,d);t.skip(u);this.nextChar();h=this.getToken();if(h==="noaccess"){this.getToken()}n.push({glyph:v,encoded:g})}break;case"Subrs":var p=this.readInt();this.getToken();while((h=this.getToken())==="dup"){var m=this.readInt();u=this.readInt();this.getToken();f=t.makeSubStream(t.pos,u);d=o.properties.privateData["lenIV"];g=i(f.getBytes(),r,d);t.skip(u);this.nextChar();h=this.getToken();if(h==="noaccess"){this.getToken()}a[m]=g}break;case"BlueValues":case"OtherBlues":case"FamilyBlues":case"FamilyOtherBlues":var b=this.readNumberArray();if(b.length>0&&b.length%2===0&&l){o.properties.privateData[h]=b}break;case"StemSnapH":case"StemSnapV":o.properties.privateData[h]=this.readNumberArray();break;case"StdHW":case"StdVW":o.properties.privateData[h]=this.readNumberArray()[0];break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":case"ExpansionFactor":o.properties.privateData[h]=this.readNumber();break;case"ForceBold":o.properties.privateData[h]=this.readBoolean();break}}for(var y=0;y>>0;var o=i[s];for(var l=0,c=o.length;l=h&&a<=u){r.charcode=a;r.length=s+1;return}}}r.charcode=0;r.length=1},get length(){return this._map.length},get isIdentityCMap(){if(!(this.name==="Identity-H"||this.name==="Identity-V")){return false}if(this._map.length!==65536){return false}for(var e=0;e<65536;e++){if(this._map[e]!==e){return false}}return true}};return t}();var k=function e(){function t(e,t){y.call(this);this.vertical=e;this.addCodespaceRange(t,0,65535)}n.inherit(t,y,{});t.prototype={addCodespaceRange:y.prototype.addCodespaceRange,mapCidRange:function(e,t,r){l("should not call mapCidRange")},mapBfRange:function(e,t,r){l("should not call mapBfRange")},mapBfRangeToArray:function(e,t,r){l("should not call mapBfRangeToArray")},mapOne:function(e,t){l("should not call mapCidOne")},lookup:function(e){return c(e)&&e<=65535?e:undefined},contains:function(e){return c(e)&&e<=65535},forEach:function(e){for(var t=0;t<=65535;t++){e(t,t)}},charCodeOf:function(e){return c(e)&&e<=65535?e:-1},getMap:function(){var e=new Array(65536);for(var t=0;t<=65535;t++){e[t]=t}return e},readCharCode:y.prototype.readCharCode,get length(){return 65536},get isIdentityCMap(){l("should not access .isIdentityCMap")}};return t}();var w=function e(){function t(e){return new Promise(function(t,r){var a=new XMLHttpRequest;a.open("GET",e,true);a.responseType="arraybuffer";a.onreadystatechange=function(){if(a.readyState===XMLHttpRequest.DONE){if(!a.response||a.status!==200&&a.status!==0){r(new Error("Unable to get binary cMap at: "+e))}else{t(new Uint8Array(a.response))}}};a.send(null)})}function r(e,t){var r=0;for(var a=0;a<=t;a++){r=r<<8|e[a]}return r>>>0}function a(e,t){if(t===1){return String.fromCharCode(e[0],e[1])}if(t===3){return String.fromCharCode(e[0],e[1],e[2],e[3])}return String.fromCharCode.apply(null,e.subarray(0,t+1))}function i(e,t,r){var a=0;for(var i=r;i>=0;i--){a+=e[i]+t[i];e[i]=a&255;a>>=8}}function n(e,t){var r=1;for(var a=t;a>=0&&r>0;a--){r+=e[a];e[a]=r&255;r>>=8}}var o=16;var c=19;function h(e){this.buffer=e;this.pos=0;this.end=e.length;this.tmpBuf=new Uint8Array(c)}h.prototype={readByte:function(){if(this.pos>=this.end){return-1}return this.buffer[this.pos++]},readNumber:function(){var e=0;var t;do{var r=this.readByte();if(r<0){l("unexpected EOF in bcmap")}t=!(r&128);e=e<<7|r&127}while(!t);return e},readSigned:function(){var e=this.readNumber();return e&1?~(e>>>1):e>>>1},readHex:function(e,t){e.set(this.buffer.subarray(this.pos,this.pos+t+1));this.pos+=t+1},readHexNumber:function(e,t){var r;var a=this.tmpBuf,i=0;do{var n=this.readByte();if(n<0){l("unexpected EOF in bcmap")}r=!(n&128);a[i++]=n&127}while(!r);var s=t,o=0,c=0;while(s>=0){while(c<8&&a.length>0){o=a[--i]<>=8;c-=8}},readHexSigned:function(e,t){this.readHexNumber(e,t);var r=e[t]&1?255:0;var a=0;for(var i=0;i<=t;i++){a=(a&1)<<8|e[i];e[i]=a>>1^r}},readString:function(){var e=this.readNumber();var t="";for(var r=0;r=0){var w=k>>5;if(w===7){switch(k&31){case 0:t.readString();break;case 1:d=t.readString();break}continue}var C=!!(k&16);var x=k&15;s(x+1<=o);var S=1;var A=t.readNumber();var I;switch(w){case 0:t.readHex(g,x);t.readHexNumber(v,x);i(v,g,x);c.addCodespaceRange(x+1,r(g,x),r(v,x));for(I=1;I>>0}function r(e){if(!h(e)){l("Malformed CMap: expected string.")}}function a(e){if(!c(e)){l("Malformed CMap: expected int.")}}function i(e,a){while(true){var i=a.getObj();if(m(i)){break}if(d(i,"endbfchar")){return}r(i);var n=t(i);i=a.getObj();r(i);var s=i;e.mapOne(n,s)}}function n(e,a){while(true){var i=a.getObj();if(m(i)){break}if(d(i,"endbfrange")){return}r(i);var n=t(i);i=a.getObj();r(i);var s=t(i);i=a.getObj();if(c(i)||h(i)){var o=c(i)?String.fromCharCode(i):i;e.mapBfRange(n,s,o)}else if(d(i,"[")){i=a.getObj();var u=[];while(!d(i,"]")&&!m(i)){u.push(i);i=a.getObj()}e.mapBfRangeToArray(n,s,u)}else{break}}l("Invalid bf range.")}function C(e,i){while(true){var n=i.getObj();if(m(n)){break}if(d(n,"endcidchar")){return}r(n);var s=t(n);n=i.getObj();a(n);var o=n;e.mapOne(s,o)}}function x(e,i){while(true){var n=i.getObj();if(m(n)){break}if(d(n,"endcidrange")){return}r(n);var s=t(n);n=i.getObj();r(n);var o=t(n);n=i.getObj();a(n);var l=n;e.mapCidRange(s,o,l)}}function S(e,r){while(true){var a=r.getObj();if(m(a)){break}if(d(a,"endcodespacerange")){return}if(!h(a)){break}var i=t(a);a=r.getObj();if(!h(a)){break}var n=t(a);e.addCodespaceRange(a.length,i,n)}l("Invalid codespace range.")}function A(e,t){var r=t.getObj();if(c(r)){e.vertical=!!r}}function I(e,t){var r=t.getObj();if(f(r)&&h(r.name)){e.name=r.name}}function B(e,t,r,a){var s;var l;e:while(true){try{var c=t.getObj();if(m(c)){break}else if(f(c)){if(c.name==="WMode"){A(e,t)}else if(c.name==="CMapName"){I(e,t)}s=c}else if(d(c)){switch(c.cmd){case"endcmap":break e;case"usecmap":if(f(s)){l=s.name}break;case"begincodespacerange":S(e,t);break;case"beginbfchar":i(e,t);break;case"begincidchar":C(e,t);break;case"beginbfrange":n(e,t);break;case"begincidrange":x(e,t);break}}}catch(e){if(e instanceof u){throw e}o("Invalid cMap data: "+e);continue}}if(!a&&l){a=l}if(a){return R(e,r,a)}return Promise.resolve(e)}function R(e,t,r){return O(r,t).then(function(t){e.useCMap=t;if(e.numCodespaceRanges===0){var r=e.useCMap.codespaceRanges;for(var a=0;a=this.firstChar&&e<=this.lastChar?e:-1},amend:function(e){v("Should not call amend()")}};return t}();var de=function e(){function t(e,t,r){e[t]=r>>8&255;e[t+1]=r&255}function r(e,t,r){e[t]=r>>24&255;e[t+1]=r>>16&255;e[t+2]=r>>8&255;e[t+3]=r&255}function a(e,t,r){var a,i;if(r instanceof Uint8Array){e.set(r,t)}else if(typeof r==="string"){for(a=0,i=r.length;aa){a<<=1;i++}var n=a*r;return{range:n,entry:i,rangeShift:r*t-n}};var n=12;var s=16;i.prototype={toArray:function e(){var o=this.sfnt;var l=this.tables;var c=Object.keys(l);c.sort();var h=c.length;var u,f,d,g,v;var p=n+h*s;var m=[p];for(u=0;u>>0;p+=b;m.push(p)}var y=new Uint8Array(p);for(u=0;u>>0}r(y,p+4,x);r(y,p+8,m[u]);r(y,p+12,l[v].length);p+=s}return y},addTable:function e(t,r){if(t in this.tables){throw new Error("Table "+t+" already exists")}this.tables[t]=r}};return i}();var ge=new Int32Array([0,32,127,161,173,174,1536,1920,2208,4256,6016,6144,7168,7248,8192,8208,8209,8210,8232,8240,8287,8304,9676,9677,12288,12289,43616,43648,65520,65536]);var ve=function e(){function t(e,t,r){var a,i,n;this.name=e;this.loadedName=r.loadedName;this.isType3Font=r.isType3Font;this.sizes=[];this.missingFile=false;this.glyphCache=Object.create(null);var s=e.split("+");s=s.length>1?s[1]:s[0];s=s.split(/[-,_]/g)[0];this.isSerifFont=!!(r.flags&ie.Serif);this.isSymbolicFont=!!(r.flags&ie.Symbolic);this.isMonospace=!!(r.flags&ie.FixedPitch);var u=r.type;var d=r.subtype;this.type=u;this.fallbackName=this.isMonospace?"monospace":this.isSerifFont?"serif":"sans-serif";this.differences=r.differences;this.widths=r.widths;this.defaultWidth=r.defaultWidth;this.composite=r.composite;this.wideChars=r.wideChars;this.cMap=r.cMap;this.ascent=r.ascent/re;this.descent=r.descent/re;this.fontMatrix=r.fontMatrix;this.bbox=r.bbox;this.toUnicode=r.toUnicode;this.toFontChar=[];if(r.type==="Type3"){for(a=0;a<256;a++){this.toFontChar[a]=this.differences[a]||r.defaultEncoding[a]}this.fontType=f.TYPE3;return}this.cidEncoding=r.cidEncoding;this.vertical=r.vertical;if(this.vertical){this.vmetrics=r.vmetrics;this.defaultVMetrics=r.defaultVMetrics}var g;if(!t||t.isEmpty){if(t){x('Font file is empty in "'+e+'" ('+this.loadedName+")")}this.missingFile=true;var m=e.replace(/[,_]/g,"-");var b=D(),y=F();var k=!!b[m]||!!(y[m]&&b[y[m]]);m=b[m]||y[m]||m;this.bold=m.search(/bold/gi)!==-1;this.italic=m.search(/oblique/gi)!==-1||m.search(/italic/gi)!==-1;this.black=e.search(/Black/g)!==-1;this.remeasure=Object.keys(this.widths).length>0;if(k&&u==="CIDFontType2"&&r.cidEncoding.indexOf("Identity-")===0){var w=U();var C=[];for(a in w){C[+a]=w[a]}if(/Arial-?Black/i.test(e)){var S=j();for(a in S){C[+a]=S[a]}}var A=this.toUnicode instanceof fe;if(!A){this.toUnicode.forEach(function(e,t){C[+e]=t})}this.toFontChar=C;this.toUnicode=new ue(C)}else if(/Symbol/i.test(m)){this.toFontChar=h(E,B(),r.differences)}else if(/Dingbats/i.test(m)){if(/Wingdings/i.test(e)){x("Non-embedded Wingdings font, falling back to ZapfDingbats.")}this.toFontChar=h(M,R(),r.differences)}else if(k){this.toFontChar=h(r.defaultEncoding,B(),r.differences)}else{g=B();this.toUnicode.forEach(function(e,t){if(!this.composite){i=r.differences[e]||r.defaultEncoding[e];n=_(i,g);if(n!==-1){t=n}}this.toFontChar[e]=t}.bind(this))}this.loadedName=m.split("-")[0];this.loading=false;this.fontType=le(u,d);return}if(d==="Type1C"){if(u!=="Type1"&&u!=="MMType1"){if(o(t)){d="TrueType"}else{u="Type1"}}else if(l(t)){u=d="OpenType"}}if(d==="CIDFontType0C"&&u!=="CIDFontType0"){u="CIDFontType0"}if(d==="OpenType"){u="OpenType"}if(u==="CIDFontType0"){if(c(t)){d="CIDFontType0"}else if(l(t)){u=d="OpenType"}else{d="CIDFontType0C"}}var I;switch(u){case"MMType1":p("MMType1 font ("+e+"), falling back to Type1.");case"Type1":case"CIDFontType0":this.mimetype="font/opentype";var T=d==="Type1C"||d==="CIDFontType0C"?new ye(t,r):new be(e,t,r);se(r);I=this.convert(e,T,r);break;case"OpenType":case"TrueType":case"CIDFontType2":this.mimetype="font/opentype";I=this.checkAndRepair(e,t,r);if(this.isOpenType){se(r);u="OpenType"}break;default:v("Font "+u+" is not supported");break}this.data=I;this.fontType=le(u,d);this.fontMatrix=r.fontMatrix;this.widths=r.widths;this.defaultWidth=r.defaultWidth;this.toUnicode=r.toUnicode;this.encoding=r.baseEncoding;this.seacMap=r.seacMap;this.loading=true}t.getFontID=function(){var e=1;return function t(){return String(e++)}}();function r(e,t){return(e<<8)+t}function a(e,t){var r=(e<<8)+t;return r&1<<15?r-65536:r}function i(e,t,r,a){return(e<<24)+(t<<16)+(r<<8)+a}function n(e){return String.fromCharCode(e>>8&255,e&255)}function s(e){e=e>32767?32767:e<-32768?-32768:e;return String.fromCharCode(e>>8&255,e&255)}function o(e){var t=e.peekBytes(4);return k(t,0)===65536}function l(e){var t=e.peekBytes(4);return g(t)==="OTTO"}function c(e){var t=e.peekBytes(2);if(t[0]===37&&t[1]===33){return true}if(t[0]===128&&t[1]===1){return true}return false}function h(e,t,r){var a=[],i;for(var n=0,s=e.length;n>1;if(e=t){continue}r.push({fontCharCode:a|0,glyphId:e[a]})}r.sort(function e(t,r){return t.fontCharCode-r.fontCharCode});var i=[];var n=r.length;for(var s=0;s65535?2:1;var i="\0\0"+n(a)+"\0"+"\0"+C(4+a*8);var s,o,l,c;for(s=r.length-1;s>=0;--s){if(r[s][0]<=65535){break}}var h=s+1;if(r[s][0]<65535&&r[s][1]===65535){r[s][1]=65534}var u=r[s][1]<65535?1:0;var f=h+u;var d=de.getSearchParams(f,2);var g="";var v="";var p="";var m="";var b="";var y=0;var k,w,x,A;for(s=0,o=h;s0){v+="ÿÿ";g+="ÿÿ";p+="\0";m+="\0\0"}var T="\0\0"+n(2*f)+n(d.range)+n(d.entry)+n(d.rangeShift)+v+"\0\0"+g+p+m+b;var O="";var P="";if(a>1){i+="\0"+"\0\n"+C(4+a*8+4+T.length);O="";for(s=0,o=r.length;sn){return false}t.getBytes(6);var s=t.getUint16();if(s===0){return false}e.data[8]=e.data[9]=0;return true}function H(e,t,r){r=r||{unitsPerEm:0,yMax:0,yMin:0,ascent:0,descent:0};var a=0;var i=0;var s=0;var o=0;var l=null;var c=0;if(t){for(var h in t){h|=0;if(l>h||!l){l=h}if(c 123 are reserved for internal usage")}}}else{l=0;c=255}var d=e.bbox||[0,0,0,0];var g=r.unitsPerEm||1/(e.fontMatrix||u)[0];var p=e.ascentScaled?1:g/re;var m=r.ascent||Math.round(p*(e.ascent||d[3]));var b=r.descent||Math.round(p*(e.descent||d[1]));if(b>0&&e.descent>0&&d[1]<0){b=-b}var y=r.yMax||m;var k=-r.yMin||-b;return"\0"+"$"+"ô"+"\0"+"\0\0"+"Š"+"»"+"\0\0"+"\0Œ"+"Š"+"»"+"\0\0"+"ß"+"\x001"+""+"\0\0"+"\0\0"+String.fromCharCode(e.fixedPitch?9:0)+"\0\0\0\0\0\0"+C(a)+C(i)+C(s)+C(o)+"*21*"+n(e.italicAngle?1:0)+n(l||e.firstChar)+n(c||e.lastChar)+n(m)+n(b)+"\0d"+n(y)+n(k)+"\0\0\0\0"+"\0\0\0\0"+n(e.xHeight)+n(e.capHeight)+n(0)+n(l||e.firstChar)+"\0"}function W(e){var t=Math.floor(e.italicAngle*Math.pow(2,16));return"\0\0\0"+C(t)+"\0\0"+"\0\0"+C(e.fixedPitch)+"\0\0\0\0"+"\0\0\0\0"+"\0\0\0\0"+"\0\0\0\0"}function V(e,t){if(!t){t=[[],[]]}var r=[t[0][0]||"Original licence",t[0][1]||e,t[0][2]||"Unknown",t[0][3]||"uniqueID",t[0][4]||e,t[0][5]||"Version 0.11",t[0][6]||"",t[0][7]||"Unknown",t[0][8]||"Unknown",t[0][9]||"Unknown"];var a=[];var i,s,o,l,c;for(i=0,s=r.length;i>>0;var a=e.getInt32()>>>0;var i=e.getInt32()>>>0;var n=e.pos;e.pos=e.start?e.start:0;e.skip(a);var s=e.getBytes(i);e.pos=n;if(t==="head"){s[8]=s[9]=s[10]=s[11]=0;s[17]|=32}return{tag:t,checksum:r,length:i,offset:a,data:s}}function l(e){return{version:g(e.getBytes(4)),numTables:e.getUint16(),searchRange:e.getUint16(),entrySelector:e.getUint16(),rangeShift:e.getUint16()}}function c(e,t,r,a){if(!e){x("No cmap table available.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:false}}var i;var n=(t.start?t.start:0)+e.offset;t.pos=n;var s=t.getUint16();var o=t.getUint16();var l;var c=false;for(var h=0;h>>0;var g=false;if(u===0&&f===0){g=true}else if(u===1&&f===0){g=true}else if(u===3&&f===1&&(!r&&a||!l)){g=true;if(!r){c=true}}else if(r&&u===3&&f===0){g=true;c=true}if(g){l={platformId:u,encodingId:f,offset:d}}if(c){break}}if(l){t.pos=n+l.offset}if(!l||t.peekByte()===-1){x("Could not find a preferred cmap table.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:false}}var v=t.getUint16();var p=t.getUint16();var m=t.getUint16();var b=false;var y=[];var k,w;if(v===0){for(k=0;k<256;k++){var C=t.getByte();if(!C){continue}y.push({charCode:k,glyphId:C})}b=true}else if(v===4){var S=t.getUint16()>>1;t.getBytes(6);var A,I=[];for(A=0;A>1)-(S-A);i.offsetIndex=T;B=Math.max(B,T+i.end-i.start+1)}var O=[];for(k=0;ka){p("The numOfMetrics ("+i+") should not be "+"greater than the numGlyphs ("+a+")");i=a;t.data[34]=(i&65280)>>8;t.data[35]=i&255}var n=a-i;var s=n-(r.length-i*4>>1);if(s>0){var o=new Uint8Array(r.length+s*2);o.set(r.data);r.data=o}}function u(e,t,r,a,i,n){if(r-t<=12){return 0}var s=e.subarray(t,r);var o=s[0]<<8|s[1];if(o&32768){a.set(s,i);return s.length}var l,c=10,h=0;for(l=0;ls.length){return 0}if(!n&&d>0){a.set(s.subarray(0,f),i);a.set([0,0],i+f);a.set(s.subarray(g,y),i+f+2);y-=d;if(s.length-y>3){y=y+3&~3}return y}if(s.length-y>3){y=y+3&~3;a.set(s.subarray(0,y),i);return y}a.set(s,i);return s.length}function f(e,t,a){var n=e.data;var s=i(n[0],n[1],n[2],n[3]);if(s>>16!==1){p("Attempting to fix invalid version in head table: "+s);n[0]=0;n[1]=1;n[2]=0;n[3]=0}var o=r(n[50],n[51]);if(o<0||o>1){p("Attempting to fix invalid indexToLocFormat in head table: "+o);var l=t+1;if(a===l<<1){n[50]=0;n[51]=0}else if(a===l<<2){n[50]=0;n[51]=1}else{x("Could not fix indexToLocFormat: "+o)}}}function m(e,t,r,a,i,n){var s,o,l;if(a){s=4;o=function e(t,r){return t[r]<<24|t[r+1]<<16|t[r+2]<<8|t[r+3]};l=function e(t,r,a){t[r]=a>>>24&255;t[r+1]=a>>16&255;t[r+2]=a>>8&255;t[r+3]=a&255}}else{s=2;o=function e(t,r){return t[r]<<9|t[r+1]<<1};l=function e(t,r,a){t[r]=a>>9&255;t[r+1]=a>>1&255}}var c=e.data;var h=s*(1+r);if(c.length!==h){c=new Uint8Array(h);c.set(e.data.subarray(0,h));e.data=c}var f=t.data;var d=f.length;var g=new Uint8Array(d);var v=o(c,0);var p=0;var m=Object.create(null);l(c,0,p);var b,y;for(b=0,y=s;bd&&(d+3&~3)===k){k=d}if(k>d){l(c,y,p);v=k;continue}if(v===k){m[b]=true}var w=u(f,v,k,g,p,i);p+=w;l(c,y,p);v=k}if(p===0){var C=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(b=0,y=s;bx+p){t.data=g.subarray(0,x+p)}else{t.data=new Uint8Array(x+p);t.data.set(g.subarray(0,p))}t.data.set(g.subarray(0,x),p);l(e.data,c.length-s,p+x)}else{t.data=g.subarray(0,p)}return m}function k(e,t,r){var a=(n.start?n.start:0)+e.offset;n.pos=a;var i=e.length,s=a+i;var o=n.getInt32();n.getBytes(28);var l;var c=true;var h;switch(o){case 65536:l=ne;break;case 131072:var u=n.getUint16();if(u!==r){c=false;break}var f=[];for(h=0;h=32768){c=false;break}f.push(d)}if(!c){break}var g=[];var v=[];while(n.posi){continue}n.pos=m;var b=p.name;if(p.encoding){var y="";for(var k=0,w=p.length;k0){a+=k-1}}}if(!v&&!m){var w=y<=142?C[y]:y>=192&&y<=223?-1:y>=224?-2:0;if(y>=113&&y<=117){n=u.pop();if(!isNaN(n)){w=-n*2}}while(w<0&&u.length>0){u.pop();w++}while(w>0){u.push(NaN);w--}}}t.tooComplexToFollowFunctions=g;var S=[r];if(a>r.length){S.push(new Uint8Array(a-r.length))}if(h>c){x("TT: complementing a missing function tail");S.push(new Uint8Array([34,45]))}T(e,S)}function R(e,t){if(e.tooComplexToFollowFunctions){return}if(e.functionsDefined.length>t){x("TT: more functions defined than expected");e.hintsValid=false;return}for(var r=0,a=e.functionsUsed.length;rt){x("TT: invalid function id: "+r);e.hintsValid=false;return}if(e.functionsUsed[r]&&!e.functionsDefined[r]){x("TT: undefined function: "+r);e.hintsValid=false;return}}}function T(e,t){if(t.length>1){var r=0;var a,i;for(a=0,i=t.length;a=65536&&q["maxp"].length>=22){n.pos+=8;var Q=n.getUint16();if(Q>2){q["maxp"].data[14]=0;q["maxp"].data[15]=2}n.pos+=4;Z=n.getUint16()}var $=false;if(s.type==="CIDFontType2"&&s.toUnicode&&s.toUnicode.get(0)>"\0"){$=true;J++;q["maxp"].data[4]=J>>8;q["maxp"].data[5]=J&255}var ee=E(q["fpgm"],q["prep"],q["cvt "],Z);if(!ee){delete q["fpgm"];delete q["prep"];delete q["cvt "]}h(n,q["hhea"],q["hmtx"],J);if(!q["head"]){v('Required "head" table is not found')}f(q["head"],J,K?q["loca"].length:0);var te=Object.create(null);if(K){var re=r(q["head"].data[50],q["head"].data[51]);te=m(q["loca"],q["glyf"],J,re,ee,$)}if(!q["hhea"]){v('Required "hhea" table is not found')}if(q["hhea"].data[10]===0&&q["hhea"].data[11]===0){q["hhea"].data[10]=255;q["hhea"].data[11]=255}var ie={unitsPerEm:r(q["head"].data[18],q["head"].data[19]),yMax:r(q["head"].data[42],q["head"].data[43]),yMin:a(q["head"].data[38],q["head"].data[39]),ascent:r(q["hhea"].data[4],q["hhea"].data[5]),descent:a(q["hhea"].data[6],q["hhea"].data[7])};this.ascent=ie.ascent/ie.unitsPerEm;this.descent=ie.descent/ie.unitsPerEm;if(q["post"]){var oe=k(q["post"],s,J);if(!oe){q["post"]=null}}var le=[],he;var ue=s.toUnicode,ge=s.widths;var ve=ue instanceof fe||ue.length===65536;function pe(e,t,r){if(!te[e]){return true}if(!ve&&t>=0&&ue.has(t)){return true}if(ge&&r>=0&&y(ge[r])){return true}return false}if(s.composite){var me=s.cidToGidMap||[];var be=me.length===0;s.cMap.forEach(function(e,t){d(t<=65535,"Max size of CID is 65,535");var r=-1;if(be){r=t}else if(me[t]!==undefined){r=me[t]}if(r>=0&&r0&&pe(Me,-1,-1)){le[he]=Me;Pe=true}}if(!Pe){le[he]=0}}}else if(we===0&&Ce===0){for(_=0;_=0){a[n]=i}else{a[n]=0}}}else if(o){for(n in t){a[n]=t[n]}}else{s=O;for(n=0;n=0){a[n]=i}else{a[n]=0}}}var l=e.differences,c;if(l){for(n in l){var h=l[n];i=r.indexOf(h);if(i===-1){if(!c){c=B()}var u=ce(h,c);if(u!==h){i=r.indexOf(u)}}if(i>=0){a[n]=i}else{a[n]=0}}}return a}var be=function e(){function t(e,t,r){var a=e.length;var i=t.length;var n=a-i;var s=r,o,l=false;while(s=i){s+=o;while(s=0){s[o]=i}}}return me(t,s,a)},getSeacs:function e(t){var r,a;var i=[];for(r=0,a=t.length;r>8&255,d&255)}s.charset=new Q(false,0,[],h);var g=new Z;g.add([139,14]);for(u=0;u0;w--){k[w]-=k[w-1]}}p.setByName(y,k)}s.topDict.privateDict=p;var C=new Z;for(u=0,f=i.length;u=0&&(r>=65&&r<=90||r>=97&&r<=122)){a.push(String.fromCharCode(r))}var s=a.join("");switch(s.toLowerCase()){case"if":return l.IF;case"ifelse":return l.IFELSE;default:return l.getOperator(s)}},getNumber:function e(){var t=this.currentChar;var r=this.strBuf;r.length=0;r[0]=String.fromCharCode(t);while((t=this.nextChar())>=0){if(t>=48&&t<=57||t===45||t===46){r.push(String.fromCharCode(t))}else{break}}var i=parseFloat(r.join(""));if(isNaN(i)){a("Invalid floating point number: "+i)}return i}};return t}();e.PostScriptLexer=c;e.PostScriptParser=s});(function(e,t){t(e.pdfjsCoreFunction={},e.pdfjsSharedUtil,e.pdfjsCorePrimitives,e.pdfjsCorePsParser)})(this,function(e,t,r,a){var i=t.error;var n=t.info;var s=t.isArray;var o=t.isBool;var l=r.isDict;var c=r.isStream;var h=a.PostScriptLexer;var u=a.PostScriptParser;var f=function e(){var t=0;var r=2;var a=3;var o=4;return{getSampleArray:function e(t,r,a,i){var n,s;var o=1;for(n=0,s=t.length;n>c)*u;h&=(1<a){t=a}else if(t0){g=a[f-1]}var v=r[1];if(f>1;var l=r.length>>1;var c=new v(i);var h=Object.create(null);var u=2048*4;var f=u;var d=new Float32Array(l);return function e(t,r,i,n){var s,u;var g="";var v=d;for(s=0;sk){u=k}}m[s]=u}if(f>0){f--;h[g]=m}i.set(m,n)}}}}();function d(e){var t;if(typeof e!=="object"){return false}else if(l(e)){t=e}else if(c(e)){t=e.dict}else{return false}return t.has("FunctionType")}var g=function e(){var t=100;function r(e){this.stack=!e?[]:Array.prototype.slice.call(e,0)}r.prototype={push:function e(r){if(this.stack.length>=t){i("PostScript function stack overflow.")}this.stack.push(r)},pop:function e(){if(this.stack.length<=0){i("PostScript function stack underflow.")}return this.stack.pop()},copy:function e(r){if(this.stack.length+r>=t){i("PostScript function stack overflow.")}var a=this.stack;for(var n=a.length-r,s=r-1;s>=0;s--,n++){a.push(a[n])}},index:function e(t){this.push(this.stack[this.stack.length-t-1])},roll:function e(t,r){var a=this.stack;var i=a.length-t;var n=a.length-1,s=i+(r-Math.floor(r/t)*t),o,l,c;for(o=i,l=n;o0){r.push(c<>h)}break;case"ceiling":c=r.pop();r.push(Math.ceil(c));break;case"copy":c=r.pop();r.copy(c);break;case"cos":c=r.pop();r.push(Math.cos(c));break;case"cvi":c=r.pop()|0;r.push(c);break;case"cvr":break;case"div":h=r.pop();c=r.pop();r.push(c/h);break;case"dup":r.copy(1);break;case"eq":h=r.pop();c=r.pop();r.push(c===h);break;case"exch":r.roll(2,1);break;case"exp":h=r.pop();c=r.pop();r.push(Math.pow(c,h));break;case"false":r.push(false);break;case"floor":c=r.pop();r.push(Math.floor(c));break;case"ge":h=r.pop();c=r.pop();r.push(c>=h);break;case"gt":h=r.pop();c=r.pop();r.push(c>h);break;case"idiv":h=r.pop();c=r.pop();r.push(c/h|0);break;case"index":c=r.pop();r.index(c);break;case"le":h=r.pop();c=r.pop();r.push(c<=h);break;case"ln":c=r.pop();r.push(Math.log(c));break;case"log":c=r.pop();r.push(Math.log(c)/Math.LN10);break;case"lt":h=r.pop();c=r.pop();r.push(c=t){return new a(t)}else if(e.max<=t){return e}return new n(e,t)}function d(){}d.prototype={compile:function e(t,i,n){var d=[];var g,v;var p=[];var m=i.length>>1,b=n.length>>1;var y=0;var k,w;var C,x,S,A,I,B;for(g=0;ge.min){s.unshift("Math.max(",a,", ");s.push(")")}if(id&&this.name!=="DeviceGray"&&this.name!=="DeviceRGB"){var m=l<=8?new Uint8Array(d):new Uint16Array(d);var b;for(v=0;v255?255:n;a[i]=a[i+1]=a[i+2]=n},getRgbBuffer:function e(t,r,a,i,n,s,o){var l=255/((1<255?255:n;a[i+1]=s<0?0:s>255?255:s;a[i+2]=o<0?0:o>255?255:o},getRgbBuffer:function e(t,r,a,i,n,s,o){if(s===8&&o===0){i.set(t.subarray(r,r+a*3),n);return}var l=255/((1<255?255:c<0?0:c;a[i+1]=h>255?255:h<0?0:h;a[i+2]=u>255?255:u<0?0:u}function r(){this.name="DeviceCMYK";this.numComps=4;this.defaultColor=new Float32Array(this.numComps);this.defaultColor[3]=1}r.prototype={getRgb:g.prototype.getRgb,getRgbItem:function e(r,a,i,n){t(r,a,1,i,n)},getRgbBuffer:function e(r,a,i,n,s,o,l){var c=1/((1<8){return Math.pow((e+16)/116,3)}return e*h}function y(e,t,r){if(e[0]===0&&e[1]===0&&e[2]===0){r[0]=t[0];r[1]=t[1];r[2]=t[2];return}var a=b(0);var i=a;var n=b(e[0]);var s=a;var o=b(e[1]);var l=a;var c=b(e[2]);var h=(1-i)/(1-n);var u=1-h;var f=(1-s)/(1-o);var d=1-f;var g=(1-l)/(1-c);var v=1-g;r[0]=t[0]*h+u;r[1]=t[1]*f+d;r[2]=t[2]*g+v}function k(e,a,i){if(e[0]===1&&e[2]===1){i[0]=a[0];i[1]=a[1];i[2]=a[2];return}var n=i;f(t,a,n);var s=o;d(e,n,s);f(r,s,i)}function w(e,a,i){var n=i;f(t,a,n);var s=o;v(e,n,s);f(r,s,i)}function C(e,t,r,i,n,o){var h=m(0,1,t[r]*o);var u=m(0,1,t[r+1]*o);var d=m(0,1,t[r+2]*o);var g=Math.pow(h,e.GR);var v=Math.pow(u,e.GG);var b=Math.pow(d,e.GB);var C=e.MXA*g+e.MXB*v+e.MXC*b;var x=e.MYA*g+e.MYB*v+e.MYC*b;var S=e.MZA*g+e.MZB*v+e.MZC*b;var A=l;A[0]=C;A[1]=x;A[2]=S;var I=c;k(e.whitePoint,A,I);var B=l;y(e.blackPoint,I,B);var R=c;w(s,B,R);var T=l;f(a,R,T);var O=p(T[0]);var P=p(T[1]);var E=p(T[2]);i[n]=Math.round(O*255);i[n+1]=Math.round(P*255);i[n+2]=Math.round(E*255)}u.prototype={getRgb:function e(t,r){var a=new Uint8Array(3);this.getRgbItem(t,r,a,0);return a},getRgbItem:function e(t,r,a,i){C(this,t,r,a,i,1)},getRgbBuffer:function e(t,r,a,i,n,s,o){var l=1/((1<this.amax||this.bmin>this.bmax){n("Invalid Range, falling back to defaults");this.amin=-100;this.amax=100;this.bmin=-100;this.bmax=100}}function r(e){var t;if(e>=6/29){t=e*e*e}else{t=108/841*(e-4/29)}return t}function a(e,t,r,a){return r+e*(a-r)/t}function s(e,t,i,n,s,o){var l=t[i];var c=t[i+1];var h=t[i+2];if(n!==false){l=a(l,n,0,100);c=a(c,n,e.amin,e.amax);h=a(h,n,e.bmin,e.bmax)}c=c>e.amax?e.amax:ce.bmax?e.bmax:h=1?255:Math.sqrt(m)*255|0;s[o+1]=b<=0?0:b>=1?255:Math.sqrt(b)*255|0;s[o+2]=y<=0?0:y>=1?255:Math.sqrt(y)*255|0}t.prototype={getRgb:g.prototype.getRgb,getRgbItem:function e(t,r,a,i){s(this,t,r,false,a,i)},getRgbBuffer:function e(t,r,a,i,n,o,l){var c=(1<a?a:e}function a(e,t,r,a,i,n){var s=i*n;var o=t<=8?new Uint8Array(s):t<=16?new Uint16Array(s):new Uint32Array(s);var l=r/i;var c=a/n;var h,u,f,d=0,g;var v=new Uint16Array(i);var p=r;for(h=0;h>3)*a;var o=t.byteLength;var l=s===o;var c,h;if(i&&(!n||l)){c=t}else if(!n){c=new Uint8Array(o);c.set(t)}else{c=new Uint8Array(s);c.set(t);for(h=o;h>7&1;l[u+1]=d>>6&1;l[u+2]=d>>5&1;l[u+3]=d>>4&1;l[u+4]=d>>3&1;l[u+5]=d>>2&1;l[u+6]=d>>1&1;l[u+7]=d&1;u+=8}if(u>=1}}}}else{var b=0;d=0;for(u=0,f=s;u>y;l[u]=k<0?0:k>h?h:k;d=d&(1<u[C+1]){y=255;break}}f[v]=y}}else{l("Unknown mask format.")}}if(f){for(v=0,m=3,p=r*s;v=255?255:h|0;t[d+1]=u<=0?0:u>=255?255:u|0;t[d+2]=f<=0?0:f>=255?255:f|0}},createImageData:function e(t){var r=this.drawWidth;var a=this.drawHeight;var i={width:r,height:a};var n=this.numComps;var l=this.width;var c=this.height;var h=this.bpc;var u=l*n*h+7>>3;var f;if(!t){var d;if(this.colorSpace.name==="DeviceGray"&&h===1){d=s.GRAYSCALE_1BPP}else if(this.colorSpace.name==="DeviceRGB"&&h===8&&!this.needsDecode){d=s.RGB_24BPP}if(d&&!this.smask&&!this.mask&&r===l&&a===c){i.kind=d;f=this.getImageBytes(c*u);if(this.image instanceof v){i.data=f}else{var g=new Uint8Array(f.length);g.set(f);i.data=g}if(this.needsDecode){o(d===s.GRAYSCALE_1BPP);var m=i.data;for(var b=0,y=m.length;b>3;var o=this.getImageBytes(i*s);var c=this.getComponents(o);var h,u;if(n===1){u=a*i;if(this.needsDecode){for(h=0;h0){var l=i.shift();var c=s.fetchIfRef(l.obj);if(c===null){continue}h(c.has("Title"),"Invalid outline item");var u={url:null,dest:null};t.parseDestDictionary({destDict:c,resultObj:u,docBaseUrl:this.pdfManager.docBaseUrl});var f=c.get("Title");var d=c.get("F")||0;var g=c.getArray("C"),p=o;if(v(g)&&g.length===3&&(g[0]!==0||g[1]!==0||g[2]!==0)){p=j.singletons.rgb.getRgb(g,0)}var m={dest:u.dest,url:u.url,unsafeUrl:u.unsafeUrl,newWindow:u.newWindow,title:k(f),color:p,count:c.get("Count"),bold:!!(d&2),italic:!!(d&1),items:[]};l.parent.items.push(m);r=c.getRaw("First");if(P(r)&&!n.has(r)){i.push({obj:r,parent:m});n.put(r)}r=c.getRaw("Next");if(P(r)&&!n.has(r)){i.push({obj:r,parent:l.parent});n.put(r)}}return a.items.length>0?a.items:null},get numPages(){var e=this.toplevelPagesDict.get("Count");h(m(e),"page count in top level pages object is not an integer");return y(this,"num",e)},get destinations(){function e(e){return O(e)?e.get("D"):e}var t=this.xref;var r={},a,i;var n=this.catDict.get("Names");if(n&&n.has("Dests")){a=n.getRaw("Dests")}else if(this.catDict.has("Dests")){i=this.catDict.get("Dests")}if(i){n=i;n.forEach(function t(a,i){if(!i){return}r[a]=e(i)})}if(a){var s=new z(a,t);var o=s.getAll();for(var l in o){r[l]=e(o[l])}}return y(this,"destinations",r)},getDestination:function e(t){function r(e){return O(e)?e.get("D"):e}var a=this.xref;var i=null,n,s;var o=this.catDict.get("Names");if(o&&o.has("Dests")){n=o.getRaw("Dests")}else if(this.catDict.has("Dests")){s=this.catDict.get("Dests")}if(s){var l=s.get(t);if(l){i=r(l)}}if(n){var c=new z(n,a);i=r(c.get(t))}return i},get pageLabels(){var e=null;try{e=this.readPageLabels()}catch(e){if(e instanceof l){throw e}C("Unable to read page labels.")}return y(this,"pageLabels",e)},readPageLabels:function e(){var t=this.catDict.getRaw("PageLabels");if(!t){return null}var r=new Array(this.numPages);var a=null;var i="";var n=new H(t,this.xref);var s=n.getAll();var o="",l=1;for(var c=0,u=this.numPages;c=1,"Invalid start in PageLabel dictionary.");l=p||1}switch(a){case"D":o=l;break;case"R":case"r":o=S.toRoman(l,a==="r");break;case"A":case"a":var y=26;var w=65,C=97;var x=a==="a"?C:w;var A=l-1;var I=String.fromCharCode(x+A%y);var B=[];for(var T=0,P=A/y|0;T<=P;T++){B.push(I)}o=B.join("");break;default:h(!a,'Invalid style "'+a+'" in PageLabel dictionary.')}r[c]=i+o;o="";l++}return r},get attachments(){var e=this.xref;var t=null,r;var a=this.catDict.get("Names");if(a){r=a.getRaw("EmbeddedFiles")}if(r){var i=new z(r,e);var n=i.getAll();for(var s in n){var o=new G(n[s],e);if(!t){t=Object.create(null)}t[k(s)]=o.serializable}}return y(this,"attachments",t)},get javaScript(){var e=this.xref;var t=this.catDict.get("Names");var r=[];function a(e){var t=e.get("S");if(!R(t,"JavaScript")){return}var a=e.get("JS");if(M(a)){a=u(a.getBytes())}else if(!b(a)){return}r.push(k(a))}if(t&&t.has("JavaScript")){var i=new z(t.getRaw("JavaScript"),e);var n=i.getAll();for(var s in n){var o=n[s];if(O(o)){a(o)}}}var l=this.catDict.get("OpenAction");if(O(l,"Action")){var c=l.get("S");if(R(c,"Named")){var h=l.get("N");if(R(h,"Print")){r.push("print({});")}}else{a(l)}}return y(this,"javaScript",r)},cleanup:function e(){var t=[];this.fontCache.forEach(function(e){t.push(e)});return Promise.all(t).then(function(e){for(var t=0,r=e.length;t=0;u--){a.push(c[u])}}}r.reject("Page index "+t+" not found.")}o();return r.promise},getPageIndex:function e(t){var r=this.xref;function a(e){var a=0;var i;return r.fetchAsync(e).then(function(r){if(E(e,t)&&!O(r,"Page")&&!(O(r)&&!r.has("Type")&&r.has("Contents"))){throw new Error("The reference does not point to a /Page Dict.")}if(!r){return null}h(O(r),"node must be a Dict.");i=r.getRaw("Parent");return r.getAsync("Parent")}).then(function(e){if(!e){return null}h(O(e),"parent must be a Dict.");return e.getAsync("Kids")}).then(function(t){if(!t){return null}var n=[];var s=false;for(var o=0;o0){var h=c[0];var u=c[1];if(!m(h)||!m(u)){d("Invalid XRef range fields: "+h+", "+u)}if(!m(s)||!m(o)||!m(l)){d("Invalid XRef entry fields length: "+h+", "+u)}for(r=i.entryNum;r=e.length){break}i+=String.fromCharCode(n);n=e[t]}return i}function c(e,t,r){var a=r.length,i=e.length;var n=0;while(t=a){break}t++;n++}return n}var h=/^(\d+)\s+(\d+)\s+obj\b/;var u=new Uint8Array([116,114,97,105,108,101,114]);var f=new Uint8Array([115,116,97,114,116,120,114,101,102]);var d=new Uint8Array([101,110,100,111,98,106]);var g=new Uint8Array([47,88,82,101,102]);this.entries.length=0;var v=this.stream;v.pos=0;var p=v.getBytes();var m=v.start,b=p.length;var y=[],k=[];while(m=b){break}w=p[m]}while(w!==r&&w!==a);continue}var C=l(p,m);var x;if(C.indexOf("xref")===0&&(C.length===4||/\s/.test(C[4]))){m+=c(p,m,u);y.push(m);m+=c(p,m,f)}else if(x=h.exec(C)){if(typeof this.entries[x[1]]==="undefined"){this.entries[x[1]]={offset:m-v.start,gen:x[2]|0,uncompressed:true}}var S=c(p,m,d)+7;var A=p.subarray(m,m+S);var I=c(A,0,g);if(I0){var n,s;var o=r.fetchIfRef(i.shift());if(!O(o)){continue}if(o.has("Kids")){var l=o.get("Kids");for(n=0,s=l.length;nn){C('Search depth limit reached for "'+this._type+'" tree.');return null}var c=a.get("Kids");if(!v(c)){return null}s=0;o=c.length-1;while(s<=o){l=s+o>>1;var h=r.fetchIfRef(c[l]);var u=h.get("Limits");if(tr.fetchIfRef(u[1])){s=l+1}else{a=r.fetchIfRef(c[l]);break}}if(s>o){return null}}var f=a.get(this._type);if(v(f)){s=0;o=f.length-2;while(s<=o){l=s+o&~1;var d=r.fetchIfRef(f[l]);if(td){s=l+2}else{return r.fetchIfRef(f[l+1])}}}return null}};return t}();var z=function e(){function t(e,t){this.root=e;this.xref=t;this._type="Names"}S.inherit(t,_,{});return t}();var H=function e(){function t(e,t){this.root=e;this.xref=t;this._type="Nums"}S.inherit(t,_,{});return t}();var G=function e(){function t(e,t){if(!e||!O(e)){return}this.xref=t;this.root=e;if(e.has("FS")){this.fs=e.get("FS")}this.description=e.has("Desc")?k(e.get("Desc")):"";if(e.has("RF")){C("Related file specifications are not supported")}this.contentAvailable=true;if(!e.has("EF")){this.contentAvailable=false;C("Non-embedded file specifications are not supported")}}function r(e){if(e.has("UF")){return e.get("UF")}else if(e.has("F")){return e.get("F")}else if(e.has("Unix")){return e.get("Unix")}else if(e.has("Mac")){return e.get("Mac")}else if(e.has("DOS")){return e.get("DOS")}return null}t.prototype={get filename(){if(!this._filename&&this.root){var e=r(this.root)||"unnamed";this._filename=k(e).replace(/\\\\/g,"\\").replace(/\\\//g,"/").replace(/\\/g,"/")}return this._filename},get content(){if(!this.contentAvailable){return null}if(!this.contentRef&&this.root){this.contentRef=r(this.root.get("EF"))}var e=null;if(this.contentRef){var t=this.xref;var a=t.fetchIfRef(this.contentRef);if(a&&M(a)){e=a.getBytes()}else{C("Embedded file specification points to non-existing/invalid "+"content")}}else{C("Embedded file specification does not have a content")}return e},get serializable(){return{filename:this.filename,content:this.content}}};return t}();var X=function(){function e(e){return P(e)||O(e)||v(e)||M(e)}function t(t,r){var a;if(O(t)||M(t)){var i;if(O(t)){i=t.map}else{i=t.dict.map}for(var n in i){a=i[n];if(e(a)){r.push(a)}}}else if(v(t)){for(var s=0,o=t.length;s=s||R<=0){h("Bad shading domain.");return}var O=new Float32Array(i.numComps),P=new Float32Array(1);var E;for(var M=n;M<=s;M+=R){P[0]=M;I(P,0,O,0);E=i.getRgb(O,0);var L=o.makeCssRgb(E[0],E[1],E[2]);T.push([(M-n)/B,L])}var D="transparent";if(e.has("Background")){E=i.getRgb(e.get("Background"),0);D=o.makeCssRgb(E[0],E[1],E[2])}if(!c){T.unshift([0,D]);T[1][0]+=m.SMALL_NUMBER}if(!f){T[T.length-1][0]-=m.SMALL_NUMBER;T.push([1,D])}this.colorStops=T}t.prototype={getIR:function e(){var t=this.coordsArr;var r=this.shadingType;var a,i,n,s,l;if(r===v.AXIAL){i=[t[0],t[1]];n=[t[2],t[3]];s=null;l=null;a="axial"}else if(r===v.RADIAL){i=[t[0],t[1]];n=[t[3],t[4]];s=t[2];l=t[5];a="radial"}else{c("getPattern type unknown: "+r)}var h=this.matrix;if(h){i=o.applyTransform(i,h);n=o.applyTransform(n,h);if(r===v.RADIAL){var u=o.singularValueDecompose2dScale(h);s*=u[0];l*=u[1]}}return["RadialAxial",a,this.colorStops,i,n,s,l]}};return t}();m.Mesh=function e(){function t(e,t){this.stream=e;this.context=t;this.buffer=0;this.bufferLength=0;var r=t.numComps;this.tmpCompsBuf=new Float32Array(r);var a=t.colorSpace.numComps;this.tmpCsCompsBuf=t.colorFn?new Float32Array(a):this.tmpCompsBuf}t.prototype={get hasData(){if(this.stream.end){return this.stream.pos0){return true}var e=this.stream.getByte();if(e<0){return false}this.buffer=e;this.bufferLength=8;return true},readBits:function e(t){var r=this.buffer;var a=this.bufferLength;if(t===32){if(a===0){return(this.stream.getByte()<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte())>>>0}r=r<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte();var i=this.stream.getByte();this.buffer=i&(1<>a)>>>0}if(t===8&&a===0){return this.stream.getByte()}while(a>a},align:function e(){this.buffer=0;this.bufferLength=0},readFlag:function e(){return this.readBits(this.context.bitsPerFlag)},readCoordinate:function e(){var t=this.context.bitsPerCoordinate;var r=this.readBits(t);var a=this.readBits(t);var i=this.context.decode;var n=t<32?1/((1<o?o:t;r=r>l?l:r;a=a=2,"Invalid VerticesPerRow");a(this,x,A);break;case v.COONS_PATCH_MESH:u(this,x);S=true;break;case v.TENSOR_PATCH_MESH:p(this,x);S=true;break;default:c("Unsupported mesh type.");break}if(S){m(this);for(var I=0,B=this.figures.length;If){M("Image exceeded maximum allowed size and was removed.");return}var d=c.get("ImageMask","IM")||false;var g,v;if(d){var p=c.get("Width","W");var m=c.get("Height","H");var b=p+7>>3;var y=a.getBytes(b*m);var k=c.getArray("Decode","D");var w=!!k&&k[0]>0;g=V.createMask(y,p,m,a instanceof _,w);g.cached=true;v=[g];n.addOp(C.paintImageMaskXObject,v);if(s){o[s]={fn:C.paintImageMaskXObject,args:v}}return}var x=c.get("SMask","SM")||false;var S=c.get("Mask")||false;var A=200;if(i&&!x&&!S&&!(a instanceof z)&&h+u0){a.addOp(C.setGState,[o])}})},loadFont:function e(t,r,a,i){function n(){return Promise.resolve(new Se("g_font_error",new J("Font "+t+" is not available"),r))}var s;if(r){A(q(r));s=r}else{var o=i.get("Font");if(o){s=o.getRaw(t)}else{M("fontRes not available");return n()}}if(!s){M("fontRef not available");return n()}if(this.fontCache.has(s)){return this.fontCache.get(s)}r=a.fetchIfRef(s);if(!U(r)){return n()}if(r.translated){return r.translated}var l=I();var c=this.preEvaluateFont(r,a);var h=c.descriptor;var u=q(s),f;if(u){f=s.toString()}if(U(h)){if(!h.fontAliases){h.fontAliases=Object.create(null)}var d=h.fontAliases;var g=c.hash;if(d[g]){var v=d[g].aliasRef;if(u&&v&&this.fontCache.has(v)){this.fontCache.putAlias(s,v);return this.fontCache.get(s)}}else{d[g]={fontID:Q.getFontID()}}if(u){d[g].aliasRef=s}f=d[g].fontID}if(u){this.fontCache.put(s,l.promise)}else{if(!f){f=this.idFactory.createObjId()}this.fontCache.put("id_"+f,l.promise)}A(f,'The "fontID" must be defined.');r.loadedName="g_"+this.pdfManager.docId+"_f"+f;r.translated=l.promise;var p;try{p=this.translateFont(c,a)}catch(e){p=Promise.reject(e)}var m=this;p.then(function(e){if(e.fontType!==undefined){var t=a.stats.fontTypes;t[e.fontType]=true}l.resolve(new Se(r.loadedName,e,r))},function(e){m.handler.send("UnsupportedFeature",{featureId:k.font});try{var t=c.descriptor;var i=t&&t.get("FontFile3");var n=i&&i.get("Subtype");var s=te(c.type,n&&n.name);var o=a.stats.fontTypes;o[s]=true}catch(e){}l.resolve(new Se(r.loadedName,new J(e instanceof Error?e.message:e),r))});return l.promise},buildPath:function e(t,r,a){var i=t.length-1;if(!a){a=[]}if(i<0||t.fnArray[i]!==C.constructPath){t.addOp(C.constructPath,[[r],a])}else{var n=t.argsArray[i];n[0].push(r);Array.prototype.push.apply(n[1],a)}},handleColorN:function e(t,r,a,i,n,s,o,h){var u=a[a.length-1];var f;if(j(u)&&(f=n.get(u.name))){var d=N(f)?f.dict:f;var g=d.get("PatternType");if(g===l){var v=i.base?i.base.getRgb(a,0):null;return this.handleTilingType(r,v,s,f,d,t,o)}else if(g===c){var p=d.get("Shading");var m=d.getArray("Matrix");f=ie.parseShading(p,m,h,s,this.handler);t.addOp(r,f.getIR());return Promise.resolve()}return Promise.reject("Unknown PatternType: "+g)}t.addOp(r,a);return Promise.resolve()},getOperatorList:function e(t,r,a,i,n){var l=this;var c=this.xref;var h=Object.create(null);A(i);a=a||L.empty;var u=a.get("XObject")||L.empty;var f=a.get("Pattern")||L.empty;var d=new Ie(n||new Re);var g=new Te(t,c,d);var v=new s;return new Promise(function e(t,n){var s=function(r){r.then(function(){try{e(t,n)}catch(e){n(e)}},n)};r.ensureNotTerminated();v.reset();var p,m={},b,y,k;while(!(p=v.check())){m.args=null;if(!g.read(m)){break}var w=m.args;var x=m.fn;switch(x|0){case C.paintXObject:if(w[0].code){break}var S=w[0].name;if(!S){M("XObject must be referred to by name.");continue}if(h[S]!==undefined){i.addOp(h[S].fn,h[S].args);w=null;continue}var I=u.get(S);if(I){A(N(I),"XObject should be a stream");var T=I.dict.get("Subtype");A(j(T),"XObject should have a Name subtype");if(T.name==="Form"){d.save();s(l.buildFormXObject(a,I,null,i,r,d.state.clone()).then(function(){d.restore()}));return}else if(T.name==="Image"){l.buildPaintImageXObject(a,I,false,i,S,h);w=null;continue}else if(T.name==="PS"){R("Ignored XObject subtype PS");continue}else{B("Unhandled XObject subtype "+T.name)}}break;case C.setFont:var E=w[1];s(l.handleSetFont(a,w,null,i,r,d.state).then(function(e){i.addDependency(e);i.addOp(C.setFont,[e,E])}));return;case C.endInlineImage:var D=w[0].cacheKey;if(D){var F=h[D];if(F!==undefined){i.addOp(F.fn,F.args);w=null;continue}}l.buildPaintImageXObject(a,w[0],true,i,D,h);w=null;continue;case C.showText:w[0]=l.handleText(w[0],d.state);break;case C.showSpacedText:var q=w[0];var _=[];var z=q.length;var H=d.state;for(b=0;b0){r=r*x.fontMatrix[3];t[3]*=r}}var a=S.transform(x.ctm,S.transform(x.textMatrix,t));u.transform=a;if(!e.vertical){u.width=0;u.height=Math.sqrt(a[2]*a[2]+a[3]*a[3]);u.vertical=false}else{u.width=Math.sqrt(a[0]*a[0]+a[1]*a[1]);u.height=0;u.vertical=true}var i=x.textLineMatrix[0];var n=x.textLineMatrix[1];var s=Math.sqrt(i*i+n*n);i=x.ctm[0];n=x.ctm[1];var o=Math.sqrt(i*i+n*n);u.textAdvanceScale=o*s;u.lastAdvanceWidth=0;u.lastAdvanceHeight=0;var l=e.spaceWidth/1e3*x.fontSize;if(l){u.spaceWidth=l;u.fakeSpaceMin=l*f;u.fakeMultiSpaceMin=l*d;u.fakeMultiSpaceMax=l*g;u.textRunBreakAllowed=!e.isMonospace}else{u.spaceWidth=0;u.fakeSpaceMin=Infinity;u.fakeMultiSpaceMin=Infinity;u.fakeMultiSpaceMax=0;u.textRunBreakAllowed=false}u.initialized=true;return u}function B(e){var t=0,r=e.length,a;while(t=32&&a<=127){t++}return t0){M(v,r.str)}}var p=0;var m=0;if(!t.vertical){var b=u*x.fontMatrix[0];p=(b*x.fontSize+g)*x.textHScale;a+=p}else{var y=u*x.fontMatrix[0];m=y*x.fontSize+g;i+=m}x.translateTextMatrix(p,m);r.str.push(f)}if(!t.vertical){r.lastAdvanceWidth=a;r.width+=a}else{r.lastAdvanceHeight=i;r.height+=Math.abs(i)}return r}function M(e,t){if(e0){t.push(" ")}}function D(){if(!u.initialized){return}u.width*=u.textAdvanceScale;u.height*=u.textAdvanceScale;h.items.push(R(u));u.initialized=false;u.str.length=0}var F=new s;return new Promise(function e(t,s){var c=function(r){r.then(function(){try{e(t,s)}catch(e){s(e)}},s)};r.ensureNotTerminated();F.reset();var f,d={},g=[];while(!(f=F.check())){g.length=0;d.args=g;if(!w.read(d)){break}x=i.state;var p=d.fn;g=d.args;var b,B;switch(p|0){case C.setFont:var R=g[0].name,q=g[1];if(x.font&&R===x.fontName&&q===x.fontSize){break}D();x.fontName=R;x.fontSize=q;c(P(R,null));return;case C.setTextRise:D();x.textRise=g[0];break;case C.setHScale:D();x.textHScale=g[0]/100;break;case C.setLeading:D();x.leading=g[0];break;case C.moveText:var _=!x.font?false:(x.font.vertical?g[0]:g[1])===0;b=g[0]-g[1];if(l&&_&&u.initialized&&b>0&&b<=u.fakeMultiSpaceMax){x.translateTextLineMatrix(g[0],g[1]);u.width+=g[0]-u.lastAdvanceWidth;u.height+=g[1]-u.lastAdvanceHeight;B=g[0]-u.lastAdvanceWidth-(g[1]-u.lastAdvanceHeight);M(B,u.str);break}D();x.translateTextLineMatrix(g[0],g[1]);x.textMatrix=x.textLineMatrix.slice();break;case C.setLeadingMoveText:D();x.leading=-g[1];x.translateTextLineMatrix(g[0],g[1]);x.textMatrix=x.textLineMatrix.slice();break;case C.nextLine:D();x.carriageReturn();break;case C.setTextMatrix:b=x.calcTextLineMatrixAdvance(g[0],g[1],g[2],g[3],g[4],g[5]);if(l&&b!==null&&u.initialized&&b.value>0&&b.value<=u.fakeMultiSpaceMax){x.translateTextLineMatrix(b.width,b.height);u.width+=b.width-u.lastAdvanceWidth;u.height+=b.height-u.lastAdvanceHeight;B=b.width-u.lastAdvanceWidth-(b.height-u.lastAdvanceHeight);M(B,u.str);break}D();x.setTextMatrix(g[0],g[1],g[2],g[3],g[4],g[5]);x.setTextLineMatrix(g[0],g[1],g[2],g[3],g[4],g[5]);break;case C.setCharSpacing:x.charSpacing=g[0];break;case C.setWordSpacing:x.wordSpacing=g[0];break;case C.beginText:D();x.textMatrix=y.slice();x.textLineMatrix=y.slice();break;case C.showSpacedText:var z=g[0];var H;for(var G=0,X=z.length;Gu.fakeMultiSpaceMax;if(!W){u.height+=H}}else{b=-b;H=b*x.textHScale;x.translateTextMatrix(H,0);W=u.textRunBreakAllowed&&b>u.fakeMultiSpaceMax;if(!W){u.width+=H}}if(W){D()}else if(b>0){M(b,u.str)}}}break;case C.showText:E(g[0]);break;case C.nextLineShowText:D();x.carriageReturn();E(g[0]);break;case C.nextLineSetSpacingShowText:D();x.wordSpacing=g[0];x.charSpacing=g[1];x.carriageReturn();E(g[2]);break;case C.paintXObject:D();if(g[0].code){break}if(!m){m=a.get("XObject")||L.empty}var V=g[0].name;if(k.key===V){if(k.texts){S.appendToArray(h.items,k.texts.items);S.extendObj(h.styles,k.texts.styles)}break}var K=m.get(V);if(!K){break}A(N(K),"XObject should be a stream");var Y=K.dict.get("Subtype");A(j(Y),"XObject should have a Name subtype");if("Form"!==Y.name){k.key=V;k.texts=null;break}i.save();var J=K.dict.getArray("Matrix");if(T(J)&&J.length===6){i.transform(J)}c(v.getTextContent(K,r,K.dict.get("Resources")||a,i,n,l).then(function(e){S.appendToArray(h.items,e.items);S.extendObj(h.styles,e.styles);i.restore();k.key=V;k.texts=e}));return;case C.setGState:D();var Z=g[0];var Q=a.get("ExtGState");if(!U(Q)||!j(Z)){break}var $=Q.get(Z.name);if(!U($)){break}var ee=$.get("Font");if(ee){x.fontName=null;x.fontSize=ee[1];c(P(null,ee[0]));return}break}}if(f){c(o);return}D();t(h)})},extractDataStructures:function e(t,r,a,i){var n=t.get("ToUnicode")||r.get("ToUnicode");var s=n?this.readToUnicode(n):Promise.resolve(undefined);if(i.composite){var o=t.get("CIDSystemInfo");if(U(o)){i.cidSystemInfo={registry:o.get("Registry"),ordering:o.get("Ordering"),supplement:o.get("Supplement")}}var l=t.get("CIDToGIDMap");if(N(l)){i.cidToGidMap=this.readCidToGidMap(l)}}var c=[];var h=null;var u;if(t.has("Encoding")){u=t.get("Encoding");if(U(u)){h=u.get("BaseEncoding");h=j(h)?h.name:null;if(u.has("Differences")){var f=u.get("Differences");var d=0;for(var g=0,v=f.length;g0;i.dict=t;return s.then(function(e){i.toUnicode=e;return this.buildToUnicode(i)}.bind(this)).then(function(e){i.toUnicode=e;return i})},buildToUnicode:function e(t){t.hasIncludedToUnicodeMap=!!t.toUnicode&&t.toUnicode.length>0;if(t.hasIncludedToUnicodeMap){return Promise.resolve(t.toUnicode)}var r,a,i;if(!t.composite){r=[];var n=t.defaultEncoding.slice();var s=t.baseEncodingName;var o=t.differences;for(a in o){i=o[a];if(i===".notdef"){continue}n[a]=i}var l=Ce();for(a in n){i=n[a];if(i===""){continue}else if(l[i]===undefined){var c=0;switch(i[0]){case"G":if(i.length===3){c=parseInt(i.substr(1),16)}break;case"g":if(i.length===5){c=parseInt(i.substr(1),16)}break;case"C":case"c":if(i.length>=3){c=+i.substr(1)}break;default:var h=we(i,l);if(h!==-1){c=h}}if(c){if(s&&c===+a){var u=ve(s);if(u&&(i=u[a])){r[a]=String.fromCharCode(l[i]);continue}}r[a]=String.fromCharCode(c)}continue}r[a]=String.fromCharCode(l[i])}return Promise.resolve(new ee(r))}if(t.composite&&(t.cMap.builtInCMap&&!(t.cMap instanceof oe)||t.cidSystemInfo.registry==="Adobe"&&(t.cidSystemInfo.ordering==="GB1"||t.cidSystemInfo.ordering==="CNS1"||t.cidSystemInfo.ordering==="Japan1"||t.cidSystemInfo.ordering==="Korea1"))){var f=t.cidSystemInfo.registry;var d=t.cidSystemInfo.ordering;var g=D.get(f+"-"+d+"-UCS2");return se.create(g,this.options.cMapOptions,null).then(function(e){var a=t.cMap;r=[];a.forEach(function(t,a){A(a<=65535,"Max size of CID is 65,535");var i=e.lookup(a);if(i){r[t]=String.fromCharCode((i.charCodeAt(0)<<8)+i.charCodeAt(1))}});return new ee(r)})}return Promise.resolve(new $(t.firstChar,t.lastChar))},readToUnicode:function e(t){var r=t;if(j(r)){return se.create(r,this.options.cMapOptions,null).then(function(e){if(e instanceof oe){return new $(0,65535)}return new ee(e.getMap())})}else if(N(r)){return se.create(r,this.options.cMapOptions,null).then(function(e){if(e instanceof oe){return new $(0,65535)}var t=new Array(e.length);e.forEach(function(e,r){var a=[];for(var i=0;i>1;a[o]=s}return a},extractWidths:function e(t,r,a,i){var n=[];var s=0;var o=[];var l;var c,h,u,f,d,g,v;if(i.composite){s=t.get("DW")||1e3;v=t.get("W");if(v){for(c=0,h=v.length;c=t){this.flush()}else if(this.fnArray.length>=r&&(e===C.restore||e===C.endText)){this.flush()}}},addDependency:function(e){if(e in this.dependencies){return}this.dependencies[e]=true;this.addOp(C.dependency,[e])},addDependencies:function(e){for(var t in e){this.addDependency(t)}},addOpList:function(e){S.extendObj(this.dependencies,e.dependencies);for(var t=0,r=e.length;to){c.push(r.shift());l--}while(lo){R("Command "+s+": expected [0,"+o+"] args, but received "+l+" args.")}this.preprocessCommand(s,r);t.fn=s;t.args=r;return true}if(W(a)){return false}if(a!==null){if(r===null){r=[]}r.push(a);A(r.length<=33,"Too many arguments")}}},preprocessCommand:function e(t,r){switch(t|0){case C.save:this.stateManager.save();break;case C.restore:this.stateManager.restore();break;case C.transform:this.stateManager.transform(r);break}}};return r}();var Oe=function e(){function t(e,t,r){var a=e;for(var i=0,n=t.length-1;ii){v=Math.max(v,b);y+=m+2*n;b=0;m=0}p.push({transform:x,x:b,y:y,w:S.width,h:S.height});b+=S.width+2*n;m=Math.max(m,S.height)}var A=Math.max(v,b)+n;var I=y+m+n;var B=new Uint8Array(A*I*4);var R=A<<2;for(k=0;k=0){T[E-4]=T[E];T[E-3]=T[E+1];T[E-2]=T[E+2];T[E-1]=T[E+3];T[E+O]=T[E+O-4];T[E+O+1]=T[E+O-3];T[E+O+2]=T[E+O-2];T[E+O+3]=T[E+O-1];E-=R}}s.splice(c,g*4,C.paintInlineImageXObjectGroup);o.splice(c,g*4,[{width:A,height:I,kind:w.RGBA_32BPP,data:B},p]);return c+1});t(a,[C.save,C.transform,C.paintImageMaskXObject,C.restore],function e(t){var a=10;var i=100;var n=1e3;var s=t.fnArray,o=t.argsArray;var l=t.iCurr;var c=l-3;var h=l-2;var u=l-1;var f=c+4;var d=s.length;while(f+3=4&&a[s-4]===a[o]&&a[s-3]===a[l]&&a[s-2]===a[c]&&a[s-1]===a[h]&&i[s-4][0]===u&&i[s-4][1]===f){v++;p-=5}var m=p+4;for(var b=1;b0?t:0},hasFlag:function e(t){return this._hasFlag(this.flags,t)},setRectangle:function e(t){if(g(t)&&t.length===4){this.rectangle=f.normalizeRect(t)}else{this.rectangle=[0,0,0,0]}},setColor:function e(t){var r=new Uint8Array(3);if(!g(t)){this.color=r;return}switch(t.length){case 0:this.color=null;break;case 1:S.singletons.gray.getRgbItem(t,0,r,0);this.color=r;break;case 3:S.singletons.rgb.getRgbItem(t,0,r,0);this.color=r;break;case 4:S.singletons.cmyk.getRgbItem(t,0,r,0);this.color=r;break;default:this.color=r;break}},setBorderStyle:function e(t){this.borderStyle=new P;if(!k(t)){return}if(t.has("BS")){var r=t.get("BS");var a=r.get("Type");if(!a||w(a,"Border")){this.borderStyle.setWidth(r.get("W"));this.borderStyle.setStyle(r.get("S"));this.borderStyle.setDashArray(r.getArray("D"))}}else if(t.has("Border")){var i=t.getArray("Border");if(g(i)&&i.length>=3){this.borderStyle.setHorizontalCornerRadius(i[0]);this.borderStyle.setVerticalCornerRadius(i[1]);this.borderStyle.setWidth(i[2]);if(i.length===4){this.borderStyle.setDashArray(i[3])}}}else{this.borderStyle.setWidth(0)}},_preparePopup:function e(t){if(!t.has("C")){this.data.color=null}this.data.hasPopup=t.has("Popup");this.data.title=m(t.get("T")||"");this.data.contents=m(t.get("Contents")||"")},loadResources:function e(t){return new Promise(function(e,r){this.appearance.dict.getAsync("Resources").then(function(a){if(!a){e();return}var i=new I(a.map,t,a.xref);i.load().then(function(){e(a)},r)},r)}.bind(this))},getOperatorList:function e(r,a,i){if(!this.appearance){return Promise.resolve(new R)}var n=this.data;var s=this.appearance.dict;var o=this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"]);var l=s.getArray("BBox")||[0,0,1,1];var c=s.getArray("Matrix")||[1,0,0,1,0,0];var h=t(n.rect,l,c);var f=this;return o.then(function(e){var t=new R;t.addOp(u.beginAnnotation,[n.rect,h,c]);return r.getOperatorList(f.appearance,a,e,t).then(function(){t.addOp(u.endAnnotation,[]);f.appearance.reset();return t})})}};a.appendToOperatorList=function e(t,r,a,i,n,s){var o=[];for(var l=0,c=t.length;l0){var r=true;var a=true;for(var i=0,n=t.length;i=0;if(!o){r=false;break}else if(s>0){a=false}}if(r&&!a){this.dashArray=t}else{this.width=0}}else if(t){this.width=0}},setHorizontalCornerRadius:function e(t){if(t===(t|0)){this.horizontalCornerRadius=t}},setVerticalCornerRadius:function e(t){if(t===(t|0)){this.verticalCornerRadius=t}}};return t}();var E=function e(){function t(e){O.call(this,e);var t=e.dict;var r=this.data;r.annotationType=h.WIDGET;r.fieldName=this._constructFieldName(t);r.fieldValue=f.getInheritableProperty(t,"V",true);r.alternativeText=m(t.get("TU")||"");r.defaultAppearance=f.getInheritableProperty(t,"DA")||"";var a=f.getInheritableProperty(t,"FT");r.fieldType=w(a)?a.name:null;this.fieldResources=f.getInheritableProperty(t,"DR")||y.empty;r.fieldFlags=f.getInheritableProperty(t,"Ff");if(!v(r.fieldFlags)||r.fieldFlags<0){r.fieldFlags=0}r.readOnly=this.hasFieldFlag(l.READONLY);if(r.fieldType==="Sig"){this.setFlags(c.HIDDEN)}}f.inherit(t,O,{_constructFieldName:function e(t){if(!t.has("T")&&!t.has("Parent")){b("Unknown field name, falling back to empty field name.");return""}if(!t.has("Parent")){return m(t.get("T"))}var r=[];if(t.has("T")){r.unshift(m(t.get("T")))}var a=t;while(a.has("Parent")){a=a.get("Parent");if(a.has("T")){r.unshift(m(a.get("T")))}}return r.join(".")},hasFieldFlag:function e(t){return!!(this.data.fieldFlags&t)}});return t}();var M=function e(){function t(e){E.call(this,e);this.data.fieldValue=m(this.data.fieldValue||"");var t=f.getInheritableProperty(e.dict,"Q");if(!v(t)||t<0||t>2){t=null}this.data.textAlignment=t;var r=f.getInheritableProperty(e.dict,"MaxLen");if(!v(r)||r<0){r=null}this.data.maxLen=r;this.data.multiLine=this.hasFieldFlag(l.MULTILINE);this.data.comb=this.hasFieldFlag(l.COMB)&&!this.hasFieldFlag(l.MULTILINE)&&!this.hasFieldFlag(l.PASSWORD)&&!this.hasFieldFlag(l.FILESELECT)&&this.data.maxLen!==null}f.inherit(t,E,{getOperatorList:function e(t,r,a){var i=new R;if(a){return Promise.resolve(i)}if(this.appearance){return O.prototype.getOperatorList.call(this,t,r,a)}if(!this.data.defaultAppearance){return Promise.resolve(i)}var n=new x(p(this.data.defaultAppearance));return t.getOperatorList(n,r,this.fieldResources,i).then(function(){return i})}});return t}();var L=function e(){function t(e){E.call(this,e);this.data.checkBox=!this.hasFieldFlag(l.RADIO)&&!this.hasFieldFlag(l.PUSHBUTTON);if(this.data.checkBox){if(!w(this.data.fieldValue)){return}this.data.fieldValue=this.data.fieldValue.name}this.data.radioButton=this.hasFieldFlag(l.RADIO)&&!this.hasFieldFlag(l.PUSHBUTTON);if(this.data.radioButton){this.data.fieldValue=this.data.buttonValue=null;var t=e.dict.get("Parent");if(!k(t)||!t.has("V")){return}var r=t.get("V");if(!w(r)){return}this.data.fieldValue=r.name;var a=e.dict.get("AP");if(!k(a)){return}var i=a.get("N");if(!k(i)){return}var n=i.getKeys();for(var s=0,o=n.length;ss){w("Page_getInheritedPageProp: maximum loop count exceeded.");break}a=a.get("Parent")}if(!i){return x.empty}if(i.length===1||!S(i[0])||n>s){return i[0]}return x.merge(this.xref,i)},get content(){return this.getPageProp("Contents")},get resources(){return b(this,"resources",this.getInheritedPageProp("Resources"))},get mediaBox(){var e=this.getInheritedPageProp("MediaBox",true);if(!g(e)||e.length!==4){return b(this,"mediaBox",r)}return b(this,"mediaBox",e)},get cropBox(){var e=this.getInheritedPageProp("CropBox",true);if(!g(e)||e.length!==4){return b(this,"cropBox",this.mediaBox)}return b(this,"cropBox",e)},get userUnit(){var e=this.getPageProp("UserUnit");if(!p(e)||e<=0){e=t}return b(this,"userUnit",e)},get view(){var e=this.mediaBox,t=this.cropBox;if(e===t){return b(this,"view",e)}var r=h.intersect(t,e);return b(this,"view",r||e)},get rotate(){var e=this.getInheritedPageProp("Rotate")||0;if(e%90!==0){e=0}else if(e>=360){e=e%360}else if(e<0){e=(e%360+360)%360}return b(this,"rotate",e)},getContentStream:function e(){var t=this.content;var r;if(g(t)){var a=this.xref;var i,n=t.length;var s=[];for(i=0;i0,"stream must have data");this.pdfManager=e;this.stream=r;this.xref=new E(r,e)}function i(e,t,r,a){var i=e.pos;var n=e.end;var s=[];if(i+r>n){r=n-i}for(var o=0;o0){s-=a-"startxref".length;if(s<0){s=0}e.pos=s;n=i(e,"startxref",a,true)}if(n){e.skip(9);var o;do{o=e.getByte()}while(C(o));var l="";while(o>=32&&o<=57){l+=String.fromCharCode(o);o=e.getByte()}t=parseInt(l,10);if(isNaN(t)){t=0}}}return b(this,"startXRef",t)},get mainXRefEntriesOffset(){var e=0;var t=this.linearization;if(t){e=t.mainXRefEntriesOffset}return b(this,"mainXRefEntriesOffset",e)},checkHeader:function e(){var t=this.stream;t.reset();if(i(t,"%PDF-",1024)){t.moveStart();var r=12;var a="",n;while((n=t.getByte())>32){if(a.length>=r){break}a+=String.fromCharCode(n)}if(!this.pdfFormatVersion){this.pdfFormatVersion=a.substring(5)}return}},parseStartXRef:function e(){var t=this.startXRef;this.xref.setStartXRef(t)},setup:function e(t){this.xref.parse(t);var r=this;var a={createPage:function(e,t,a,i){return new q(r.pdfManager,r.xref,e,t,a,i)}};this.catalog=new O(this.pdfManager,this.xref,a)},get numPages(){var e=this.linearization;var t=e?e.numPages:this.catalog.numPages;return b(this,"numPages",t)},get documentInfo(){var e={PDFFormatVersion:this.pdfFormatVersion,IsAcroFormPresent:!!this.acroForm,IsXFAPresent:!!this.xfa};var t;try{t=this.xref.trailer.get("Info")}catch(e){d("The document information dictionary is invalid.")}if(t){var r=n.entries;for(var a in r){if(t.has(a)){var i=t.get(a);if(r[a](i)){e[a]=typeof i!=="string"?i:k(i)}else{d('Bad value in document info for "'+a+'"')}}}}return b(this,"documentInfo",e)},get fingerprint(){var e=this.xref,a,i="";var n=e.trailer.get("ID");if(n&&g(n)&&n[0]&&m(n[0])&&n[0]!==r){a=y(n[0])}else{if(this.stream.ensureRange){this.stream.ensureRange(0,Math.min(t,this.stream.end))}a=L(this.stream.bytes.subarray(0,t),0,t)}for(var s=0,o=a.length;s0){this._queuedChunks.push(r)}this._msgHandler=t;this._isRangeSupported=!e.disableRange;this._isStreamingSupported=!e.disableStream;this._contentLength=e.length;this._fullRequestReader=null;this._rangeReaders=[];t.on("OnDataRange",this._onReceiveData.bind(this));t.on("OnDataProgress",this._onProgress.bind(this))}t.prototype={_onReceiveData:function e(t){if(t.begin===undefined){if(this._fullRequestReader){this._fullRequestReader._enqueue(t.chunk)}else{this._queuedChunks.push(t.chunk)}}else{var r=this._rangeReaders.some(function(e){if(e._begin!==t.begin){return false}e._enqueue(t.chunk);return true});v(r)}},_onProgress:function e(t){if(this._rangeReaders.length>0){var r=this._rangeReaders[0];if(r.onProgress){r.onProgress({loaded:t.loaded})}}},_removeRangeReader:function e(t){var r=this._rangeReaders.indexOf(t);if(r>=0){this._rangeReaders.splice(r,1)}},getFullReader:function e(){v(!this._fullRequestReader);var t=this._queuedChunks;this._queuedChunks=null;return new r(this,t)},getRangeReader:function e(t,r){var i=new a(this,t,r);this._msgHandler.send("RequestDataRange",{begin:t,end:r});this._rangeReaders.push(i);return i},cancelAllRequests:function e(t){if(this._fullRequestReader){this._fullRequestReader.cancel(t)}var r=this._rangeReaders.slice(0);r.forEach(function(e){e.cancel(t)})}};function r(e,t){this._stream=e;this._done=false;this._queuedChunks=t||[];this._requests=[];this._headersReady=Promise.resolve();e._fullRequestReader=this;this.onProgress=null}r.prototype={_enqueue:function e(t){if(this._done){return}if(this._requests.length>0){var r=this._requests.shift();r.resolve({value:t,done:false});return}this._queuedChunks.push(t)},get headersReady(){return this._headersReady},get isRangeSupported(){return this._stream._isRangeSupported},get isStreamingSupported(){return this._stream._isStreamingSupported},get contentLength(){return this._stream._contentLength},read:function e(){if(this._queuedChunks.length>0){var t=this._queuedChunks.shift();return Promise.resolve({value:t,done:false})}if(this._done){return Promise.resolve({value:undefined,done:true})}var r=p();this._requests.push(r);return r.promise},cancel:function e(t){this._done=true;this._requests.forEach(function(e){e.resolve({value:undefined,done:true})});this._requests=[]}};function a(e,t,r){this._stream=e;this._begin=t;this._end=r;this._queuedChunk=null;this._requests=[];this._done=false;this.onProgress=null}a.prototype={_enqueue:function e(t){if(this._done){return}if(this._requests.length===0){this._queuedChunk=t}else{var r=this._requests.shift();r.resolve({value:t,done:false});this._requests.forEach(function(e){e.resolve({value:undefined,done:true})});this._requests=[]}this._done=true;this._stream._removeRangeReader(this)},get isStreamingSupported(){return false},read:function e(){if(this._queuedChunk){return Promise.resolve({value:this._queuedChunk,done:false})}if(this._done){return Promise.resolve({value:undefined,done:true})}var t=p();this._requests.push(t);return t.promise},cancel:function e(t){this._done=true;this._requests.forEach(function(e){e.resolve({value:undefined,done:true})});this._requests=[];this._stream._removeRangeReader(this)}};return t}();var B;function R(e){B=e}var T={setup:function e(t,r){var a=false;t.on("test",function e(r){if(a){return}a=true;if(!(r instanceof Uint8Array)){t.send("test","main",false);return}var i=r[0]===255;t.postMessageTransfers=i;var n=new XMLHttpRequest;var s="response"in n;try{var o=n.responseType}catch(e){s=false}if(!s){t.send("test",false);return}t.send("test",{supportTypedArray:true,supportTransfers:i})});t.on("configure",function e(t){k(t.verbosity)});t.on("GetDocRequest",function e(t){return T.createDocumentHandler(t,r)})},createDocumentHandler:function e(t,r){var a;var h=false;var m=null;var k=[];var S=t.docId;var R=t.docBaseUrl;var T=t.docId+"_worker";var O=new s(T,S,r);O.postMessageTransfers=t.postMessageTransfers;function P(){if(h){throw new Error("Worker was terminated")}}function E(e){k.push(e)}function M(e){e.finish();var t=k.indexOf(e);k.splice(t,1)}function L(e){var t=p();var r=function e(){var r=a.ensureDoc("numPages");var n=a.ensureDoc("fingerprint");var s=a.ensureXRef("encrypt");Promise.all([r,n,s]).then(function e(r){var a={numPages:r[0],fingerprint:r[1],encrypted:!!r[2]};t.resolve(a)},i)};var i=function e(r){t.reject(r)};a.ensureDoc("checkHeader",[]).then(function(){a.ensureDoc("parseStartXRef",[]).then(function(){a.ensureDoc("parse",[e]).then(r,i)},i)},i);return t.promise}function D(e,t){var r=p();var a;var i=e.source;if(i.data){try{a=new C(S,i.data,i.password,t,R);r.resolve(a)}catch(e){r.reject(e)}return r.promise}var n;try{if(i.chunkedViewerLoading){n=new I(i,O)}else{v(B,"pdfjs/core/network module is not loaded");n=new B(e)}}catch(e){r.reject(e);return r.promise}var s=n.getFullReader();s.headersReady.then(function(){if(!s.isStreamingSupported||!s.isRangeSupported){s.onProgress=function(e){O.send("DocProgress",{loaded:e.loaded,total:e.total})}}if(!s.isRangeSupported){return}var e=i.disableAutoFetch||s.isStreamingSupported;a=new x(S,n,{msgHandler:O,url:i.url,password:i.password,length:s.contentLength,disableAutoFetch:e,rangeChunkSize:i.rangeChunkSize},t,R);r.resolve(a);m=null}).catch(function(e){r.reject(e);m=null});var o=[],l=0;var c=function(){var e=g(o);if(i.length&&e.length!==i.length){y("reported HTTP length is different from actual")}try{a=new C(S,e,i.password,t,R);r.resolve(a)}catch(e){r.reject(e)}o=[]};var h=new Promise(function(e,t){var r=function(e){try{P();if(e.done){if(!a){c()}m=null;return}var i=e.value;l+=d(i);if(!s.isStreamingSupported){O.send("DocProgress",{loaded:l,total:Math.max(l,s.contentLength||0)})}if(a){a.sendProgressiveData(i)}else{o.push(i)}s.read().then(r,t)}catch(e){t(e)}};s.read().then(r,t)});h.catch(function(e){r.reject(e);m=null});m=function(){n.cancelAllRequests("abort")};return r.promise}function F(e){function t(e){P();O.send("GetDoc",{pdfInfo:e})}function r(e){if(e instanceof c){var t=new A("PasswordException: response "+e.code);E(t);O.sendWithPromise("PasswordRequest",e).then(function(e){M(t);a.updatePassword(e.password);i()}).catch(function(e){M(t);O.send("PasswordException",e)}.bind(null,e))}else if(e instanceof n){O.send("InvalidPDF",e)}else if(e instanceof o){O.send("MissingPDF",e)}else if(e instanceof l){O.send("UnexpectedResponse",e)}else{O.send("UnknownError",new u(e.message,e.toString()))}}function i(){P();L(false).then(t,function e(i){P();if(!(i instanceof f)){r(i);return}a.requestLoadedStream();a.onLoadedStream().then(function(){P();L(true).then(t,r)})},r)}P();var s={url:e.cMapUrl===undefined?null:e.cMapUrl,packed:e.cMapPacked===true};var d={forceDataSchema:e.disableCreateObjectURL,maxImageSize:e.maxImageSize===undefined?-1:e.maxImageSize,disableFontFace:e.disableFontFace,cMapOptions:s};D(e,d).then(function(e){if(h){e.terminate();throw new Error("Worker was terminated")}a=e;O.send("PDFManagerReady",null);a.onLoadedStream().then(function(e){O.send("DataLoaded",{length:e.bytes.byteLength})})}).then(i,r)}O.on("GetPage",function e(t){return a.getPage(t.pageIndex).then(function(e){var t=a.ensure(e,"rotate");var r=a.ensure(e,"ref");var i=a.ensure(e,"userUnit");var n=a.ensure(e,"view");return Promise.all([t,r,i,n]).then(function(e){return{rotate:e[0],ref:e[1],userUnit:e[2],view:e[3]}})})});O.on("GetPageIndex",function e(t){var r=new w(t.ref.num,t.ref.gen);var i=a.pdfDocument.catalog;return i.getPageIndex(r)});O.on("GetDestinations",function e(t){return a.ensureCatalog("destinations")});O.on("GetDestination",function e(t){return a.ensureCatalog("getDestination",[t.id])});O.on("GetPageLabels",function e(t){return a.ensureCatalog("pageLabels")});O.on("GetAttachments",function e(t){return a.ensureCatalog("attachments")});O.on("GetJavaScript",function e(t){return a.ensureCatalog("javaScript")});O.on("GetOutline",function e(t){return a.ensureCatalog("documentOutline")});O.on("GetMetadata",function e(t){return Promise.all([a.ensureDoc("documentInfo"),a.ensureCatalog("metadata")])});O.on("GetData",function e(t){a.requestLoadedStream();return a.onLoadedStream().then(function(e){return e.bytes})});O.on("GetStats",function e(t){return a.pdfDocument.xref.stats});O.on("GetAnnotations",function e(t){return a.getPage(t.pageIndex).then(function(e){return a.ensure(e,"getAnnotationsData",[t.intent])})});O.on("RenderPageRequest",function e(t){var r=t.pageIndex;a.getPage(r).then(function(e){var a=new A("RenderPageRequest: page "+r);E(a);var n=r+1;var s=Date.now();e.getOperatorList(O,a,t.intent,t.renderInteractiveForms).then(function(e){M(a);b("page="+n+" - getOperatorList: time="+(Date.now()-s)+"ms, len="+e.totalLength)},function(e){M(a);if(a.terminated){return}O.send("UnsupportedFeature",{featureId:i.unknown});var r="worker.js: while trying to getPage() and getOperatorList()";var s;if(typeof e==="string"){s={message:e,stack:r}}else if(typeof e==="object"){s={message:e.message||e.toString(),stack:e.stack||r}}else{s={message:"Unknown exception type: "+typeof e,stack:r}}O.send("PageError",{pageNum:n,error:s,intent:t.intent})})})},this);O.on("GetTextContent",function e(t){var r=t.pageIndex;var i=t.normalizeWhitespace;var n=t.combineTextItems;return a.getPage(r).then(function(e){var t=new A("GetTextContent: page "+r);E(t);var a=r+1;var s=Date.now();return e.extractTextContent(t,i,n).then(function(e){M(t);b("text indexing: page="+a+" - time="+(Date.now()-s)+"ms");return e},function(e){M(t);if(t.terminated){return}throw e})})});O.on("Cleanup",function e(t){return a.cleanup()});O.on("Terminate",function e(t){h=true;if(a){a.terminate();a=null}if(m){m()}var r=[];k.forEach(function(e){r.push(e.finished);e.terminate()});return Promise.all(r).then(function(){O.destroy();O=null})});O.on("Ready",function e(r){F(t);t=null});return T}};function O(){if(!("console"in S)){var e={};var t={log:function e(){var t=Array.prototype.slice.call(arguments);S.postMessage({targetName:"main",action:"console_log",data:t})},error:function e(){var t=Array.prototype.slice.call(arguments);S.postMessage({targetName:"main",action:"console_error",data:t});throw"pdf.js execution error"},time:function t(r){e[r]=Date.now()},timeEnd:function t(r){var a=e[r];if(!a){m("Unknown timer name "+r)}this.log("Timer:",r,Date.now()-a)}};S.console=t}var r=new s("worker","main",self);T.setup(r,self);r.send("ready",null)}if(typeof window==="undefined"&&!(typeof module!=="undefined"&&module.require)){O()}e.setPDFNetworkStreamClass=R;e.WorkerTask=A;e.WorkerMessageHandler=T});(function(e,t){t(e.pdfjsCoreNetwork={},e.pdfjsSharedUtil,e.pdfjsCoreWorker)})(this,function(e,t,r){var a=200;var i=206;function n(e,t){this.url=e;t=t||{};this.isHttp=/^https?:/i.test(e);this.httpHeaders=this.isHttp&&t.httpHeaders||{};this.withCredentials=t.withCredentials||false;this.getXhr=t.getXhr||function e(){return new XMLHttpRequest};this.currXhrId=0;this.pendingRequests=Object.create(null);this.loadedRequests=Object.create(null)}function s(e){var t=e.response;if(typeof t!=="string"){return t}var r=t.length;var a=new Uint8Array(r);for(var i=0;i=2&&n.onHeadersReceived){n.onHeadersReceived();delete n.onHeadersReceived}if(o.readyState!==4){return}if(!(t in this.pendingRequests)){return}delete this.pendingRequests[t];if(o.status===0&&this.isHttp){if(n.onError){n.onError(o.status)}return}var l=o.status||a;var c=l===a&&n.expectedStatus===i;if(!c&&l!==n.expectedStatus){if(n.onError){n.onError(o.status)}return}this.loadedRequests[t]=true;var h=s(o);if(l===i){var u=o.getResponseHeader("Content-Range");var f=/bytes (\d+)-(\d+)\/(\d+)/.exec(u);var d=parseInt(f[1],10);n.onDone({begin:d,chunk:h})}else if(n.onProgressiveData){n.onDone(null)}else if(h){n.onDone({begin:0,chunk:h})}else if(n.onError){n.onError(o.status)}},hasPendingRequests:function e(){for(var t in this.pendingRequests){return true}return false},getRequestXhr:function e(t){return this.pendingRequests[t].xhr},isStreamingRequest:function e(t){return!!this.pendingRequests[t].onProgressiveData},isPendingRequest:function e(t){return t in this.pendingRequests},isLoadedRequest:function e(t){return t in this.loadedRequests},abortAllRequests:function e(){for(var t in this.pendingRequests){this.abortRequest(t|0)}},abortRequest:function e(t){var r=this.pendingRequests[t].xhr;delete this.pendingRequests[t];r.abort()}};var l=t.assert;var c=t.createPromiseCapability;var h=t.isInt;var u=t.MissingPDFException;var f=t.UnexpectedResponseException;function d(e){this._options=e;var t=e.source;this._manager=new n(t.url,{httpHeaders:t.httpHeaders,withCredentials:t.withCredentials});this._rangeChunkSize=t.rangeChunkSize;this._fullRequestReader=null;this._rangeRequestReaders=[]}d.prototype={_onRangeRequestReaderClosed:function e(t){var r=this._rangeRequestReaders.indexOf(t);if(r>=0){this._rangeRequestReaders.splice(r,1)}},getFullReader:function e(){l(!this._fullRequestReader);this._fullRequestReader=new g(this._manager,this._options);return this._fullRequestReader},getRangeReader:function e(t,r){var a=new v(this._manager,t,r);a.onClosed=this._onRangeRequestReaderClosed.bind(this);this._rangeRequestReaders.push(a);return a},cancelAllRequests:function e(t){if(this._fullRequestReader){this._fullRequestReader.cancel(t)}var r=this._rangeRequestReaders.slice(0);r.forEach(function(e){e.cancel(t)})}};function g(e,t){this._manager=e;var r=t.source;var a={onHeadersReceived:this._onHeadersReceived.bind(this),onProgressiveData:r.disableStream?null:this._onProgressiveData.bind(this),onDone:this._onDone.bind(this),onError:this._onError.bind(this),onProgress:this._onProgress.bind(this)};this._url=r.url;this._fullRequestId=e.requestFull(a);this._headersReceivedCapability=c();this._disableRange=t.disableRange||false;this._contentLength=r.length;this._rangeChunkSize=r.rangeChunkSize;if(!this._rangeChunkSize&&!this._disableRange){this._disableRange=true}this._isStreamingSupported=false;this._isRangeSupported=false;this._cachedChunks=[];this._requests=[];this._done=false;this._storedError=undefined;this.onProgress=null}g.prototype={_validateRangeRequestCapabilities:function e(){if(this._disableRange){return false}var t=this._manager;if(!t.isHttp){return false}var r=this._fullRequestId;var a=t.getRequestXhr(r);if(a.getResponseHeader("Accept-Ranges")!=="bytes"){return false}var i=a.getResponseHeader("Content-Encoding")||"identity";if(i!=="identity"){return false}var n=a.getResponseHeader("Content-Length");n=parseInt(n,10);if(!h(n)){return false}this._contentLength=n;if(n<=2*this._rangeChunkSize){return false}return true},_onHeadersReceived:function e(){if(this._validateRangeRequestCapabilities()){this._isRangeSupported=true}var t=this._manager;var r=this._fullRequestId;if(t.isStreamingRequest(r)){this._isStreamingSupported=true}else if(this._isRangeSupported){t.abortRequest(r)}this._headersReceivedCapability.resolve()},_onProgressiveData:function e(t){if(this._requests.length>0){var r=this._requests.shift();r.resolve({value:t,done:false})}else{this._cachedChunks.push(t)}},_onDone:function e(t){if(t){this._onProgressiveData(t.chunk)}this._done=true;if(this._cachedChunks.length>0){return}this._requests.forEach(function(e){e.resolve({value:undefined,done:true})});this._requests=[]},_onError:function e(t){var r=this._url;var a;if(t===404||t===0&&/^file:/.test(r)){a=new u('Missing PDF "'+r+'".')}else{a=new f("Unexpected server response ("+t+') while retrieving PDF "'+r+'".',t)}this._storedError=a;this._headersReceivedCapability.reject(a);this._requests.forEach(function(e){e.reject(a)});this._requests=[];this._cachedChunks=[]},_onProgress:function e(t){if(this.onProgress){this.onProgress({loaded:t.loaded,total:t.lengthComputable?t.total:this._contentLength})}},get isRangeSupported(){return this._isRangeSupported},get isStreamingSupported(){return this._isStreamingSupported},get contentLength(){return this._contentLength},get headersReady(){return this._headersReceivedCapability.promise},read:function e(){if(this._storedError){return Promise.reject(this._storedError)}if(this._cachedChunks.length>0){var t=this._cachedChunks.shift();return Promise.resolve(t)}if(this._done){return Promise.resolve({value:undefined,done:true})}var r=c();this._requests.push(r);return r.promise},cancel:function e(t){this._done=true;this._headersReceivedCapability.reject(t);this._requests.forEach(function(e){e.resolve({value:undefined,done:true})});this._requests=[];if(this._manager.isPendingRequest(this._fullRequestId)){this._manager.abortRequest(this._fullRequestId)}this._fullRequestReader=null}};function v(e,t,r){this._manager=e;var a={onDone:this._onDone.bind(this),onProgress:this._onProgress.bind(this)};this._requestId=e.requestRange(t,r,a);this._requests=[];this._queuedChunk=null;this._done=false;this.onProgress=null;this.onClosed=null}v.prototype={_close:function e(){if(this.onClosed){this.onClosed(this)}},_onDone:function e(t){var r=t.chunk;if(this._requests.length>0){var a=this._requests.shift();a.resolve({value:r,done:false})}else{this._queuedChunk=r}this._done=true;this._requests.forEach(function(e){e.resolve({value:undefined,done:true})});this._requests=[];this._close()},_onProgress:function e(t){if(!this.isStreamingSupported&&this.onProgress){this.onProgress({loaded:t.loaded})}},get isStreamingSupported(){return false},read:function e(){if(this._queuedChunk!==null){var t=this._queuedChunk;this._queuedChunk=null;return Promise.resolve({value:t,done:false})}if(this._done){return Promise.resolve({value:undefined,done:true})}var r=c();this._requests.push(r);return r.promise},cancel:function e(t){this._done=true;this._requests.forEach(function(e){e.resolve({value:undefined,done:true})});this._requests=[];if(this._manager.isPendingRequest(this._requestId)){this._manager.abortRequest(this._requestId)}this._close()}};r.setPDFNetworkStreamClass(d);e.PDFNetworkStream=d;e.NetworkManager=n})}).call(i);e.WorkerMessageHandler=i.pdfjsCoreWorker.WorkerMessageHandler}); ================================================ FILE: package.json ================================================ { "name": "flip-book", "version": "1.9.9", "description": "3D FlipBook allows to browse images, PDFs or HTMLs as a flipping book. It helps to attract user attention and make more impression on him.", "main": "dist/flip-book.js", "scripts": { "build-debug": "webpack --env.debug", "build-production": "webpack --display-modules", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { "type": "git", "url": "git+https://github.com/iberezansky/flip-book-jquery.git" }, "keywords": [ "jquery-plugin", "ecosystem:jquery", "flipbook", "jquery flipbook", "flip book", "pdf flipbook", "pdf to flip book", "flip gallery", "magazine", "mobile flipbook", "page flip", "page turn", "pageflip" ], "author": "iberezansky", "license": "GPL-2.0", "dependencies": { "babel-core": "^6.18.2", "babel-loader": "^6.2.7", "babel-plugin-transform-class-properties": "^6.18.0", "babel-preset-es2015": "^6.18.0", "babel-preset-stage-0": "^6.16.0", "html2canvas": "^0.5.0-beta4", "imports-loader": "^0.6.5", "jquery": "^3.1.1", "raw-loader": "^0.5.1", "three": "^0.81.2", "webpack": "^2.1.0-beta.27" }, "bugs": { "url": "https://github.com/iberezansky/flip-book-jquery/issues" }, "homepage": "https://github.com/iberezansky/flip-book-jquery#readme" } ================================================ FILE: src/3dflipbook.js ================================================ /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 72); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _$ = true ? window.jQuery : require('jquery'), _html2canvas = true ? window.html2canvas : require('html2canvas'), _THREE = true ? window.THREE : require('three'), _React = true ? window.React : require('react'), _ReactDOM = true ? window.ReactDOM : require('react-dom'), _PDFJS = true ? window.PDFJS : require('pdfjs'), _tr = function _tr(s) { return (window.iberezansky || {}).tr && window.iberezansky.tr(s) || s; }; exports.$ = _$; exports.html2canvas = _html2canvas; exports.THREE = _THREE; exports.React = _React; exports.ReactDOM = _ReactDOM; exports.PDFJS = _PDFJS; exports.tr = _tr; /***/ }, /* 1 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _$ = true ? window.jQuery : require('jquery'), _html2canvas = true ? window.html2canvas : require('html2canvas'), _THREE = true ? window.THREE : require('three'), _PDFJS = true ? window.PDFJS : require('pdfjs'), _tr = function _tr(s) { return (window.iberezansky || {}).tr && window.iberezansky.tr(s) || s; }; if (window.FB3D_LOCALE) { window.iberezansky = _extends({}, window.iberezansky, { tr: function tr(s) { return (FB3D_LOCALE.dictionary || {})[s] || s; } }); } exports.$ = _$; exports.html2canvas = _html2canvas; exports.THREE = _THREE; exports.PDFJS = _PDFJS; exports.tr = _tr; /***/ }, /* 2 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var BaseMathUtils = function () { function BaseMathUtils() { _classCallCheck(this, BaseMathUtils); } BaseMathUtils.sum1 = function sum1(ka, a, kb, b) { return [ka * a[0] + kb * b[0]]; }; BaseMathUtils.sum2 = function sum2(ka, a, kb, b) { return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1]]; }; BaseMathUtils.sum3 = function sum3(ka, a, kb, b) { return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1], ka * a[2] + kb * b[2]]; }; BaseMathUtils.sum4 = function sum4(ka, a, kb, b) { return [ka * a[0] + kb * b[0], ka * a[1] + kb * b[1], ka * a[2] + kb * b[2], ka * a[3] + kb * b[3]]; }; BaseMathUtils.rk4 = function rk4(dy, t, dt, y) { var sum = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : BaseMathUtils.sum[y.length - 1]; var k1 = dy(t, y), k2 = dy(t + dt / 2, sum(1, y, dt / 2, k1)), k3 = dy(t + dt / 2, sum(1, y, dt / 2, k2)), k4 = dy(t + dt, sum(1, y, dt, k3)); return sum(1, y, dt / 6, sum(1, sum(1, k1, 2, k2), 1, sum(2, k3, 1, k4))); }; BaseMathUtils.extrapolateLinear = function extrapolateLinear(x, y, xi) { return y[0] + (y[1] - y[0]) / (x[1] - x[0]) * (xi - x[0]); }; BaseMathUtils.interpolateLinear = function interpolateLinear(x, y, xi) { var yi = void 0; if (x[0] > x[1]) { x = x.reverse(); y = y.reverse(); } if (xi < x[0]) { yi = y[0]; } else if (xi > x[1]) { yi = y[1]; } else { yi = BaseMathUtils.extrapolateLinear(x, y, xi); } return yi; }; BaseMathUtils.calcScale = function calcScale(srcW, srcH, dstW, dstH) { return Math.min(dstW / srcW, dstH / srcH); }; BaseMathUtils.mulM = function mulM(a, b) { var r = []; for (var i = 0; i < a.length; ++i) { r.push([]); for (var j = 0; j < b[0].length; ++j) { r[i][j] = 0; for (var k = 0; k < b.length; ++k) { r[i][j] += a[i][k] * b[k][j]; } } } return r; }; BaseMathUtils.transM = function transM(m) { var r = []; for (var i = 0; i < m.length; ++i) { for (var j = 0; j < m[0].length; ++j) { if (!r[j]) { r[j] = []; } r[j][i] = m[i][j]; } } return r; }; BaseMathUtils.mat = function mat(data) { var s = 0; for (var _iterator = data, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var x = _ref; s += x; } return s / data.length; }; BaseMathUtils.disp = function disp(data) { var M = BaseMathUtils.mat(data); var s = 0; for (var _iterator2 = data, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var x = _ref2; s += (x - M) * (x - M); } return s / data.length; }; BaseMathUtils.predict = function predict(data, num) { var r = [], l = data.length, D = BaseMathUtils.disp(data); if (D < l && l > 1) { var am = [], bm = []; for (var i = 0; i < l; ++i) { am.push([i, 1]); bm.push([data[i]]); } var ta = BaseMathUtils.transM(am), a = BaseMathUtils.mulM(ta, am), b = BaseMathUtils.mulM(ta, bm), d = a[0][0] * a[1][1] - a[1][0] * a[0][1], p = [-(a[0][1] * b[1][0] - b[0][0] * a[1][1]) / d, (a[0][0] * b[1][0] - a[1][0] * b[0][0]) / d]; for (var _i3 = 0; _i3 < num; ++_i3) { var v = Math.round(p[0] * (_i3 + l) + p[1]); if (r.indexOf(v) === -1) { r.push(v); } } } return r; }; BaseMathUtils.getUnique = function getUnique() { return Math.ceil(1e9 * Math.random()); }; BaseMathUtils.setSplinePoints = function setSplinePoints(spline, ps) { if (spline.points.length !== ps.x.length) { console.warn('setSplinePoints: bad points'); } for (var i = 0; i < spline.points.length; ++i) { spline.points[i].set(ps.x[i], ps.y[i], ps.z ? ps.z[i] : 0); } }; BaseMathUtils.mapl2L = function mapl2L(ls, len, n, f) { var dL = len / (n - 1); var L = 0; for (var i = 0, d = ls[0]; i < ls.length - 1 && L < len + 0.1 * dL; ++i, d += ls[i]) { if (Math.abs(L - d) < Math.abs(L - d - ls[i + 1])) { f(i, L); L += dL; } } if (L < len + 0.1 * dL) { console.warn('mapl2L: ls is not enought'); } }; BaseMathUtils.det2 = function det2(a, b, c, d) { return a * d - b * c; }; BaseMathUtils.solve2Lin = function solve2Lin(a1, b1, a2, b2) { var res = void 0; var d = BaseMathUtils.det2(a1[0], a1[1], a2[0], a2[1]); if (Math.abs(d) > BaseMathUtils.eps) { var dx = BaseMathUtils.det2(b1, a1[1], b2, a2[1]), dy = BaseMathUtils.det2(a1[0], b1, a2[0], b2); res = { x: dx / d, y: dy / d }; } return res; }; BaseMathUtils.isInsidePoly = function isInsidePoly(ps, p) { var done = false, ct = void 0; for (var i = 0; i < ps.length; ++i) { if (BaseMathUtils.v2dist(p, ps[i]) < BaseMathUtils.eps) { ct = 1; done = true; break; } } while (!done) { done = true; ct = 0; var np = { x: p.x + Math.random() - 0.5, y: p.y + Math.random() - 0.5 }, rn = { x: np.x - p.x, y: np.y - p.y }, a1 = [rn.y, -rn.x], b1 = p.x * rn.y - p.y * rn.x; for (var _i4 = 0; _i4 < ps.length; ++_i4) { var p0 = ps[_i4], p1 = ps[(_i4 + 1) % ps.length], n = { x: p1.x - p0.x, y: p1.y - p0.y }, a2 = [n.y, -n.x], b2 = p0.x * n.y - p0.y * n.x, ip = BaseMathUtils.solve2Lin(a1, b1, a2, b2); if (ip) { if (BaseMathUtils.v2dist(ip, p0) < BaseMathUtils.eps || BaseMathUtils.v2dist(ip, p1) < BaseMathUtils.eps) { done = false; break; } else if (ip.x > Math.min(p0.x, p1.x) - BaseMathUtils.eps && ip.x < Math.max(p0.x, p1.x) + BaseMathUtils.eps && ip.y > Math.min(p0.y, p1.y) - BaseMathUtils.eps && ip.y < Math.max(p0.y, p1.y) + BaseMathUtils.eps) { if (BaseMathUtils.v2dist(ip, p) < BaseMathUtils.eps) { ct = 1; break; } else { var tn = { x: ip.x - p.x, y: ip.y - p.y }; ct += tn.x * rn.x + tn.y * rn.y > 0; } } } } } return ct % 2; }; BaseMathUtils.isInsideConvPoly = function isInsideConvPoly(ps, p) { var sg = [0, 0]; for (var i = 0; i < ps.length; ++i) { var p0 = ps[i], p1 = ps[(i + 1) % ps.length], a = { x: p0.x - p.x, y: p0.y - p.y }, b = { x: p1.x - p.x, y: p1.y - p.y }; ++sg[(a.x * b.y - a.y * b.x < 0) + 0]; } return ~sg.indexOf(ps.length); }; BaseMathUtils.v2len = function v2len(v2) { return Math.sqrt(v2.x * v2.x + v2.y * v2.y); }; BaseMathUtils.v2dist = function v2dist(v21, v22) { return BaseMathUtils.v2len({ x: v22.x - v21.x, y: v22.y - v21.y }); }; BaseMathUtils.computeSquare = function computeSquare(ps) { var a = []; var p = 0; for (var i = 0; i < ps.length; ++i) { a.push(BaseMathUtils.v2dist(ps[i], ps[(i + 1) % ps.length])); p += 0.5 * a[i]; } return Math.sqrt(p * (p - a[0]) * (p - a[1]) * (p - a[2])); }; BaseMathUtils.computeInterpCoefs = function computeInterpCoefs(tri, p) { var s = BaseMathUtils.computeSquare(tri), coefs = [], l = tri.length; for (var i = 0; i < l; ++i) { coefs[i] = BaseMathUtils.computeSquare([p, tri[(i + 1) % l], tri[(i + 2) % l]]) / s; } return coefs; }; return BaseMathUtils; }(); BaseMathUtils.sum = [BaseMathUtils.sum1, BaseMathUtils.sum2, BaseMathUtils.sum3, BaseMathUtils.sum4]; BaseMathUtils.eps = 1e-4; exports.default = BaseMathUtils; /***/ }, /* 3 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _BaseMathUtils2 = __webpack_require__(2); var _BaseMathUtils3 = _interopRequireDefault(_BaseMathUtils2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var MathUtils = function (_BaseMathUtils) { _inherits(MathUtils, _BaseMathUtils); function MathUtils() { _classCallCheck(this, MathUtils); return _possibleConstructorReturn(this, _BaseMathUtils.apply(this, arguments)); } MathUtils.splitSpline = function splitSpline(spline, N) { var o = { len: 0, ls: [0] }, dl = 1 / N; for (var i = 0; i <= N; ++i) { var p = spline.getPoint(i * dl); if (i) { var d = MathUtils.v1.distanceTo(p); o.len += d; o.ls.push(d); } MathUtils.v1.copy(p); } return o; }; MathUtils.getLinearIndeces = function getLinearIndeces(spline, n) { var del = 5000, dDel = 1 / del; var ls = [0]; var l = 0; for (var i = 0; i <= del; ++i) { var p = spline.getPoint(i * dDel); if (i) { var d = MathUtils.v1.distanceTo(p); l += d; ls.push(d); } MathUtils.v1.copy(p); } ls.push(1e7); var res = [], dl = l / (n - 1); for (var _i = 0, L = 0, _d = ls[0]; _i < ls.length - 1; ++_i, _d += ls[_i]) { if (Math.abs(L - _d) < Math.abs(L - _d - ls[_i + 1])) { res.push(_i * dDel); L += dl; } } return res; }; MathUtils.refinePoly = function refinePoly(poly, maxDl) { var res = []; for (var i = 0; i < poly.length; ++i) { var p0 = poly[i], p1 = poly[(i + 1) % poly.length], l = _BaseMathUtils3.default.v2dist(p0, p1), n = Math.ceil(l / maxDl), dl = l / n; res.push(p0); for (var j = 1; j < n; ++j) { res.push(new _libs.THREE.Vector2(p0.x + j * dl * (p1.x - p0.x) / l, p0.y + j * dl * (p1.y - p0.y) / l)); } } return res; }; return MathUtils; }(_BaseMathUtils3.default); MathUtils.v1 = new _libs.THREE.Vector3(); exports.default = MathUtils; /***/ }, /* 4 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Utils = function () { function Utils() { _classCallCheck(this, Utils); } Utils.normalizeUrl = function normalizeUrl(url) { function split(s) { return s.replace(/\\/g, '/').split('/'); } var base = split(window.location.href); url = split(url); if (base[2] === url[2]) { url[0] = base[0]; } return url.join('/'); }; Utils.extends = function _extends(der, base) { for (var name in base) { if (!der.hasOwnProperty(name)) { der[name] = base[name]; } } }; Utils.defaultCmp = function defaultCmp(a, b) { return a - b; }; Utils.lowerBound = function lowerBound(a, x, cmp) { cmp = cmp || Utils.defaultCmp; var l = 0, h = a.length - 1; while (h - l > 1) { var mid = Math.floor((l + h) / 2); if (cmp(x, a[mid]) < 0) { h = mid; } else { l = mid; } } return cmp(x, a[h]) >= 0 ? h : l; }; return Utils; }(); exports.default = Utils; /***/ }, /* 5 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _GraphUtils = __webpack_require__(7); var _GraphUtils2 = _interopRequireDefault(_GraphUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ImageBase = function () { function ImageBase(context, width, height, color) { _classCallCheck(this, ImageBase); this.context = context; this.wnd = context.wnd; this.doc = context.doc; this.element = context.element || context.doc.body; this.c = context.renderCanvas || ImageBase.renderCanvas; this.ctx = context.renderCanvasCtx || ImageBase.renderCanvasCtx; this.resW = this.width = width; this.resH = this.height = height; this.color = color; } ImageBase.prototype.setResolution = function setResolution(res) { this.resW = res.width; this.resH = res.height; }; ImageBase.prototype.dispose = function dispose() {}; ImageBase.prototype.renderBlankPage = function renderBlankPage() { this.ctx.beginPath(); this.ctx.fillStyle = _GraphUtils2.default.color2Rgba(this.color, 1); this.ctx.rect(0, 0, this.c.width, this.c.height); this.ctx.fill(); }; ImageBase.prototype.renderImage = function renderImage(image) { this.pushCtx(); this.ctx.drawImage(image, 0, 0); this.popCtx(); }; ImageBase.prototype.normToConv = function normToConv(p) { return { x: p.x * this.c.width, y: (1 - p.y) * this.c.height }; }; ImageBase.prototype.renderHit = function renderHit(poly) { var ctx = this.ctx; ctx.fillStyle = 'rgba(255,255,0,0.4)'; ctx.beginPath(); var p = this.normToConv(poly[0]); ctx.moveTo(p.x, p.y); for (var i = 1; i < poly.length; ++i) { p = this.normToConv(poly[i]); ctx.lineTo(p.x, p.y); } ctx.closePath(); ctx.fill(); }; ImageBase.prototype.pushCtx = function pushCtx() { if (this.resW != this.c.width) { this.c.width = this.resW; } if (this.resH != this.c.height) { this.c.height = this.resH; } this.ctx.save(); this.ctx.scale(this.c.width / this.width, this.c.height / this.height); return this.ctx; }; ImageBase.prototype.popCtx = function popCtx() { this.ctx.restore(); }; ImageBase.prototype.renderNotFoundPage = function renderNotFoundPage() { this.renderBlankPage(); }; ImageBase.prototype.finishRender = function finishRender() { if (this.onChange) { this.onChange(this.c); } }; ImageBase.prototype.finishLoad = function finishLoad() { if (this.onLoad) { this.onLoad(); } else { this.startRender(); } }; ImageBase.prototype.getSimulatedDoc = function getSimulatedDoc() { return undefined; }; return ImageBase; }(); ImageBase.renderCanvas = (0, _libs.$)('')[0]; ImageBase.renderCanvasCtx = ImageBase.renderCanvas.getContext('2d'); exports.default = ImageBase; /***/ }, /* 6 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var EventConverter = function () { // virtuals // getObject(e, data); // getCallback(object); // test(object1, object1); function EventConverter(wnd, doc) { _classCallCheck(this, EventConverter); this.wnd = wnd; this.doc = doc; this.enabled = true; } EventConverter.prototype.setEnable = function setEnable(vl) { if (!vl) { if (this.mCapObject) { this.notify(this.mCapObject, _libs.$.Event('mouseup'), 'mouseup'); this.mCapObject = undefined; } if (this.mHovObject) { this.notify(this.mHovObject, _libs.$.Event('mouseout'), 'mouseout'); this.mHovObject = undefined; } } this.enabled = vl; }; EventConverter.prototype.getCallback = function getCallback(object) { return undefined; }; EventConverter.prototype.notify = function notify(object, e, type) { var callback = this.getCallback(object); if (callback) { var props = _extends({}, e, { type: type, view: this.wnd }); var jE = _libs.$.Event(type, props); callback(jE, object); } }; EventConverter.prototype.convert = function convert(e, data) { if (!this.enabled) return; if (this.filter) { e = this.filter(this.element, e); } var object = this.getObject(e, data), notify = ~e.type.indexOf('touch') ? this.convertTouch(e, data, object) : this.convertMouse(e, data, object); if (notify && object) { this.notify(object, e, e.type); } }; EventConverter.prototype.convertTouch = function convertTouch(e, data, object) { var notify = true; switch (e.type) { case 'touchstart': { if (this.tCapObject) { this.notify(this.tCapObject, e, 'touchend'); } this.tCapObject = object; break; } case 'touchend': { if (this.tCapObject && !this.test(this.tCapObject, object)) { this.notify(this.tCapObject, e, 'touchend'); notify = false; } else if (object && this.test(this.tCapObject, object)) { this.notify(object, e, 'touchtap'); } this.tCapObject = undefined; break; } case 'touchtap': { notify = false; break; } } return notify; }; EventConverter.prototype.convertMouse = function convertMouse(e, data, object) { var notify = true; switch (e.type) { case 'mousedown': { if (this.mCapObject) { this.notify(this.mCapObject, e, 'mouseup'); } this.mCapObject = object; break; } case 'mouseup': { if (this.mCapObject && !this.test(this.mCapObject, object)) { this.notify(this.mCapObject, e, 'mouseup'); notify = false; } break; } case 'click': { notify = this.test(this.mCapObject, object); this.mCapObject = undefined; break; } case 'mouseenter': case 'mouseover': case 'mousemove': { if (!this.test(this.mHovObject, object) && this.mHovObject) { this.notify(this.mHovObject, e, 'mouseout'); this.mHovObject = undefined; } if (!this.mHovObject && object) { this.notify(object, e, 'mouseover'); this.mHovObject = object; } notify = e.type === 'mousemove'; break; } case 'mouseleave': case 'mouseout': { if (this.mHovObject) { this.notify(this.mHovObject, e, 'mouseout'); this.mHovObject = undefined; } notify = false; break; } } return notify; }; return EventConverter; }(); exports.default = EventConverter; /***/ }, /* 7 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var GraphUtils = function () { function GraphUtils() { _classCallCheck(this, GraphUtils); } GraphUtils.extrapolateLinear = function extrapolateLinear(x, y, xi) { return y[0] + (y[1] - y[0]) / (x[1] - x[0]) * (xi - x[0]); }; GraphUtils.interpolate01 = function interpolate01(y1, y2, t) { return GraphUtils.extrapolateLinear([0, 1], [y1, y2], t); }; GraphUtils.getColorBytes = function getColorBytes(color) { return [color >> 16 & 0xFF, color >> 8 & 0xFF, color & 0xFF]; }; GraphUtils.inverseColor = function inverseColor(color) { var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var bs = GraphUtils.getColorBytes(color), ibs = [0xFF - bs[0], 0xFF - bs[1], 0xFF - bs[2]], nbs = [Math.round(GraphUtils.interpolate01(bs[0], ibs[0], t)), Math.round(GraphUtils.interpolate01(bs[1], ibs[1], t)), Math.round(GraphUtils.interpolate01(bs[2], ibs[2], t))]; return GraphUtils.bytes2Color(nbs); }; GraphUtils.color2Rgba = function color2Rgba(color, a) { return GraphUtils.bytes2Rgba(GraphUtils.getColorBytes(color), a); }; GraphUtils.bytes2Rgba = function bytes2Rgba(bs, a) { return 'rgba(' + bs.join(',') + ',' + a + ')'; }; GraphUtils.bytes2Color = function bytes2Color(bs) { return bs[2] | bs[1] << 8 | bs[0] << 16; }; return GraphUtils; }(); exports.default = GraphUtils; /***/ }, /* 8 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Cache = __webpack_require__(14); var _Cache2 = _interopRequireDefault(_Cache); var _BlankImage = __webpack_require__(43); var _BlankImage2 = _interopRequireDefault(_BlankImage); var _StaticImage = __webpack_require__(59); var _StaticImage2 = _interopRequireDefault(_StaticImage); var _PdfImage = __webpack_require__(57); var _PdfImage2 = _interopRequireDefault(_PdfImage); var _InteractiveImage = __webpack_require__(51); var _InteractiveImage2 = _interopRequireDefault(_InteractiveImage); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ImageFactory = function () { function ImageFactory(context, cache) { _classCallCheck(this, ImageFactory); this.context = context; this.cache = cache || new _Cache2.default(); } ImageFactory.prototype.build = function build(info) { var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var widthTexels = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 210; var heightTexels = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 297; var color = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0xFFFFFF; var injector = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined; var image = void 0; switch (info.type) { case 'html': { image = new _InteractiveImage2.default(this.context, widthTexels, heightTexels, color, info.src, this.cache, injector); break; } case 'image': { image = new _StaticImage2.default(this.context, widthTexels, heightTexels, color, info.src); break; } case 'pdf': { image = new _PdfImage2.default(this.context, widthTexels, heightTexels, color, info.src, n); break; } case 'blank': default: { image = new _BlankImage2.default(this.context, widthTexels, heightTexels, color); break; } } return image; }; return ImageFactory; }(); exports.default = ImageFactory; /***/ }, /* 9 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _book = __webpack_require__(11); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var BookPropsBuilder = function () { function BookPropsBuilder(onReady) { _classCallCheck(this, BookPropsBuilder); this.onReady = onReady; this.defaults = (0, _book.props)(); } BookPropsBuilder.prototype.dispose = function dispose() {}; BookPropsBuilder.prototype.calcSize = function calcSize(width, height) { var scale = _BaseMathUtils2.default.calcScale(width, height, this.defaults.width, this.defaults.height); return { width: scale * width, height: scale * height }; }; BookPropsBuilder.prototype.calcTexels = function calcTexels(width, height) { var sheet = this.defaults.sheet, scale = _BaseMathUtils2.default.calcScale(width, height, sheet.widthTexels, sheet.heightTexels); return { widthTexels: scale * width, heightTexels: scale * height }; }; BookPropsBuilder.prototype.calcProps = function calcProps(width, height) { this.props = _extends({}, this.defaults, this.calcSize(width, height), { sheet: _extends({}, this.defaults.sheet, this.calcTexels(width, height)), cover: _extends({}, this.defaults.cover), page: _extends({}, this.defaults.page) }); }; BookPropsBuilder.prototype.calcSheets = function calcSheets(pages) { return this.sheets = Math.ceil(Math.max(0, pages - 4) / 2); }; BookPropsBuilder.prototype.getSheets = function getSheets() { return this.sheets; }; BookPropsBuilder.prototype.getProps = function getProps() { return this.props; }; BookPropsBuilder.prototype.getPageCallback = function getPageCallback() { return this.binds.pageCallback; }; BookPropsBuilder.prototype.ready = function ready() { if (this.onReady) { this.onReady(this.getProps(), this.getSheets(), this.getPageCallback()); } }; return BookPropsBuilder; }(); exports.default = BookPropsBuilder; /***/ }, /* 10 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(1); var _sheetBlock = __webpack_require__(41); var _sheetBlock2 = _interopRequireDefault(_sheetBlock); var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); var _ThreeUtils = __webpack_require__(20); var _ThreeUtils2 = _interopRequireDefault(_ThreeUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // import ThreeMarkup from './ThreeMarkup'; var SheetBlock = function () { function SheetBlock(visual, p, first, last) { var angle = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; var _this = this; var state = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'closed'; var height = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0; _classCallCheck(this, SheetBlock); this.visual = visual; this.p = _extends({}, p, { first: first, last: last }); var props = this.getProps(); var loadedPoints = this.loadPoints(); Object.keys(loadedPoints).map(function (k) { _this[k] = loadedPoints[k][props.shape] || loadedPoints[k][0]; }); this.pSpline = new _libs.THREE.Spline([]); for (var i = 0; i < this.interpolationPoints.x[0].length; ++i) { this.pSpline.points.push(new _libs.THREE.Vector3()); } this.iSpline = new _libs.THREE.Spline([]); for (var _i = 0; _i < _sheetBlock2.default.resX; ++_i) { this.iSpline.points.push(new _libs.THREE.Vector3()); } this.aSplines = []; //this.three = new THREE.Object3D(); this.geometry = _sheetBlock2.default.geometry.clone(); this.p.sideFaces = [{ first: 0, last: _sheetBlock2.default.faces[0] }, { first: _sheetBlock2.default.faces[0], last: _sheetBlock2.default.faces[1] }]; this.sideTexture = new _libs.THREE.Texture(); this.sideTexture.wrapT = _libs.THREE.RepeatWrapping; this.sideTexture.repeat.set(0, last - first); this.sideTexture.image = props.sideTexture; this.sideTexture.needsUpdate = true; this.materials = [new _libs.THREE.MeshPhongMaterial(), new _libs.THREE.MeshPhongMaterial(), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture }), new _libs.THREE.MeshPhongMaterial({ map: this.sideTexture })]; this.p.setTexture(this.materials[0], 2 * first); this.p.setTexture(this.materials[1], 2 * last - 1); this.mesh = new _libs.THREE.Mesh(this.geometry, new _libs.THREE.MeshFaceMaterial(this.materials)); this.mesh.castShadow = false; this.mesh.receiveShadow = false; // this.mesh.frustumCulled = true; //this.three.add(this.mesh); this.three = this.mesh; this.three.userData.self = this; this.markers = []; if (this.p.marker.use) { var l = this.geometry.vertices.length; var is = void 0; // is = [0, sheetBlock.resX-1, (sheetBlock.resZ-1)*sheetBlock.resX, sheetBlock.resZ*sheetBlock.resX-1]; is = Array.apply(0, Array(l)).map(function (_, i) { return i; }); for (var _iterator = is, _isArray = Array.isArray(_iterator), _i2 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i2 >= _iterator.length) break; _ref = _iterator[_i2++]; } else { _i2 = _iterator.next(); if (_i2.done) break; _ref = _i2.value; } var _i3 = _ref; var marker = _ThreeUtils2.default.createMarker(this.geometry.vertices[_i3], _i3 < l / 2 ? 0xFF0000 : 0x00FF00, this.p.marker.size); this.markers.push({ marker: marker, vertex: _i3 }); this.three.add(marker); } } this.corner = { use: true, height: 0, maxDistance: 0, points: [], OZ: new _libs.THREE.Vector3(0, 0, 1), axis: new _libs.THREE.Vector3() }; this.set(0, 'closed', height, first, last); // calculate corner points this.set(angle, state, height, first, last); // init position // if(!SheetBlock.markup) { // SheetBlock.markup=true; // this.markup = new ThreeMarkup(this, 0, [{ // x: 0, // y: 0, // }, { // x: 0.5, // y: 1 // }, { // x: 1, // y: 0 // }].map((p)=>new THREE.Vector2(p.x, p.y)), {}); // } } SheetBlock.prototype.dispose = function dispose() { for (var _iterator2 = this.materials, _isArray2 = Array.isArray(_iterator2), _i4 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i4 >= _iterator2.length) break; _ref2 = _iterator2[_i4++]; } else { _i4 = _iterator2.next(); if (_i4.done) break; _ref2 = _i4.value; } var m = _ref2; if (m.map) { m.map = null; m.needsUpdate = true; } m.dispose(); } delete this.materials; this.geometry.dispose(); }; SheetBlock.prototype.getSize = function getSize() { return this.p.last - this.p.first; }; SheetBlock.prototype.getProps = function getProps() { return _extends({}, this.p.page, { sheets: this.p.sheets }); }; SheetBlock.prototype.getTopCerners = function getTopCerners() { var off = this.angle > Math.PI / 2 ? this.geometry.vertices.length / 2 : 0; return [this.geometry.vertices[off], this.geometry.vertices[_sheetBlock2.default.resX - 1 + off], this.geometry.vertices[(_sheetBlock2.default.resZ - 1) * _sheetBlock2.default.resX + off], this.geometry.vertices[_sheetBlock2.default.resZ * _sheetBlock2.default.resX - 1 + off]]; }; SheetBlock.prototype.getTopSize = function getTopSize() { // const l=this.geometry.vertices.length, off = this.angle>Math.PI/2? l/2: 0, // v0 = this.geometry.vertices[off], v1 = this.geometry.vertices[sheetBlock.resZ*sheetBlock.resX-1+off]; // // is = [0, sheetBlock.resX-1, (sheetBlock.resZ-1)*sheetBlock.resX, sheetBlock.resZ*sheetBlock.resX-1]; // return { // width: Math.abs(v1.x-v0.x), // height: Math.abs(v1.z-v0.z) // }; var vs = this.getTopCerners(); return { width: vs[0].distanceTo(vs[1]), height: vs[0].distanceTo(vs[2]) }; }; SheetBlock.prototype.getTopWorldRotation = function getTopWorldRotation(q) { q.x = -Math.PI / 2; return q; }; SheetBlock.prototype.getTopWorldPosition = function getTopWorldPosition(v) { var l = this.geometry.vertices.length, off = this.angle > Math.PI / 2 ? l / 2 : 0, vs = [this.geometry.vertices[off], this.geometry.vertices[_sheetBlock2.default.resX - 1 + off], this.geometry.vertices[(_sheetBlock2.default.resZ - 1) * _sheetBlock2.default.resX + off], this.geometry.vertices[_sheetBlock2.default.resZ * _sheetBlock2.default.resX - 1 + off]]; v.set(0, 0, 0); for (var _iterator3 = vs, _isArray3 = Array.isArray(_iterator3), _i5 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i5 >= _iterator3.length) break; _ref3 = _iterator3[_i5++]; } else { _i5 = _iterator3.next(); if (_i5.done) break; _ref3 = _i5.value; } var vi = _ref3; v.x += 0.25 * vi.x; v.y += 0.25 * vi.y; v.z += 0.25 * vi.z; } this.three.localToWorld(v); return v; }; SheetBlock.prototype.getInterpolationPoints = function getInterpolationPoints(inds, mod) { var ps = { x: [], y: [] }, K = this.getProps().wave; for (var _iterator4 = inds, _isArray4 = Array.isArray(_iterator4), _i6 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i6 >= _iterator4.length) break; _ref4 = _iterator4[_i6++]; } else { _i6 = _iterator4.next(); if (_i6.done) break; _ref4 = _i6.value; } var i = _ref4; ps.x.push([].concat(this.interpolationPoints.x[i])); ps.y.push(~mod.indexOf(i) ? this.interpolationPoints.y[i].map(function (n) { return K * n; }) : [].concat(this.interpolationPoints.y[i])); } return ps; }; SheetBlock.prototype.set = function set(angle) { var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.state; var height = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.corner.height; var first = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.p.first; var last = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.p.last; var PI = Math.PI; this.state = state; var closedAngle = void 0, binderTurn = void 0; if ((typeof angle === 'undefined' ? 'undefined' : _typeof(angle)) === 'object') { this.angle = angle.openedAngle; closedAngle = angle.closedAngle; binderTurn = angle.binderTurn > PI / 2 ? PI - angle.binderTurn : angle.binderTurn; } else { this.angle = angle; } this.corner.height = height; if (this.p.first !== first || this.p.last !== last) { this.sideTexture.repeat.set(0, last - first); this.sideTexture.needsUpdate = true; if (this.p.first !== first) { this.p.setTexture(this.materials[0], 2 * first); } if (this.p.last !== last) { this.p.setTexture(this.materials[1], 2 * last - 1); } } this.p.first = first; this.p.last = last; var points = void 0; var props = this.getProps(); if (this.state === 'closed') { points = this.getInterpolationPoints(this.closedInterpolationIndeces, this.closedInterpolationIndeces); } else if (this.state === 'opened') { if (closedAngle !== undefined && Math.abs(closedAngle - PI / 2) > 1e-2) { points = this.getInterpolationPoints(this.flatInterpolationIndeces, []); var ps = this.getPointsAtAngle(this.getInterpolationPoints(this.closedInterpolationIndeces, this.closedInterpolationIndeces), closedAngle > PI / 2 ? PI - closedAngle : closedAngle); points.x = [ps.x].concat(points.x); points.y = [ps.y].concat(points.y); // console.log(ps); } else { points = this.getInterpolationPoints(this.openedInterpolationIndeces, this.closedInterpolationIndeces); } } var hl = void 0, hr = void 0, offset = 0.5 * props.sheets * props.depth; if (this.state === 'closed') { offset -= 7e-6 * this.p.scale; } if (this.angle <= PI / 2) { hl = (props.sheets - first) * props.depth; hr = (props.sheets - last) * props.depth; } else { hl = first * props.depth; hr = last * props.depth; } var inAngle = this.angle > PI / 2 ? PI - this.angle : this.angle, hAngle = this.state === 'closed' ? inAngle : binderTurn === undefined ? PI / 2 : binderTurn; var _getPointsAtAngleAndH = this.getPointsAtAngleAndHs(points, inAngle, hAngle, [hl / props.width, hr / props.width]), left = _getPointsAtAngleAndH[0], right = _getPointsAtAngleAndH[1]; if (this.angle > PI / 2) { this.inverse(left); this.inverse(right); offset = -offset; } this.setPoints(left, right, offset); }; SheetBlock.prototype.setPoints = function setPoints(left, right, offset) { var _this2 = this; var p = this.getProps(); var i = 0; var ys = [right, left]; for (var y = 0; y < _sheetBlock2.default.resY; ++y) { for (var z = 0; z < _sheetBlock2.default.resZ; ++z) { for (var x = 0; x < _sheetBlock2.default.resX; ++x) { this.geometry.vertices[i++].set(ys[y].x[x] * p.width + offset, ys[y].y[x] * p.width, z * p.height / (_sheetBlock2.default.resZ - 1) - 0.5 * p.height); } } } if (i !== this.geometry.vertices.length) { console.warn('setPoints: bad mapping!'); } if (this.corner.use && !this.corner.points.length) { var plane = new _libs.THREE.Plane(), normal = plane.normal, planeOffset = (1 - this.getProps().flexibleCorner) * Math.min(p.width, p.height), proj = new _libs.THREE.Vector3(); plane.setFromNormalAndCoplanarPoint(new _libs.THREE.Vector3(-1, 0, -1).normalize(), new _libs.THREE.Vector3(planeOffset + offset, 0, 0.5 * p.height)); for (var _i7 = 0, l = this.geometry.vertices.length; _i7 < l; ++_i7) { plane.projectPoint(this.geometry.vertices[_i7], proj); proj.sub(this.geometry.vertices[_i7]); if (proj.x * normal.x + proj.y * normal.y + proj.z * normal.z > 0) { var d = proj.length() / planeOffset; this.corner.maxDistance = Math.max(this.corner.maxDistance, d); this.corner.points.push({ vertex: _i7, distance: d }); } } } if (this.corner.use && Math.abs(this.corner.height) > 1e-3) { var d2Angle = function d2Angle(d) { return p.cornerDeviation * _this2.corner.height / (1 + Math.exp(-p.bending * (d - 0.5 * _this2.corner.maxDistance))); }; this.corner.axis.set(-1, 0, 1).normalize(); this.corner.axis.applyAxisAngle(this.corner.OZ, this.angle); for (var _iterator5 = this.corner.points, _isArray5 = Array.isArray(_iterator5), _i8 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i8 >= _iterator5.length) break; _ref5 = _iterator5[_i8++]; } else { _i8 = _iterator5.next(); if (_i8.done) break; _ref5 = _i8.value; } var point = _ref5; this.geometry.vertices[point.vertex].applyAxisAngle(this.corner.axis, d2Angle(point.distance)); } } for (var _iterator6 = this.markers, _isArray6 = Array.isArray(_iterator6), _i9 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i9 >= _iterator6.length) break; _ref6 = _iterator6[_i9++]; } else { _i9 = _iterator6.next(); if (_i9.done) break; _ref6 = _i9.value; } var m = _ref6; m.marker.position.copy(this.geometry.vertices[m.vertex]); } this.geometry.computeVertexNormals(); //this.geometry.computeFaceNormals(); this.geometry.computeBoundingSphere(); //this.geometry.computeBoundingBox(); this.geometry.verticesNeedUpdate = true; if (this.markup) { this.markup.computeVertices(); } }; SheetBlock.prototype.inverse = function inverse(ps) { for (var i = 0; i < ps.x.length; ++i) { ps.x[i] = -ps.x[i]; } return ps; }; SheetBlock.prototype.getPointsAtHs = function getPointsAtHs(ps, angle, hs) { var _this3 = this; var N = 1000; _MathUtils2.default.setSplinePoints(this.pSpline, ps); var bl = _MathUtils2.default.splitSpline(this.pSpline, N), r = []; { var p1 = _extends({}, this.pSpline.getPoint((N - 1) / N)), p2 = _extends({}, this.pSpline.getPoint(1)), dp = { x: p2.x - p1.x, y: p2.y - p1.y }, ln = Math.sqrt(dp.x * dp.x + dp.y * dp.y), sp = this.pSpline.points[this.pSpline.points.length - 1]; sp.set(sp.x + 0.1 * dp.x / ln, sp.y + 0.1 * dp.y / ln, 0); bl = _MathUtils2.default.splitSpline(this.pSpline, N); } bl.ls.push(1e7); _MathUtils2.default.mapl2L(bl.ls, bl.len, _sheetBlock2.default.resX, function (i) { for (var j = 0; j < hs.length; ++j) { if (!i) { r[j] = { x: [-hs[j] * Math.sin(angle)], y: [hs[j] * Math.cos(angle)] }; } else { var p0 = _extends({}, _this3.pSpline.getPoint((i - 1) / N)), _p = _this3.pSpline.getPoint(i / N), x = -(_p.y - p0.y), y = _p.x - p0.x, l = Math.sqrt(x * x + y * y); r[j].x.push(_p.x + x / l * hs[j]); r[j].y.push(_p.y + y / l * hs[j]); } } }); var nps = []; var _loop = function _loop(j) { nps[j] = { x: [], y: [] }; _MathUtils2.default.setSplinePoints(_this3.iSpline, r[j]); var l = _MathUtils2.default.splitSpline(_this3.iSpline, N); l.ls.push(1e7); _MathUtils2.default.mapl2L(l.ls, 1, _sheetBlock2.default.resX, function (i) { var p = _this3.iSpline.getPoint(i / N); nps[j].x.push(p.x); nps[j].y.push(p.y); }); }; for (var j = 0; j < hs.length; ++j) { _loop(j); } return nps; }; SheetBlock.prototype.getPointsAtAngleAndHs = function getPointsAtAngleAndHs(points, angle, hAngle, hs) { var ps = this.getPointsAtAngle(points, angle); return this.getPointsAtHs(ps, hAngle, hs); }; SheetBlock.prototype.getPointsAtAngle = function getPointsAtAngle(points, angle) { var ps = { x: [], y: [] }, angles = []; angle /= Math.PI / 2; for (var j = 0; j < points.x.length; ++j) { angles.push(j / (points.x.length - 1)); } for (var i = 0; i < points.x[0].length; ++i) { var xps = [], yps = []; for (var _j = 0; _j < points.x.length; ++_j) { xps.push(points.x[_j][i]); yps.push(points.y[_j][i]); } ps.x.push(this.interpolate(angles, xps, angle)); ps.y.push(this.interpolate(angles, yps, angle)); } return ps; }; SheetBlock.prototype.interpolate = function interpolate(x, y, xi) { if (!this.aSplines[x.length]) { this.aSplines[x.length] = new _libs.THREE.Spline([]); var ps = this.aSplines[x.length].points; for (var i = 0; i < x.length; ++i) { ps.push(new _libs.THREE.Vector3()); } } var spline = this.aSplines[x.length]; for (var _i10 = 0; _i10 < x.length; ++_i10) { spline.points[_i10].set(x[_i10], y[_i10], 0); } return spline.getPoint(Math.min(1, Math.max(xi, 0))).y; }; SheetBlock.prototype.loadPoints = function loadPoints() { var x = [], y = []; var _arr = [0, 0.2877, 0.6347, 0.8174, 1.0000]; for (var _i11 = 0; _i11 < _arr.length; _i11++) { var r = _arr[_i11]; x.push(r * Math.cos(0.9 * Math.PI / 4)); y.push(r * Math.sin(0.9 * Math.PI / 4)); } var openedInterpolationIndeces = [[2, 3, 4], [2, 3, 4, 5, 6]], closedInterpolationIndeces = [[0, 1, 2], [0, 1, 2]], flatInterpolationIndeces = [[5, 4], [7, 6]], interpolationPoints = [{ x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0.000, 0.286, 0.632, 0.815, 0.997], [0.000, 0.279, 0.623, 0.806, 0.988], [0.000, 0.126, 0.411, 0.593, 0.774], [0, 0, 0, 0, 0], x], y: [[0, 0, 0, 0, 0], [0.000, 0.030, 0.010, 0.002, 0.000], [0.000, 0.060, 0.017, 0.004, 0.000], [0.000, 0.259, 0.440, 0.446, 0.429], [0, 0.2877, 0.6347, 0.8174, 1.0000], y] }, { x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0.000, 0.286, 0.632, 0.815, 0.997], [0.000, 0.279, 0.623, 0.806, 0.988], [0.000, 0.233, 0.563, 0.746, 0.927], [0.000, 0.144, 0.433, 0.613, 0.796], [0.000, 0.070, 0.288, 0.455, 0.626], [0, 0, 0, 0, 0], x], y: [[0, 0, 0, 0, 0], [0.000, 0.030, 0.010, 0.002, 0.000], [0.000, 0.060, 0.017, 0.004, 0.000], [0.000, 0.168, 0.269, 0.270, 0.255], [0.000, 0.245, 0.435, 0.458, 0.460], [0.000, 0.278, 0.544, 0.614, 0.673], [0, 0.2877, 0.6347, 0.8174, 1.0000], y] }]; return { interpolationPoints: interpolationPoints, openedInterpolationIndeces: openedInterpolationIndeces, closedInterpolationIndeces: closedInterpolationIndeces, flatInterpolationIndeces: flatInterpolationIndeces }; }; return SheetBlock; }(); exports.default = SheetBlock; /***/ }, /* 11 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; exports.props = props; function props() { // const props = { // height, // width, // gravity, // injector, // cachedPages, // renderInactivePages, // renderWhileFlipping, // pagesForPredicting, // preloadPages, // sheet: { // startVelocity, // cornerDeviation, // flexibility, // flexibleCorner, // bending, // wave, // shape, // widthTexels, // heightTexels, // color, // sideTexture // }, // cover: { // ...sheet, // padding, // binderTexture, // depth, // mass // }, // page: { // ...sheet, // depth, // mass // } // }; return { height: 0.297, width: 0.21, gravity: 1, cachedPages: 50, renderInactivePages: true, renderInactivePagesOnMobile: false, renderWhileFlipping: false, pagesForPredicting: 5, preloadPages: 5, rtl: false, sheet: { startVelocity: 0.9, cornerDeviation: 0.25, flexibility: 10, flexibleCorner: 0.5, bending: 11, wave: 0.5, shape: 0, widthTexels: 5 * 210, heightTexels: 5 * 297, color: 0xFFFFFF }, cover: { binderTexture: '', depth: 0.0003, padding: 0, mass: 0.003 }, page: { depth: 0.0001, mass: 0.001 }, cssLayerProps: { width: 1024 } }; }; /***/ }, /* 12 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; exports.CSS3DSprite = exports.CSS3DObject = undefined; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } _libs.THREE.CSS3DObject = function (_THREE$Object3D) { _inherits(CSS3DObject, _THREE$Object3D); function CSS3DObject() { var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; _classCallCheck(this, CSS3DObject); var _this = _possibleConstructorReturn(this, _THREE$Object3D.call(this)); if (element) { _this.set(element); } return _this; } CSS3DObject.prototype.set = function set(element) { this.element = element; this.element.style.position = 'absolute'; this.addEventListener('removed', function () { if (this.element.parentNode !== null) { this.element.parentNode.removeChild(this.element); } }); }; return CSS3DObject; }(_libs.THREE.Object3D); _libs.THREE.CSS3DSprite = function (_THREE$CSS3DObject) { _inherits(CSS3DSprite, _THREE$CSS3DObject); function CSS3DSprite(element) { _classCallCheck(this, CSS3DSprite); return _possibleConstructorReturn(this, _THREE$CSS3DObject.call(this, element)); } return CSS3DSprite; }(_libs.THREE.CSS3DObject); _libs.THREE.CSS3DRenderer = function CSS3DRenderer() { _classCallCheck(this, CSS3DRenderer); var _width, _height; var _widthHalf, _heightHalf; var matrix = new _libs.THREE.Matrix4(); var cache = { camera: { fov: 0, style: '' }, objects: {} }; var domElement = document.createElement('div'); domElement.style.overflow = 'hidden'; this.domElement = domElement; var cameraElement = document.createElement('div'); cameraElement.style.WebkitTransformStyle = 'preserve-3d'; cameraElement.style.MozTransformStyle = 'preserve-3d'; cameraElement.style.transformStyle = 'preserve-3d'; domElement.appendChild(cameraElement); var isIE = /Trident/i.test(navigator.userAgent); this.setClearColor = function () {}; this.getSize = function () { return { width: _width, height: _height }; }; this.setSize = function (width, height) { _width = width; _height = height; _widthHalf = _width / 2; _heightHalf = _height / 2; domElement.style.width = width + 'px'; domElement.style.height = height + 'px'; cameraElement.style.width = width + 'px'; cameraElement.style.height = height + 'px'; }; function epsilon(value) { return Math.abs(value) < 1e-10 ? 0 : value; } function getCameraCSSMatrix(matrix) { var elements = matrix.elements; return 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(-elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(elements[6]) + ',' + epsilon(elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(-elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(-elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')'; } function getObjectCSSMatrix(matrix, cameraCSSMatrix) { var elements = matrix.elements; var matrix3d = 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(-elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(-elements[6]) + ',' + epsilon(-elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')'; if (isIE) { return 'translate(-50%,-50%)' + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)' + cameraCSSMatrix + matrix3d; } return 'translate(-50%,-50%)' + matrix3d; } function renderObject(object, camera, cameraCSSMatrix) { if (object instanceof _libs.THREE.CSS3DObject) { var style; if (object instanceof _libs.THREE.CSS3DSprite) { matrix.copy(camera.matrixWorldInverse); matrix.transpose(); matrix.copyPosition(object.matrixWorld); matrix.scale(object.scale); matrix.elements[3] = 0; matrix.elements[7] = 0; matrix.elements[11] = 0; matrix.elements[15] = 1; style = getObjectCSSMatrix(matrix, cameraCSSMatrix); } else { style = getObjectCSSMatrix(object.matrixWorld, cameraCSSMatrix); } var element = object.element; var cachedStyle = cache.objects[object.id] && cache.objects[object.id].style; if (cachedStyle === undefined || cachedStyle !== style) { element.style.WebkitTransform = style; element.style.MozTransform = style; element.style.transform = style; cache.objects[object.id] = { style: style }; if (isIE) { cache.objects[object.id].distanceToCameraSquared = getDistanceToSquared(camera, object); } } if (element.parentNode !== cameraElement) { cameraElement.appendChild(element); } } for (var i = 0, l = object.children.length; i < l; i++) { renderObject(object.children[i], camera, cameraCSSMatrix); } } var getDistanceToSquared = function () { var a = new _libs.THREE.Vector3(); var b = new _libs.THREE.Vector3(); return function (object1, object2) { a.setFromMatrixPosition(object1.matrixWorld); b.setFromMatrixPosition(object2.matrixWorld); return a.distanceToSquared(b); }; }(); function zOrder(scene) { var order = Object.keys(cache.objects).sort(function (a, b) { return cache.objects[a].distanceToCameraSquared - cache.objects[b].distanceToCameraSquared; }); var zMax = order.length; scene.traverse(function (object) { var index = order.indexOf(object.id + ''); if (index !== -1) { object.element.style.zIndex = zMax - index; } }); } this.render = function (scene, camera) { var fov = camera.projectionMatrix.elements[5] * _heightHalf; if (cache.camera.fov !== fov) { domElement.style.WebkitPerspective = fov + 'px'; domElement.style.MozPerspective = fov + 'px'; domElement.style.perspective = fov + 'px'; cache.camera.fov = fov; } scene.updateMatrixWorld(); if (camera.parent === null) camera.updateMatrixWorld(); var cameraCSSMatrix = 'translateZ(' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse); var style = cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)'; if (cache.camera.style !== style && !isIE) { cameraElement.style.WebkitTransform = style; cameraElement.style.MozTransform = style; cameraElement.style.transform = style; cache.camera.style = style; } renderObject(scene, camera, cameraCSSMatrix); if (isIE) { // IE10 and 11 does not support 'preserve-3d'. // Thus, z-order in 3D will not work. // We have to calc z-order manually and set CSS z-index for IE. // FYI: z-index can't handle object intersection zOrder(scene); } }; }; exports.default = _libs.THREE.CSS3DRenderer; var _CSS3DObject = _libs.THREE.CSS3DObject, _CSS3DSprite = _libs.THREE.CSS3DSprite; exports.CSS3DObject = _CSS3DObject; exports.CSS3DSprite = _CSS3DSprite; /***/ }, /* 13 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _CSS3DRenderer = __webpack_require__(12); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var CSSLayer = function (_CSS3DObject) { _inherits(CSSLayer, _CSS3DObject); CSSLayer.init = function init(doc) { var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 150; CSSLayer.delay = delay; CSSLayer.style = (0, _libs.$)('').appendTo(doc.head); }; CSSLayer.dispose = function dispose() { CSSLayer.style.remove(); }; function CSSLayer(width, height, props) { _classCallCheck(this, CSSLayer); var _this = _possibleConstructorReturn(this, _CSS3DObject.call(this)); _this.props = props; _this.jContainer = (0, _libs.$)(''); var widthPxs = props.width, heightPxs = height / width * widthPxs; _this.jContainer.width(widthPxs).height(heightPxs); _this.scale.x /= widthPxs / width; _this.scale.y /= widthPxs / width; _this.setData(); _this.set(_this.jContainer[0]); return _this; } CSSLayer.prototype.callInternal = function callInternal(name) { if (this.object && this.object[name]) { try { this.object[name](); } catch (e) { console.error(e); } } }; CSSLayer.prototype.dispose = function dispose() { this.clearInternals(); }; CSSLayer.prototype.clearInternals = function clearInternals() { this.callInternal('dispose'); !this.css || this.css.remove(); !this.html || this.html.remove(); }; CSSLayer.prototype.setData = function setData() { var css = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var html = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var js = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; this.clearInternals(); this.css = (0, _libs.$)('').appendTo(this.jContainer); this.html = (0, _libs.$)(html).appendTo(this.jContainer); var init = eval(js); if (init) { this.object = init(this.jContainer, this.props) || {}; } }; CSSLayer.prototype.pendedCall = function pendedCall(clb) { var _this2 = this; var timestamp = this.timestamp = Date.now(); setTimeout(function () { if (timestamp === _this2.timestamp) { clb(); } }, CSSLayer.delay); }; CSSLayer.prototype.isHidden = function isHidden() { return this.jContainer.hasClass('hidden'); }; CSSLayer.prototype.hide = function hide() { var _this3 = this; var res = void 0; if (!this.isHidden()) { this.jContainer.addClass('hidden'); this.callInternal('hide'); res = new Promise(function (resolve) { _this3.pendedCall(function () { _this3.callInternal('hidden'); resolve(); }); }); } else { res = Promise.resolve(); } return res; }; CSSLayer.prototype.show = function show() { var _this4 = this; var res = void 0; if (this.isHidden()) { this.jContainer.removeClass('hidden'); this.callInternal('show'); res = new Promise(function (resolve) { _this4.pendedCall(function () { _this4.callInternal('shown'); resolve(); }); }); } else { res = Promise.resolve(); } return res; }; return CSSLayer; }(_CSS3DRenderer.CSS3DObject); exports.default = CSSLayer; /***/ }, /* 14 */ /***/ function(module, exports) { "use strict"; "use strict"; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Cache = function () { function Cache() { var maxSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity; var sizeof = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Cache.countSizeof; _classCallCheck(this, Cache); this.os = new Map(); this.sizeof = sizeof; this.maxSize = maxSize; this.size = 0; } Cache.prototype.forEach = function forEach(clb) { this.os.forEach(function (v, k) { return clb([k, v]); }); }; Cache.countSizeof = function countSizeof(value) { return 1; }; Cache.prototype.remove = function remove(k) { var res = false; var v = this.os.get(k); if (!v.locked || !v.locked(k)) { this.size -= this.sizeof(v); if (v.dispose) { v.dispose(); } this.os.delete(k); res = true; } return res; }; Cache.prototype.freeSpace = function freeSpace() { var arr = []; for (var _iterator = this.os, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var p = _ref; arr.push({ timestamp: p[1].timestamp, key: p[0] }); } arr.sort(function (a, b) { return a.timestamp - b.timestamp; }); for (var i = 0; i < arr.length && this.size > 3 * this.maxSize / 4; ++i) { this.remove(arr[i].key); } }; Cache.prototype.dispose = function dispose() { var arr = []; for (var _iterator2 = this.os, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var p = _ref2; arr.push({ v: p[1], k: p[0] }); } for (var _iterator3 = arr, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var o = _ref3; if (o.v.dispose) { o.v.dispose(); } this.os.delete(o.k); } }; Cache.recursionSizeof = function recursionSizeof(value) { var size = 0; if (value) { ++size; var len = value.length; if (len === undefined) { for (var p in value) { if (value.hasOwnProperty(p)) { size += Cache.recursionSizeof(value[p]); } } } else { size += len; } } return size; }; Cache.prototype.getTimestamp = function getTimestamp() { return Date.now(); }; Cache.prototype.get = function get(key) { var value = this.os.get(key); if (value) { value.timestamp = this.getTimestamp(); } return value; }; Cache.prototype.put = function put(key, value) { value.timestamp = this.getTimestamp(); this.os.set(key, value); this.size += this.sizeof(value); if (this.size > this.maxSize) { this.freeSpace(); } return value; }; return Cache; }(); exports.default = Cache; /***/ }, /* 15 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Controller = function (_THREE$EventDispatche) { _inherits(Controller, _THREE$EventDispatche); function Controller() { _classCallCheck(this, Controller); return _possibleConstructorReturn(this, _THREE$EventDispatche.apply(this, arguments)); } Controller.prototype.handleDefault = function handleDefault(id, e, data) { //console.log(id+'-'+e.type+'-'+data); }; Controller.prototype.dispatchAsync = function dispatchAsync(e) { var _this2 = this; Promise.resolve().then(function () { return _this2.dispatchEvent(e); }); }; Controller.prototype.dispose = function dispose() {}; return Controller; }(_libs.THREE.EventDispatcher); exports.default = Controller; /***/ }, /* 16 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _EventConverter2 = __webpack_require__(6); var _EventConverter3 = _interopRequireDefault(_EventConverter2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var CustomEventConverter = function (_EventConverter) { _inherits(CustomEventConverter, _EventConverter); // custom // testIntersection(e, data); // custom.object // test(object); function CustomEventConverter(wnd, doc) { var customTest = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () { return false; }; var eDoc = arguments[3]; _classCallCheck(this, CustomEventConverter); var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); _this.eDoc = eDoc; _this.customTest = customTest; _this.customs = []; return _this; } CustomEventConverter.prototype.test = function test(object1, object2) { return object1 && object2 ? this.customTest(object1, object2) : false; }; CustomEventConverter.prototype.getCallback = function getCallback(object) { return object.target.callback; }; CustomEventConverter.prototype.addCustom = function addCustom(custom) { this.customs.push(custom); }; CustomEventConverter.prototype.getObject = function getObject(e, data) { var object = void 0; if (data.doc === this.eDoc) { for (var _iterator = this.customs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var custom = _ref; object = custom.testIntersection(e, data); if (object) { break; } } } return object; }; return CustomEventConverter; }(_EventConverter3.default); exports.default = CustomEventConverter; /***/ }, /* 17 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Finder = function () { Finder.isDelimetr = function isDelimetr(s) { return s === Finder.DELIMITER; }; Finder.prototype.merge = function merge() { var as = [], map = [], strs = this.strs; var p = 0; for (var i = 0; i < strs.length; ++i) { if (strs[i].length) { map.push({ base: i, offset: p }); as.push(strs[i]); p += strs[i].length; if (i < strs.length - 1 && !Finder.isDelimetr(strs[i].charAt(strs[i].length - 1)) && !Finder.isDelimetr(strs[i + 1].charAt(0))) { as.push(Finder.DELIMITER); ++p; } } } this.map = map; this.str = as.join(''); }; Finder.prototype.addHits = function addHits(p) { var info = this.map[_Utils2.default.lowerBound(this.map, { offset: p }, function (a, b) { return a.offset - b.offset; })]; var chars = this.pattern.length, i = info.base; p -= info.offset; while (chars) { if (this.strs[i].length) { var delimeter = i < this.strs.length - 1 && !Finder.isDelimetr(this.strs[i].charAt(this.strs[i].length - 1)) && !Finder.isDelimetr(this.strs[i + 1].charAt(0)), length = Math.min(this.strs[i].length + (delimeter ? 1 : 0) - p, chars); if (p < this.strs[i].length) { this.hits.push({ index: i, offset: p, length: Math.min(length, this.strs[i].length - p) }); } chars -= length; ++i; p = 0; } } }; Finder.prototype.addContext = function addContext(p) { var f = p, l = p + this.pattern.length - 1, dels = this.props.contextLength, prevDels = dels + 1; while (dels && prevDels - dels) { prevDels = dels; if (dels % 2) { for (var i = f - 2; i >= 0; --i) { if (Finder.isDelimetr(this.str[i]) || i === 0) { f = i === 0 ? 0 : i + 1; --dels; break; } } } else { for (var _i = l + 2; _i < this.str.length; ++_i) { if (Finder.isDelimetr(this.str[_i]) || _i === this.str.length - 1) { l = _i === this.str.length - 1 ? _i === this.str.length - 1 : _i - 1; --dels; break; } } } } this.contexts.push(this.str.substr(f, l - f + 1)); }; Finder.prototype.getHits = function getHits() { return this.hits; }; Finder.prototype.getContexts = function getContexts() { return this.contexts; }; function Finder(strs, pattern, props) { _classCallCheck(this, Finder); this.props = _extends({}, Finder.defaults, props); this.strs = strs; var data = this.merge(strs); this.hits = []; this.contexts = []; this.pattern = pattern.toLowerCase(); this.lstr = this.str.toLowerCase(); var p = 0; while (true) { p = this.lstr.indexOf(this.pattern, p); if (p === -1) { break; } else { this.addHits(p); this.addContext(p); p += this.pattern.length; } } } return Finder; }(); Finder.DELIMITER = ' '; Finder.defaults = { contextLength: 7, hits: true, contexts: true }; exports.default = Finder; /***/ }, /* 18 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } _libs.PDFJS.workerSrc = (window.PDFJS_LOCALE ? PDFJS_LOCALE : {"pdfJsWorker":"js/pdf.worker.js","pdfJsCMapUrl":"cmaps/"}).pdfJsWorker; _libs.PDFJS.cMapUrl = (window.PDFJS_LOCALE ? PDFJS_LOCALE : {"pdfJsWorker":"js/pdf.worker.js","pdfJsCMapUrl":"cmaps/"}).pdfJsCMapUrl; _libs.PDFJS.cMapPacked = true; var Pdf = function () { function Pdf(src, loadingProgress) { var _this = this; _classCallCheck(this, Pdf); this.src = _Utils2.default.normalizeUrl(src); this.handlerQueue = []; this.progresData = { loaded: -1, total: 1 }; this.loadingProgress = loadingProgress; _libs.PDFJS.getDocument({ url: this.src, rangeChunkSize: 512 * 1024 }, null, null, function (data) { if (_this.loadingProgress) { var cur = Math.floor(100 * data.loaded / data.total), old = Math.floor(100 * _this.progresData.loaded / _this.progresData.total); if (cur !== old) { cur = isNaN(cur) ? 0 : cur; cur = cur > 100 ? 100 : cur; _this.loadingProgress(cur); } } _this.progresData = data; }).then(function (handler) { if (handler.numPages > 1) { Promise.all([handler.getPage(1), handler.getPage(2)]).then(function (pages) { _this.init(handler, pages); }); } else { _this.init(handler); } }); } Pdf.prototype.init = function init(handler, pages) { this.handler = handler; this.doubledPages = pages ? Math.abs(2 * Pdf.getPageSize(pages[0]).width - Pdf.getPageSize(pages[1]).width) / Pdf.getPageSize(pages[0]).width < 1e-4 : false; var done = Promise.resolve(handler); var _loop = function _loop() { if (_isArray) { if (_i >= _iterator.length) return 'break'; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) return 'break'; _ref = _i.value; } var clb = _ref; done = done.then(function (handler) { clb(handler); return handler; }); }; for (var _iterator = this.handlerQueue.reverse(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; var _ret = _loop(); if (_ret === 'break') break; } }; Pdf.prototype.getPageType = function getPageType(n) { return !this.doubledPages || n === 0 || n === this.getPagesNum() - 1 ? 'full' : n & 1 ? 'left' : 'right'; }; Pdf.prototype.getPage = function getPage(n) { return this.handler.getPage(this.doubledPages ? Math.ceil(n / 2) + 1 : n + 1); }; Pdf.prototype.dispose = function dispose() { this.handlerQueue.splice(0, this.handlerQueue.length); delete this.handler; }; Pdf.prototype.setLoadingProgressClb = function setLoadingProgressClb(clb) { this.loadingProgress = clb; }; Pdf.prototype.getPagesNum = function getPagesNum() { return this.handler ? this.doubledPages ? 2 * (this.handler.numPages - 1) : this.handler.numPages : undefined; }; Pdf.getPageSize = function getPageSize(page) { return { width: page.view[2] - page.view[0], height: page.view[3] - page.view[1] }; }; // if(pages>1) { // handler.getPage(2). // then((page)=> { // const size1 = Pdf.getPageSize(page); // this.props.doubledPages = 2*size0.width===size1.width; // this.ready(); // }). // catch(()=> this.ready()); // } // else { Pdf.prototype.getHandler = function getHandler(clb) { if (this.handler) { clb(this.handler); } else { this.handlerQueue.push(clb); } }; return Pdf; }(); exports.default = Pdf; /***/ }, /* 19 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ThreeEventConverterFs = function () { ThreeEventConverterFs.objectsTest = function objectsTest(object1, object2) { return object1 && object2 ? object1.object === object2.object : false; }; ThreeEventConverterFs.objectsAndFacesTest = function objectsAndFacesTest(object1, object2) { return object1 && object2 ? object1.object === object2.object && object1.face.materialIndex === object2.face.materialIndex : false; }; function ThreeEventConverterFs(visualWorld) { var test = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ThreeEventConverterFs.objectsAndFacesTest; _classCallCheck(this, ThreeEventConverterFs); this.visual = visualWorld; this.coords = new _libs.THREE.Vector2(); this.raycaster = this.visual.raycaster; this.camera = this.visual.camera; this.threes = []; this.test = test; } ThreeEventConverterFs.prototype.addThree = function addThree(three) { this.threes.push(three); }; ThreeEventConverterFs.prototype.removeThree = function removeThree(three) { var i = this.threes.indexOf(three); if (~i) { this.threes.splice(i, 1); } }; ThreeEventConverterFs.prototype.getObject = function getObject(e) { this.setCoordsFromEvent(e); this.raycaster.setFromCamera(this.coords, this.camera); var intersects = this.raycaster.intersectObjects(this.threes); return intersects[0]; }; return ThreeEventConverterFs; }(); exports.default = ThreeEventConverterFs; /***/ }, /* 20 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ThreeUtils = function () { function ThreeUtils() { _classCallCheck(this, ThreeUtils); } ThreeUtils.vertices2UVs = function vertices2UVs(vertices, indeces, first, last, converClb) { var r = []; for (var i = first; i < last; ++i) { var vis = [indeces[i].a, indeces[i].b, indeces[i].c]; for (var j = 0; j < vis.length; ++j) { if (!r[vis[j]]) { r[vis[j]] = converClb(vertices[vis[j]]); } } } return r; }; ThreeUtils.computeFaceVertexUvs = function computeFaceVertexUvs(geometry, faces) { var uvs = [ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, 0, faces[0], function (p) { return new THREE.Vector2(p.x, 1 - p.z); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[0], faces[1], function (p) { return new THREE.Vector2(1 - p.x, 1 - p.z); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[1], faces[2], function (p) { return new THREE.Vector2(p.x, p.y); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[2], faces[3], function (p) { return new THREE.Vector2(1 - p.x, p.y); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[3], faces[4], function (p) { return new THREE.Vector2(p.z, p.y); }), ThreeUtils.vertices2UVs(geometry.vertices, geometry.faces, faces[4], geometry.faces.length, function (p) { return new THREE.Vector2(1 - p.z, p.y); })]; var uvsi = 0; for (var i = 0; i < geometry.faces.length; ++i) { uvsi += faces[uvsi] === i; var f = geometry.faces[i]; f.materialIndex = uvsi; geometry.faceVertexUvs[0][i] = [uvs[uvsi][f.a], uvs[uvsi][f.b], uvs[uvsi][f.c]]; } }; ThreeUtils.createMarker = function createMarker(p, c, size) { var marker = new THREE.Mesh(new THREE.SphereGeometry(size), new THREE.MeshPhongMaterial({ color: c })); marker.position.set(p.x, p.y, p.z); return marker; }; ThreeUtils.findUvTris = function findUvTris(geometry, ps, first, last) { var res = []; for (var _iterator = ps, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var p = _ref; var found = false; for (var i = first; i < last && !found; ++i) { var tri = geometry.faceVertexUvs[0][i]; if (_BaseMathUtils2.default.isInsideConvPoly(tri, p)) { res.push({ coefs: _BaseMathUtils2.default.computeInterpCoefs(tri, p), i: i }); found = true; } } if (!found) { console.error('Bad point'); res.push(undefined); } } return res; }; ThreeUtils.findInternalVertices = function findInternalVertices(geometry, ps, first, last) { var res = {}; for (var i = first; i < last; ++i) { var tri = geometry.faceVertexUvs[0][i], f = geometry.faces[i], vs = [f.a, f.b, f.c]; for (var j = 0; j < tri.length; ++j) { if (res[vs[j]] === undefined && _BaseMathUtils2.default.isInsidePoly(ps, tri[j])) { res[vs[j]] = { p: tri[j], i: vs[j], n: f.vertexNormals[j] }; } } } return Object.values(res); }; return ThreeUtils; }(); exports.default = ThreeUtils; /***/ }, /* 21 */ /***/ function(module, exports) { "use strict"; "use strict"; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Target = function () { function Target() { _classCallCheck(this, Target); } Target.test = function test(object1, object2) { return object1.target === object2.target; }; return Target; }(); exports.default = Target; /***/ }, /* 22 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(1); var _Detector = __webpack_require__(45); var _Detector2 = _interopRequireDefault(_Detector); var _VisualWorld = __webpack_require__(66); var _VisualWorld2 = _interopRequireDefault(_VisualWorld); var _PdfLinksHandler = __webpack_require__(35); var _PdfLinksHandler2 = _interopRequireDefault(_PdfLinksHandler); var _Book = __webpack_require__(26); var _Book2 = _interopRequireDefault(_Book); var _BookView = __webpack_require__(29); var _BookView2 = _interopRequireDefault(_BookView); var _BookController = __webpack_require__(27); var _BookController2 = _interopRequireDefault(_BookController); var _PdfBookPropsBuilder = __webpack_require__(34); var _PdfBookPropsBuilder2 = _interopRequireDefault(_PdfBookPropsBuilder); var _ClbBookPropsBuilder = __webpack_require__(30); var _ClbBookPropsBuilder2 = _interopRequireDefault(_ClbBookPropsBuilder); var _LoadingController = __webpack_require__(53); var _LoadingController2 = _interopRequireDefault(_LoadingController); var _Search = __webpack_require__(58); var _Search2 = _interopRequireDefault(_Search); var _Bookmarks = __webpack_require__(44); var _Bookmarks2 = _interopRequireDefault(_Bookmarks); var _Thumbnails = __webpack_require__(63); var _Thumbnails2 = _interopRequireDefault(_Thumbnails); var _TocController = __webpack_require__(40); var _TocController2 = _interopRequireDefault(_TocController); var _BookPrinter = __webpack_require__(28); var _BookPrinter2 = _interopRequireDefault(_BookPrinter); var _AutoNavigator = __webpack_require__(24); var _AutoNavigator2 = _interopRequireDefault(_AutoNavigator); var _SoundsEnviroment = __webpack_require__(39); var _SoundsEnviroment2 = _interopRequireDefault(_SoundsEnviroment); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } _libs.$.fn.FlipBook = function (options) { var scene = { dispose: function dispose() { if (this.ready) { !scene.pdfLinksHandler || scene.pdfLinksHandler.dispose(); delete scene.pdfLinksHandler; scene.sounds.dispose(); delete scene.sounds; scene.tocCtrl.dispose(); delete scene.tocCtrl; scene.thumbnails.dispose(); delete scene.thumbnails; !scene.bookmarks || scene.bookmarks.dispose(); delete scene.bookmarks; scene.ctrl.dispose(); delete scene.ctrl; scene.bookPrinter.dispose(); delete scene.bookPrinter; scene.book.dispose(); delete scene.book; scene.propsBuilder.dispose(); delete scene.propsBuilder; delete scene.bookBuilder; scene.visual.dispose(); delete scene.visual; scene.view.dispose(); delete scene.view; delete scene.dispose; } else { this.pendingDispose = true; } } }; options = _extends({}, options); scene.view = new _BookView2.default(this.length ? this[0] : (0, _libs.$)('
').appendTo('body'), function () { if (!_Detector2.default.webgl) { _Detector2.default.addGetWebGLMessage({ parent: scene.view.getView() }); } else { scene.loadingCtrl = new _LoadingController2.default(scene.view, true, function (progress) { return progress === 0 ? (0, _libs.tr)('Please wait... the Application is Loading') : (0, _libs.tr)('PDF is Loading:') + ' ' + progress + '%'; }); scene.visual = new _VisualWorld2.default(scene.view.getContainer().ownerDocument.defaultView, scene.view.getContainer().ownerDocument, scene.view.getView()); scene.bookBuilder = function (props, sheets, pageCallback) { props.cssLayerProps = _extends({}, props.cssLayerProps, { scene: scene }); if (options.propertiesCallback) { props = options.propertiesCallback(props); } scene.book = new _Book2.default(scene.visual, sheets, pageCallback, props); scene.bookPrinter = new _BookPrinter2.default(scene.visual, scene.book, (options.template || {}).printStyle); scene.loadingCtrl.dispose(); delete scene.loadingCtrl; scene.ctrl = new _BookController2.default(scene.book, scene.view, options.controlsProps); scene.book.setInjector(function (w) { w.jQuery = w.$ = _libs.$; w.book = scene.book; w.bookCtrl = scene.ctrl; if (props.injector) { props.injector(w); } }); scene.view.addHandler(scene.ctrl); scene.ctrl.setPrinter(scene.bookPrinter); var test = pageCallback(0); scene.search = new _Search2.default(scene.view.getSearchView(), scene.book.getPages()); scene.search.onQuery = scene.book.setQuery.bind(scene.book); scene.book.addEventListener('searchResults', function (e) { scene.search.setResults(e.results, e.lastPage); }); scene.thumbnails = new _Thumbnails2.default(scene.visual, scene.view.getThumbnailsView(), pageCallback, 2 * (sheets + 2), { kWtoH: props.width / props.height }); scene.tocCtrl = new _TocController2.default(scene.view, scene.ctrl); scene.tocCtrl.setThumbnails(scene.thumbnails); scene.tocCtrl.setSearch(scene.search); scene.ctrl.setTocCtrl(scene.tocCtrl); scene.view.addHandler(scene.tocCtrl); if (test.type === 'pdf') { scene.pdfLinksHandler = new _PdfLinksHandler2.default(test.src, scene.ctrl, scene.visual.element); scene.book.addEventListener('pdfAnnotation', scene.pdfLinksHandler.handleEvent.bind(scene.pdfLinksHandler)); test.src.getHandler(function (handler) { handler.getOutline().then(function (outline) { scene.bookmarks = new _Bookmarks2.default(scene.view.getBookmarksView(), outline); scene.tocCtrl.setBookmarks(scene.bookmarks, test.src); }); }); if (options.pdfLinks && options.pdfLinks.handler) { scene.pdfLinksHandler.setHandler(options.pdfLinks.handler); } } scene.sounds = new _SoundsEnviroment2.default(options.template); scene.ctrl.setSounds(scene.sounds); scene.sounds.subscribeFlips(scene.ctrl); scene.ready = true; new _AutoNavigator2.default(scene.visual, scene.ctrl, options.autoNavigation).dispose(); if (options.ready) { options.ready(scene); } if (scene.pendingDispose) { scene.dispose(); } }; if (options.pdf) { scene.propsBuilder = new _PdfBookPropsBuilder2.default(options.pdf, scene.bookBuilder); scene.propsBuilder.pdf.setLoadingProgressClb(scene.loadingCtrl.setProgress.bind(scene.loadingCtrl)); } else if (options.pageCallback) { scene.propsBuilder = new _ClbBookPropsBuilder2.default(scene.visual, options.pageCallback, options.pages, scene.bookBuilder); } else { scene.propsBuilder = new _ClbBookPropsBuilder2.default(scene.visual, _Book2.default.pageCallback, 6, scene.bookBuilder); } } }, options.template); return scene; }; (0, _libs.$)(function () { var containers = (0, _libs.$)('.flip-book-container'); for (var i = 0; i < containers.length; ++i) { var jContainer = (0, _libs.$)(containers[i]), src = jContainer.attr('src'); if (!!src) { jContainer.FlipBook({ pdf: src }); } } }); window.jQuery = window.$ = _libs.$; /***/ }, /* 23 */ /***/ function(module, exports) { "use strict"; 'use strict'; if (!Array.prototype.fill) { Array.prototype.fill = function (value) { // Шаги 1-2. if (this == null) { throw new TypeError('this is null or not defined'); } var O = Object(this); // Шаги 3-5. var len = O.length >>> 0; // Шаги 6-7. var start = arguments[1]; var relativeStart = start >> 0; // Шаг 8. var k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); // Шаги 9-10. var end = arguments[2]; var relativeEnd = end === undefined ? len : end >> 0; // Шаг 11. var final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); // Шаг 12. while (k < final) { O[k] = value; k++; } // Шаг 13. return O; }; } if (!Array.prototype.find) { Object.defineProperty(Array.prototype, 'find', { value: function value(predicate) { 'use strict'; if (this == null) { throw new TypeError('Array.prototype.find called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } return undefined; } }); } if (!Array.prototype.findIndex) { Array.prototype.findIndex = function (predicate) { if (this == null) { throw new TypeError('Array.prototype.findIndex called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return i; } } return -1; }; } if (!Object.values) { Object.values = function values(O) { return Object.keys(O).map(function (name) { return O[name]; }) || []; }; } /***/ }, /* 24 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var AutoNavigator = function () { function AutoNavigator(context, bookCtrl) { var props = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; _classCallCheck(this, AutoNavigator); props = _extends({}, props, { urlParam: props.urlParam || 'fb3d-page', navigates: props.navigates === undefined ? 1 : props.navigates }); this.props = props; this.context = context; this.bookCtrl = bookCtrl; this.urlParam = props.urlParam; this.wnd = context.wnd; this.wnd.fb3d = _extends({}, this.wnd.fb3d); this.wnd.fb3d.navigator = _extends({}, this.wnd.fb3d.navigator); this.navigator = this.wnd.fb3d.navigator[this.urlParam] = _extends({}, this.wnd.fb3d.navigator[this.urlParam]); this.navigator.instances = (this.navigator.instances || 0) + 1; if (this.navigator.instances <= this.props.navigates) { this.bookCtrl.goToPage(this.getPageNumber()); } } AutoNavigator.prototype.dispose = function dispose() {}; AutoNavigator.prototype.getParameterByName = function getParameterByName(name, url) { if (!url) { url = window.location.href; } name = name.replace(/[\[\]]/g, '\\$&'); var regex = new RegExp('[?&]' + name + '(=([^]*)|&|#|$)'), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, ' ')); }; AutoNavigator.prototype.getPageNumber = function getPageNumber() { var number = this.getParameterByName(this.urlParam); number = parseInt(number); if (isNaN(number)) { number = 1; } return number - 1; }; return AutoNavigator; }(); exports.default = AutoNavigator; /***/ }, /* 25 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(1); var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Binder = function () { function Binder(visual, p) { var _this = this; _classCallCheck(this, Binder); this.visual = visual; this.p = _extends({}, p, { backSize: 2 * p.cover.depth + p.sheets * p.page.depth }); this.OZ = new _libs.THREE.Vector3(0, 0, 1); this.backG = new _libs.THREE.BoxGeometry(p.cover.depth, this.p.backSize, p.cover.height); this.materials = [new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color }), new _libs.THREE.MeshPhongMaterial({ color: p.cover.color })]; var backM = new _libs.THREE.Mesh(this.backG, new _libs.THREE.MeshFaceMaterial(this.materials)); if (p.cover.binderTexture !== '') { this.visual.textureLoader.load(p.cover.binderTexture, function (texture) { _this.materials[1].color.setHex(0xFFFFFF); _this.materials[1].map = texture; texture.minFilter = _libs.THREE.LinearFilter; texture.needsUpdate = true; _this.materials[1].needsUpdate = true; }); } this.three = new _libs.THREE.Object3D(); this.back = new _libs.THREE.Object3D(); this.backRT = new _libs.THREE.Object3D(); this.backRR = new _libs.THREE.Object3D(); this.backLT = new _libs.THREE.Object3D(); this.backLR = new _libs.THREE.Object3D(); this.leftPivot = new _libs.THREE.Object3D(); this.rightPivot = new _libs.THREE.Object3D(); this.back.add(backM); this.back.add(this.leftPivot); this.back.add(this.rightPivot); this.backRT.add(this.back); this.backRR.add(this.backRT); this.backLT.add(this.backRR); this.backLR.add(this.backLT); this.three.add(this.backLR); } Binder.prototype.dispose = function dispose() { for (var _iterator = this.materials, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var m = _ref; if (m.map) { m.map = null; m.needsUpdate = true; } m.dispose(); } delete this.materials; this.backG.dispose(); }; Binder.prototype.set = function set(angle) { var right = void 0, left = void 0; if (angle > Math.PI / 2) { right = Math.PI / 2; left = angle - Math.PI / 2; } else { right = angle; left = 0; } var p = this.p, tr1 = { x: -0.5 * p.cover.depth, y: 0.5 * p.backSize - p.cover.depth }; this.backRT.position.set(tr1.x, tr1.y, 0); this.backRR.position.set(-tr1.x, -tr1.y, 0); this.backRR.quaternion.setFromAxisAngle(this.OZ, right); var tr2 = { x: p.backSize - 2 * p.cover.depth - 0.5 * p.cover.depth, y: 0.5 * p.backSize - p.cover.depth }; this.backLT.position.set(tr2.x, tr2.y, 0); this.backLR.position.set(-tr2.x, -tr2.y, 0); this.backLR.quaternion.setFromAxisAngle(this.OZ, left); }; Binder.prototype.setLeft = function setLeft(angle) { var PI = Math.PI; this.leftPivot.position.set(_MathUtils2.default.interpolateLinear([-PI, -PI / 2], [0, this.p.cover.depth], angle), 0.5 * this.p.backSize - 0.5 * this.p.cover.depth, 0); this.leftPivot.quaternion.setFromAxisAngle(this.OZ, angle); }; Binder.prototype.setRight = function setRight(angle) { var PI = Math.PI; this.rightPivot.position.set(_MathUtils2.default.interpolateLinear([-PI / 2, 0], [this.p.cover.depth, 0], angle), -0.5 * this.p.backSize + 0.5 * this.p.cover.depth, 0); this.rightPivot.quaternion.setFromAxisAngle(this.OZ, angle); }; Binder.prototype.joinLeftCover = function joinLeftCover(cover) { cover.three.position.set(0, -0.5 * this.p.cover.depth, 0); this.leftPivot.add(cover.three); }; Binder.prototype.disconnectLeftCover = function disconnectLeftCover(cover) { this.leftPivot.remove(cover.three); }; Binder.prototype.joinRightCover = function joinRightCover(cover) { cover.three.position.set(0, -0.5 * this.p.cover.depth, 0); this.rightPivot.add(cover.three); }; Binder.prototype.disconnectRightCover = function disconnectRightCover(cover) { this.rightPivot.remove(cover.three); }; return Binder; }(); exports.default = Binder; /***/ }, /* 26 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(1); var _book = __webpack_require__(11); var _GraphUtils = __webpack_require__(7); var _GraphUtils2 = _interopRequireDefault(_GraphUtils); var _Binder = __webpack_require__(25); var _Binder2 = _interopRequireDefault(_Binder); var _Cover = __webpack_require__(31); var _Cover2 = _interopRequireDefault(_Cover); var _SheetBlock = __webpack_require__(10); var _SheetBlock2 = _interopRequireDefault(_SheetBlock); var _SheetPhysics = __webpack_require__(38); var _SheetPhysics2 = _interopRequireDefault(_SheetPhysics); var _PageManager = __webpack_require__(33); var _PageManager2 = _interopRequireDefault(_PageManager); var _CSSLayer = __webpack_require__(13); var _CSSLayer2 = _interopRequireDefault(_CSSLayer); var _CssLayersManager = __webpack_require__(32); var _CssLayersManager2 = _interopRequireDefault(_CssLayersManager); var _SearchEngine = __webpack_require__(36); var _SearchEngine2 = _interopRequireDefault(_SearchEngine); var _CustomEventConverter = __webpack_require__(16); var _CustomEventConverter2 = _interopRequireDefault(_CustomEventConverter); var _CircleTarget = __webpack_require__(68); var _CircleTarget2 = _interopRequireDefault(_CircleTarget); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Book = function (_THREE$EventDispatche) { _inherits(Book, _THREE$EventDispatche); // pageCallback samples // (n)=> ({ // type: 'image', // src: 'sample.png', // interactive: false // }); // // (n)=> ({ // type: 'html', // src: 'sample.html', // interactive: true // }); // // const pdf = new Pdf('sample.pdf'); // (n)=> ({ // type: 'pdf', // src: pdf, // interactive: false // }); function Book(visual, sheets, pageCallback, props) { _classCallCheck(this, Book); var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); sheets = Math.min(3, sheets); visual.jContainer.append('\n \n
\n This is the demo version, only 10 pages are available. Use the full version.\n
\n '); _this.visual = visual; _this.mouseController = true; _this.p = _extends({}, Book.prepareProps(props), { sheets: sheets, pageCallback: pageCallback, zoom: 1, singlePage: false, autoResolution: { enable: false, k: 1.5 } }); _this.pageManager = new _PageManager2.default(visual, _this, _this.p); _CSSLayer2.default.init(visual.doc); _this.layerManager = new _CssLayersManager2.default(_this); _this.searchEngine = new _SearchEngine2.default(pageCallback, 2 * (sheets + 2)); _this.searchEngine.onPageHitsChanged = function (page, query) { _this.pageManager.refreshPageQuery(page, query); _this.dispatchEvent({ type: 'searchResults', results: _this.searchEngine.results, lastPage: page, query: query }); }; _this.three = new _libs.THREE.Object3D(); _this.binder = new _Binder2.default(visual, _this.p); _this.three.add(_this.binder.three); _this.leftCover = new _Cover2.default(visual, _extends({}, _this.p, { setTexture: _this.setLeftCoverTexture.bind(_this) }), Math.PI / 2, 'opened'); _this.binder.joinLeftCover(_this.leftCover); _this.subscribeSheetBlock(_this.leftCover, 0); _this.rightCover = new _Cover2.default(visual, _extends({}, _this.p, { setTexture: _this.setRightCoverTexture.bind(_this) }), 0, 'closed'); _this.binder.joinRightCover(_this.rightCover); _this.subscribeSheetBlock(_this.rightCover, 2 * (_this.p.sheets + 1)); _this.threeSheetBlocks = new _libs.THREE.Object3D(); _this.three.add(_this.threeSheetBlocks); _this.threeSheetBlocks.position.set(0.5 * _this.p.cover.depth - 0.5 * sheets * _this.p.page.depth, -0.5 * sheets * _this.p.page.depth, 0); _this.sheetBlocks = []; if (sheets > 0) { _this.addSheetBlock(0, new _SheetBlock2.default(visual, _extends({}, _this.p, { setTexture: _this.setPageTexture.bind(_this) }), 0, sheets, 0, 'closed')); } _this.angle = _this.p.rtl ? Math.PI : 0; _this.closedAngle = 0; _this.set(_this.angle, 0); _this.lastMousePos = { t: 0 }; _this.three.position.set(-0.5 * _this.p.cover.depth + 0.5 * sheets * _this.p.page.depth, 0, 0); _this.sheetPhysics = new _SheetPhysics2.default(_this.p.page.width / _this.p.scale, _this.p.gravity, _this.p.page.cornerDeviation); _this.binds = { update: _this.update.bind(_this), lastMousePos: function lastMousePos(e) { _this.lastMousePos = _extends({}, _this.lastMousePos, { pageX: e.pageX, pageY: e.pageY }); } }; _this.visual.addRenderCallback(_this.binds.update); (0, _libs.$)(_this.visual.element).on('mousemove', _this.binds.lastMousePos); _this.binds.onPickCallback = _this.onPickCallback.bind(_this); _this.visual.drag.onPickCallback = _this.binds.onPickCallback; _this.binds.onDragCallback = _this.onDragCallback.bind(_this); _this.visual.drag.onDragCallback = _this.binds.onDragCallback; _this.binds.onReleaseCallback = _this.onReleaseCallback.bind(_this); _this.visual.drag.onReleaseCallback = _this.binds.onReleaseCallback; _this.dragAngle = 0.05; _this.tmp = { boxs: [new _libs.THREE.Box3(), new _libs.THREE.Box3()] }; _this.visual.addObject(_this.three); _this.visual.addEventListener('resize', _this.pageManager.refreshZoom.bind(_this.pageManager)); setTimeout(function () { _this.notifyBeforeAnimation(); _this.notifyAfterAnimation(); }, 100); return _this; } Book.prototype.dispose = function dispose() { this.visual.removeObject(this.three); this.sheetPhysics.dispose(); delete this.visual.drag.onPickCallback; delete this.visual.drag.onDragCallback; delete this.visual.drag.onReleaseCallback; (0, _libs.$)(this.visual.element).off('mousemove', this.binds.lastMousePos); this.visual.removeRenderCallback(this.binds.update); this.removeSheetBlocks(0, this.sheetBlocks.length); this.binder.disconnectLeftCover(this.leftCover); this.removeSheetBlock(this.leftCover); this.binder.disconnectRightCover(this.rightCover); this.removeSheetBlock(this.rightCover); this.binder.dispose(); this.layerManager.dispose(); _CSSLayer2.default.dispose(); this.pageManager.dispose(); }; // publics { Book.prototype.setAutoResolution = function setAutoResolution(enable) { var k = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1.5; this.p.autoResolution = _extends({}, this.p.autoResolution, { enable: enable, k: k }); }; Book.prototype.setZoom = function setZoom(zoom, singlePage) { if (Math.abs(this.p.zoom - zoom) > 1e-3 || singlePage !== this.p.singlePage) { this.p.zoom = zoom; this.p.singlePage = singlePage; this.pageManager.refreshZoom(); } }; Book.prototype.getPageCallback = function getPageCallback() { return this.p.pageCallback; }; Book.prototype.setQuery = function setQuery(query) { this.searchEngine.setQuery(query); }; Book.prototype.isProcessing = function isProcessing() { return this.sheetPhysics.getSize() !== 0; }; Book.prototype.getPages = function getPages() { return 4 + 2 * this.p.sheets; }; Book.prototype.setFlipProgressClb = function setFlipProgressClb(clb) { this.p.flipProgressClb = clb; }; Book.prototype.setInjector = function setInjector(injector) { this.p.injector = injector; }; Book.prototype.isActivePage = function isActivePage(n) { var res = true; if (n > 1 && n < this.getPages() - 2) { for (var _iterator = this.sheetBlocks, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var b = _ref; if (n - 2 > 2 * b.p.first && n - 2 < 2 * b.p.last - 1) { res = false; break; } } } return res; }; Book.prototype.getBlockByPage = function getBlockByPage(n) { var block = void 0; if (n < 2) { block = this.leftCover; } else if (n < 2 * (this.p.sheets + 1)) { for (var _iterator2 = this.sheetBlocks, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var b = _ref2; if (n - 2 >= 2 * b.p.first && n - 2 < 2 * b.p.last) { block = b; break; } } } else { block = this.rightCover; } return block; }; Book.prototype.getBlockPages = function getBlockPages(block) { var range = void 0; switch (block) { case this.leftCover: { range = [0, 1]; break; } case this.rightCover: { range = [2 * (this.p.sheets + 1), 2 * (this.p.sheets + 1) + 1]; break; } default: { range = block ? [2 * (block.p.first + 1), 2 * (block.p.last + 1) - 1] : undefined; } } return range; }; Book.prototype.getPage = function getPage() { var PI = Math.PI; var p = void 0; if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { for (var _iterator3 = this.sheetBlocks, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var block = _ref3; if (block.angle <= PI / 2) { p = this.getBlockPages(block)[0] - 1; break; } } if (!p) { p = this.getPages() - 3; } } else if (this.angle < PI / 2) { p = 0; } else if (this.angle > 3 * PI / 2) { p = 1; } else if (this.angle < PI) { p = this.getPages() - 3; } else if (this.angle >= PI) { p = this.getPages() - 1; } return p; }; Book.prototype.getTopPages = function getTopPages() { var p = this.getPage(); return p === 0 || p === this.getPages() - 1 ? [p] : [p, p + 1]; }; Book.prototype.getPageState = function getPageState(n) { return this.pageManager.getPageState(n); }; Book.prototype.enableLoadingAnimation = function enableLoadingAnimation(enable) { this.pageManager.enableLoadingAnimation(enable); }; Book.prototype.getLeftFlipping = function getLeftFlipping() { var block = void 0; var left = this.sheetBlocks[0], PI = Math.PI; if (this.angle === PI) { block = this.rightCover; } else { if (left && left.state === 'closed' && left.angle > PI / 2) { block = left; } else if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { block = this.leftCover; } } return block; }; Book.prototype.getRightFlipping = function getRightFlipping() { var block = void 0; var right = this.sheetBlocks[this.sheetBlocks.length - 1], PI = Math.PI; if (this.angle === 0) { block = this.leftCover; } else { if (right && right.state === 'closed' && right.angle <= PI / 2) { block = right; } else if (this.angle === PI / 2 || this.angle === 3 * PI / 2) { block = this.rightCover; } } return block; }; Book.prototype.getClosedBlockAngle = function getClosedBlockAngle(angle) { var closedAngle = void 0, PI = Math.PI; if (this.leftCover.physicId) { var test = void 0; try { test = Math.abs(this.sheetPhysics.getParametr(this.leftCover.physicId, 'angle') - angle); } catch (e) { test = 0; } closedAngle = angle > PI / 2 || test > PI / 6 ? PI / 2 : this.closedAngle; } else if (this.rightCover.physicId) { var _test = void 0; try { _test = Math.abs(this.sheetPhysics.getParametr(this.rightCover.physicId, 'angle') - angle); } catch (e) { _test = 0; } closedAngle = angle < PI / 2 || _test > PI / 6 ? PI / 2 + 1e-7 : this.closedAngle; } else { closedAngle = PI / 2 + (angle !== 0) * 1e-7; } return { openedAngle: angle, closedAngle: closedAngle, binderTurn: this.closedAngle }; }; Book.prototype.flipLeft = function flipLeft() { var _this2 = this; var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var progressClb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.p.flipProgressClb; var block = void 0, res = void 0; if (this.sheetPhysics.getSize() < 25) { (function () { var left = _this2.sheetBlocks[0], PI = Math.PI; if (_this2.angle === PI) { res = _this2.connectPhysics(block = _this2.rightCover, _this2.p.cover.mass, PI, -_this2.p.cover.startVelocity, _this2.p.cover.flexibility, 0, function (angle, height) { return _this2.set(3 * PI / 2 - angle / 2, height); }, function (angle, height) { _this2.set(3 * PI / 2 - angle / 2, 0); _this2.setSheetBlocks(angle ? PI : PI / 2 + 1e-7, 'closed'); }, progressClb); } else { if (left && left.state === 'closed' && left.angle > PI / 2) { block = size < left.getSize() ? _this2.splitSheetBlock(0, left.getSize() - size)[1] : left; res = _this2.connectPhysics(block, _this2.p.page.mass * block.getSize(), PI, -_this2.p.page.startVelocity, _this2.p.page.flexibility, 0, function (angle, height) { return block.set(_this2.getClosedBlockAngle(angle), 'opened', height); }, Book.finishAnimationClb.bind({ book: _this2, block: block }), progressClb); } else if (_this2.angle === PI / 2 || _this2.angle === 3 * PI / 2) { res = _this2.connectPhysics(block = _this2.leftCover, _this2.p.cover.mass, PI, -_this2.p.cover.startVelocity, _this2.p.cover.flexibility, 0, function (angle, height) { _this2.set(2 * PI - angle / 2, height); if (angle > PI / 2) { _this2.setSheetBlocks(angle ? PI / 2 : 0, 'closed'); } }, function (angle, height) { return _this2.set(angle === 0 ? 0 : 2 * PI - angle / 2, 0); }, progressClb); } } })(); } return res; }; Book.prototype.flipRight = function flipRight() { var _this3 = this; var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var progressClb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.p.flipProgressClb; var block = void 0, res = void 0; if (this.sheetPhysics.getSize() < 25) { (function () { var right = _this3.sheetBlocks[_this3.sheetBlocks.length - 1], PI = Math.PI; if (_this3.angle === 0) { res = _this3.connectPhysics(block = _this3.leftCover, _this3.p.cover.mass, 0, _this3.p.cover.startVelocity, _this3.p.cover.flexibility, 0, function (angle, height) { return _this3.set(angle / 2, height); }, function (angle, height) { _this3.set(angle / 2, 0); _this3.setSheetBlocks(angle ? PI / 2 : 0, 'closed'); }, progressClb); } else { if (right && right.state === 'closed' && right.angle <= PI / 2) { block = size < right.getSize() ? _this3.splitSheetBlock(_this3.sheetBlocks.length - 1, size)[0] : right; res = _this3.connectPhysics(block, _this3.p.page.mass * block.getSize(), 0, _this3.p.page.startVelocity, _this3.p.page.flexibility, 0, function (angle, height) { return block.set(_this3.getClosedBlockAngle(angle), 'opened', height); }, Book.finishAnimationClb.bind({ book: _this3, block: block }), progressClb); } else if (_this3.angle === PI / 2 || _this3.angle === 3 * PI / 2) { res = _this3.connectPhysics(block = _this3.rightCover, _this3.p.cover.mass, 0, _this3.p.cover.startVelocity, _this3.p.cover.flexibility, 0, function (angle, height) { _this3.set(PI / 2 + angle / 2, height); if (angle < PI / 2) { _this3.setSheetBlocks(PI / 2 + 1e-7, 'closed'); } }, function (angle, height) { return _this3.set(PI / 2 + angle / 2, 0); }, progressClb); } } })(); } return res; }; // } Book.prototype.clearHoverInfo = function clearHoverInfo() { this.pageManager.turnOnEvents(); delete this.hoverInfo.block.force; delete this.hoverInfo.block.cornerForce; delete this.hoverInfo; }; Book.prototype.xSegment = function xSegment() { var boxs = this.tmp.boxs, res = {}; if (this.leftCover.physicId) { boxs[0].setFromObject(this.rightCover.three); res.min = -(res.max = boxs[0].max.x); } else if (this.rightCover.physicId) { boxs[0].setFromObject(this.leftCover.three); res.max = -(res.min = boxs[0].min.x); } else { boxs[0].setFromObject(this.leftCover.three); boxs[1].setFromObject(this.rightCover.three); boxs[0].union(boxs[1]); res.min = boxs[0].min.x; res.max = boxs[0].max.x; } return res; }; Book.prototype.computeTarget = function computeTarget(point) { var x = point.x, y = point.y, seg = this.xSegment(), angle = void 0; angle = (seg.max - x) / (seg.max - seg.min) * Math.PI; // angle = Math.acos(x/Math.sqrt(x*x+y*y)); return Math.max(this.dragAngle, Math.min(Math.PI - this.dragAngle, angle)); }; Book.prototype.onPickCallback = function onPickCallback(object) { var res = false; var block = object.object.userData.self, p = _extends({}, object.uv), i = object.face.materialIndex; if (i < 2) { p.x = i === 0 ? p.x : 1 - p.x; if (block.cornerTarget.testIntersection(null, p) && block.physicId) { if (this.hoverInfo) { this.clearHoverInfo(); } block.force = _SheetPhysics2.default.dragForceClb; block.cornerForce = _SheetPhysics2.default.getDragCornerForceClb(this.computeTarget(object.point)); this.dragInfo = { object: object, block: block }; res = true; this.pageManager.turnOffEvents(); } } return res; }; Book.prototype.onDragCallback = function onDragCallback(point) { var block = this.dragInfo.block, p = block.getProps(); block.force = _SheetPhysics2.default.dragForceClb; block.cornerForce = _SheetPhysics2.default.getDragCornerForceClb(this.computeTarget(point)); return true; }; Book.prototype.onReleaseCallback = function onReleaseCallback() { delete this.dragInfo.block.force; delete this.dragInfo.block.cornerForce; delete this.dragInfo; this.pageManager.turnOnEvents(); }; Book.prototype.getFlipping = function getFlipping(i) { return i ? this.getLeftFlipping() : this.getRightFlipping(); }; Book.prototype.flip = function flip(i) { var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; return i ? this.flipLeft(size) : this.flipRight(size); }; Book.prototype.enableMouse = function enableMouse(enable) { this.mouseController = enable; }; Book.prototype.cornerCallback = function cornerCallback(e, data) { var _this4 = this; if (this.mouseController) { (function () { var _data$data = data.data, i = _data$data.i, n = _data$data.n; if (e.type === 'mouseover') { if (_this4.hoverInfo && _this4.hoverInfo.pendings !== undefined) { ++_this4.hoverInfo.pendings; } else { if (_this4.hoverInfo) { console.warn('Wrong state: element is already hover'); if (_this4.hoverInfo.n !== n) { _this4.clearHoverInfo(); } } if (!_this4.hoverInfo && !_this4.dragInfo) { (function () { var res = Promise.resolve(undefined); var hoverAngle = 0.02, hover = _this4.getBlockByPage(n), possible = _this4.getFlipping(i); if (n > 1 && n < 2 * (_this4.p.sheets + 1) && hover.physicId && (hover.angle < hoverAngle || hover.angle > Math.PI - hoverAngle)) { res = Promise.resolve(hover); } else if (hover === possible) { var sheetBlocks = [_this4.leftCover].concat(_this4.sheetBlocks, [_this4.rightCover]); var j = sheetBlocks.indexOf(hover), nextBlock = ~j ? sheetBlocks[j + 2 * i - 1] : undefined; if (!nextBlock || !nextBlock.physicId || nextBlock.angle > hoverAngle && nextBlock.angle < Math.PI - hoverAngle) { res = _this4.flip(i, 1).then(function (block) { if (!block) { delete _this4.hoverInfo; } else { _this4.sheetPhysics.setParametr(block.physicId, 'velocity', 0); } return block; }); _this4.hoverInfo = { pendings: 1 }; } } res.then(function (block) { if (_this4.hoverInfo && _this4.hoverInfo.pendings < 1) { block = undefined; delete _this4.hoverInfo; } if (block) { _this4.pageManager.turnOffEvents(); var p = block.getProps(); block.force = _this4.sheetPhysics.getTargetForceClb(p.mass * block.getSize(), i ? Math.PI - hoverAngle : hoverAngle); block.cornerForce = function () { return (i ? -1 : 1) * _SheetPhysics2.default.hoverCornerForceClb(); }; _this4.sheetPhysics.setParametr(block.physicId, 'angle', i ? Math.PI - 0.5 * hoverAngle : 0.5 * hoverAngle); _this4.hoverInfo = { n: n, block: block }; _this4.update(1 / 30); } }); })(); } } } else if (_this4.hoverInfo && e.type === 'mouseout') { if (_this4.hoverInfo.pendings !== undefined) { --_this4.hoverInfo.pendings; } else if (n === _this4.hoverInfo.n) { _this4.clearHoverInfo(); } } else if (e.type === 'mousedown') { _this4.cornerClickData = { x: e.pageX, y: e.pageY }; } else if (e.type === 'click') { if (Math.sqrt(Math.pow(_this4.cornerClickData.x - e.pageX, 2) + Math.pow(_this4.cornerClickData.y - e.pageY, 2)) < 5) { var hover = _this4.getBlockByPage(n); if (hover.physicId) { var id = hover.physicId, props = hover.getProps(); _this4.sheetPhysics.setParametr(id, 'velocity', (i ? -1 : 1) * props.startVelocity); } } delete _this4.cornerClickData; } })(); } }; Book.prototype.addSheetBlock = function addSheetBlock(p, block) { this.sheetBlocks.splice(p, 0, block); this.subscribeSheetBlock(block, 2); this.threeSheetBlocks.add(block.three); }; Book.prototype.subscribeSheetBlock = function subscribeSheetBlock(block, offset) { var _this5 = this; var eventConverter = new _CustomEventConverter2.default(this.visual.wnd, this.visual.doc, _CircleTarget2.default.test), r = 0.15, target = new _CircleTarget2.default(1 - 0.5 * r, 0.5 * r, r); target.block = block; target.callback = this.cornerCallback.bind(this); eventConverter.addCustom(target); block.cornerTarget = target; block.three.userData.mouseCallback = function (e, data) { var i = data.face.materialIndex; if (i < 2) { var n = i === 0 ? offset + 2 * block.p.first : offset + 2 * block.p.last - 1; eventConverter.convert(e, { x: i === 0 ? data.uv.x : 1 - data.uv.x, y: data.uv.y, i: i, n: n }); _this5.pageManager.transferEventToTexture(n, e, data); } }; block.three.userData.touchCallback = function (e, data) { var i = data.face.materialIndex; if (i < 2) { var n = i === 0 ? offset + 2 * block.p.first : offset + 2 * block.p.last - 1; _this5.pageManager.transferEventToTexture(n, e, data); } }; this.visual.drag.addThree(block.three); this.visual.mouseEvents.addThree(block.three); this.visual.touchEvents.addThree(block.three); }; Book.prototype.removeSheetBlock = function removeSheetBlock(block) { this.visual.mouseEvents.removeThree(block.three); this.visual.touchEvents.removeThree(block.three); this.visual.drag.removeThree(block.three); this.threeSheetBlocks.remove(block.three); block.dispose(); }; Book.prototype.removeSheetBlocks = function removeSheetBlocks(first, size) { var blocks = this.sheetBlocks.splice(first, size); for (var _iterator4 = blocks, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var block = _ref4; this.removeSheetBlock(block); } }; Book.prototype.setTexture = function setTexture(material, n) { this.pageManager.setTexture(material, n); }; Book.prototype.setPageTexture = function setPageTexture(material, n) { this.setTexture(material, n + 2); }; Book.prototype.setLeftCoverTexture = function setLeftCoverTexture(material, n) { this.setTexture(material, n); }; Book.prototype.setRightCoverTexture = function setRightCoverTexture(material, n) { this.setTexture(material, n + 2 * (this.p.sheets + 1)); }; Book.finishAnimationClb = function finishAnimationClb(angle) { this.block.set(this.book.getClosedBlockAngle(angle).closedAngle, 'closed', 0); var i = this.book.sheetBlocks.indexOf(this.block); if (~i) { if (angle === 0) { this.book.mergeSheetBlocks(i, this.book.sheetBlocks.length - i); } else { this.book.mergeSheetBlocks(0, i + 1); } } }; Book.prototype.calcBlockForce = function calcBlockForce(block, object, angle, velocity, cornerHeight) { return block.force ? block.force(object, angle, velocity, cornerHeight) : 0; }; Book.prototype.calcBlockCornerForce = function calcBlockCornerForce(block, object, angle, velocity, cornerHeight) { return block.cornerForce ? block.cornerForce(object, angle, velocity, cornerHeight) : 0; }; Book.prototype.notifyBeforeAnimation = function notifyBeforeAnimation() { var res = void 0; if (this.animationNotification) { res = Promise.reject(); } else { this.animationNotification = true; this.dispatchEvent({ type: 'beforeAnimation' }); res = this.layerManager.hide(); } return res; }; Book.prototype.notifyAfterAnimation = function notifyAfterAnimation() { if (this.animationNotification) { delete this.animationNotification; this.layerManager.show(); this.dispatchEvent({ type: 'afterAnimation' }); } }; Book.prototype.connectPhysics = function connectPhysics(block, mass, angle, velocity, flexibility, coverHeight, simulateClb, removeClb, progressClb) { var _this6 = this; var type = function type() { return _this6.hoverInfo ? 'hover' : _this6.dragInfo ? 'drag' : 'free'; }, res = this.sheetPhysics.getSize() ? Promise.resolve() : this.notifyBeforeAnimation(); return res.then(function () { block.physicId = _this6.sheetPhysics.addObject(mass, angle, velocity, flexibility, coverHeight, function (angl, ch) { simulateClb(angl, ch); progressClb(block, Math.abs(angle - angl) / Math.PI, 'process', type()); }, function (angl, ch) { removeClb(angl, ch); delete block.physicId; progressClb(block, Math.abs(angle - angl) / Math.PI, 'finish', type()); Promise.resolve().then(function () { if (!_this6.sheetPhysics.getSize()) { _this6.notifyAfterAnimation(); } }); }, function (object, angle, velocity, cornerHeight) { return _this6.calcBlockForce(block, object, angle, velocity, cornerHeight); }, function (object, angle, velocity, cornerHeight) { return _this6.calcBlockCornerForce(block, object, angle, velocity, cornerHeight); }); progressClb(block, 0, 'init', type()); return block; }).catch(function () { return undefined; }); }; Book.prototype.update = function update(dt) { var _this7 = this; this.lastMousePos.t += dt; if (this.isProcessing() && this.lastMousePos.pageX !== undefined && this.lastMousePos.t - (this.lastMousePos.lastT || 0) > 0.25 && !this.hoverInfo && !this.dragInfo) { this.lastMousePos.lastT = this.lastMousePos.t; Promise.resolve().then(function () { (0, _libs.$)(_this7.visual.element).trigger(_libs.$.Event('mousemove', _this7.lastMousePos)); }); } this.sheetPhysics.simulate(dt); }; Book.prototype.splitSheetBlock = function splitSheetBlock(i, leftSize) { var block = this.sheetBlocks[i]; if (block && leftSize < block.getSize()) { var newBlock = new _SheetBlock2.default(this.visual, _extends({}, this.p, { setTexture: this.setPageTexture.bind(this) }), block.p.first, block.p.first + leftSize, block.angle, block.state); block.set(block.angle, block.state, block.corner.height, block.p.first + leftSize, block.p.last); this.addSheetBlock(i, newBlock); return [newBlock, block]; } }; Book.prototype.mergeSheetBlocks = function mergeSheetBlocks(first, size) { if (first < this.sheetBlocks.length) { size = Math.min(this.sheetBlocks.length - first, size); var firstBlock = this.sheetBlocks[first], lastBlock = this.sheetBlocks[first + size - 1]; firstBlock.set(firstBlock.angle, firstBlock.state, firstBlock.corner.height, firstBlock.p.first, lastBlock.p.last); this.removeSheetBlocks(first + 1, size - 1); } }; Book.prototype.setSheetBlocks = function setSheetBlocks(angle, state) { if (state === 'closed') { this.closedAngle = angle; } this.sheetBlocks.forEach(function (s) { if (!s.physicId) { s.set(angle, state); } }); }; Book.prototype.set = function set(angle) { var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; this.angle = angle; var PI = Math.PI; if (angle < PI / 4) { this.binder.set(0); this.binder.setLeft(-PI / 2 + 2 * angle); this.leftCover.set(PI / 2, 'opened', height); this.setSheetBlocks(0, 'closed'); this.binder.setRight(0); this.rightCover.set(0, 'closed', 0); } else if (angle < 2 * PI / 4) { var a = 2 * (angle - PI / 4); this.binder.set(a); this.binder.setLeft(-a); this.leftCover.set(PI / 2 + a, 'opened', height); this.setSheetBlocks(a, 'closed'); this.binder.setRight(-a); this.rightCover.set(a, 'closed', 0); } else if (angle < 3 * PI / 4) { var _a = 2 * (angle - PI / 2); this.binder.set(PI / 2); this.binder.setLeft(-PI / 2); this.leftCover.set(PI, 'opened', 0); this.binder.setRight(-PI / 2); this.rightCover.set(_a, 'opened', height); } else if (angle < 4 * PI / 4) { var _a2 = 2 * (angle - 3 * PI / 4) + PI / 2; this.binder.set(_a2); this.binder.setLeft(-_a2); this.leftCover.set(_a2, 'closed', 0); this.setSheetBlocks(_a2, 'closed'); this.binder.setRight(-PI / 2); this.rightCover.set(PI / 2, 'opened', height); } else if (angle < 5 * PI / 4) { this.binder.set(PI); this.binder.setLeft(-PI); this.leftCover.set(PI, 'closed', 0); this.setSheetBlocks(PI, 'closed'); this.binder.setRight(-PI / 2 - 2 * (angle - PI)); this.rightCover.set(PI / 2, 'opened', height); } else if (angle < 6 * PI / 4) { var _a3 = 2 * (angle - 5 * PI / 4); this.binder.set(PI - _a3); this.binder.setLeft(-PI + _a3); this.leftCover.set(PI - _a3, 'closed', 0); this.setSheetBlocks(PI - _a3, 'closed'); this.binder.setRight(-PI + _a3); this.rightCover.set(PI / 2 - _a3, 'opened', height); } else if (angle < 7 * PI / 4) { var _a4 = 2 * (angle - 6 * PI / 4); this.binder.set(PI / 2); this.binder.setLeft(-PI / 2); this.leftCover.set(PI - _a4, 'opened', height); this.binder.setRight(-PI / 2); this.rightCover.set(0, 'opened', 0); } else if (angle < 8 * PI / 4) { var _a5 = 2 * (angle - 7 * PI / 4); this.binder.set(PI / 2 - _a5); this.binder.setLeft(-PI / 2); this.leftCover.set(PI / 2, 'opened', height); this.setSheetBlocks(PI / 2 - _a5, 'closed'); this.binder.setRight(-PI / 2 + _a5); this.rightCover.set(PI / 2 - _a5, 'closed', 0); } }; Book.createSideTexture = function createSideTexture(color) { var jC = (0, _libs.$)(''); var ctx = jC[0].getContext('2d'); ctx.beginPath(); ctx.fillStyle = _GraphUtils2.default.color2Rgba(color, 1); ctx.rect(0, 0, 8, 7); ctx.fill(); ctx.beginPath(); ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(color, 0.5), 1); ctx.rect(0, 7, 8, 1); ctx.fill(); return jC[0]; }; Book.prepareProps = function prepareProps(props) { return Book.calcProps(Book.mergeProps((0, _book.props)(), props)); }; Book.mergeProps = function mergeProps(first, second) { second = second || {}; return _extends({}, first, second, { sheet: _extends({}, first.sheet, second.sheet), cover: _extends({}, first.cover, second.cover), page: _extends({}, first.page, second.page), cssLayerProps: _extends({}, first.cssLayerProps, second.cssLayerProps) }); }; Book.calcProps = function calcProps(props) { var p = _extends({}, props, { sheet: _extends({}, props.sheet), cover: _extends({}, props.sheet, props.cover), page: _extends({}, props.sheet, props.page), cssLayerProps: _extends({}, props.cssLayerProps, { $: _libs.$ }) }), scale = 10, height = scale * p.height, width = scale * p.width, flipProgressClb = function flipProgressClb() { return undefined; }, sheet = { sideTexture: p.sheet.sideTexture || Book.createSideTexture(p.sheet.color) }, cover = _extends({}, sheet, p.cover, { depth: scale * p.cover.depth, width: width, height: height, padding: scale * p.cover.padding }), page = _extends({}, sheet, p.page, { depth: scale * p.page.depth, width: cover.width - cover.padding, height: cover.height - 2 * cover.padding }), marker = { use: false, color: 0XFF0000, size: scale * 0.001 }; if (cover.color !== sheet.color && !p.cover.sideTexture) { cover.sideTexture = Book.createSideTexture(cover.color); } if (page.color !== sheet.color && !p.page.sideTexture) { page.sideTexture = Book.createSideTexture(page.color); } return _extends({}, p, { scale: scale, height: height, width: width, flipProgressClb: flipProgressClb, cover: cover, page: page, marker: marker }); }; return Book; }(_libs.THREE.EventDispatcher); exports.default = Book; /***/ }, /* 27 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(1); var _Controller2 = __webpack_require__(15); var _Controller3 = _interopRequireDefault(_Controller2); var _bookController = __webpack_require__(42); var _EventsToActions = __webpack_require__(49); var _EventsToActions2 = _interopRequireDefault(_EventsToActions); var _stats = __webpack_require__(70); var _stats2 = _interopRequireDefault(_stats); var _Object3DWatcher = __webpack_require__(55); var _Object3DWatcher2 = _interopRequireDefault(_Object3DWatcher); var _FullScreen = __webpack_require__(50); var _FullScreen2 = _interopRequireDefault(_FullScreen); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var BookController = function (_Controller) { _inherits(BookController, _Controller); function BookController(book, view, props) { _classCallCheck(this, BookController); var _this = _possibleConstructorReturn(this, _Controller.call(this)); _this.navigationControls = true; _this.book = book; _this.visual = book.visual; _this.p = BookController.prepareProps(props); _this.p.rtl = book.p.rtl; _this.devicePixelRatio = _this.visual.wnd.devicePixelRatio || 1; _this.orbit = book.visual.getOrbit(); book.setFlipProgressClb(_this.updateViewIfState.bind(_this)); _this.view = view; _this.bindActions(); _this.state = { smartPan: !_this.actions['cmdSmartPan'].active, singlePage: _this.actions['cmdSinglePage'].active || _this.actions['cmdSinglePage'].activeForMobile && _this.devicePixelRatio > 1, stats: _this.actions['cmdStats'].active, lighting: _this.p.lighting.default, activeSide: 1 }; _this.boxs = [new _libs.THREE.Box3(), new _libs.THREE.Box3()]; _this.bookWatcher = new _Object3DWatcher2.default(_this.visual, function () { if (_this.state.singlePage) { if (_this.state.activeSide) { _this.boxs[0].setFromObject(book.rightCover.three); } else { _this.boxs[0].setFromObject(book.leftCover.three); } } else { _this.boxs[0].setFromObject(book.leftCover.three); _this.boxs[1].setFromObject(book.rightCover.three); _this.boxs[0].union(_this.boxs[1]); } return _this.boxs[0]; }); _this.bookWatcher.scale = _this.p.scale.default; _this.book.setZoom(_this.bookWatcher.scale, _this.state.singlePage); _this.Stats = new _stats2.default(); _this.Stats.domElement.style.position = 'absolute'; _this.Stats.domElement.style.top = '0px'; _this.visual.setExtraLighting(_this.state.lighting); _this.binds = { onScreenModeChanged: _this.onScreenModeChanged.bind(_this), stats: _this.Stats.update.bind(_this.Stats), onUpdateView: _this.updateView.bind(_this) }; _FullScreen2.default.addEventListener(_this.view.getParentContainer().ownerDocument, _this.binds.onScreenModeChanged); _this.cmdSmartPan(); if (_this.view.templateObject.appLoaded) { Promise.resolve().then(_this.view.templateObject.appLoaded); } _this.book.enableLoadingAnimation(_this.p.loadingAnimation.book); if (_this.p.loadingAnimation.skin) { _this.initLoadingAnimation(); } _this.book.enableLoadingAnimation(_this.p.loadingAnimation.book); _this.book.setAutoResolution(_this.p.autoResolution.enabled, _this.p.autoResolution.coefficient); return _this; } BookController.prototype.dispose = function dispose() { _FullScreen2.default.removeEventListener(this.view.getParentContainer().ownerDocument, this.binds.onScreenModeChanged); delete this.book; delete this.view; delete this.visual; }; BookController.prototype.initLoadingAnimation = function initLoadingAnimation() { var _this2 = this; var handler = function handler() { var pages = _this2.book.getTopPages(); var visible = false; for (var _iterator = pages, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var n = _ref; var state = _this2.book.getPageState(n); visible = state === undefined || state === 'loading'; if (visible) { break; } } _this2.view.setState('widLoading', { visible: visible }); }; this.book.addEventListener('beforeAnimation', handler); this.book.addEventListener('afterAnimation', handler); this.book.addEventListener('loadPage', handler); this.book.addEventListener('loadedPage', handler); }; BookController.prototype.enableNavigation = function enableNavigation(enable) { this.navigationControls = enable; }; BookController.prototype.setTocCtrl = function setTocCtrl(tocCtrl) { this.tocCtrl = tocCtrl; this.tocCtrl.onChange = this.updateView.bind(this); this.updateView(); }; BookController.prototype.setPrinter = function setPrinter(printer) { this.printer = printer; this.updateView(); }; BookController.prototype.setSounds = function setSounds(sounds) { this.sounds = sounds; sounds.setEnabled(this.actions['cmdSounds'].active); this.updateView(); }; BookController.prototype.onScreenModeChanged = function onScreenModeChanged(e) { this.updateView(); }; BookController.prototype.canZoomIn = function canZoomIn() { return !this.state.smartPan || Math.abs(this.bookWatcher.scale - this.p.scale.max) > this.p.eps; }; BookController.prototype.canZoomOut = function canZoomOut() { return !this.state.smartPan || Math.abs(this.bookWatcher.scale - this.p.scale.min) > this.p.eps; }; BookController.prototype.canDefaultZoom = function canDefaultZoom() { return this.state.smartPan; }; BookController.prototype.setBookZoom = function setBookZoom(scale) { var _this3 = this; setTimeout(function () { if (_this3.bookWatcher.scale === scale) { _this3.book.setZoom(scale, _this3.state.singlePage); } }, 1000); }; BookController.prototype.cmdZoomIn = function cmdZoomIn() { if (this.state.smartPan) { this.bookWatcher.scale = Math.min(this.p.scale.max, this.bookWatcher.scale + this.p.scale.delta); this.setBookZoom(this.bookWatcher.scale); } else { this.orbit.zoomIn(6.6 * this.p.scale.delta / 0.32); } this.updateView(); }; BookController.prototype.cmdZoomOut = function cmdZoomOut() { if (this.state.smartPan) { this.bookWatcher.scale = Math.max(this.p.scale.min, this.bookWatcher.scale - this.p.scale.delta); this.setBookZoom(this.bookWatcher.scale); } else { this.orbit.zoomOut(6.6 * this.p.scale.delta / 0.32); } this.updateView(); }; BookController.prototype.cmdDefaultZoom = function cmdDefaultZoom() { if (this.state.smartPan) { this.bookWatcher.scale = this.p.scale.default; this.setBookZoom(this.bookWatcher.scale); this.updateView(); } }; BookController.prototype.cmdToc = function cmdToc() { if (this.tocCtrl) { this.tocCtrl.togle(); } }; BookController.prototype.cmdFastBackward = function cmdFastBackward() { this.startFlip(this.book.flipLeft(5)); }; BookController.prototype.cmdBackward = function cmdBackward() { var _this4 = this; if (this.state.singlePage) { this.state.activeSide = (this.getPage() + 1) % 2; if (this.state.activeSide) { this.state.activeSide = 0; this.updateView(); } else { this.startFlip(this.book.flipLeft(1)).then(function (block) { if (block) { _this4.state.activeSide = 1; } }); } } else { this.startFlip(this.book.flipLeft(1)); } }; BookController.prototype.cmdForward = function cmdForward() { var _this5 = this; if (this.state.singlePage) { this.state.activeSide = (this.getPage() + 1) % 2; if (!this.state.activeSide) { this.state.activeSide = 1; this.updateView(); } else { this.startFlip(this.book.flipRight(1)).then(function (block) { if (block) { _this5.state.activeSide = 0; } }); } } else { this.startFlip(this.book.flipRight(1)); } }; BookController.prototype.cmdFastForward = function cmdFastForward() { this.startFlip(this.book.flipRight(5)); }; BookController.prototype.cmdSave = function cmdSave() { window.open(this.p.downloadURL, '_blank'); }; BookController.prototype.cmdPrint = function cmdPrint() { this.printer.print(); }; BookController.prototype.cmdFullScreen = function cmdFullScreen() { if (!_FullScreen2.default.activated()) { _FullScreen2.default.request(this.view.getParentContainer()); } else { _FullScreen2.default.cancel(); } }; BookController.prototype.cmdSmartPan = function cmdSmartPan() { this.state.smartPan = !this.state.smartPan; if (this.state.smartPan) { this.orbit.minAzimuthAngle = 0; this.orbit.maxAzimuthAngle = 0; this.orbit.minPolarAngle = 0; this.orbit.maxPolarAngle = Math.PI / 4; this.bookWatcher.enabled = true; } else { this.orbit.minAzimuthAngle = -Infinity; this.orbit.maxAzimuthAngle = Infinity; this.orbit.minPolarAngle = 0; this.orbit.maxPolarAngle = Math.PI; this.bookWatcher.enabled = false; } this.updateView(); }; BookController.prototype.cmdSinglePage = function cmdSinglePage() { this.state.singlePage = !this.state.singlePage; this.setBookZoom(this.bookWatcher.scale); this.updateView(); }; BookController.prototype.cmdSounds = function cmdSounds() { if (this.sounds) { this.sounds.togle(); } this.updateView(); }; BookController.prototype.cmdStats = function cmdStats() { this.state.stats = !this.state.stats; if (this.state.stats) { (0, _libs.$)(this.view.getContainer()).append(this.Stats.domElement); this.visual.addRenderCallback(this.binds.stats); } else { (0, _libs.$)(this.view.getContainer()).find(this.Stats.domElement).remove(); this.visual.removeRenderCallback(this.binds.stats); } this.updateView(); }; BookController.prototype.cmdLightingUp = function cmdLightingUp() { this.state.lighting = Math.min(this.state.lighting + this.p.lighting.delta, this.p.lighting.max); this.visual.setExtraLighting(this.state.lighting); this.updateView(); }; BookController.prototype.cmdLightingDown = function cmdLightingDown() { this.state.lighting = Math.max(this.state.lighting - this.p.lighting.delta, this.p.lighting.min); this.visual.setExtraLighting(this.state.lighting); this.updateView(); }; BookController.prototype.goToPage = function goToPage(page) { var _this6 = this; if (this.p.rtl) { page = this.book.getPages() - 1 - page; } var pageNum = Math.max(Math.min(page, this.book.getPages() - 1), 0); this.state.activeSide = (pageNum + 1) % 2; var target = Math.max(Math.min(page - 1 + page % 2, this.book.getPages() - 1), 0), current = this.book.getPage(), flips = [], covs = 0;; if (target != current) { if (current === 0) { flips.push(1); current += 1; ++covs; } else if (current === this.book.getPages() - 1) { flips.push(-1); current -= 2; ++covs; } var cv = 0; if (target === 0) { cv = -1; target += 1; ++covs; } else if (target === this.book.getPages() - 1) { cv = 1; target -= 2; ++covs; } if (target - current) { flips.push(Math.ceil((target - current) / 2)); } if (cv) { flips.push(cv); } } var setClb = function setClb(fl, time, clb) { setTimeout(function () { if (fl < 0) { _this6.startFlip(_this6.book.flipLeft(-fl, clb)); } else { _this6.startFlip(_this6.book.flipRight(fl, clb)); } }, time); }; if (covs === 2) { setClb(flips[0], 0, function (block, progress, state) { if (state == 'finish' && progress == 1) { setClb(flips[flips.length - 1], 0); } }); setClb(flips[1], 500); } else { var time = 0; for (var _iterator2 = flips, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var fl = _ref2; setClb(fl, time); time += 250; } } }; BookController.prototype.startFlip = function startFlip(flipRes) { var _this7 = this; return flipRes ? flipRes.then(function (block) { if (block) { _this7.dispatchAsync({ type: 'startFlip' }); } return block; }) : Promise.resolve(undefined); }; BookController.prototype.endFlip = function endFlip(block) { this.dispatchAsync({ type: 'endFlip' }); return block; }; BookController.prototype.getPage = function getPage() { var page = this.book.getPage(); return page ? Math.min(this.book.getPage() + this.state.activeSide, this.book.getPages() - 1) : 0; }; BookController.prototype.getPageForGUI = function getPageForGUI() { var n = (this.state.singlePage ? this.getPage() : this.book.getPage()) + 1; if (this.p.rtl) { n = this.book.getPages() - n + 1; } return n; }; BookController.prototype.inpPage = function inpPage(e, data) { this.goToPage(data - 1); }; BookController.prototype.updateViewIfState = function updateViewIfState(block, progress, state, type) { if (state === 'init' || state === 'finish') { setTimeout(this.updateView.bind(this), 100); } if (state === 'finish') { this.endFlip(block); } }; BookController.prototype.updateViewState = function updateViewState() { this.viewState = { 'cmdZoomIn': { enable: this.canZoomIn(), visible: this.actions['cmdZoomIn'].enabled, active: false }, 'cmdZoomOut': { enable: this.canZoomOut(), visible: this.actions['cmdZoomOut'].enabled, active: false }, 'cmdDefaultZoom': { enable: this.canDefaultZoom(), visible: this.actions['cmdDefaultZoom'].enabled, active: this.canDefaultZoom() && Math.abs(this.bookWatcher.scale - this.p.scale.default) < this.p.eps }, 'cmdToc': { enable: !!this.tocCtrl, visible: this.actions['cmdToc'].enabled && this.tocCtrl, active: this.tocCtrl && this.tocCtrl.visible }, 'inpPages': { visible: true, value: this.book.getPages() }, 'inpPage': { visible: true, enable: !this.book.isProcessing() && this.navigationControls, value: this.getPageForGUI() }, 'cmdSave': { enable: true, visible: this.actions['cmdSave'].enabled && !!this.p.downloadURL, active: false }, 'cmdPrint': { enable: true, visible: this.actions['cmdPrint'].enabled && !!this.printer, active: false }, 'cmdFullScreen': { enable: _FullScreen2.default.available(), visible: this.actions['cmdFullScreen'].enabled, active: _FullScreen2.default.available() && _FullScreen2.default.activated() }, 'widSettings': { enable: true, visible: this.actions['widSettings'].enabled, active: false }, 'cmdSmartPan': { enable: true, visible: this.actions['cmdSmartPan'].enabled, active: this.state.smartPan }, 'cmdSinglePage': { enable: true, visible: this.actions['cmdSinglePage'].enabled, active: this.state.singlePage }, 'cmdSounds': { enable: true, visible: this.actions['cmdSounds'].enabled && !!this.sounds, active: !!this.sounds && this.sounds.enabled }, 'cmdStats': { enable: true, visible: this.actions['cmdStats'].enabled, active: this.state.stats }, 'cmdLightingUp': { enable: Math.abs(this.state.lighting - this.p.lighting.max) > this.p.eps, visible: this.actions['cmdLightingUp'].enabled, active: false }, 'cmdLightingDown': { enable: Math.abs(this.state.lighting - this.p.lighting.min) > this.p.eps, visible: this.actions['cmdLightingDown'].enabled, active: false } }; var left = this.book.getLeftFlipping(), right = this.book.getRightFlipping(); var flippersEnable = { cmdFastBackward: !!left && this.navigationControls, cmdBackward: !!left && this.navigationControls, cmdForward: !!right && this.navigationControls, cmdFastForward: !!right && this.navigationControls }; for (var _iterator3 = Object.keys(flippersEnable), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var name = _ref3; this.viewState[name] = { enable: flippersEnable[name], visible: this.actions[name].enabled, active: false }; }; }; BookController.prototype.updateView = function updateView() { if (this.view) { this.updateViewState(); for (var _iterator4 = Object.keys(this.viewState), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var name = _ref4; this.view.setState(name, this.viewState[name]); } } }; BookController.prototype.getActions = function getActions() { var _this8 = this; var isSwipping = function isSwipping(name) { return _this8.actions.touchCmdSwipe.enabled && _this8.actions.touchCmdSwipe.code === _this8.actions[name].code && _this8.state.smartPan && _this8.bookWatcher.scale <= 1; }, cmds = {}; var _loop = function _loop(name) { if (name.indexOf('cmd') === 0) { cmds[name] = { activate: function activate() { if (_this8.viewState && _this8.viewState[name].enable) { _this8[name].apply(_this8, arguments); } } }; } }; for (var name in this) { _loop(name); } return _extends({}, cmds, { cmdPanLeft: { activate: function activate(e) { return _this8.orbit.actions.pan(e, { state: 'move', dx: -_this8.p.pan.speed, dy: 0 }); } }, cmdPanRight: { activate: function activate(e) { return _this8.orbit.actions.pan(e, { state: 'move', dx: _this8.p.pan.speed, dy: 0 }); } }, cmdPanUp: { activate: function activate(e) { return _this8.orbit.actions.pan(e, { state: 'move', dx: 0, dy: -_this8.p.pan.speed }); } }, cmdPanDown: { activate: function activate(e) { return _this8.orbit.actions.pan(e, { state: 'move', dx: 0, dy: _this8.p.pan.speed }); } }, mouseCmdRotate: { activate: this.orbit.actions.rotate }, mouseCmdDragZoom: { activate: function activate(e, data) { if (data.dy > 0) { _this8.cmdZoomOut(); } else if (data.dy < 0) { _this8.cmdZoomIn(); } } }, mouseCmdPan: { activate: this.orbit.actions.pan }, mouseCmdWheelZoom: { activate: function activate(e) { e.preventDefault(); if (e.deltaY < 0) { _this8.cmdZoomOut(); } else if (e.deltaY > 0) { _this8.cmdZoomIn(); } } }, touchCmdRotate: { activate: function activate(e, data) { if (!isSwipping('touchCmdRotate')) { e.preventDefault(); _this8.orbit.actions.rotate(e, data); } } }, touchCmdZoom: { activate: function activate(e, data) { if (!isSwipping('touchCmdZoom')) { e.preventDefault(); if (data.dy > 0) { _this8.cmdZoomOut(); } else if (data.dy < 0) { _this8.cmdZoomIn(); } } } }, touchCmdPan: { activate: function activate(e, data) { if (!isSwipping('touchCmdPan')) { e.preventDefault(); _this8.orbit.actions.pan(e, data); } } }, touchCmdSwipe: { activate: function activate(e, data) { if (isSwipping('touchCmdSwipe')) { e.preventDefault(); if (data.state === 'start') { var touch = (e.touches || e.originalEvent.touches)[_this8.actions.touchCmdSwipe.code - 1]; _this8.swipeData = { handled: false, x0: touch.pageX, y0: touch.pageY, x: touch.pageX, y: touch.pageY }; } else if (data.state === 'move') { if (!_this8.swipeData.handled) { _this8.swipeData = _extends({}, _this8.swipeData, { x: _this8.swipeData.x + data.dx, y: _this8.swipeData.y + data.dy }); if (Math.abs(_this8.swipeData.x0 - _this8.swipeData.x) > 100) { _this8.swipeData.x0 > _this8.swipeData.x ? _this8.cmdForward() : _this8.cmdBackward(); _this8.swipeData.handled = true; } } } else { delete _this8.swipeData; } } } }, widSettings: { activate: function activate() { return undefined; } } }); }; BookController.prototype.bindActions = function bindActions() { this.eToA = new _EventsToActions2.default((0, _libs.$)(this.visual.element)); this.eToA.addAction(function (e) { return e.preventDefault(); }, 'contextmenu', _EventsToActions2.default.mouseButtons.Right, 0); this.actions = this.getActions(); for (var _iterator5 = Object.keys(this.actions), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } var name = _ref5; var action = _extends({}, this.actions[name], this.p.actions[name]); this.actions[name] = action; if (action.enabled) { var flags = action.flags || 0; if (action.type) { this.eToA.addAction(action.activate, action.type, action.code, flags); } else if (action.code !== undefined) { this.eToA.addAction(action.activate, 'keydown', action.code, flags); } } } }; BookController.prepareProps = function prepareProps(props) { return BookController.calcProps(BookController.mergeProps((0, _bookController.props)(), props)); }; BookController.setActions = function setActions(props, actions) { for (var _iterator6 = Object.keys(actions || {}), _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref6 = _i6.value; } var name = _ref6; props.actions[name] = _extends({}, props.actions[name], actions[name]); } }; BookController.mergeProps = function mergeProps(first, second) { second = second || {}; function merge(first, second) { second = second || {}; var props = _extends({}, first, second); for (var _iterator7 = Object.keys(first), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref7; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref7 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref7 = _i7.value; } var name = _ref7; if (_typeof(first[name]) === 'object') { props[name] = merge(first[name], second[name]); } } return props; } var props = merge(first, second); BookController.setActions(props, first.actions); BookController.setActions(props, second.actions); return props; }; BookController.calcProps = function calcProps(props) { props.scale.delta = (props.scale.max - props.scale.min) / props.scale.levels; props.lighting.delta = (props.lighting.max - props.lighting.min) / props.lighting.levels; return props; }; return BookController; }(_Controller3.default); exports.default = BookController; /***/ }, /* 28 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(1); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var BookPrinter = function () { function BookPrinter(context, book, styleSheet) { _classCallCheck(this, BookPrinter); this.book = book; this.styleSheet = styleSheet; this.wnd = context.wnd; this.doc = context.doc; this.pageCallback = book.getPageCallback(); var test = this.pageCallback(0); this.type = test.type; if (this.type === 'pdf') { this.pdfSrc = test.src.src; } } BookPrinter.prototype.cancel = function cancel() { this.canceled = true; }; BookPrinter.prototype.dispose = function dispose() { if (this.frame) { this.frame.remove(); delete this.frame; } }; BookPrinter.prototype.print = function print() { var _this = this; delete this.canceled; if (this.type === 'pdf') { (function () { var printWnd = void 0, callManually = false; if (_this.useIFrame()) { callManually = !!_this.frame; if (!_this.frame) { _this.frame = (0, _libs.$)('').appendTo(_this.doc.body); } printWnd = _this.frame[0].contentWindow; } else { printWnd = _this.wnd.open(_this.pdfSrc); } if (callManually) { printWnd.print(); } else { (0, _libs.$)(printWnd).on('load', function () { try { printWnd.print(); } catch (e) { console.error(e); } }); } })(); } else { this.renderContent().then(function (content) { var printWnd = _this.wnd.open(), printDoc = printWnd.document, html = '\n \n \n \n \n 3D FlipBook - Printing\n ' + content.head + '\n \n \n \n ' + content.body + '\n \n \n '; printDoc.open(); printDoc.write(html); printDoc.close(); }).catch(function (e) { return console.warn('3D FlipBook - Printing was canceled'); }); } }; BookPrinter.prototype.progress = function progress(v) { if (this.canceled) { throw 'Cancel Printing'; } if (this.onProgress) { this.onProgress(Math.floor(v * 100)); } }; BookPrinter.prototype.renderContent = function renderContent() { var _this2 = this; var pages = this.book.getPages(), head = new Set(), body = []; var done = Promise.resolve(); var _loop = function _loop(page) { var info = _this2.pageCallback(page); if (info.type === 'image') { done = done.then(function () { _this2.progress(page / pages); return _this2.renderImage(head, body, info.src); }); } else if (info.type === 'html') { done = done.then(function () { _this2.progress(page / pages); return _this2.renderHtml(head, body, info.src); }); } }; for (var page = 0; page < pages; ++page) { _loop(page); } return done.then(function () { _this2.progress(1); return { head: _this2.renderHead(head), body: body.join('\n') }; }); }; BookPrinter.wrap = function wrap(content) { return '
' + content + '
'; }; BookPrinter.prototype.renderImage = function renderImage(head, body, src) { body.push(BookPrinter.wrap('')); }; BookPrinter.prototype.renderHtml = function renderHtml(head, body, src) { return new Promise(function (resolve, reject) { _libs.$.get(src, function (html) { var links = html.match(//ig) || []; for (var _iterator = links, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var link = _ref; if (link.match(/stylesheet/i)) { var href = link.match(/href\s*=\s*['"](.*)['"]/i); if (href) { head.add(href[1]); } } } var content = html.match(/([\S\s]*)<\/body>/i); if (content) { body.push(BookPrinter.wrap(content[1])); } resolve(); }).fail(function (e) { console.error(e.responseText); reject(); }); }); }; BookPrinter.prototype.renderHead = function renderHead(head) { var content = []; head.forEach(function (k) { return content.push(''); }); content.push(this.styleSheet ? '' : BookPrinter.defaultStyleSheet()); return content.join('\n'); }; BookPrinter.prototype.useIFrame = function useIFrame() { var isChromium = this.wnd.chrome, winNav = this.wnd.navigator, vendorName = winNav.vendor, isIEedge = winNav.userAgent.indexOf("Edge") > -1, isIOSChrome = winNav.userAgent.match("CriOS"); var use = void 0; if (isIOSChrome) { use = true; } else if (isChromium && vendorName === 'Google Inc.' && !isIEedge) { use = true; } else { use = false; } return use; }; BookPrinter.defaultStyleSheet = function defaultStyleSheet() { return '\n \n '; }; return BookPrinter; }(); exports.default = BookPrinter; /***/ }, /* 29 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(1); var _View2 = __webpack_require__(65); var _View3 = _interopRequireDefault(_View2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var BookView = function (_View) { _inherits(BookView, _View); function BookView(container, onLoad, template, handler) { _classCallCheck(this, BookView); return _possibleConstructorReturn(this, _View.call(this, container, onLoad, template, handler)); } BookView.prototype.initView = function initView() { this.view = this.container.find('.view'); this.bookmarksView = this.container.find('.widBookmarks'); this.thumbnailsView = this.container.find('.widThumbnails'); this.searchView = this.container.find('.widSearch'); }; BookView.prototype.getHandlers = function getHandlers(id) { var _this2 = this; var handlers = void 0; if (id === 'inpPage') { handlers = [{ inpPage: function inpPage(e, data) { return _this2.callLater(_View.prototype.getHandlers.call(_this2, id), id, e, data, BookView.PAGE_HANDLER_DELAY); } }]; } else { handlers = _View.prototype.getHandlers.call(this, id); } return handlers; }; BookView.prototype.onItemStateChanged = function onItemStateChanged(id, state) { if (id === 'cmdFullScreen') { if (state.active) { this.parentContainer.addClass('fullscreen'); } else { this.parentContainer.removeClass('fullscreen'); } } }; BookView.prototype.getView = function getView() { return this.view; }; BookView.prototype.getBookmarksView = function getBookmarksView() { return this.bookmarksView; }; BookView.prototype.getThumbnailsView = function getThumbnailsView() { return this.thumbnailsView; }; BookView.prototype.getSearchView = function getSearchView() { return this.searchView; }; BookView.prototype.getForms = function getForms() { return []; }; BookView.prototype.getLinks = function getLinks() { return ['cmdZoomIn', 'cmdZoomOut', 'cmdDefaultZoom', 'cmdToc', 'cmdFastBackward', 'cmdBackward', 'cmdForward', 'cmdFastForward', 'cmdSave', 'cmdPrint', 'cmdFullScreen', 'cmdSmartPan', 'cmdSinglePage', 'cmdSounds', 'cmdStats', 'cmdLightingUp', 'cmdLightingDown', 'cmdCloseToc', 'cmdBookmarks', 'cmdSearch', 'cmdThumbnails']; }; BookView.prototype.getWidgets = function getWidgets() { return ['widLoadingProgress', 'widFloatWnd', 'widTocMenu', 'widBookmarks', 'widThumbnails', 'widSearch', 'widSettings', 'widLoading']; }; BookView.prototype.getInputs = function getInputs() { return ['inpPage', 'inpPages']; }; BookView.prototype.getTexts = function getTexts() { return ['txtLoadingProgress']; }; BookView.prototype.getTemplate = function getTemplate() { return { html: 'templates/default-book-view.html', styles: ['css/black-book-view.css'], links: [{ rel: 'stylesheet', href: 'css/font-awesome.min.css' }], script: 'js/default-book-view.js' }; }; return BookView; }(_View3.default); BookView.PAGE_HANDLER_DELAY = 1000; exports.default = BookView; /***/ }, /* 30 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _BookPropsBuilder2 = __webpack_require__(9); var _BookPropsBuilder3 = _interopRequireDefault(_BookPropsBuilder2); var _ImageFactory = __webpack_require__(8); var _ImageFactory2 = _interopRequireDefault(_ImageFactory); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ClbBookPropsBuilder = function (_BookPropsBuilder) { _inherits(ClbBookPropsBuilder, _BookPropsBuilder); function ClbBookPropsBuilder(context, pageCallback, pages, onReady) { _classCallCheck(this, ClbBookPropsBuilder); var _this = _possibleConstructorReturn(this, _BookPropsBuilder.call(this, onReady)); _this.calcSheets(pages); _this.pageCallback = pageCallback; _this.binds = { pageCallback: pageCallback.bind(_this) }; _this.imageFactory = new _ImageFactory2.default(context); if (pages > 0) { (function () { var test = _this.imageFactory.build(pageCallback(0), 0, _this.defaults.sheet.widthTexels, _this.defaults.sheet.heightTexels, _this.defaults.sheet.color); test.onLoad = function () { _this.calcProps(test.width, test.height); test.dispose(); _this.ready(); }; })(); } else { _this.props = _this.defaults; _this.ready(); } return _this; } return ClbBookPropsBuilder; }(_BookPropsBuilder3.default); exports.default = ClbBookPropsBuilder; /***/ }, /* 31 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _SheetBlock2 = __webpack_require__(10); var _SheetBlock3 = _interopRequireDefault(_SheetBlock2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Cover = function (_SheetBlock) { _inherits(Cover, _SheetBlock); function Cover(visual, p, angle, state) { _classCallCheck(this, Cover); return _possibleConstructorReturn(this, _SheetBlock.call(this, visual, p, 0, 1, angle, state)); } Cover.prototype.getProps = function getProps() { return _extends({}, this.p.cover, { sheets: 1 }); }; Cover.prototype.loadPoints = function loadPoints() { var openedInterpolationIndeces = [[2, 3, 4], [2, 3, 4, 5, 6]], closedInterpolationIndeces = [[0, 1, 2], [0, 1, 2]], interpolationPoints = [{ x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0, 0.2831, 0.6256, 0.8082, 0.9909], [0, 0.2603, 0.5936, 0.7763, 0.9589], [0, 0.1370, 0.3881, 0.5342, 0.6758], [0, 0, 0, 0, 0]], y: [[0, 0, 0, 0, 0], [0, 0.02, 0.005, -0.001, -0.0025], [0, 0.04, 0.01, -0.002, -0.005], [0, 0.2466, 0.4795, 0.5708, 0.6758], [0, 0.2877, 0.6347, 0.8174, 1.0000]] }, { x: [[0, 0.2877, 0.6347, 0.8174, 1.0000], [0, 0.2831, 0.6256, 0.8082, 0.9909], [0, 0.2603, 0.5936, 0.7763, 0.9589], [0.000, 0.233, 0.563, 0.746, 0.927], [0.000, 0.144, 0.433, 0.613, 0.796], [0.000, 0.070, 0.288, 0.455, 0.626], [0, 0, 0, 0, 0]], y: [[0, 0, 0, 0, 0], [0, 0.02, 0.005, -0.001, -0.0025], [0, 0.04, 0.01, -0.002, -0.005], [0.000, 0.168, 0.269, 0.270, 0.255], [0.000, 0.245, 0.435, 0.458, 0.460], [0.000, 0.278, 0.544, 0.614, 0.673], [0, 0.2877, 0.6347, 0.8174, 1.0000]] }]; return { interpolationPoints: interpolationPoints, openedInterpolationIndeces: openedInterpolationIndeces, closedInterpolationIndeces: closedInterpolationIndeces }; }; return Cover; }(_SheetBlock3.default); exports.default = Cover; /***/ }, /* 32 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _SheetCssLayer = __webpack_require__(37); var _SheetCssLayer2 = _interopRequireDefault(_SheetCssLayer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var CssLayersManager = function () { function CssLayersManager(book) { _classCallCheck(this, CssLayersManager); this.book = book; this.props = book.p.cssLayerProps; this.visual = book.visual; this.pageManager = book.pageManager; this.wrappers = {}; } CssLayersManager.prototype.getActives = function getActives() { var page = this.book.getPage(), pages = this.book.getPages(); return page === 0 || page === pages - 1 ? [page] : [page, page + 1]; }; CssLayersManager.prototype.dispose = function dispose() { for (var _iterator = Object.values(this.wrappers), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var w = _ref; w.layers.forEach(function (l) { return l.dispose(); }); } delete this.wrappers; }; CssLayersManager.prototype.show = function show() { var _this = this; this.hidden = false; var _loop = function _loop() { if (_isArray2) { if (_i2 >= _iterator2.length) return 'break'; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) return 'break'; _ref2 = _i2.value; } var n = _ref2; var w = _this.wrappers[n]; if (w) { if (w.state === 'ready' && w.layers.length) { (function () { var block = _this.book.getBlockByPage(n); w.layers.forEach(function (l) { if (l.isHidden()) { l.update(block); l.show(); } }); })(); } } else { (function () { var w = _this.wrappers[n] = { state: 'loading', layers: [] }; Promise.resolve().then(function () { _this.pageManager.getLayers(n, function (layers) { if (layers.length && _this.wrappers) { var block = _this.book.getBlockByPage(n); for (var _iterator3 = layers, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var l = _ref3; var sl = new _SheetCssLayer2.default(_this.visual, block, _this.props); w.layers.push(sl); sl.set(l.css, l.html, l.js); } setTimeout(function () { if (!_this.hidden && ~_this.getActives().indexOf(n)) { w.layers.forEach(function (l) { return l.show(); }); } }, 10); } w.state = 'ready'; }); }); })(); } }; for (var _iterator2 = this.getActives(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; var _ret = _loop(); if (_ret === 'break') break; } }; CssLayersManager.prototype.hide = function hide() { this.hidden = true; var wait = []; for (var _iterator4 = Object.values(this.wrappers), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var _w = _ref4; _w.layers.forEach(function (l) { return wait.push(l.hide()); }); } return Promise.all(wait); }; return CssLayersManager; }(); exports.default = CssLayersManager; /***/ }, /* 33 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(1); var _Cache = __webpack_require__(14); var _Cache2 = _interopRequireDefault(_Cache); var _LoadingAnimation = __webpack_require__(52); var _LoadingAnimation2 = _interopRequireDefault(_LoadingAnimation); var _ImageFactory = __webpack_require__(8); var _ImageFactory2 = _interopRequireDefault(_ImageFactory); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); var _TextureAnimator = __webpack_require__(60); var _TextureAnimator2 = _interopRequireDefault(_TextureAnimator); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var PageManager = function () { function PageManager(visual, book, p) { _classCallCheck(this, PageManager); this.visual = visual; this.book = book; this.pageQuery = ''; this.p = p; this.pageCache = new _Cache2.default(p.cachedPages); this.resourcesCache = new _Cache2.default(); this.canvas = (0, _libs.$)('')[0]; this.imageFactory = new _ImageFactory2.default(_extends({}, visual, { dispatchEvent: book.dispatchEvent.bind(book), renderCanvas: this.canvas, renderCanvasCtx: this.canvas.getContext('2d') }), this.resourcesCache); this.loadings = []; this.renderQueue = []; this.pageRequests = []; this.predictedRequests = []; this.tmpMaterial = new _libs.THREE.MeshBasicMaterial(); visual.addObject(new _libs.THREE.Mesh(new _libs.THREE.PlaneGeometry(0, 0), this.tmpMaterial)); this.loadingAnimation = true; this.loading = {}; this.loading[p.cover.color] = this.createLoadingTexture(p.cover); if (p.page.color !== p.cover.color) { this.loading[p.page.color] = this.createLoadingTexture(p.page); } this.turnOnEvents(); visual.addRenderCallback(this.update.bind(this)); setTimeout(this.updateRenderQueue.bind(this), 250); } PageManager.prototype.createLoadingTexture = function createLoadingTexture(p) { var spriteTiles = 6, scale = Math.sqrt(4.5 * 210 * 4.5 * 297 / (p.widthTexels * p.heightTexels)), animation = new _LoadingAnimation2.default(scale * p.widthTexels, scale * p.heightTexels, p.color), animator = new _TextureAnimator2.default(animation.createSprite(spriteTiles), spriteTiles, 1, spriteTiles, 0.2); animation.dispose(); return animator; }; PageManager.prototype.dispose = function dispose() { this.turnOffEvents(); for (var _iterator = Object.keys(this.loading), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var color = _ref; this.loading[color].dispose(); } delete this.loading; this.resourcesCache.dispose(); this.pageCache.dispose(); this.canvas.height = this.canvas.width = 0; delete this.canvas; }; PageManager.prototype.isCover = function isCover(n) { return n < 2 || n >= 2 * (this.p.sheets + 1); }; PageManager.prototype.isMobile = function isMobile() { return (this.visual.wnd.devicePixelRatio || 1) > 1; }; PageManager.prototype.getPageState = function getPageState(n) { var object = this.pageCache.get(n); return object ? object.state : undefined; }; PageManager.prototype.enableLoadingAnimation = function enableLoadingAnimation(enable) { this.loadingAnimation = enable; for (var _iterator2 = this.loadings, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var o = _ref2; this.setupMaterial(o); } }; PageManager.prototype.update = function update(dt) { if (this.loadingAnimation) { var loading = {}; for (var _iterator3 = this.loadings, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var o = _ref3; if (o.isActive()) { loading[o.color] = true;; } } for (var _iterator4 = Object.keys(loading), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var color = _ref4; this.loading[color].update(dt); } } }; PageManager.prototype.removeFromLoadings = function removeFromLoadings(o) { var i = this.loadings.indexOf(o); if (~i) { this.loadings.splice(i, 1); } }; PageManager.prototype.removeFromRenderQueue = function removeFromRenderQueue(o) { var i = this.renderQueue.indexOf(o); if (~i) { this.renderQueue.splice(i, 1); } }; PageManager.prototype.refreshPageQuery = function refreshPageQuery(n) { var query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; this.pageQuery = query; var object = this.pageCache.get(n); if (object && object.wrapper && object.wrapper.setQuery) { if (!this.pageCache.remove(n)) { object.wrapper.setQuery(query); this.pushInRenderQueue(object); } } }; PageManager.prototype.refreshZoom = function refreshZoom() { var _this = this; if (this.p.autoResolution.enable) { (function () { var es = []; _this.pageCache.forEach(function (e) { es.push(e); }); es.forEach(function (e) { var object = e[1]; if (object && object.wrapper) { if (!_this.pageCache.remove(e[0])) { _this.pushInRenderQueue(object); } } }); })(); } }; PageManager.prototype.getLayers = function getLayers(n, clb) { var _this2 = this; if (this.p.cssLayersLoader) { this.p.cssLayersLoader(n, function () { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var object = _this2.pageCache.get(n); if (object) { if (object.state !== 'active') { object.pendings.push({ clb: clb, args: args }); } else { clb.apply(undefined, args); } } }); } else { clb([]); } }; PageManager.prototype.resolvePendings = function resolvePendings(pendings) { for (var _iterator5 = pendings, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } var p = _ref5; try { p.clb.apply(p, p.args); } catch (e) { console.error(e); } } pendings.splice(0, pendings.length); }; PageManager.prototype.rtlPageN = function rtlPageN(n) { return this.p.rtl ? 2 * (this.p.sheets + 2) - 1 - n : n; }; PageManager.prototype.load = function load(material, n) { var _this3 = this; var pi = this.p.pageCallback(this.rtlPageN(n)), p = this.isCover(n) ? this.p.cover : this.p.page; var o = { n: n, texture: new _libs.THREE.Texture(), wrapper: null, state: 'loading', locked: function locked(n) { return o.state === 'loading' || o.state === 'rendering' || _this3.book.isActivePage(n); }, color: p.color, isActive: function isActive() { return _this3.book.isActivePage(n); }, isTop: function isTop() { return ~_this3.book.getTopPages().indexOf(n); }, dispose: function dispose() { _this3.removeFromLoadings(o); _this3.removeFromRenderQueue(o); if (o.wrapper && o.wrapper.dispose) { o.wrapper.dispose(); } o.texture.dispose(); delete o.texture; delete o.wrapper; }, pendings: [] }; o.texture.minFilter = _libs.THREE.LinearFilter; this.loadings.push(o); this.setMaterial(o, material); Promise.resolve().then(function () { if (o.texture) { o.widthTexels = pi.widthTexels || p.widthTexels; o.heightTexels = pi.heightTexels || p.heightTexels; var res = _this3.calcResolution(o); o.wrapper = _this3.imageFactory.build(pi, pi.number === undefined ? n : pi.number, res.width, res.height, p.color, _this3.p.injector); if (o.wrapper.setQuery) { o.wrapper.setQuery(_this3.pageQuery); } o.simulate = pi.interactive ? (o.wrapper.simulate || function () { return undefined; }).bind(o.wrapper) : undefined; o.wrapper.onLoad = function () { _this3.pushInRenderQueue(o); _this3.book.dispatchEvent({ type: 'loadedPage', page: n }); }; o.wrapper.onChange = function (image) { if (o.texture) { _this3.removeFromLoadings(o); if (o.material) { o.material.map = o.texture; o.material.color = new _libs.THREE.Color(0xFFFFFF); o.material.needsUpdate = true; } o.texture.image = image; o.texture.needsUpdate = true; o.texture.onUpdate = function () { if (o.state !== 'queuedForRender') { o.state = 'active'; _this3.resolvePendings(o.pendings); } delete _this3.rendering; //this.updateRenderQueue(); }; _this3.tmpMaterial.map = o.texture; _this3.tmpMaterial.needsUpdate = true; } }; } }); this.book.dispatchEvent({ type: 'loadPage', page: n }); return this.pageCache.put(n, o); }; PageManager.prototype.isSinglePage = function isSinglePage(o) { return this.p.singlePage || !o.n || o.n === this.book.getPages() - 1; }; PageManager.prototype.calcResolution = function calcResolution(o) { var res = void 0; if (this.p.autoResolution.enable) { var k = Math.min((this.isSinglePage(o) ? 1 : 0.5) * this.visual.width() / o.widthTexels, this.visual.height() / o.heightTexels); res = { width: this.p.autoResolution.k * this.p.zoom * k * o.widthTexels, height: this.p.autoResolution.k * this.p.zoom * k * o.heightTexels }; } else { res = { width: o.widthTexels, height: o.heightTexels }; } return res; }; PageManager.prototype.pushInRenderQueue = function pushInRenderQueue(o) { if (o.state !== 'queuedForRender') { o.state = 'queuedForRender'; this.renderQueue.push(o); // this.updateRenderQueue(); } }; PageManager.prototype.updateRenderQueue = function updateRenderQueue() { if (this.canvas) { var p = this.p; if (!this.rendering && (p.renderWhileFlipping || !this.book.isProcessing())) { var active = void 0, top = void 0; for (var _iterator6 = this.renderQueue, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i6 >= _iterator6.length) break; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) break; _ref6 = _i6.value; } var o = _ref6; if (!active && o.isActive()) { active = o; } if (o.isTop()) { top = o; break; } } this.rendering = top || active; if (this.isMobile() && p.renderInactivePagesOnMobile || !this.isMobile() && p.renderInactivePages) { this.rendering = this.rendering || this.renderQueue[0]; } if (this.rendering) { if (this.rendering.wrapper.startRender) { this.removeFromRenderQueue(this.rendering); this.rendering.state = 'rendering'; this.rendering.wrapper.setResolution(this.calcResolution(this.rendering)); this.rendering.wrapper.startRender(); } else { delete this.rendering; } } } setTimeout(this.updateRenderQueue.bind(this), 250); } }; PageManager.prototype.turnOnEvents = function turnOnEvents() { this.transferEvents = true; }; PageManager.prototype.turnOffEvents = function turnOffEvents() { var mouseup = _libs.$.Event('mouseup'), mouseout = _libs.$.Event('mouseout'); this.pageCache.forEach(function (ent) { var object = ent[1]; if (object.simulate) { object.simulate(mouseup, undefined, 0, 0); object.simulate(mouseout, undefined, 0, 0); } }); this.transferEvents = false; }; PageManager.prototype.transferEventToTexture = function transferEventToTexture(n, e, data) { var _this4 = this; if (this.transferEvents) { var toObject = this.getOrLoadTextureObject(undefined, n); if (toObject.wrapper) { (function () { var uv = data.uv, toDoc = toObject.wrapper.getSimulatedDoc(); _this4.pageCache.forEach(function (ent) { var object = ent[1]; if (object.simulate) { object.simulate(e, toDoc, uv.x, uv.y); } }); })(); } } }; PageManager.prototype.loadPredictedPages = function loadPredictedPages() { this.predictedRequests = _BaseMathUtils2.default.predict(this.pageRequests, this.p.preloadPages); for (var _iterator7 = this.predictedRequests, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref7; if (_isArray7) { if (_i7 >= _iterator7.length) break; _ref7 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) break; _ref7 = _i7.value; } var p = _ref7; if (p < this.book.getPages() && !this.pageCache.get(p)) { this.load(undefined, p); } } }; PageManager.prototype.addPageRequest = function addPageRequest(n) { this.pageRequests.push(n); if (this.pageRequests.length > this.p.pagesForPredicting) { this.pageRequests.shift(); } Promise.resolve().then(this.loadPredictedPages.bind(this)); }; PageManager.prototype.setMaterial = function setMaterial(o, material) { this.pageCache.forEach(function (e) { var ob = e[1]; if (o !== ob && ob.material === material) { delete ob.material; } }); if (material && material !== o.material) { o.material = material; this.setupMaterial(o); } }; PageManager.prototype.setupMaterial = function setupMaterial(o) { o.material.map = o.texture.image ? o.texture : this.loadingAnimation ? this.loading[o.color].texture : null; if (!o.material.map) { o.material.color = new _libs.THREE.Color(o.color); } o.material.needsUpdate = true; }; PageManager.prototype.getOrLoadTextureObject = function getOrLoadTextureObject(material, n) { var object = this.pageCache.get(n); if (!object) { object = this.load(material, n); this.addPageRequest(n); } else { this.setMaterial(object, material); } return object; }; PageManager.prototype.setTexture = function setTexture(material, n) { if (~this.predictedRequests.indexOf(n)) { this.addPageRequest(n); } this.getOrLoadTextureObject(material, n); }; return PageManager; }(); exports.default = PageManager; /***/ }, /* 34 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _BookPropsBuilder2 = __webpack_require__(9); var _BookPropsBuilder3 = _interopRequireDefault(_BookPropsBuilder2); var _Pdf = __webpack_require__(18); var _Pdf2 = _interopRequireDefault(_Pdf); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PdfBookPropsBuilder = function (_BookPropsBuilder) { _inherits(PdfBookPropsBuilder, _BookPropsBuilder); function PdfBookPropsBuilder(src, onReady) { _classCallCheck(this, PdfBookPropsBuilder); var _this = _possibleConstructorReturn(this, _BookPropsBuilder.call(this, onReady)); _this.pdf = new _Pdf2.default(src); _this.pageDescription = { type: 'pdf', src: _this.pdf, interactive: true }; _this.binds = { pageCallback: _this.pageCallback.bind(_this) }; _this.pdf.getHandler(_this.init.bind(_this)); return _this; } PdfBookPropsBuilder.prototype.dispose = function dispose() { this.pdf.dispose(); _BookPropsBuilder.prototype.dispose.call(this); }; PdfBookPropsBuilder.prototype.init = function init(handler) { var _this2 = this; var pages = this.pdf.getPagesNum(); this.calcSheets(pages); if (pages > 0) { handler.getPage(1).then(function (page) { var size = _Pdf2.default.getPageSize(page); _this2.calcProps(size.width, size.height); _this2.ready(); }).catch(function (e) { console.error(e); }); } else { this.props = this.defaults; this.ready(); } }; PdfBookPropsBuilder.prototype.pageCallback = function pageCallback(n) { return this.pageDescription; }; return PdfBookPropsBuilder; }(_BookPropsBuilder3.default); exports.default = PdfBookPropsBuilder; /***/ }, /* 35 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(1); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var PdfLinksHandler = function () { function PdfLinksHandler(pdf, ctrl, element) { _classCallCheck(this, PdfLinksHandler); this.pdf = pdf; this.ctrl = ctrl; this.element = (0, _libs.$)(element); this.cursors = []; } PdfLinksHandler.prototype.dispose = function dispose() {}; PdfLinksHandler.prototype.setHandler = function setHandler(handler) { this.handler = handler; }; PdfLinksHandler.prototype.defaultHandler = function defaultHandler(type, destination) { if (type === 'internal') { this.ctrl.goToPage(destination); } else if (type === 'external') { window.open(destination, '_blank'); } }; PdfLinksHandler.prototype.callHandlers = function callHandlers(type, destination) { if (!this.handler || !this.handler(type, destination)) { this.defaultHandler(type, destination); } }; PdfLinksHandler.prototype.handleEvent = function handleEvent(data) { var _this = this; var e = data.event, anno = data.annotation; switch (e.type) { case 'mouseover': { this.cursors.push(this.element.css('cursor')); this.element.css('cursor', 'pointer'); break; } case 'mouseout': { this.element.css('cursor', this.cursors.pop() || ''); break; } case 'touchtap': case 'click': { if (anno.url) { this.callHandlers('external', anno.url); } else if (anno.dest) { var destPromise = void 0; if (typeof anno.dest === 'string') { destPromise = this.pdf.handler.getDestination(anno.dest); } else { destPromise = Promise.resolve(anno.dest); } destPromise.then(function (dest) { return typeof dest[0] === 'number' ? dest[0] : _this.pdf.handler.getPageIndex(dest[0]); }).then(function (number) { return _this.callHandlers('internal', number); }).catch(function () { return console.error('Bad link'); }); } break; } } }; return PdfLinksHandler; }(); exports.default = PdfLinksHandler; /***/ }, /* 36 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Finder = __webpack_require__(17); var _Finder2 = _interopRequireDefault(_Finder); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SearchEngine = function () { function SearchEngine(pageCallback, pages) { _classCallCheck(this, SearchEngine); this.pageCallback = pageCallback; this.pages = pages; this.results = []; } SearchEngine.prototype.setQuery = function setQuery(query) { this.query = query; this.update = true; this.process(); }; SearchEngine.prototype.process = function process() { var _this = this; if (this.update) { var results = this.results; this.results = []; if (this.onPageHitsChanged) { for (var _iterator = results, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var res = _ref; this.onPageHitsChanged(undefined, ''); } } this.update = false; this.page = 0; this.stamp = Date.now(); if (this.query.length > 1) { this.process(); } } else { if (this.page < this.pages) { (function () { var stamp = _this.stamp; _this.find(_this.pageCallback(_this.page)).then(function (contexts) { if (stamp === _this.stamp) { if (contexts.length) { _this.results.push({ page: _this.page, contexts: contexts }); } ++_this.page; if (_this.onPageHitsChanged) { _this.onPageHitsChanged(_this.page, _this.query); } _this.process(); } }); })(); } } }; SearchEngine.prototype.find = function find(pi) { var _this2 = this; var next = void 0; if (pi.type === 'pdf') { next = new Promise(function (resolve) { pi.src.getHandler(function () { var n = pi.number === undefined ? _this2.page : pi.number; if (pi.src.getPageType(n) === 'right') { resolve([]); } else { pi.src.getPage(n).then(function (page) { page.getTextContent().then(function (textContent) { resolve(new _Finder2.default(textContent.items.map(function (item) { return item.str; }), _this2.query, { hits: false }).getContexts()); }); }).catch(function () { return resolve([]); }); } }); }); } else { next = Promise.resolve([]); } return next; }; return SearchEngine; }(); exports.default = SearchEngine; /***/ }, /* 37 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _CSSLayer = __webpack_require__(13); var _CSSLayer2 = _interopRequireDefault(_CSSLayer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SheetCssLayer = function () { function SheetCssLayer(visual, block, props) { _classCallCheck(this, SheetCssLayer); this.visual = visual; var size = block.getTopSize(); this.layer = new _CSSLayer2.default(size.width, size.height, props); this.update(block); this.visual.addCssObject(this.layer); } SheetCssLayer.prototype.dispose = function dispose() { this.layer.dispose(); this.visual.removeCssObject(this.layer); }; SheetCssLayer.prototype.isHidden = function isHidden() { return this.layer.isHidden(); }; SheetCssLayer.prototype.hide = function hide() { return this.layer.hide(); }; SheetCssLayer.prototype.show = function show() { return this.layer.show(); }; SheetCssLayer.prototype.set = function set(css, html, js) { this.layer.setData(css, html, js); }; SheetCssLayer.prototype.update = function update(block) { this.block = block; this.block.getTopWorldRotation(this.layer.rotation); this.block.getTopWorldPosition(this.layer.position); }; return SheetCssLayer; }(); exports.default = SheetCssLayer; /***/ }, /* 38 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SheetPhysics = function () { SheetPhysics.targetForceClb = function targetForceClb(o, a, v, ch) { var l = a * this.r; return 100 * this.m * this.g * (2 / (1 + Math.exp(10 * (l - this.tl))) - 1) - this.m * 40 * v; }; SheetPhysics.hoverCornerForceClb = function hoverCornerForceClb(o, v, l, ch) { return 5; }; SheetPhysics.prototype.getTargetForceClb = function getTargetForceClb(mass, targetAngle) { return SheetPhysics.targetForceClb.bind({ g: this.p.gravity, m: mass, tl: targetAngle * this.p.r, r: this.p.r }); }; SheetPhysics.dragForceClb = function dragForceClb(o, a, v, ch) { return o.flbt * o.m * (10 * o.g * ch - 50 * v / (1 + Math.exp(3.5 * Math.abs(ch)))); }; SheetPhysics.dragCornerForceClb = function dragCornerForceClb(o, a, v, ch) { return 15 * (2 / (1 + Math.exp(10 * (a - this.ta) * o.r)) - 1); }; SheetPhysics.getDragCornerForceClb = function getDragCornerForceClb(targetAngle) { return SheetPhysics.dragCornerForceClb.bind({ ta: targetAngle }); }; function SheetPhysics() { var r = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var gravity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var cornerDeviation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15; var fps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 240; _classCallCheck(this, SheetPhysics); this.p = { r: r, cornerDeviation: cornerDeviation, l: Math.PI * r, startDt: 1 / fps, gravity: gravity, margin: 0.002 * r, infM: 1e4, attempts: 16, maxIterations: 100 }; this.os = []; } SheetPhysics.prototype.dispose = function dispose() { this.os = []; }; SheetPhysics.prototype.getSize = function getSize() { return this.os.length; }; SheetPhysics.prototype.addObject = function addObject(mass, angle, velocity, flexibility, cornerHeight, simulateClb, removeClb) { var forceClb = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : function () { return 0; }; var cornerForceClb = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : function () { return 0; }; var no = { id: _MathUtils2.default.getUnique(), m: mass, v: velocity, l: angle * this.p.r, f: forceClb, cf: cornerForceClb, ch: cornerHeight, flbt: flexibility, simulateClb: simulateClb, removeClb: removeClb }; var i = this.os.findIndex(function (o) { return no.l <= o.l; }); i = ~i ? i : this.os.length; this.os.splice(i, 0, no); return no.id; }; SheetPhysics.prototype.getParametrMap = function getParametrMap(name) { var map = { mass: 'm', velocity: 'v', flexibility: 'flbt', cornerHeight: 'ch', simulateClb: 'simulateClb', removeClb: 'removeClb', forceClb: 'f', cornerForceClb: 'cf' }; return map[name]; }; SheetPhysics.prototype.setParametr = function setParametr(id, name, value) { var o = this.os.find(function (o) { return o.id === id; }); if (name === 'angle') { o.l = value * this.p.r; } else { o[this.getParametrMap(name)] = value; } }; SheetPhysics.prototype.getParametr = function getParametr(id, name) { var o = this.os.find(function (o) { return o.id === id; }); var value = void 0; if (name === 'angle') { value = o.l / this.p.r; } else { value = o[this.getParametrMap(name)]; } return value; }; SheetPhysics.prototype.simulate = function simulate(T) { var t = 0, dt = this.p.startDt, attempt = 0, it = 0; while (t < T && it < this.p.maxIterations) { if (dt > T - t) { dt = T - t; } var nos = this.integrate(this.os, dt), ci = this.findCollisions(nos); if (ci.num > 1 && attempt < this.p.attempts) { dt /= 2; ++attempt; } else { if (ci.num === 1) { var scos = this.solveCollision(nos[ci.last - 1], nos[ci.last]); nos[ci.last - 1] = scos[0]; nos[ci.last] = scos[1]; } else if (ci.num > 1) { var gs = []; var last = -2; for (var _iterator = ci.all, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var i = _ref; if (i - last > 1) { gs.push([]); } gs[gs.length - 1].push(i); last = i; } for (var _iterator2 = gs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var g = _ref2; var sg = void 0, i0 = void 0; if (nos[g[0]].l > Math.PI / 2 * this.p.r) { sg = -1; i0 = g[g.length - 1]; } else { sg = 1; i0 = g[0]; } for (var _i3 = i0; _i3 < nos.length && _i3 > -1; _i3 += sg) { var o = nos[_i3 + sg]; if (o && sg * (o.l - nos[_i3].l) <= this.p.margin) { o.l = nos[_i3].l + sg * 2 * this.p.margin; if (o.l > this.p.l || o.l < 0) { o.l = o.l > this.p.l ? this.p.l : 0; o.ch = 0; o.v = 0; console.error('Bad collision'); } } else { break; } } } } this.os = nos; this.findAndSolveCornerCollisions(); t += dt; dt = this.p.startDt; attempt = 0; } ++it; } this.removeStatics(); }; SheetPhysics.prototype.removeStatics = function removeStatics() { var nos = [], notify = [[], []]; for (var _iterator3 = this.os, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i4 >= _iterator3.length) break; _ref3 = _iterator3[_i4++]; } else { _i4 = _iterator3.next(); if (_i4.done) break; _ref3 = _i4.value; } var o = _ref3; if (o.simulateClb) { o.simulateClb(o.l / this.p.r, o.ch); } if ((o.l === this.p.l || o.l === 0) && o.v === 0) { if (o.removeClb !== undefined) { notify[(o.l !== this.p.l) + 0].push(o); } } else { nos.push(o); } } this.os = nos; for (var _iterator4 = notify[0].reverse(), _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i5 >= _iterator4.length) break; _ref4 = _iterator4[_i5++]; } else { _i5 = _iterator4.next(); if (_i5.done) break; _ref4 = _i5.value; } var _o = _ref4; _o.removeClb(Math.PI, _o.ch); } for (var _iterator5 = notify[1], _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i6 >= _iterator5.length) break; _ref5 = _iterator5[_i6++]; } else { _i6 = _iterator5.next(); if (_i6.done) break; _ref5 = _i6.value; } var _o2 = _ref5; _o2.removeClb(0, _o2.ch); } }; SheetPhysics.prototype.findAndSolveCornerCollisions = function findAndSolveCornerCollisions() { if (this.os.length) { var os = [_extends({}, this.os[0], { l: 0, m: this.p.infM, ch: 0 })].concat(this.os, [_extends({}, this.os[0], { l: 1.05 * this.p.l, m: this.p.infM, ch: 0 })]); for (var i = 1; i < os.length; ++i) { var a = os[i - 1], b = os[i], al = a.l + this.p.cornerDeviation * a.ch * this.p.r, bl = b.l + this.p.cornerDeviation * b.ch * this.p.r; if (1.05 * al > bl && a.ch > b.ch) { var dCh = a.ch - b.ch, dv = a.m / a.flbt + b.m / b.flbt, ka = a.m / a.flbt / dv, kb = b.m / b.flbt / dv; a.ch = a.ch - kb * dCh; b.ch = b.ch + ka * dCh; } } } }; SheetPhysics.prototype.solveCollision = function solveCollision(a, b) { var mm = b.m + a.m, av = (-a.v * b.m + a.m * a.v + 2 * b.m * b.v) / mm, bv = (b.m * b.v - b.v * a.m + 2 * a.m * a.v) / mm; return [_extends({}, a, { v: av }), _extends({}, b, { v: bv })]; }; SheetPhysics.prototype.findCollisions = function findCollisions(os) { var ci = { num: 0, last: 0, all: [] }; for (var i = 1; i < os.length && ci.num < 2; ++i) { if (os[i - 1].l > os[i].l || this.isCollision(os[i - 1], os[i])) { if (os[i - 1].l > os[i].l) { ++ci.num; } ++ci.num; ci.last = i; if (ci.all.indexOf(i - 1) === -1) { ci.all.push(i - 1); } if (ci.all.indexOf(i) === -1) { ci.all.push(i); } } } return ci; }; SheetPhysics.prototype.isCollision = function isCollision(a, b) { return Math.abs(a.l - b.l) < this.p.margin && a.v > b.v; }; SheetPhysics.prototype.integrate = function integrate(os, dt) { var nos = []; for (var _iterator6 = os, _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; if (_isArray6) { if (_i7 >= _iterator6.length) break; _ref6 = _iterator6[_i7++]; } else { _i7 = _iterator6.next(); if (_i7.done) break; _ref6 = _i7.value; } var o = _ref6; var vl = _MathUtils2.default.rk4(this.dy.bind({ g: this.p.gravity, r: this.p.r, m: o.m, f: o.f, cf: o.cf, ch: o.ch, flbt: o.flbt }), 0, dt, [o.v, o.l, o.ch]); var no = _extends({}, o, { v: vl[0], l: vl[1], ch: vl[2] }); if (no.l <= 0 || no.l >= this.p.l) { no.l = no.l <= 0 ? 0 : this.p.l; no.v = 0; no.ch = 0; } nos.push(no); } return nos; }; SheetPhysics.prototype.dy = function dy(t, y) { var v = y[0], l = y[1], ch = y[2], f = this.f(this, l / this.r, v, ch), cf = this.cf(this, l / this.r, v, ch); return [(-this.g * Math.cos(l / this.r) * this.m + f) / this.m, v + 0.01 * (Math.random() - 0.5), this.flbt * ((2 / (1 + Math.exp(-0.2 * cf)) - 1) * (1 - 2 / (1 + Math.exp(-5 * (Math.abs(ch) - 2)))) - ch)]; }; return SheetPhysics; }(); exports.default = SheetPhysics; /***/ }, /* 39 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SoundsEnviroment = function () { function SoundsEnviroment() { var template = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, SoundsEnviroment); this.sounds = template.sounds || {}; this.audio = {}; if (this.sounds.startFlip) { this.audio.startFlip = new Audio(this.sounds.startFlip); } if (this.sounds.endFlip) { this.audio.endFlip = new Audio(this.sounds.endFlip); } } SoundsEnviroment.prototype.setEnabled = function setEnabled(enabled) { this.enabled = enabled; }; SoundsEnviroment.prototype.togle = function togle() { this.enabled = !this.enabled; }; SoundsEnviroment.prototype.dispose = function dispose() { delete this.audio.startFlip; delete this.audio.endFlip; }; SoundsEnviroment.prototype.startFlip = function startFlip() { if (this.enabled && this.audio.startFlip) { this.audio.startFlip.play(); } }; SoundsEnviroment.prototype.endFlip = function endFlip() { if (this.enabled && this.audio.startFlip) { this.audio.startFlip.pause(); this.audio.startFlip.currentTime = 0; } if (this.enabled && this.audio.endFlip) { this.audio.endFlip.play(); } }; SoundsEnviroment.prototype.subscribeFlips = function subscribeFlips(emitter) { emitter.addEventListener('startFlip', this.startFlip.bind(this)); emitter.addEventListener('endFlip', this.endFlip.bind(this)); }; return SoundsEnviroment; }(); exports.default = SoundsEnviroment; /***/ }, /* 40 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _WidgetController2 = __webpack_require__(67); var _WidgetController3 = _interopRequireDefault(_WidgetController2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var TocController = function (_WidgetController) { _inherits(TocController, _WidgetController); function TocController(view, bookCtrl) { _classCallCheck(this, TocController); var _this = _possibleConstructorReturn(this, _WidgetController.call(this, view)); _this.bookCtrl = bookCtrl; _this.tab = 'none'; return _this; } TocController.prototype.setThumbnails = function setThumbnails(thumbnails) { this.thumbnails = thumbnails; thumbnails.onNavigate = this.navigateThumbnails.bind(this); if (this.tab === 'none') { this.tab = 'thumbnails'; } this.fireChange(); }; TocController.prototype.setSearch = function setSearch(search) { this.search = search; search.onNavigate = this.navigateSearch.bind(this); this.fireChange(); }; TocController.prototype.setBookmarks = function setBookmarks(bookmarks, pdf) { this.bookmarks = bookmarks; this.pdf = pdf; bookmarks.onNavigate = this.navigateBookmarks.bind(this); if (bookmarks.getSize()) { this.tab = 'bookmarks'; this.isBookmarks = true; } this.fireChange(); }; TocController.prototype.cmdBookmarks = function cmdBookmarks() { this.tab = 'bookmarks'; this.fireChange(); }; TocController.prototype.cmdThumbnails = function cmdThumbnails() { this.tab = 'thumbnails'; this.fireChange(); }; TocController.prototype.cmdSearch = function cmdSearch() { this.tab = 'search'; this.fireChange(); }; TocController.prototype.cmdCloseToc = function cmdCloseToc() { this.hide(); }; TocController.prototype.navigateThumbnails = function navigateThumbnails(number) { this.bookCtrl.goToPage(number); }; TocController.prototype.navigateSearch = function navigateSearch(number) { this.bookCtrl.goToPage(number); }; TocController.prototype.navigateBookmarks = function navigateBookmarks(item) { var _this2 = this; if (item.url) { window.open(item.url, '_blank'); } else if (item.dest) { var destPromise = void 0; if (typeof item.dest === 'string') { destPromise = this.pdf.handler.getDestination(item.dest); } else { destPromise = Promise.resolve(item.dest); } destPromise.then(function (dest) { return _this2.pdf.handler.getPageIndex(dest[0]); }).then(function (number) { return _this2.bookCtrl.goToPage(number); }).catch(function () { return console.error('Bad bookmark'); }); } }; TocController.prototype.updateView = function updateView() { var _this3 = this; if (this.view) { this.view.setState('widTocMenu', { enable: true, visible: true, active: false }); this.view.setState('widThumbnails', { enable: true, visible: this.tab === 'thumbnails', active: false }); this.view.setState('widSearch', { enable: true, visible: this.tab === 'search', active: false }); this.view.setState('widBookmarks', { enable: true, visible: this.tab === 'bookmarks', active: false }); this.view.setState('cmdBookmarks', { enable: true, visible: true, active: this.tab === 'bookmarks' }); this.view.setState('cmdCloseToc', { enable: true, visible: true, active: false }); this.view.setState('cmdThumbnails', { enable: true, visible: true, active: this.tab === 'thumbnails' }); this.view.setState('cmdSearch', { enable: true, visible: true, active: this.tab === 'search' }); Promise.resolve().then(function () { return _this3.thumbnails.setEnable(_this3.visible && _this3.tab === 'thumbnails'); }); _WidgetController.prototype.updateView.call(this); } }; return TocController; }(_WidgetController3.default); exports.default = TocController; /***/ }, /* 41 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(1); var _ThreeUtils = __webpack_require__(20); var _ThreeUtils2 = _interopRequireDefault(_ThreeUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var resX = 11, resY = 2, resZ = 15, scale = 1, faces = []; var frontGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resY - 1); frontGeometry.translate(0.5 * scale, 0.5 * scale, scale); var backGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resY - 1); backGeometry.rotateY(Math.PI); backGeometry.translate(0.5 * scale, 0.5 * scale, 0); var leftGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resZ - 1, resY - 1); leftGeometry.rotateY(-Math.PI / 2); leftGeometry.translate(0, 0.5 * scale, 0.5 * scale); var rightGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resZ - 1, resY - 1); rightGeometry.rotateY(Math.PI / 2); rightGeometry.translate(scale, 0.5 * scale, 0.5 * scale); var topGeometry = new _libs.THREE.PlaneGeometry(scale, scale, resX - 1, resZ - 1); topGeometry.rotateX(-Math.PI / 2); topGeometry.translate(0.5 * scale, scale, 0.5 * scale); var bottomGeometry = topGeometry.clone(); bottomGeometry.translate(0, -scale, 0); for (var _iterator = bottomGeometry.faces, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var f = _ref; var _ref3 = [f.b, f.a]; f.a = _ref3[0]; f.b = _ref3[1]; } var geometry = new _libs.THREE.Geometry(); geometry.vertices = [].concat(bottomGeometry.vertices, topGeometry.vertices); var addFaces = function addFaces(fs, map) { for (var _iterator2 = fs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var f = _ref2; geometry.faces.push(new _libs.THREE.Face3(map(f.a), map(f.b), map(f.c))); } faces.push(geometry.faces.length); }; var mapVertices = function mapVertices(src, dst) { var map = []; var eq = function eq(a, b) { return Math.abs(a.x - b.x) + Math.abs(a.y - b.y) + Math.abs(a.z - b.z) < 1e-4; }; for (var i = 0; i < src.length; ++i) { for (var j = 0; j < dst.length; ++j) { if (eq(src[i], dst[j])) { map[i] = j; break; } } } return map; }; var frontMap = mapVertices(frontGeometry.vertices, geometry.vertices); var backMap = mapVertices(backGeometry.vertices, geometry.vertices); var leftMap = mapVertices(leftGeometry.vertices, geometry.vertices); var rightMap = mapVertices(rightGeometry.vertices, geometry.vertices); addFaces(topGeometry.faces, function (i) { return i + bottomGeometry.vertices.length; }); addFaces(bottomGeometry.faces, function (i) { return i; }); addFaces(frontGeometry.faces, function (i) { return frontMap[i]; }); addFaces(backGeometry.faces, function (i) { return backMap[i]; }); addFaces(leftGeometry.faces, function (i) { return leftMap[i]; }); addFaces(rightGeometry.faces, function (i) { return rightMap[i]; }); faces.pop(); _ThreeUtils2.default.computeFaceVertexUvs(geometry, faces); geometry.computeVertexNormals(); //geometry.computeFaceNormals(); geometry.computeBoundingSphere(); //geometry.computeBoundingBox(); geometry.verticesNeedUpdate = true; exports.default = { resX: resX, resY: resY, resZ: resZ, faces: faces, geometry: geometry }; /***/ }, /* 42 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; exports.props = props; var mouseButtons = { Left: 0, Middle: 1, Right: 2 }; function props() { return { eps: 1e-4, skin: { default: 'short-white-book-view' }, scale: { default: 0.9, min: 0.9, max: 2.5, levels: 7 }, lighting: { default: 0.7, min: 0, max: 1, levels: 7 }, pan: { speed: 50 }, loadingAnimation: { skin: false, book: true }, autoResolution: { enabled: true, coefficient: 1.5 }, actions: { cmdZoomIn: { enabled: true }, cmdZoomOut: { enabled: true }, cmdDefaultZoom: { enabled: true, type: 'dblclick', code: 0 }, cmdToc: { enabled: true }, cmdFastBackward: { enabled: false }, cmdBackward: { enabled: true }, cmdForward: { enabled: true }, cmdFastForward: { enabled: false }, cmdSave: { enabled: true }, cmdPrint: { enabled: true }, cmdFullScreen: { enabled: true }, widSettings: { enabled: true }, cmdSmartPan: { enabled: true, active: true }, cmdSinglePage: { enabled: true, active: false, activeForMobile: false }, cmdSounds: { enabled: true, active: true }, cmdStats: { enabled: true, active: false }, cmdLightingUp: { enabled: true }, cmdLightingDown: { enabled: true }, cmdPanLeft: { enabled: false }, cmdPanRight: { enabled: false }, cmdPanUp: { enabled: false }, cmdPanDown: { enabled: false }, mouseCmdRotate: { enabled: true, type: 'mousedrag', code: mouseButtons.Right }, mouseCmdDragZoom: { enabled: true, type: 'mousedrag', code: mouseButtons.Middle }, mouseCmdPan: { enabled: true, type: 'mousedrag', code: mouseButtons.Left }, mouseCmdWheelZoom: { enabled: true, type: 'mousewheel', code: 0 }, touchCmdRotate: { enabled: true, type: 'touchdrag', code: 3 }, touchCmdZoom: { enabled: true, type: 'touchdrag', code: 2 }, touchCmdPan: { enabled: true, type: 'touchdrag', code: 1 }, touchCmdSwipe: { enabled: true, type: 'touchdrag', code: 1 } } }; }; /***/ }, /* 43 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _ImageBase2 = __webpack_require__(5); var _ImageBase3 = _interopRequireDefault(_ImageBase2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var BlankImage = function (_ImageBase) { _inherits(BlankImage, _ImageBase); function BlankImage(context, width, height, color) { _classCallCheck(this, BlankImage); var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); Promise.resolve().then(function () { _this.startRender = function () { _this.renderBlankPage(); _this.finishRender(); }; _this.finishLoad(); }); return _this; } return BlankImage; }(_ImageBase3.default); exports.default = BlankImage; /***/ }, /* 44 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Bookmarks = function () { function Bookmarks(container, items) { var _this = this; var getTitle = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (i) { return i.title; }; var getItems = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function (i) { return i.items; }; _classCallCheck(this, Bookmarks); this.container = container; this.map = []; this.getTitle = getTitle; this.getItems = getItems; this.nodes = this.mapNodes(items, this.map); this.binds = { togle: function togle(e) { e.preventDefault(); var li = (0, _libs.$)(e.target); while (li[0] && li[0] !== container[0] && !li.hasClass('item')) { li = (0, _libs.$)(li[0].parentNode); } if (li.hasClass('item')) { var cmd = (0, _libs.$)(e.target); while (cmd[0] && cmd[0] !== li[0] && !cmd.hasClass('cmd')) { cmd = (0, _libs.$)(cmd[0].parentNode); } if (cmd.hasClass('cmd')) { var node = _this.map[li.attr('data-id')]; if (cmd.hasClass('togle')) { node.minimized = !node.minimized; if (node.minimized) { li.find('ul').remove(); li.find('.togle').addClass('minimized'); } else { li.find('.togle').removeClass('minimized'); li.append((_this.renderNode(node).match(//) || [''])[0]); } } else { if (_this.onNavigate) { _this.onNavigate(node.item); } } } } } }; container.on('click', this.binds.togle); this.update(); } Bookmarks.prototype.getSize = function getSize() { return this.map.length; }; Bookmarks.prototype.dispose = function dispose() { this.container.off('click', this.binds.togle); this.container.html(''); }; Bookmarks.prototype.update = function update() { this.container.html(this.renderNodes(this.nodes)); }; Bookmarks.prototype.forEach = function forEach(f) { var nodes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.nodes; for (var _iterator = nodes || [], _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var node = _ref; f(node); this.forEach(f, node.children); } }; Bookmarks.prototype.expand = function expand() { this.forEach(function (n) { return n.minimized = false; }); this.update(); }; Bookmarks.prototype.minimize = function minimize() { this.forEach(function (n) { return n.minimized = true; }); this.update(); }; Bookmarks.prototype.renderNode = function renderNode(node) { return ['
', node.children ? ' ' : ' ', '', node.title, '
', node.minimized ? '' : this.renderNodes(node.children)].join(''); }; Bookmarks.prototype.renderNodes = function renderNodes(nodes) { var res = ['
']; if (nodes && nodes.length) { res.push('
    '); for (var _iterator2 = nodes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var node = _ref2; res.push(['
  • ', this.renderNode(node), '
  • '].join('')); } res.push('
'); } res.push('
'); return res.join(''); }; Bookmarks.prototype.mapNodes = function mapNodes(items) { var map = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; var nodes = null; if (items && items.length) { nodes = []; for (var _iterator3 = items, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var item = _ref3; var id = map.length; map.push(undefined); var node = { id: id, title: this.getTitle(item), level: level, item: item, minimized: true, children: this.mapNodes(this.getItems(item), map, level + 1) }; nodes.push(node); map[id] = node; } } return nodes; }; return Bookmarks; }(); exports.default = Bookmarks; /***/ }, /* 45 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Detector = function () { function Detector() { _classCallCheck(this, Detector); } Detector.getWebGLErrorMessage = function getWebGLErrorMessage() { var element = document.createElement('div'); element.id = 'webgl-error-message'; element.style.fontFamily = 'monospace'; element.style.fontSize = '13px'; element.style.fontWeight = 'normal'; element.style.textAlign = 'center'; element.style.background = '#fff'; element.style.color = '#000'; element.style.padding = '1.5em'; element.style.width = '400px'; element.style.margin = '5em auto 0'; if (!Detector.webgl) { element.innerHTML = window.WebGLRenderingContext ? ['Your graphics card does not seem to support WebGL.
', 'Find out how to get it here.'].join('\n') : ['Your browser does not seem to support WebGL.
', 'Find out how to get it here.'].join('\n'); } return element; }; Detector.addGetWebGLMessage = function addGetWebGLMessage(parameters) { var parent = void 0, id = void 0, element = void 0; parameters = parameters || {}; parent = parameters.parent || (0, _libs.$)(document.body); id = parameters.id || 'oldie'; element = Detector.getWebGLErrorMessage(); //element.id = id; parent.append(element); }; return Detector; }(); Detector.canvas = !!window.CanvasRenderingContext2D; Detector.webgl = function () { try { var canvas = document.createElement('canvas'); return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))); } catch (e) { return false; } }(); Detector.workers = !!window.Worker; Detector.fileapi = window.File && window.FileReader && window.FileList && window.Blob; exports.default = Detector; /***/ }, /* 46 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var DocMouseSimulator = function () { function DocMouseSimulator(jFrame, element) { var bElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : document.body; _classCallCheck(this, DocMouseSimulator); this.jFrame = jFrame; this.wnd = jFrame[0].contentWindow; this.doc = jFrame[0].contentDocument; this.element = element || doc.body; this.bElement = bElement; this.resendProperties = this.getDefaultResendProperties(); this.undefinedProperties = this.getDefaultUndefinedProperties(); this.cursors = []; this.onDocChangeClbs = []; var terms = [{ find: ':hover', replace: '.' + DocMouseSimulator.HOVER }, { find: ':active', replace: '.' + DocMouseSimulator.ACTIVE }]; var style = [''); (0, _libs.$)(this.doc.head).append((0, _libs.$)(style.join(''))); } DocMouseSimulator.prototype.convertCoords = function convertCoords(x, y) { var jElement = (0, _libs.$)(this.element); var offset = jElement.offset(); return { x: offset.left + jElement.width() * x, y: offset.top + jElement.height() * (1 - y) }; }; DocMouseSimulator.prototype.triggerEvent = function triggerEvent(element, e, p, type, advancedProps) { var props = {}; for (var _iterator2 = this.resendProperties, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var _n = _ref2; props[_n] = e[_n]; } for (var _iterator3 = this.undefinedProperties, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var _n2 = _ref3; props[_n2] = undefined; } for (var n in advancedProps) { if (advancedProps.hasOwnProperty(n)) { props[n] = advancedProps[n]; } } props.view = this.wnd; props.pageX = p.x; props.pageY = p.y; var jE = _libs.$.Event(type, props); jE.timeStamp = e.timeStamp; (0, _libs.$)(element).trigger(jE); }; DocMouseSimulator.prototype.addClass = function addClass(element, name) { (0, _libs.$)(element).addClass(name); var style = this.wnd.getComputedStyle(element); this.cursors.push((0, _libs.$)(this.bElement).css('cursor')); (0, _libs.$)(this.bElement).css('cursor', style.getPropertyValue('cursor')); }; DocMouseSimulator.prototype.removeClass = function removeClass(element, name) { (0, _libs.$)(element).removeClass(name); (0, _libs.$)(this.bElement).css('cursor', this.cursors.pop()); }; DocMouseSimulator.prototype.enterElement = function enterElement(element) { this.addClass(element, DocMouseSimulator.HOVER); }; DocMouseSimulator.prototype.leaveElement = function leaveElement(element) { this.removeClass(element, DocMouseSimulator.HOVER); }; DocMouseSimulator.prototype.activateElement = function activateElement(element) { this.addClass(element, DocMouseSimulator.ACTIVE); }; DocMouseSimulator.prototype.deactivateElement = function deactivateElement(element) { this.removeClass(element, DocMouseSimulator.ACTIVE); }; DocMouseSimulator.prototype.addDocChangeClb = function addDocChangeClb(clb) { this.onDocChangeClbs.push(clb); }; DocMouseSimulator.prototype.notify = function notify() { for (var _iterator4 = this.onDocChangeClbs, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var clb = _ref4; clb(this.wnd, this.doc); } }; DocMouseSimulator.prototype.elementFromPoint = function elementFromPoint(p) { var node = this.doc.body, next = true; while (next) { next = false; for (var i = 0; i < node.childNodes.length; ++i) { var child = node.childNodes[i]; if (child instanceof this.wnd.Element) { var jC = (0, _libs.$)(child), offset = jC.offset(), height = jC.height(), width = jC.width(); if (p.x > offset.left && p.x < offset.left + width && p.y > offset.top && p.y < offset.top + height) { node = child; next = true; break; } } } } return node; }; DocMouseSimulator.prototype.getElement = function getElement(p) { var off0 = this.jFrame.offset(); this.jFrame.offset({ left: 0.5 * window.innerWidth - p.x, top: 0.5 * window.innerHeight - p.y }); var element = this.doc.elementFromPoint(p.x, p.y); if (!element) { // it isn't a joke it's IE element = this.doc.elementFromPoint(p.x, p.y); } this.jFrame.offset(off0); return element ? element : this.elementFromPoint(p); }; DocMouseSimulator.prototype.simulate = function simulate(e, doc, x, y) { var p = this.convertCoords(x, y), element = doc === this.doc ? this.getElement(p) : undefined; var trigger = element !== undefined, notify = false; switch (e.type) { case 'mousedown': { if (this.capElement) { this.deactivateElement(this.capElement); notify = true; } this.capElement = element; if (this.capElement) { this.activateElement(this.capElement); notify = true; } break; } case 'mouseup': { if (this.capElement) { this.deactivateElement(this.capElement); notify = true; } this.timeStamp = e.timeStamp; break; } case 'click': { trigger = element && this.capElement === element && e.timeStamp === this.timeStamp; this.capElement = undefined; break; } case 'mouseenter': case 'mouseover': case 'mousemove': { var leaved = null; if (this.hovElement !== element && this.hovElement) { this.triggerEvent(this.hovElement, e, p, 'mouseout', { relatedTarget: element ? element : null }); this.leaveElement(this.hovElement); leaved = this.hovElement; this.hovElement = undefined; notify = true; } if (!this.hovElement && element) { this.triggerEvent(element, e, p, 'mouseover', { relatedTarget: leaved }); this.enterElement(element); this.hovElement = element; notify = true; } trigger = element && e.type === 'mousemove'; break; } case 'mouseleave': case 'mouseout': { if (this.hovElement) { this.triggerEvent(this.hovElement, e, p, 'mouseout', { relatedTarget: e.relatedTarget }); this.leaveElement(this.hovElement); this.hovElement = undefined; notify = true; } trigger = false; break; } } if (trigger) { this.triggerEvent(element, e, p, e.type); } if (notify) { this.notify(); } }; DocMouseSimulator.prototype.getDefaultUndefinedProperties = function getDefaultUndefinedProperties() { return ['clientX', 'clientY', 'offsetX', 'offsetY', 'screenX', 'screenY']; }; DocMouseSimulator.prototype.getDefaultResendProperties = function getDefaultResendProperties() { return ['altKey', 'bubbles', 'button', 'buttons', 'cancelable', 'changedTouches', 'char', 'charCode', 'ctrlKey', 'data', 'detail', 'eventPhase', 'isDefaultPrevented', 'key', 'keyCode', 'metaKey', 'pointerId', 'pointerType', 'shiftKey', 'targetTouches', 'touches', 'which']; }; return DocMouseSimulator; }(); /* altKey, bubbles, button, buttons, cancelable, changedTouches, char, charCode, clientX, clientY, ctrlKey, currentTarget, data, delegateTarget, detail, eventPhase, handleObj, isDefaultPrevented, key, keyCode, metaKey, offsetX, offsetY, originalEvent, pageX, pageY, pointerId, pointerType, relatedTarget, screenX, screenY, shiftKey, target, targetTouches, timeStamp, toElement, touches, type, view, which */ DocMouseSimulator.HOVER = 'SIMULATED-HOVER'; DocMouseSimulator.ACTIVE = 'SIMULATED-ACTIVE'; exports.default = DocMouseSimulator; /***/ }, /* 47 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Dom2Image = function Dom2Image(wnd, doc, cache) { _classCallCheck(this, Dom2Image); var self = this; this.window = wnd; this.document = doc; this.cache = cache; var util = newUtil(); var inliner = newInliner(); var fontFaces = newFontFaces(); var images = newImages(); this.toSvg = toSvg; this.toPng = toPng; this.toJpeg = toJpeg; this.toBlob = toBlob; this.toPixelData = toPixelData; this.impl = { fontFaces: fontFaces, images: images, util: util, inliner: inliner }; /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options * @param {Function} options.filter - Should return true if passed node should be included in the output * (excluding node means excluding it's children as well). Not called on the root node. * @param {String} options.bgcolor - color for the background, any valid CSS color value. * @param {Number} options.width - width to be applied to node before rendering. * @param {Number} options.height - height to be applied to node before rendering. * @param {Object} options.style - an object whose properties to be copied to node's style before rendering. * @param {Number} options.quality - a Number between 0 and 1 indicating image quality (applicable to JPEG only), defaults to 1.0. * @return {Promise} - A promise that is fulfilled with a SVG image data URL * */ function toSvg(node, options) { options = options || {}; return Promise.resolve(node).then(function (node) { return cloneNode(node, options.filter, true); }).then(embedFonts).then(inlineImages).then(applyOptions).then(function (clone) { return makeSvgDataUri(clone, options.width || util.width(node), options.height || util.height(node)); }); function applyOptions(clone) { if (options.bgcolor) clone.style.backgroundColor = options.bgcolor; if (options.width) clone.style.width = options.width + 'px'; if (options.height) clone.style.height = options.height + 'px'; if (options.style) self.window.Object.keys(options.style).forEach(function (property) { clone.style[property] = options.style[property]; }); return clone; } } /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options, @see {@link toSvg} * @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data. * */ function toPixelData(node, options) { return draw(node, options || {}).then(function (canvas) { return canvas.getContext('2d').getImageData(0, 0, util.width(node), util.height(node)).data; }); } /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options, @see {@link toSvg} * @return {Promise} - A promise that is fulfilled with a PNG image data URL * */ function toPng(node, options) { return draw(node, options || {}).then(function (canvas) { return canvas.toDataURL(); }); } /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options, @see {@link toSvg} * @return {Promise} - A promise that is fulfilled with a JPEG image data URL * */ function toJpeg(node, options) { options = options || {}; return draw(node, options).then(function (canvas) { return canvas.toDataURL('image/jpeg', options.quality || 1.0); }); } /** * @param {Node} node - The DOM Node object to render * @param {Object} options - Rendering options, @see {@link toSvg} * @return {Promise} - A promise that is fulfilled with a PNG image blob * */ function toBlob(node, options) { return draw(node, options || {}).then(util.canvasToBlob); } function draw(domNode, options) { return toSvg(domNode, options).then(util.makeImage).then(util.delay(100)).then(function (image) { var canvas = newCanvas(domNode); canvas.getContext('2d').drawImage(image, 0, 0); return canvas; }); function newCanvas(domNode) { var canvas = self.document.createElement('canvas'); canvas.width = options.width || util.width(domNode); canvas.height = options.height || util.height(domNode); if (options.bgcolor) { var ctx = canvas.getContext('2d'); ctx.fillStyle = options.bgcolor; ctx.fillRect(0, 0, canvas.width, canvas.height); } return canvas; } } function cloneNode(node, filter, root) { if (!root && filter && !filter(node)) return Promise.resolve(); return Promise.resolve(node).then(makeNodeCopy).then(function (clone) { return cloneChildren(node, clone, filter); }).then(function (clone) { return processClone(node, clone); }); function makeNodeCopy(node) { if (util.isCanvas(node)) return util.makeImage(node.toDataURL()); return node.cloneNode(false); } function cloneChildren(original, clone, filter) { var children = original.childNodes; if (children.length === 0) return Promise.resolve(clone); return cloneChildrenInOrder(clone, util.asArray(children), filter).then(function () { return clone; }); function cloneChildrenInOrder(parent, children, filter) { var done = Promise.resolve(); children.forEach(function (child) { done = done.then(function () { return cloneNode(child, filter); }).then(function (childClone) { if (childClone) parent.appendChild(childClone); }); }); return done; } } function processClone(original, clone) { if (!util.isElement(clone)) return clone; return Promise.resolve().then(cloneStyle).then(clonePseudoElements).then(copyUserInput).then(fixSvg).then(function () { return clone; }); function cloneStyle() { copyStyle(self.window.getComputedStyle(original), clone.style); function copyStyle(source, target) { if (source.cssText) target.cssText = source.cssText;else copyProperties(source, target); function copyProperties(source, target) { util.asArray(source).forEach(function (name) { target.setProperty(name, source.getPropertyValue(name), source.getPropertyPriority(name)); }); } } } function clonePseudoElements() { [':before', ':after'].forEach(function (element) { clonePseudoElement(element); }); function clonePseudoElement(element) { var style = self.window.getComputedStyle(original, element); var content = style.getPropertyValue('content'); if (content === '' || content === 'none') return; var className = util.uid(); clone.className = clone.className + ' ' + className; var styleElement = self.document.createElement('style'); styleElement.appendChild(formatPseudoElementStyle(className, element, style)); clone.appendChild(styleElement); function formatPseudoElementStyle(className, element, style) { var selector = '.' + className + ':' + element; var cssText = style.cssText ? formatCssText(style) : formatCssProperties(style); return self.document.createTextNode(selector + '{' + cssText + '}'); function formatCssText(style) { var content = style.getPropertyValue('content'); return style.cssText + ' content: ' + content + ';'; } function formatCssProperties(style) { return util.asArray(style).map(formatProperty).join('; ') + ';'; function formatProperty(name) { return name + ': ' + style.getPropertyValue(name) + (style.getPropertyPriority(name) ? ' !important' : ''); } } } } } function copyUserInput() { if (util.isTextArea(original)) clone.innerHTML = original.value; if (util.isInput(original)) clone.setAttribute("value", original.value); } function fixSvg() { if (!util.isSVG(clone)) return; clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); if (!util.isSVGRect(clone)) return; ['width', 'height'].forEach(function (attribute) { var value = clone.getAttribute(attribute); if (!value) return; clone.style.setProperty(attribute, value); }); } } } function embedFonts(node) { return fontFaces.resolveAll().then(function (cssText) { var styleNode = self.document.createElement('style'); node.appendChild(styleNode); styleNode.appendChild(self.document.createTextNode(cssText)); return node; }); } function inlineImages(node) { return images.inlineAll(node).then(function () { return node; }); } function makeSvgDataUri(node, width, height) { return Promise.resolve(node).then(function (node) { node.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); return new self.window.XMLSerializer().serializeToString(node); }).then(util.escapeXhtml).then(function (xhtml) { return ['data:image/svg+xml;charset=utf-8,', '', '', xhtml, '', ''].join(''); }); } function newUtil() { return { escape: escape, parseExtension: parseExtension, mimeType: mimeType, dataAsUrl: dataAsUrl, isDataUrl: isDataUrl, canvasToBlob: canvasToBlob, resolveUrl: resolveUrl, getAndEncode: getAndEncode, uid: uid(), delay: delay, asArray: asArray, escapeXhtml: escapeXhtml, makeImage: makeImage, width: width, height: height, isElement: isElement, isCanvas: isCanvas, isTextArea: isTextArea, isInput: isInput, isSVG: isSVG, isSVGRect: isSVGRect, isImage: isImage }; function mimes() { /* * Only WOFF and EOT mime types for fonts are 'real' * see http://www.iana.org/assignments/media-types/media-types.xhtml */ var WOFF = 'application/font-woff'; var JPEG = 'image/jpeg'; return { 'woff': WOFF, 'woff2': WOFF, 'ttf': 'application/font-truetype', 'eot': 'application/vnd.ms-fontobject', 'png': 'image/png', 'jpg': JPEG, 'jpeg': JPEG, 'gif': 'image/gif', 'tiff': 'image/tiff', 'svg': 'image/svg+xml' }; } function parseExtension(url) { var match = /\.([^\.\/]*?)$/g.exec(url); if (match) return match[1];else return ''; } function mimeType(url) { var extension = parseExtension(url).toLowerCase(); return mimes()[extension] || ''; } function isDataUrl(url) { return url.search(/^(data:)/) !== -1; } function toBlob(canvas) { return new Promise(function (resolve) { var binaryString = self.window.atob(canvas.toDataURL().split(',')[1]); var length = binaryString.length; var binaryArray = new self.window.Uint8Array(length); for (var i = 0; i < length; i++) { binaryArray[i] = binaryString.charCodeAt(i); }resolve(new self.window.Blob([binaryArray], { type: 'image/png' })); }); } function canvasToBlob(canvas) { if (canvas.toBlob) return new Promise(function (resolve) { canvas.toBlob(resolve); }); return toBlob(canvas); } function resolveUrl(url, baseUrl) { var doc = self.document.implementation.createHTMLDocument(); var base = doc.createElement('base'); doc.head.appendChild(base); var a = doc.createElement('a'); doc.body.appendChild(a); base.href = baseUrl; a.href = url; return a.href; } function uid() { var index = 0; return function () { return 'u' + fourRandomChars() + index++; function fourRandomChars() { /* see http://stackoverflow.com/a/6248722/2519373 */ return ('0000' + (self.window.Math.random() * self.window.Math.pow(36, 4) << 0).toString(36)).slice(-4); } }; } function makeImage(uri) { return new Promise(function (resolve, reject) { var image = new self.window.Image(); image.onload = function () { resolve(image); }; image.onerror = reject; image.src = uri; }); } function getAndEncode(url) { var data = self.cache.get(url); if (data) { if (data.content) { return data.content; } else { return new Promise(function (resolve) { if (data.content) { resolve(data.content); } else { data.pendings.push(resolve); } }); } } else { data = self.cache.put(url, { pendings: [] }); var TIMEOUT = 30000; return new Promise(function (resolve) { var request = new self.window.XMLHttpRequest(); request.onreadystatechange = done; request.ontimeout = timeout; request.responseType = 'blob'; request.timeout = TIMEOUT; request.open('GET', url, true); request.send(); function done() { if (request.readyState !== 4) return; if (request.status !== 200) { fail('cannot fetch resource: ' + url + ', status: ' + request.status); return; } var encoder = new self.window.FileReader(); encoder.onloadend = function () { data.content = encoder.result.split(/,/)[1]; for (var _iterator = data.pendings, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var _resolve = _ref; _resolve(data.content); } data.pendings = []; resolve(data.content); }; encoder.readAsDataURL(request.response); } function timeout() { fail('timeout of ' + TIMEOUT + 'ms occured while fetching resource: ' + url); } function fail(message) { console.error(message); resolve(''); } }); } } function dataAsUrl(content, type) { return ['data:', type, ';base64,', content].join(''); } function escape(string) { return string.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1'); } function delay(ms) { return function (arg) { return new Promise(function (resolve) { setTimeout(function () { resolve(arg); }, ms); }); }; } function asArray(arrayLike) { var array = []; var length = arrayLike.length; for (var i = 0; i < length; i++) { array.push(arrayLike[i]); }return array; } function escapeXhtml(string) { return string.replace(/(#|\n)/g, function (c) { return c === '#' ? '%23' : '%0A'; }); } function width(node) { var leftBorder = px(node, 'border-left-width'); var rightBorder = px(node, 'border-right-width'); return node.scrollWidth + leftBorder + rightBorder; } function height(node) { var topBorder = px(node, 'border-top-width'); var bottomBorder = px(node, 'border-bottom-width'); return node.scrollHeight + topBorder + bottomBorder; } function px(node, styleProperty) { var value = self.window.getComputedStyle(node).getPropertyValue(styleProperty); return parseFloat(value.replace('px', '')); } function isElement(node) { return node instanceof self.window.Element; } function isCanvas(node) { return node instanceof self.window.HTMLCanvasElement; } function isTextArea(node) { return node instanceof self.window.HTMLTextAreaElement; } function isInput(node) { return node instanceof self.window.HTMLInputElement; } function isSVG(node) { return node instanceof self.window.SVGElement; } function isSVGRect(node) { return node instanceof self.window.SVGRectElement; } function isImage(node) { return node instanceof self.window.HTMLImageElement; } } function newInliner() { var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g; return { inlineAll: inlineAll, shouldProcess: shouldProcess, impl: { readUrls: readUrls, inline: inline } }; function shouldProcess(string) { return string.search(URL_REGEX) !== -1; } function readUrls(string) { var result = []; var match = void 0; while ((match = URL_REGEX.exec(string)) !== null) { result.push(match[1]); } return result.filter(function (url) { return !util.isDataUrl(url); }); } function inline(string, url, baseUrl, get) { return Promise.resolve(url).then(function (url) { return baseUrl ? util.resolveUrl(url, baseUrl) : url; }).then(get || util.getAndEncode).then(function (data) { return util.dataAsUrl(data, util.mimeType(url)); }).then(function (dataUrl) { return string.replace(urlAsRegex(url), ['$1', dataUrl, '$3'].join('')); }); function urlAsRegex(url) { return new self.window.RegExp(['(url\\([\'"]?)(', util.escape(url), ')([\'"]?\\))'].join(''), 'g'); } } function inlineAll(string, baseUrl, get) { if (nothingToInline()) return Promise.resolve(string); return Promise.resolve(string).then(readUrls).then(function (urls) { var done = Promise.resolve(string); urls.forEach(function (url) { done = done.then(function (string) { return inline(string, url, baseUrl, get); }); }); return done; }); function nothingToInline() { return !shouldProcess(string); } } } function newFontFaces() { return { resolveAll: resolveAll, impl: { readAll: readAll } }; function resolveAll() { return readAll(self.document).then(function (webFonts) { return Promise.all(webFonts.map(function (webFont) { return webFont.resolve(); })); }).then(function (cssStrings) { return cssStrings.join('\n'); }); } function readAll() { return Promise.resolve(util.asArray(self.document.styleSheets)).then(getCssRules).then(selectWebFontRules).then(function (rules) { return rules.map(newWebFont); }); function selectWebFontRules(cssRules) { return cssRules.filter(function (rule) { return rule.type === CSSRule.FONT_FACE_RULE; }).filter(function (rule) { return inliner.shouldProcess(rule.style.getPropertyValue('src')); }); } function getCssRules(styleSheets) { var cssRules = []; styleSheets.forEach(function (sheet) { try { util.asArray(sheet.cssRules || []).forEach(cssRules.push.bind(cssRules)); } catch (e) { console.log('Error while reading CSS rules from ' + sheet.href, e.toString()); } }); return cssRules; } function newWebFont(webFontRule) { return { resolve: function resolve() { var baseUrl = (webFontRule.parentStyleSheet || {}).href; return inliner.inlineAll(webFontRule.cssText, baseUrl); }, src: function src() { return webFontRule.style.getPropertyValue('src'); } }; } } } function newImages() { return { inlineAll: inlineAll, impl: { newImage: newImage } }; function newImage(element) { return { inline: inline }; function inline(get) { if (util.isDataUrl(element.src)) return Promise.resolve(); return Promise.resolve(element.src).then(get || util.getAndEncode).then(function (data) { return util.dataAsUrl(data, util.mimeType(element.src)); }).then(function (dataUrl) { return new Promise(function (resolve, reject) { element.onload = resolve; element.onerror = reject; element.src = dataUrl; }); }); } } function inlineAll(node) { if (!util.isElement(node)) return Promise.resolve(node); return inlineBackground(node).then(function () { if (util.isImage(node)) return newImage(node).inline();else return Promise.all(util.asArray(node.childNodes).map(function (child) { return inlineAll(child); })); }); function inlineBackground(node) { var background = node.style.getPropertyValue('background'); if (!background) return Promise.resolve(node); return inliner.inlineAll(background).then(function (inlined) { node.style.setProperty('background', inlined, node.style.getPropertyPriority('background')); }).then(function () { return node; }); } } } }; exports.default = Dom2Image; /***/ }, /* 48 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Drag = function () { function Drag(wnd, doc, visualWorld) { _classCallCheck(this, Drag); this.wnd = wnd; this.doc = doc; this.visual = visualWorld; this.coords = new _libs.THREE.Vector2(); this.intersection = new _libs.THREE.Vector3(); this.raycaster = this.visual.raycaster; this.camera = this.visual.camera; this.plane = new _libs.THREE.Plane(); this.threes = []; this.selected = null; this.enabled = true; this.controlsState = this.visual.getControlsState(); this.element = this.visual.element; this.binds = { onMouseMove: this.onMouseMove.bind(this), onMouseDown: this.onMouseDown.bind(this), onMouseUp: this.onMouseUp.bind(this) }; (0, _libs.$)(this.element).on('mousemove', this.binds.onMouseMove); (0, _libs.$)(this.element).on('mousedown', this.binds.onMouseDown); (0, _libs.$)(this.doc).on('mouseup', this.binds.onMouseUp); } Drag.prototype.addThree = function addThree(three) { this.threes.push(three); }; Drag.prototype.removeThree = function removeThree(three) { var i = this.threes.indexOf(three); if (~i) { this.threes.splice(i, 1); } }; Drag.prototype.onPickCallback = function onPickCallback() { return true; }; Drag.prototype.onDragCallback = function onDragCallback() { return true; }; Drag.prototype.onReleaseCallback = function onReleaseCallback() {}; Drag.prototype.dispose = function dispose() { (0, _libs.$)(this.element).off('mousemove', this.binds.onMouseMove); (0, _libs.$)(this.element).off('mousedown', this.binds.onMouseDown); (0, _libs.$)(this.doc).off('mouseup', this.binds.onMouseUp); }; Drag.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { var jElement = (0, _libs.$)(this.element); var offset = jElement.offset(); this.coords.x = (e.pageX - offset.left) / jElement.width() * 2 - 1; this.coords.y = -((e.pageY - offset.top) / jElement.height()) * 2 + 1; return this.coords; }; Drag.prototype.onMouseDown = function onMouseDown(e) { if (!this.enabled) return; if (this.selected) this.onMouseUp(e); this.setCoordsFromEvent(e); this.raycaster.setFromCamera(this.coords, this.camera); var intersects = this.raycaster.intersectObjects(this.threes); if (intersects.length > 0) { var selected = intersects[0].object; if (!this.onPickCallback(intersects[0])) return; var v = intersects[0].point.clone(); this.distance = v.sub(this.raycaster.ray.origin).length();; this.controlsState = this.visual.getControlsState(); this.visual.setControlsState(false); this.plane.setFromNormalAndCoplanarPoint(this.visual.camera.getWorldDirection(this.plane.normal), intersects[0].point); //this.plane.setFromNormalAndCoplanarPoint(this.plane.normal.set(0,0,1), new THREE.Vector3(0,0,0)); this.selected = selected; } }; Drag.prototype.onMouseMove = function onMouseMove(e) { if (!this.enabled) return; e.preventDefault(); if (this.selected) { this.setCoordsFromEvent(e); this.raycaster.setFromCamera(this.coords, this.camera); if (this.raycaster.ray.intersectPlane(this.plane, this.intersection)) { if (!this.onDragCallback(this.intersection)) this.onMouseUp(e); } /**/ //this.intersection.copy(this.raycaster.ray.direction).normalize().multiplyScalar(this.distance).add(this.raycaster.ray.origin);/**/ //if(!this.onDragCallback(this.selected, this.intersection)) this.onMouseUp(e); } }; Drag.prototype.onMouseUp = function onMouseUp(e) { if (this.selected) { this.onReleaseCallback(); this.selected = null; this.visual.setControlsState(this.controlsState); } if (!this.enabled) return; e.preventDefault(); }; return Drag; }(); exports.default = Drag; /***/ }, /* 49 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } __webpack_require__(71)(_libs.$); var EventsToActions = function () { EventsToActions.getEventFlags = function getEventFlags(e) { return e.ctrlKey << 0 | e.shiftKey << 1 | e.altKey << 2; }; EventsToActions.getPosition = function getPosition(touches) { var x = void 0, y = void 0; if (touches.length === 2) { x = touches[1].pageX - touches[0].pageX; y = touches[1].pageY - touches[0].pageY; y = -Math.sqrt(x * x + y * y); x = 0; } else { x = touches[0].pageX; y = touches[0].pageY; } return { x: x, y: y }; }; function EventsToActions(element, actions) { _classCallCheck(this, EventsToActions); this.actions = actions || {}; this.element = element; this.doc = element[0].ownerDocument; this.wnd = this.doc.defaultView; this.enabled = true; this.binds = { contextMenu: this.contextMenu.bind(this), mouseDown: this.mouseDown.bind(this), mouseMove: this.mouseMove.bind(this), mouseUp: this.mouseUp.bind(this), mouseWheel: this.mouseWheel.bind(this), mouseMoveDoc: this.mouseMoveDoc.bind(this), mouseUpDoc: this.mouseUpDoc.bind(this), click: this.click.bind(this), dblclick: this.dblclick.bind(this), touchStart: this.touchStart.bind(this), touchMove: this.touchMove.bind(this), touchEnd: this.touchEnd.bind(this), keyDown: this.keyDown.bind(this), keyPress: this.keyPress.bind(this), keyUp: this.keyUp.bind(this) }; this.element.on('contextmenu', this.binds.contextMenu); this.element.on('mousedown', this.binds.mouseDown); this.element.on('mousemove', this.binds.mouseMove); this.element.on('mouseup', this.binds.mouseUp); this.element.on('mousewheel', this.binds.mouseWheel); (0, _libs.$)(this.doc).on('mousemove', this.binds.mouseMoveDoc); (0, _libs.$)(this.doc).on('mouseup', this.binds.mouseUpDoc); this.element.on('click', this.binds.click); this.element.on('dblclick', this.binds.dblclick); this.element.on('touchstart', this.binds.touchStart); this.element.on('touchmove', this.binds.touchMove); this.element.on('touchend', this.binds.touchEnd); (0, _libs.$)(this.wnd).on('keydown', this.binds.keyDown); (0, _libs.$)(this.wnd).on('keypress', this.binds.keyPress); (0, _libs.$)(this.wnd).on('keyup', this.binds.keyUp); } EventsToActions.prototype.addAction = function addAction(action, type, code, flags) { type = type.toLowerCase(); if (!this.actions[type]) { this.actions[type] = {}; } if (!this.actions[type][code]) { this.actions[type][code] = {}; } if (!this.actions[type][code][flags]) { this.actions[type][code][flags] = []; } this.actions[type][code][flags].push(action); }; EventsToActions.prototype.getActions = function getActions(type, code, flags) { return ((this.actions[type] || {})[code] || {})[flags] || []; }; EventsToActions.prototype.fireActions = function fireActions(actions, e, data) { for (var _iterator = actions, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var action = _ref; action(e, data); } }; EventsToActions.prototype.contextMenu = function contextMenu(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('contextmenu', e.button, flags), e); } }; EventsToActions.prototype.mouseDown = function mouseDown(e) { if (this.picked) { this.mouseUpDoc(); } if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('mousedown', e.button, flags), e); this.picked = { x: e.pageX, y: e.pageY, actions: this.getActions('mousedrag', e.button, flags) }; this.fireActions(this.picked.actions, e, { state: 'start' }); } }; EventsToActions.prototype.mouseMove = function mouseMove(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('mousemove', e.button, flags), e); } }; EventsToActions.prototype.mouseMoveDoc = function mouseMoveDoc(e) { if (this.enabled && this.picked) { this.fireActions(this.picked.actions, e, { state: 'move', dx: e.pageX - this.picked.x, dy: e.pageY - this.picked.y }); this.picked = { x: e.pageX, y: e.pageY, actions: this.picked.actions }; } }; EventsToActions.prototype.mouseUp = function mouseUp(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('mouseup', e.button, flags), e); } }; EventsToActions.prototype.mouseUpDoc = function mouseUpDoc(e) { if (this.picked) { this.fireActions(this.picked.actions, e, { state: 'end' }); delete this.picked; } }; EventsToActions.prototype.mouseWheel = function mouseWheel(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions('mousewheel', 0, flags), e); } }; EventsToActions.prototype.clicks = function clicks(e, type) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions(type, e.button, flags), e); } }; EventsToActions.prototype.click = function click(e) { this.clicks(e, 'click'); }; EventsToActions.prototype.dblclick = function dblclick(e) { this.clicks(e, 'dblclick'); }; EventsToActions.prototype.touchPick = function touchPick(e, flags, touches) { this.touchPicked = _extends({}, EventsToActions.getPosition(touches), { actions: this.getActions('touchdrag', touches.length, flags), code: touches.length, flags: flags }); this.fireActions(this.touchPicked.actions, e, { state: 'start' }); }; EventsToActions.prototype.touchStart = function touchStart(e) { if (this.touchPicked) { this.touchEnd(e); } if (this.enabled) { var flags = EventsToActions.getEventFlags(e), touches = e.touches || e.originalEvent.touches; this.fireActions(this.getActions('touchstart', touches.length, flags), e); this.touchPick(e, flags, touches); } }; EventsToActions.prototype.touchMove = function touchMove(e) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e), touches = e.touches || e.originalEvent.touches; this.fireActions(this.getActions('touchmove', touches.length, flags), e); if (this.touchPicked) { if (this.touchPicked.code === touches.length && this.touchPicked.flags === flags) { var pos = EventsToActions.getPosition(touches); this.fireActions(this.touchPicked.actions, e, { state: 'move', dx: pos.x - this.touchPicked.x, dy: pos.y - this.touchPicked.y }); this.touchPicked = _extends({}, this.touchPicked, pos); } else { this.touchEnd(e); this.touchPick(e, flags, touches); } } } }; EventsToActions.prototype.touchEnd = function touchEnd(e) { if (this.touchPicked) { this.fireActions(this.touchPicked.actions, e, { state: 'end' }); delete this.touchPicked; } }; EventsToActions.prototype.key = function key(e, type) { if (this.enabled) { var flags = EventsToActions.getEventFlags(e); this.fireActions(this.getActions(type, e.keyCode, flags), e); } }; EventsToActions.prototype.keyDown = function keyDown(e) { this.key(e, 'keydown'); }; EventsToActions.prototype.keyPress = function keyPress(e) { this.key(e, 'keypress'); }; EventsToActions.prototype.keyUp = function keyUp(e) { this.key(e, 'keyup'); }; EventsToActions.prototype.dispose = function dispose() { this.element.off('contextmenu', this.binds.contextMenu); this.element.off('mousedown', this.binds.mouseDown); this.element.off('mousemove', this.binds.mouseMove); this.element.off('mouseup', this.binds.mouseUp); this.element.off('mousewheel', this.binds.mouseWheel); (0, _libs.$)(this.doc).off('mousemove', this.binds.mouseMoveDoc); (0, _libs.$)(this.doc).off('mouseup', this.binds.mouseUpDoc); this.element.off('click', this.binds.click); this.element.off('dblclick', this.binds.dblclick); this.element.off('touchstart', this.binds.touchStart); this.element.off('touchmove', this.binds.touchMove); this.element.off('touchend', this.binds.touchEnd); (0, _libs.$)(this.wnd).off('keydown', this.binds.keyDown); (0, _libs.$)(this.wnd).off('keypress', this.binds.keyPress); (0, _libs.$)(this.wnd).off('keyup', this.binds.keyUp); }; return EventsToActions; }(); EventsToActions.modKeys = { Ctrl: 1, Shift: 2, Alt: 4 }; EventsToActions.mouseButtons = { Left: 0, Middle: 1, Right: 2 }; exports.default = EventsToActions; /***/ }, /* 50 */ /***/ function(module, exports) { "use strict"; 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var FullScreen = function () { function FullScreen() { _classCallCheck(this, FullScreen); } FullScreen.available = function available() { return FullScreen._hasWebkitFullScreen || FullScreen._hasMozFullScreen || FullScreen._hasMsFullscreen; }; FullScreen.activated = function activated() { if (FullScreen._hasWebkitFullScreen) { return document.webkitIsFullScreen; } else if (FullScreen._hasMozFullScreen) { return document.mozFullScreen; } else if (FullScreen._hasMsFullscreen) { return !!document.msFullscreenElement; } else { console.assert(false); } }; FullScreen.addEventListener = function addEventListener(element, handler) { if (element.addEventListener) { element.addEventListener('webkitfullscreenchange', handler, false); element.addEventListener('mozfullscreenchange', handler, false); element.addEventListener('fullscreenchange', handler, false); element.addEventListener('MSFullscreenChange', handler, false); } }; FullScreen.removeEventListener = function removeEventListener(element, handler) { if (element.removeEventListener) { element.removeEventListener('webkitfullscreenchange', handler, false); element.removeEventListener('mozfullscreenchange', handler, false); element.removeEventListener('fullscreenchange', handler, false); element.removeEventListener('MSFullscreenChange', handler, false); } }; FullScreen.request = function request(element) { element = element || document.body; if (FullScreen._hasWebkitFullScreen) { element.webkitRequestFullScreen(); } else if (FullScreen._hasMozFullScreen) { element.mozRequestFullScreen(); } else if (FullScreen._hasMsFullscreen) { element.msRequestFullscreen(); } else { console.assert(false); } }; FullScreen.cancel = function cancel() { if (FullScreen._hasWebkitFullScreen) { document.webkitCancelFullScreen(); } else if (FullScreen._hasMozFullScreen) { document.mozCancelFullScreen(); } else if (FullScreen._hasMsFullscreen) { document.msExitFullscreen(); } else { console.assert(false); } }; return FullScreen; }(); FullScreen._hasWebkitFullScreen = !!document.webkitCancelFullScreen; FullScreen._hasMozFullScreen = !!document.mozCancelFullScreen; FullScreen._hasMsFullscreen = !!document.documentElement.msRequestFullscreen; exports.default = FullScreen; /***/ }, /* 51 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _ImageBase2 = __webpack_require__(5); var _ImageBase3 = _interopRequireDefault(_ImageBase2); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); var _Dom2Image = __webpack_require__(47); var _Dom2Image2 = _interopRequireDefault(_Dom2Image); var _DocMouseSimulator = __webpack_require__(46); var _DocMouseSimulator2 = _interopRequireDefault(_DocMouseSimulator); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var InteractiveImage = function (_ImageBase) { _inherits(InteractiveImage, _ImageBase); function InteractiveImage(context, width, height, color, src, cache, injector) { _classCallCheck(this, InteractiveImage); var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); _this.iId = 'i' + _BaseMathUtils2.default.getUnique(); var jFrame = (0, _libs.$)(''); (0, _libs.$)(_this.doc.body).append(jFrame); _this.frame = jFrame[0]; _this.binds = {}; if (injector) { injector(_this.frame.contentWindow); } if (_this.doc.implementation.hasFeature('www.http://w3.org/TR/SVG11/feature#Extensibility', '1.1')) { // svg foreignObject renderer _this.image = new Image(); _this.binds.imageLoad = function () { _this.renderImage(_this.image); _this.finishRender(); }; (0, _libs.$)(_this.image).on('load', _this.binds.imageLoad); _this.svgRender = new _Dom2Image2.default(_this.frame.contentWindow, _this.frame.contentDocument, cache); } // otherwise - html2canvas _this.binds.frameLoad = function () { if (~_this.frame.contentDocument.title.indexOf('404')) { _this.startRender = function () { _this.renderNotFoundPage(); _this.finishRender(); }; _this.finishLoad(); } else { setTimeout(function () { if (_this.frame) { _this.width = (0, _libs.$)(_this.frame.contentDocument.body).width(); _this.height = (0, _libs.$)(_this.frame.contentDocument.body).height(); jFrame.css('width', _this.width + 'px').css('height', _this.height + 'px'); jFrame.offset({ left: -_this.width - 100, top: 0 }); if (_this.svgRender) { _this.simulator = new _DocMouseSimulator2.default(jFrame, _this.frame.contentDocument.body, _this.element); _this.simulator.addDocChangeClb(_this.finishLoad.bind(_this)); } _this.startRender = function () { _this.render(); }; _this.finishLoad(); } }, 500); } }; (0, _libs.$)(_this.frame.contentWindow).on('load', _this.binds.frameLoad); return _this; } InteractiveImage.prototype.getSimulatedDoc = function getSimulatedDoc() { return this.frame.contentDocument; }; InteractiveImage.prototype.render = function render() { var _this2 = this; if (this.svgRender) { this.svgRender.toSvg(this.simulator.element, { height: this.height + 'px', width: this.width + 'px' }).then(function (dataUrl) { _this2.image.src = dataUrl; }).catch(function (error) { console.error('Dom2Image: ', error); _this2.renderBlankPage(); _this2.finishRender(); }); } else { (0, _libs.html2canvas)(this.frame.contentDocument.body, { timeout: 30000 }).then(function (canvas) { _this2.renderImage(canvas); _this2.finishRender(); }); } }; InteractiveImage.prototype.dispose = function dispose() { (0, _libs.$)(this.image).off('load', this.binds.imageLoad); (0, _libs.$)(this.frame.contentWindow).off('load', this.binds.frameLoad); (0, _libs.$)(this.doc.body).find('#' + this.iId).remove(); if (this.image) { this.image.src = ''; delete this.image; } this.frame.src = ''; delete this.frame; _ImageBase.prototype.dispose.call(this); }; InteractiveImage.prototype.simulate = function simulate(e, doc, x, y) { if (this.simulator) { this.simulator.simulate(e, doc, x, y); } }; return InteractiveImage; }(_ImageBase3.default); exports.default = InteractiveImage; /***/ }, /* 52 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _GraphUtils = __webpack_require__(7); var _GraphUtils2 = _interopRequireDefault(_GraphUtils); var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var LoadingAnimation = function () { LoadingAnimation.prototype.dy = function dy(t, y) { var w = y[0], a = y[1]; return [-this.g * Math.cos(a), w]; }; LoadingAnimation.prototype.integrate = function integrate(T) { var t = 0, dt = this.p.dt, os = this.os; while (t < T) { if (t + dt > T) { dt = T - t; } os = _MathUtils2.default.rk4(this.dy.bind({ g: this.p.g }), 0, dt, os); t += dt; } return os; }; LoadingAnimation.prototype.calcTimeTo = function calcTimeTo(target) { var t = 0, dt = this.p.dt, os = this.os; while (Math.abs(os[1] - target) > 1e-4) { var nos = _MathUtils2.default.rk4(this.dy.bind({ g: this.p.g }), 0, dt, os); if (nos[0] < 0 && nos[1] < target || nos[0] > 0 && nos[1] > target) { dt /= 2; } else { os = nos; t += dt; } } return t; }; LoadingAnimation.prototype.update = function update(T) { this.os = this.integrate(T); this.t += T; if (this.t >= this.p.updateInterval) { this.t = 0; var r = 0.06 * Math.min(this.c.width, this.c.height), a = this.os[1], x0 = 0.5 * this.c.width, y0 = 0.5 * this.c.height, ctx = this.ctx; ctx.clearRect(0, 0, this.c.width, this.c.height); ctx.beginPath(); ctx.fillStyle = _GraphUtils2.default.color2Rgba(this.p.color, 1); ctx.rect(0, 0, this.c.width, this.c.height); ctx.fill(); ctx.beginPath(); ctx.shadowBlur = 50; ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 0.9), Math.abs(this.os[0] / 6.36)); ctx.shadowColor = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 1), 0.9); ctx.shadowOffsetX = 0; ctx.shadowOffsetY = 0; ctx.font = 'bold ' + Math.round(0.25 * r) + 'px Arial'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillText((0, _libs.tr)('Loading...'), x0, y0); var ps = 10, da = 2 * Math.PI / ps; //2.5*_r/r ctx.shadowColor = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, 1), 0.7); for (var i = 0, _a = a, _r = 0.2 * r; i < ps; ++i, _r *= 0.9, _a += da) { ctx.beginPath(); ctx.fillStyle = _GraphUtils2.default.color2Rgba(_GraphUtils2.default.inverseColor(this.p.color, (ps - i) / ps), 0.7 * (ps - i) / ps); var cx = x0 + r * Math.cos(_a), cy = y0 - r * Math.sin(_a), nx = x0 + r * Math.cos(_a + da), ny = y0 - r * Math.sin(_a + da); ctx.shadowOffsetX = 0.2 * (nx - cx); ctx.shadowOffsetY = 0.2 * (ny - cy); ctx.arc(cx, cy, _r, 0, Math.PI * 2, 1); ctx.fill(); } if (this.onChange) { this.onChange(this.c, this.p.color); } } }; LoadingAnimation.prototype.getImage = function getImage() { return this.c; }; LoadingAnimation.prototype.dispose = function dispose() { this.c.width = 0; this.c.height = 0; delete this.ctx; delete this.c; }; LoadingAnimation.prototype.createSprite = function createSprite(n) { var c = (0, _libs.$)('')[0], ctx = c.getContext('2d'), t = this.calcTimeTo(this.os[1] + Math.sign(this.os[0]) * 2 * Math.PI), dt = t / (n + 1); var updateInterval = this.p.updateInterval; this.p.updateInterval = 0; for (var i = 0; i < n; ++i) { this.update(dt); ctx.drawImage(this.c, i * this.c.width, 0); } this.p.updateInterval = updateInterval; return c; }; function LoadingAnimation(width, height, color) { _classCallCheck(this, LoadingAnimation); var jC = (0, _libs.$)(''); this.c = jC[0]; this.p = { g: 9.8, dt: 1 / 60, color: color, updateInterval: 0.25 }; this.ctx = this.c.getContext('2d'); this.os = [-2, Math.PI / 2]; this.t = this.p.updateInterval; } return LoadingAnimation; }(); exports.default = LoadingAnimation; /***/ }, /* 53 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var LoadingController = function () { function LoadingController(view) { var showProgress = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var loadingMsg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; _classCallCheck(this, LoadingController); this.view = view; this.progress = 0; this.showProgress = showProgress; this.getLoadingMsg = loadingMsg || LoadingController.defaultLoadingMsg; this.updateView(); } LoadingController.defaultLoadingMsg = function defaultLoadingMsg(progress) { return ['Please wait... the Application is Loading: ', progress, '%'].join(''); }; LoadingController.prototype.dispose = function dispose() { this.showProgress = false; this.updateView(); delete this.view; }; LoadingController.prototype.setProgress = function setProgress(v) { this.progress = v; this.updateView(); }; LoadingController.prototype.updateView = function updateView() { if (this.view) { this.view.setState('widLoadingProgress', { enable: true, visible: this.showProgress, active: false }); this.view.setState('txtLoadingProgress', { value: this.getLoadingMsg(this.progress), visible: true }); for (var _iterator = this.view.getLinks(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var name = _ref; this.view.setState(name, { enable: false, visible: true, active: false }); } this.view.setState('inpPages', { visible: true, value: '' }); this.view.setState('inpPage', { visible: true, enable: false, value: '' }); } }; return LoadingController; }(); exports.default = LoadingController; /***/ }, /* 54 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _EventConverter2 = __webpack_require__(6); var _EventConverter3 = _interopRequireDefault(_EventConverter2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var MouseEventConverter = function (_EventConverter) { _inherits(MouseEventConverter, _EventConverter); function MouseEventConverter(wnd, doc, element) { _classCallCheck(this, MouseEventConverter); var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); _this.element = element; _this.binds = { convert: _this.convert.bind(_this) }; (0, _libs.$)(_this.element).on('mousemove mousedown mouseover mouseout click', _this.binds.convert); (0, _libs.$)(_this.doc).on('mouseup', _this.binds.convert); return _this; } MouseEventConverter.prototype.dispose = function dispose() { (0, _libs.$)(this.element).off('mousemove mousedown mouseover mouseout click', this.binds.convert); (0, _libs.$)(this.doc).off('mouseup', this.binds.convert); }; return MouseEventConverter; }(_EventConverter3.default); exports.default = MouseEventConverter; /***/ }, /* 55 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(0); var _MathUtils = __webpack_require__(3); var _MathUtils2 = _interopRequireDefault(_MathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Object3DWatcher = function () { function Object3DWatcher(visual, boundBoxClb) { var testScale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.testScale; _classCallCheck(this, Object3DWatcher); this.visual = visual; this.boundBoxClb = boundBoxClb; this.testScale = testScale; this.camera = visual.camera; this.element = this.visual.element; this.elementSize = { w: 1, h: 1 }; this.devicePixelRatio = this.visual.wnd.devicePixelRatio || 1; this.orbit = visual.getOrbit(); this.scale = 1; this.eps = 1e-4; this.v = new _libs.THREE.Vector3(); this.dv = new _libs.THREE.Vector2(); this.enabled = false; visual.addRenderCallback(this.update.bind(this)); this.os = { vx: 0, vy: 0, x: 0, y: 0 }; this.orbit.update(); this.camera.updateMatrixWorld(); var box = this.computeClientBoundBox(), k = 1.11; this.movePan({ x: -k * box.mid.x, y: -k * box.mid.y }); } Object3DWatcher.prototype.movePan = function movePan(dv) { this.orbit.pan(dv.x * this.visual.width(), -dv.y * this.visual.height()); }; Object3DWatcher.prototype.vToCamera = function vToCamera(v) { v.project(this.camera); return { x: 0.5 * v.x, y: 0.5 * v.y }; }; Object3DWatcher.prototype.computeClientBoundBox = function computeClientBoundBox() { var box = this.boundBoxClb(), xs = [box.min.x, box.max.x], ys = [0, 0], zs = [box.min.z, box.max.z]; var ps = [], res = { max: {}, min: {} }; for (var _iterator = xs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var x = _ref; for (var _iterator2 = ys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var y = _ref2; for (var _iterator3 = zs, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var z = _ref3; ps.push(this.vToCamera(this.v.set(x, y, z))); } } } ps.sort(function (p1, p2) { return p1.x - p2.x; }); res.min.x = ps[0].x; res.max.x = ps[ps.length - 1].x; ps.sort(function (p1, p2) { return p1.y - p2.y; }); res.min.y = ps[0].y; res.max.y = ps[ps.length - 1].y; res.width = res.max.x - res.min.x; res.height = res.max.y - res.min.y; res.mid = { x: 0.5 * (res.max.x + res.min.x), y: 0.5 * (res.max.y + res.min.y) }; return res; }; Object3DWatcher.prototype.setObject = function setObject(boundBoxClb) { this.boundBoxClb = boundBoxClb; }; Object3DWatcher.prototype.testScale = function testScale() { return true; }; Object3DWatcher.prototype.computeCorr = function computeCorr(K, min, max) { var corr = 0; if (K < 1) { if (min > -0.5) { corr = -0.5 - min; } else if (max < 0.5) { corr = 0.5 - max; } } else { if (min < -0.5) { corr = -0.5 - min; } else if (max > 0.5) { corr = 0.5 - max; } } return corr; }; Object3DWatcher.prototype.getScale = function getScale() { var box = this.computeClientBoundBox(), Kx = this.elementSize.w / box.width, Ky = this.elementSize.h / box.height; return 1 / Math.min(Kx, Ky); }; Object3DWatcher.prototype.centerView = function centerView(T) { var _this = this; var box = this.computeClientBoundBox(), Kx = this.elementSize.w / box.width, Ky = this.elementSize.h / box.height, K = Math.min(Kx, Ky); if (this.testScale() && Math.abs(1 / K - this.scale) > this.eps) { var scale = 1 / K + 0.2 * (this.scale - 1 / K); this.orbit.setScale(this.orbit.getScale() / (K * scale)); this.orbit.update(); this.camera.updateMatrixWorld(); box = this.computeClientBoundBox(); Kx = this.elementSize.w / box.width; Ky = this.elementSize.h / box.height; K = Math.min(Kx, Ky); } var dv = this.dv; if (K > 1 - this.eps) { dv.set(-box.mid.x, -box.mid.y); } else { dv.set(this.computeCorr(Kx, box.min.x, box.max.x), this.computeCorr(Ky, box.min.y, box.max.y)); } if (Math.sqrt(this.os.vx * this.os.vx + this.os.vy * this.os.vy) > 0.003 || dv.length() > 0.003) { var dt = 1 / 60, t = 0, os = _extends({}, this.os, { x: 0, y: 0 }); os.tf = function (vx, vy, x, y) { return { x: 75 * (dv.x - x) / Math.pow(_this.devicePixelRatio, 1.0), y: 75 * (dv.y - y) / Math.pow(_this.devicePixelRatio, 1.0) }; }; while (t < T) { if (t + dt > T) { dt = T - t; } os = this.integrate(os, dt); t += dt; } this.movePan(os); this.os = os; } }; Object3DWatcher.prototype.integrate = function integrate(os, dt) { var _MathUtils$rk = _MathUtils2.default.rk4(this.dy.bind(os), 0, dt, [os.vx, os.vy, os.x, os.y]), vx = _MathUtils$rk[0], vy = _MathUtils$rk[1], x = _MathUtils$rk[2], y = _MathUtils$rk[3]; return _extends({}, os, { vx: vx, vy: vy, x: x, y: y }); }; Object3DWatcher.prototype.dy = function dy(t, Y) { var vx = Y[0], vy = Y[1], x = Y[2], y = Y[3], vd = 15, tf = this.tf(vx, vy, x, y); return [tf.x - vd * vx, tf.y - vd * vy, vx, vy]; }; Object3DWatcher.prototype.update = function update(dt) { if (this.enabled && this.boundBoxClb) { this.centerView(dt); } }; return Object3DWatcher; }(); exports.default = Object3DWatcher; /***/ }, /* 56 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Orbit = function (_THREE$EventDispatche) { _inherits(Orbit, _THREE$EventDispatche); function Orbit(object, domElement) { _classCallCheck(this, Orbit); var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); _this.object = object; _this.domElement = domElement || document.body; // Set to false to disable this control _this.enabled = true; // "target" sets the location of focus, where the object orbits around _this.target = new _libs.THREE.Vector3(); // How far you can dolly in and out(PerspectiveCamera only) _this.minDistance = 0; _this.maxDistance = Infinity; // How far you can zoom in and out(OrthographicCamera only) _this.minZoom = 0; _this.maxZoom = Infinity; // How far you can orbit vertically, upper and lower limits. // Range is 0 to Math.PI radians. _this.minPolarAngle = 0; // radians _this.maxPolarAngle = Math.PI; // radians // How far you can orbit horizontally, upper and lower limits. // If set, must be a sub-interval of the interval [-Math.PI, Math.PI ]. _this.minAzimuthAngle = -Infinity; // radians _this.maxAzimuthAngle = Infinity; // radians // Set to true to enable damping (inertia) // If damping is enabled, you must call controls.update() in your animation loop _this.enableDamping = false; _this.dampingFactor = 0.25; // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. // Set to false to disable zooming _this.enableZoom = true; _this.zoomSpeed = 1.0; // Set to false to disable rotating _this.enableRotate = true; _this.rotateSpeed = 1.0; // Set to false to disable panning _this.enablePan = true; // Set to true to automatically rotate around the target // If auto-rotate is enabled, you must call controls.update() in your animation loop _this.autoRotate = false; _this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 // for reset _this.target0 = _this.target.clone(); _this.position0 = _this.object.position.clone(); _this.zoom0 = _this.object.zoom; // // public methods // _this.getPolarAngle = function () { return spherical.phi; }; _this.getAzimuthalAngle = function () { return spherical.theta; }; _this.reset = function () { scope.target.copy(scope.target0); scope.object.position.copy(scope.position0); scope.object.zoom = scope.zoom0; scope.object.updateProjectionMatrix(); scope.dispatchEvent(changeEvent); scope.update(); }; _this.zoomOut = function () { var speed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.zoomSpeed; var _speed = this.zoomSpeed; this.zoomSpeed = speed; dollyIn(getZoomScale()); this.zoomSpeed = _speed; }; _this.zoomIn = function () { var speed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.zoomSpeed; var _speed = this.zoomSpeed; this.zoomSpeed = speed; dollyOut(getZoomScale()); this.zoomSpeed = _speed; }; _this.getScale = function () { return scale; }; _this.setScale = function (newScale) { scale = newScale; }; // this method is exposed, but perhaps it would be better if we can make it private... _this.update = function () { var offset = new _libs.THREE.Vector3(); // so camera.up is the orbit axis var quat = new _libs.THREE.Quaternion().setFromUnitVectors(object.up, new _libs.THREE.Vector3(0, 1, 0)); var quatInverse = quat.clone().inverse(); var lastPosition = new _libs.THREE.Vector3(); var lastQuaternion = new _libs.THREE.Quaternion(); return function update() { var position = scope.object.position; offset.copy(position).sub(scope.target); // rotate offset to "y-axis-is-up" space offset.applyQuaternion(quat); // angle from z-axis around y-axis spherical.setFromVector3(offset); if (scope.autoRotate) { rotateLeft(getAutoRotationAngle()); } spherical.theta += sphericalDelta.theta; spherical.phi += sphericalDelta.phi; // restrict theta to be between desired limits spherical.theta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, spherical.theta)); // restrict phi to be between desired limits spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi)); spherical.makeSafe(); spherical.radius *= scale; // restrict radius to be between desired limits spherical.radius = Math.max(scope.minDistance, Math.min(scope.maxDistance, spherical.radius)); // move target to panned location scope.target.add(panOffset); offset.setFromSpherical(spherical); // rotate offset back to "camera-up-vector-is-up" space offset.applyQuaternion(quatInverse); position.copy(scope.target).add(offset); scope.object.lookAt(scope.target); if (scope.enableDamping === true) { sphericalDelta.theta *= 1 - scope.dampingFactor; sphericalDelta.phi *= 1 - scope.dampingFactor; } else { sphericalDelta.set(0, 0, 0); } scale = 1; panOffset.set(0, 0, 0); // update condition is: // min(camera displacement, camera rotation in radians)^2 > EPS // using small-angle approximation cos(x/2) = 1-x^2 / 8 if (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) { scope.dispatchEvent(changeEvent); lastPosition.copy(scope.object.position); lastQuaternion.copy(scope.object.quaternion); zoomChanged = false; return true; } return false; }; }(); _this.dispose = function () {}; // // internals // var scope = _this; var changeEvent = { type: 'change' }; var EPS = 1e-6; // current position in spherical coordinates var spherical = new _libs.THREE.Spherical(); var sphericalDelta = new _libs.THREE.Spherical(); var scale = 1; var panOffset = new _libs.THREE.Vector3(); var zoomChanged = false; function getAutoRotationAngle() { return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed; } function getZoomScale() { return Math.pow(0.95, scope.zoomSpeed); } function rotateLeft(angle) { sphericalDelta.theta -= angle; } function rotateUp(angle) { sphericalDelta.phi -= angle; } var panLeft = function () { var v = new _libs.THREE.Vector3(); return function panLeft(distance, objectMatrix) { v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix v.multiplyScalar(-distance); panOffset.add(v); }; }(); var panUp = function () { var v = new _libs.THREE.Vector3(); return function panUp(distance, objectMatrix) { v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix v.multiplyScalar(distance); panOffset.add(v); }; }(); // deltaX and deltaY are in pixels; right and down are positive scope.pan = function () { var offset = new _libs.THREE.Vector3(); return function pan(deltaX, deltaY) { var element = scope.domElement; if (scope.object instanceof _libs.THREE.PerspectiveCamera) { // perspective var position = scope.object.position; offset.copy(position).sub(scope.target); var targetDistance = offset.length(); // half of the fov is center to top of screen targetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0); // we actually don't use screenWidth, since perspective camera is fixed to screen height panLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix); panUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix); } else if (scope.object instanceof _libs.THREE.OrthographicCamera) { // orthographic panLeft(deltaX * (scope.object.right - scope.object.left) / scope.object.zoom / element.clientWidth, scope.object.matrix); panUp(deltaY * (scope.object.top - scope.object.bottom) / scope.object.zoom / element.clientHeight, scope.object.matrix); } else { // camera neither orthographic nor perspective console.warn('WARNING: OrbitControls.js encountered an unknown camera type-pan disabled.'); scope.enablePan = false; } }; }(); function dollyIn(dollyScale) { if (scope.object instanceof _libs.THREE.PerspectiveCamera) { scale /= dollyScale; } else if (scope.object instanceof _libs.THREE.OrthographicCamera) { scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale)); scope.object.updateProjectionMatrix(); zoomChanged = true; } else { console.warn('WARNING: OrbitControls.js encountered an unknown camera type-dolly/zoom disabled.'); scope.enableZoom = false; } } function dollyOut(dollyScale) { if (scope.object instanceof _libs.THREE.PerspectiveCamera) { scale *= dollyScale; } else if (scope.object instanceof _libs.THREE.OrthographicCamera) { scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale)); scope.object.updateProjectionMatrix(); zoomChanged = true; } else { console.warn('WARNING: OrbitControls.js encountered an unknown camera type-dolly/zoom disabled.'); scope.enableZoom = false; } } /* Actions */ function rotate(event, data) { if (scope.enabled && scope.enableRotate && data.state === 'move') { var element = scope.domElement; // rotating across whole screen goes 360 degrees around rotateLeft(2 * Math.PI * data.dx / element.clientWidth * scope.rotateSpeed); // rotating up and down along whole screen attempts to go 360, but limited to 180 rotateUp(2 * Math.PI * data.dy / element.clientHeight * scope.rotateSpeed); scope.update(); } } function pan(event, data) { if (scope.enabled && scope.enablePan && data.state === 'move') { scope.pan(data.dx, data.dy); scope.update(); } } function offsetDolly(event, data) { if (scope.enabled && scope.enableZoom && data.state === 'move') { if (data.dy > 0) { dollyIn(getZoomScale()); } else if (data.dy < 0) { dollyOut(getZoomScale()); } scope.update(); } } function wheelDolly(event) { if (scope.enabled && scope.enableZoom) { if (event.deltaY > 0) { dollyOut(getZoomScale()); } else if (event.deltaY < 0) { dollyIn(getZoomScale()); } scope.update(); } } _this.actions = { rotate: rotate, pan: pan, offsetDolly: offsetDolly, wheelDolly: wheelDolly }; // force an update at start _this.update(); return _this; } return Orbit; }(_libs.THREE.EventDispatcher); exports.default = Orbit; /***/ }, /* 57 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _ImageBase2 = __webpack_require__(5); var _ImageBase3 = _interopRequireDefault(_ImageBase2); var _Pdf = __webpack_require__(18); var _Pdf2 = _interopRequireDefault(_Pdf); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); var _CustomEventConverter = __webpack_require__(16); var _CustomEventConverter2 = _interopRequireDefault(_CustomEventConverter); var _PolyTarget = __webpack_require__(69); var _PolyTarget2 = _interopRequireDefault(_PolyTarget); var _Finder = __webpack_require__(17); var _Finder2 = _interopRequireDefault(_Finder); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PdfImage = function (_ImageBase) { _inherits(PdfImage, _ImageBase); function PdfImage(context, width, height, color, pdf, n) { _classCallCheck(this, PdfImage); var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); _this.query = ''; _this.n = n; _this.pdf = pdf; _this.v = { x: 0, y: 0, z: 0, set: function set(x, y, z) { this.x = x;this.y = y;this.z = z; return this; }, transform: function transform(m) { var x = m.m[0][0] * this.x + m.m[1][0] * this.y + m.m[2][0] * this.z, y = m.m[0][1] * this.x + m.m[1][1] * this.y + m.m[2][1] * this.z, z = m.m[0][2] * this.x + m.m[0][2] * this.y + m.m[2][0] * this.z; this.x = x; this.y = y; this.z = z; return this; } }; _this.m = { m: [[1, 0, 0], [0, 1, 0], [0, 0, 1]], set: function set(m00, m01, m02, m10, m11, m12, m20, m21, m22) { this.m = [[m00, m01, m02], [m10, m11, m12], [m20, m21, m22]]; return this; } }; _this.startRender = function () { _this.pdf.getHandler(_this.render.bind(_this)); }; Promise.resolve().then(function () { return _this.pdf.getHandler(_this.init.bind(_this)); }); return _this; } PdfImage.prototype.setQuery = function setQuery(query) { this.query = query.trim(); if (this.textContent) { this.setHits(this.textContent); // this.finishLoad(); } }; PdfImage.prototype.rectSize = function rectSize(r) { return { width: r[2] - r[0], height: r[3] - r[1] }; }; PdfImage.prototype.createPoly = function createPoly(m, p, s) { var poly = [], v = this.v; v.set(p.x, p.y, 1).transform(m); poly.push({ x: v.x, y: v.y }); v.set(p.x, p.y + s.height, 1).transform(m); poly.push({ x: v.x, y: v.y }); v.set(p.x + s.width, p.y + s.height, 1).transform(m); poly.push({ x: v.x, y: v.y }); v.set(p.x + s.width, p.y, 1).transform(m); poly.push({ x: v.x, y: v.y }); return poly; }; PdfImage.prototype.getSimulatedDoc = function getSimulatedDoc() { return this.page; }; PdfImage.prototype.simulate = function simulate(e, doc, x, y) { if (this.eventConverter) { this.eventConverter.convert(e, { doc: doc, x: x, y: y }); } }; PdfImage.prototype.setAnnotations = function setAnnotations(annos) { var _this2 = this; var t = this.viewport.transform, targets = []; this.m.set(t[0], t[1], 0, t[2], t[3], 0, t[4], t[5], 1); for (var _iterator = annos, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var anno = _ref; if (anno.subtype === 'Link') { var rect = anno.rect, aPos = { x: rect[0], y: rect[1] }, aSz = this.rectSize(rect); var _target = new _PolyTarget2.default(this.createPoly(this.m, aPos, aSz).map(function (p) { return { x: p.x / _this2.viewport.width, y: 1 - p.y / _this2.viewport.height }; })); _target.anno = anno; _target.callback = this.annoClb.bind(this); targets.push(_target); } } if (targets.length) { this.eventConverter = new _CustomEventConverter2.default(this.wnd, this.doc, _PolyTarget2.default.test, this.page); for (var _iterator2 = targets, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var target = _ref2; this.eventConverter.addCustom(target); } } }; PdfImage.prototype.setHits = function setHits(textContent) { this.textContent = textContent; if (this.query !== '') { this.finder = new _Finder2.default(textContent.items.map(function (item) { return item.str; }), this.query, { contexts: false }); } }; PdfImage.prototype.renderHits = function renderHits() { var _this3 = this; if (this.finder) { var view = this.page.view, testSz = (0, _libs.$)('
').appendTo('body'), textDiv = testSz[0], baseOffset = testSz.offset().left; for (var _iterator3 = this.finder.getHits(), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var hit = _ref3; var item = this.textContent.items[hit.index], t = PDFJS.Util.transform(this.viewport.transform, item.transform), style = this.textContent.styles[item.fontName], angle = Math.atan2(t[1], t[0]) + (style.vertical ? Math.PI / 2 : 0), fontHeight = Math.sqrt(t[2] * t[2] + t[3] * t[3]), fontAscent = style.ascent ? style.ascent * fontHeight : style.descent ? (1 + style.descent) * fontHeight : fontHeight; testSz.html(item.str.substr(0, hit.offset) + '' + item.str.substr(hit.offset, hit.length) + '' + item.str.substr(hit.offset + hit.length)); textDiv.style.fontSize = fontHeight + 'px'; textDiv.style.fontFamily = style.fontFamily; var testSpan = testSz.find('span'), iwidth = style.vertical ? item.height * this.viewport.scale : item.width * this.viewport.scale, width = testSz.width(), relativeOffset = (testSpan.offset().left - baseOffset) / width; this.m.set(1, 0, 0, 0, 1, 0, t[4] + fontAscent * Math.sin(angle), t[5] - fontAscent * Math.cos(angle), 1); var poly = this.createPoly(this.m, { x: relativeOffset * iwidth, y: 0 }, { width: iwidth * testSpan.width() / width, height: testSpan.height() }); poly = poly.map(function (p) { return { x: p.x / _this3.viewport.width, y: 1 - p.y / _this3.viewport.height }; }); this.renderHit(poly); } testSz.remove(); } }; PdfImage.prototype.annoClb = function annoClb(e, data) { if (this.context.dispatchEvent) { this.context.dispatchEvent({ type: 'pdfAnnotation', event: e, annotation: data.target.anno }); } }; PdfImage.prototype.calcViewport = function calcViewport() { var scale = _BaseMathUtils2.default.calcScale(this.size.width, this.size.height, this.resW, this.resH); if (!this.viewport || Math.abs(this.viewport.scale - scale) > 1e-4) { this.viewport = this.page.getViewport(scale); if (this.type !== 'full') { if (this.type === 'right') { this.viewport.offsetX += 0.5 * this.viewport.width; this.viewport.transform[4] -= 0.5 * this.viewport.width; } this.viewport.width /= 2; } this.resW = this.width = this.viewport.width; this.resH = this.height = this.viewport.height; } }; PdfImage.prototype.init = function init() { var _this4 = this; this.type = this.pdf.getPageType(this.n); this.pdf.getPage(this.n).then(function (page) { _this4.page = page; _this4.size = _Pdf2.default.getPageSize(page); if (_this4.type !== 'full') { _this4.size.width /= 2; } page.getAnnotations().then(_this4.setAnnotations.bind(_this4)); page.getTextContent().then(_this4.setHits.bind(_this4)); _this4.calcViewport(); _this4.finishLoad(); }).catch(function (e) { console.error('Cannot load PDF page: ' + (_this4.n + 1)); _this4.finishLoad(); }); }; PdfImage.prototype.setResolution = function setResolution(res) { _ImageBase.prototype.setResolution.call(this, res); if (this.page) { this.calcViewport(); } }; PdfImage.prototype.render = function render(handler) { var _this5 = this; if (this.page) { this.page.render({ canvasContext: this.pushCtx(), viewport: this.viewport }).then(function () { _this5.renderHits(); _this5.popCtx(); _this5.finishRender(); }); } else { this.renderBlankPage(); this.finishRender(); } }; return PdfImage; }(_ImageBase3.default); exports.default = PdfImage; /***/ }, /* 58 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Search = function () { function Search(container, pages) { _classCallCheck(this, Search); this.container = container; this.pages = pages; this.prevResults = []; container.html('\n \n '); this.query = container.find('.query input'); this.results = container.find('.results'); this.status = container.find('.status'); this.binds = { navigate: this.navigate.bind(this), doQuery: this.doQuery.bind(this) }; this.query.on('keydown', this.binds.doQuery); this.results.on('click', this.binds.navigate); } Search.prototype.dispose = function dispose() { this.results.off('click', this.binds.navigate); this.query.off('keydown', this.binds.doQuery); }; Search.prototype.navigate = function navigate(e) { e.preventDefault(); if (this.onNavigate !== undefined) { var target = (0, _libs.$)(e.target); if (!target.hasClass('result')) { var t = target.find('.result'); if (t.length) { target = t; } else { while (target.length && !target.hasClass('result')) { target = (0, _libs.$)(target[0].parentNode); } } } var page = target.attr('data'); if (page !== undefined) { this.onNavigate(parseInt(page)); } } }; Search.prototype.doQuery = function doQuery() { var _this = this; if (this.onQuery) { var queryStamp = this.queryStamp = Date.now(); setTimeout(function () { if (queryStamp === _this.queryStamp) { _this.onQuery(_this.query[0].value.trim()); } }, 1000); } }; Search.prototype.setResults = function setResults(results, lastPage) { if (this.prevResults.length && results[0] !== this.prevResults[0]) { this.prevResults = []; this.results.html(''); } var htmls = []; for (var i = this.prevResults.length; i < results.length; ++i) { var result = results[i]; htmls.push(''); } (0, _libs.$)(htmls.join('')).appendTo(this.results); this.prevResults = [].concat(results); if (lastPage === undefined) { this.status.html(''); } else { this.status.html(lastPage + ' of ' + this.pages); } }; return Search; }(); exports.default = Search; /***/ }, /* 59 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _ImageBase2 = __webpack_require__(5); var _ImageBase3 = _interopRequireDefault(_ImageBase2); var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var StaticImage = function (_ImageBase) { _inherits(StaticImage, _ImageBase); function StaticImage(context, width, height, color, src) { _classCallCheck(this, StaticImage); var _this = _possibleConstructorReturn(this, _ImageBase.call(this, context, width, height, color)); _this.binds = {}; _this.image = new Image(); _this.image.crossOrigin = 'Anonymous'; _this.binds.imageLoad = function () { _this.width = _this.image.width; _this.height = _this.image.height; _this.startRender = function () { _this.renderImage(_this.image); _this.finishRender(); }; _this.finishLoad(); }; _this.binds.imageError = function () { _this.startRender = function () { _this.renderNotFoundPage(); _this.finishRender(); }; _this.finishLoad(); }; (0, _libs.$)(_this.image).on('load', _this.binds.imageLoad).on('error', _this.binds.imageError); _this.image.src = _Utils2.default.normalizeUrl(src); return _this; } StaticImage.prototype.dispose = function dispose() { (0, _libs.$)(this.image).off('load', this.binds.imageLoad).off('error', this.binds.imageError); this.image.src = ''; delete this.image; _ImageBase.prototype.dispose.call(this); }; return StaticImage; }(_ImageBase3.default); exports.default = StaticImage; /***/ }, /* 60 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var TextureAnimator = function () { function TextureAnimator(img, tilesHoriz, tilesVert, numTiles, tileDispDuration) { _classCallCheck(this, TextureAnimator); var texture = new _libs.THREE.Texture(); texture.minFilter = _libs.THREE.LinearFilter; texture.image = img; texture.needsUpdate = true; // note: texture passed by reference, will be updated by the update function. this.texture = texture; this.tilesHorizontal = tilesHoriz; this.tilesVertical = tilesVert; // how many images does this spritesheet contain? // usually equals tilesHoriz * tilesVert, but not necessarily, // if there at blank tiles at the bottom of the spritesheet. this.numberOfTiles = numTiles; texture.repeat.set(1 / this.tilesHorizontal, 1 / this.tilesVertical); // how long should each image be displayed? this.tileDisplayDuration = tileDispDuration; // how long has the current image been displayed? this.currentDisplayTime = 0; // which image is currently being displayed? this.currentTile = 0; } TextureAnimator.prototype.update = function update(milliSec) { this.currentDisplayTime += milliSec; while (this.currentDisplayTime > this.tileDisplayDuration) { this.currentDisplayTime -= this.tileDisplayDuration; ++this.currentTile; if (this.currentTile == this.numberOfTiles) this.currentTile = 0; var currentColumn = this.currentTile % this.tilesHorizontal; this.texture.offset.x = currentColumn / this.tilesHorizontal; var currentRow = Math.floor(this.currentTile / this.tilesHorizontal); this.texture.offset.y = currentRow / this.tilesVertical; } }; TextureAnimator.prototype.dispose = function dispose() { var img = this.texture.image; img.height = img.width = 0; this.texture.dispose(); }; return TextureAnimator; }(); exports.default = TextureAnimator; /***/ }, /* 61 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); var _MouseEventConverter2 = __webpack_require__(54); var _MouseEventConverter3 = _interopRequireDefault(_MouseEventConverter2); var _ThreeEventConverter = __webpack_require__(19); var _ThreeEventConverter2 = _interopRequireDefault(_ThreeEventConverter); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ThreeMouseEventConverter = function (_MouseEventConverter) { _inherits(ThreeMouseEventConverter, _MouseEventConverter); function ThreeMouseEventConverter(wnd, doc, visualWorld, test) { _classCallCheck(this, ThreeMouseEventConverter); var _this = _possibleConstructorReturn(this, _MouseEventConverter.call(this, wnd, doc, visualWorld.element)); _Utils2.default.extends(_this, new _ThreeEventConverter2.default(visualWorld, test)); return _this; } ThreeMouseEventConverter.prototype.getCallback = function getCallback(object) { return object.object.userData.mouseCallback; }; ThreeMouseEventConverter.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { var jElement = (0, _libs.$)(this.element); var offset = jElement.offset(); this.coords.x = (e.pageX - offset.left) / jElement.width() * 2 - 1; this.coords.y = -((e.pageY - offset.top) / jElement.height()) * 2 + 1; return this.coords; }; return ThreeMouseEventConverter; }(_MouseEventConverter3.default); exports.default = ThreeMouseEventConverter; /***/ }, /* 62 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _Utils = __webpack_require__(4); var _Utils2 = _interopRequireDefault(_Utils); var _TouchEventConverter2 = __webpack_require__(64); var _TouchEventConverter3 = _interopRequireDefault(_TouchEventConverter2); var _ThreeEventConverter = __webpack_require__(19); var _ThreeEventConverter2 = _interopRequireDefault(_ThreeEventConverter); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var ThreeTouchEventConverter = function (_TouchEventConverter) { _inherits(ThreeTouchEventConverter, _TouchEventConverter); function ThreeTouchEventConverter(wnd, doc, visualWorld, test) { _classCallCheck(this, ThreeTouchEventConverter); var _this = _possibleConstructorReturn(this, _TouchEventConverter.call(this, wnd, doc, visualWorld.element)); _Utils2.default.extends(_this, new _ThreeEventConverter2.default(visualWorld, test)); return _this; } ThreeTouchEventConverter.prototype.getCallback = function getCallback(object) { return object.object.userData.touchCallback; }; ThreeTouchEventConverter.prototype.setCoordsFromEvent = function setCoordsFromEvent(e) { var jElement = (0, _libs.$)(this.element), offset = jElement.offset(), touches = e.touches || e.originalEvent.touches, touch = touches.length ? touches[0] : (this.lastTouches || [{ pageX: 0, pageY: 0 }])[0], pageX = touch.pageX, pageY = touch.pageY; this.lastTouches = touches.length ? touches : this.lastTouches; this.coords.x = (pageX - offset.left) / jElement.width() * 2 - 1; this.coords.y = -((pageY - offset.top) / jElement.height()) * 2 + 1; return this.coords; }; return ThreeTouchEventConverter; }(_TouchEventConverter3.default); exports.default = ThreeTouchEventConverter; /***/ }, /* 63 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(0); var _ImageFactory = __webpack_require__(8); var _ImageFactory2 = _interopRequireDefault(_ImageFactory); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Thumbnails = function () { function Thumbnails(context, container, thumbnailsClb, size) { var _this = this; var props = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { kWtoH: 210 / 297 }; _classCallCheck(this, Thumbnails); this.container = container; this.p = props; this.thumbnailsClb = thumbnailsClb; this.size = size; this.canvas = (0, _libs.$)('')[0]; this.imageFactory = new _ImageFactory2.default(_extends({}, context, { renderCanvas: this.canvas, renderCanvasCtx: this.canvas.getContext('2d') })); this.thumbnails = []; for (var i = 0; i < size; ++i) { var info = this.thumbnailsClb(i); this.thumbnails.push(_extends({}, info, { index: i, loaded: info.type === 'thumbnail-image', heading: null, thumbnail: null, title: info.title || i })); } this.binds = { update: this.update.bind(this), navigate: function navigate(e) { e.preventDefault(); if (_this.onNavigate) { var node = e.target; while (node && !node.dataThumbnail) { node = node.parentNode; } _this.onNavigate(node.dataThumbnail.index); } } }; this.container.on('scroll', this.binds.update); } Thumbnails.prototype.getSize = function getSize() { return this.size; }; Thumbnails.prototype.setEnable = function setEnable(enable) { this.enable = enable; this.update(); }; Thumbnails.prototype.dispose = function dispose() { this.container.find('a').off('click', this.binds.navigate); this.container.off('scroll', this.binds.update); this.container.html(''); this.canvas.height = this.canvas.width = 0; delete this.canvas; }; Thumbnails.prototype.load = function load(thumbnail) { var _this2 = this; this.loading = true; var wrapper = this.imageFactory.build(thumbnail, thumbnail.number === undefined ? thumbnail.index : thumbnail.number, this.p.kWtoH * 300, 300); wrapper.onChange = function (canvas) { _this2.setImage(thumbnail, canvas.toDataURL('image/png')); thumbnail.loaded = true; wrapper.dispose(); _this2.loading = false; Promise.resolve().then(function () { return _this2.update(); }); }; }; Thumbnails.prototype.getActive = function getActive() { var first = this.container.scrollTop(), last = first + this.container.height(), res = []; for (var _iterator = this.thumbnails, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var thumbnail = _ref; if (Math.max(thumbnail.first, first) < Math.min(thumbnail.last, last)) { res.push(thumbnail); } } return res; }; Thumbnails.prototype.update = function update() { if (!this.loading && this.canvas && this.enable) { if (!this.built) { this.render(); } var active = this.getActive(); for (var _iterator2 = active, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var thumbnail = _ref2; if (!thumbnail.loaded) { this.load(thumbnail); break; } } } }; Thumbnails.prototype.setImage = function setImage(thumbnail, img) { thumbnail.img = img; thumbnail.thumbnail.css('background-image', ['url(\'', img, '\')'].join('')); thumbnail.thumbnail.removeClass('loading'); }; Thumbnails.prototype.render = function render() { var elements = ['
']; for (var i = 0; i < this.size; ++i) { elements.push([''].join('')); } elements.push('
'); this.container.append(elements.join('')); var items = this.container.find('.item'), base = this.container.find('.thumbnails').offset().top; for (var _i3 = 0; _i3 < items.length; ++_i3) { var item = (0, _libs.$)(items[_i3]); this.thumbnails[_i3].heading = item.find('.heading'); this.thumbnails[_i3].thumbnail = item.find('.thumbnail'); this.thumbnails[_i3].first = item.offset().top - base; this.thumbnails[_i3].last = this.thumbnails[_i3].first + item.height(); if (this.thumbnails[_i3].loaded) { this.setImage(this.thumbnails[_i3], this.thumbnails[_i3].src); } var as = item.find('a'); for (var j = 0; j < as.length; ++j) { var a = as[j]; a.dataThumbnail = this.thumbnails[_i3]; } } this.container.find('a').on('click', this.binds.navigate); this.built = true; }; return Thumbnails; }(); exports.default = Thumbnails; /***/ }, /* 64 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _libs = __webpack_require__(0); var _EventConverter2 = __webpack_require__(6); var _EventConverter3 = _interopRequireDefault(_EventConverter2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var TouchConverter = function (_EventConverter) { _inherits(TouchConverter, _EventConverter); function TouchConverter(wnd, doc, element) { _classCallCheck(this, TouchConverter); var _this = _possibleConstructorReturn(this, _EventConverter.call(this, wnd, doc)); _this.element = element; _this.binds = { convert: _this.convert.bind(_this) }; (0, _libs.$)(_this.element).on('touchstart touchmove', _this.binds.convert); (0, _libs.$)(_this.doc).on('touchend', _this.binds.convert); return _this; } TouchConverter.prototype.dispose = function dispose() { (0, _libs.$)(this.element).off('touchstart touchmove', this.binds.convert); (0, _libs.$)(this.doc).off('touchend', this.binds.convert); }; return TouchConverter; }(_EventConverter3.default); exports.default = TouchConverter; /***/ }, /* 65 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(0); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var View = function () { View.classProperty = function classProperty(ctrl, className, value) { if (value) { ctrl.addClass(className); } else { ctrl.removeClass(className); } }; View.attributeProperty = function attributeProperty(ctrl, attributeName, value) { if (value) { ctrl.attr(attributeName, value); } else { ctrl.removeAttr(attributeName); } }; View.callHandlers = function callHandlers(handlers, id, e, data) { for (var _iterator = handlers, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var handler = _ref; if (handler[id]) { handler[id](e, data); } else if (handler.handleDefault) { handler.handleDefault(id, e, data); } } }; View.handleEvent = function handleEvent(id, getHandlers, e, data) { View.callHandlers(getHandlers(id), id, e, data); }; View.handleLinkEvent = function handleLinkEvent(e) { e.preventDefault(); if (!this.ctrl.hasClass('disabled')) { View.handleEvent(this.id, this.getHandlers, e); } }; View.handleInputEvent = function handleInputEvent(e) { View.handleEvent(this.id, this.getHandlers, e, e.target.value); }; View.handleFormEvent = function handleFormEvent(e) { e.preventDefault(); View.handleEvent(this.id, this.getHandlers, e); }; // virtual functions { View.prototype.getLinks = function getLinks() { return null; }; View.prototype.getWidgets = function getWidgets() { return null; }; View.prototype.getInputs = function getInputs() { return null; }; View.prototype.getTexts = function getTexts() { return null; }; View.prototype.getTemplate = function getTemplate() { return {}; }; View.prototype.getHandlers = function getHandlers(id) { return this.handlers; }; // } View.prototype.callLater = function callLater(handlers, id, e, data, ms) { var _this = this; this.pendings[id] = { timestamp: new Date().getTime() }; setTimeout(function () { var timestamp = new Date().getTime(), pending = _this.pendings[id]; if (pending && timestamp - pending.timestamp >= ms) { View.callHandlers(handlers, id, e, data); delete _this.pendings[id]; } }, ms); }; // loadFiles(urls, ready, failure) { // let done = Promise.resolve(); // for(let url of urls) { // done = done.then(()=> { // return new Promise((resolve, reject)=> { // $.get(url, (res)=> { // ready(res, url); // resolve(); // }).fail((res)=> { // if(failure && failure(res, url)) { // resolve(); // } // else { // reject(res); // } // }); // }); // }); // } // return done; // } View.prototype.loadFiles = function loadFiles(urls, files) { var tasks = []; var _loop = function _loop() { if (_isArray2) { if (_i2 >= _iterator2.length) return 'break'; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) return 'break'; _ref2 = _i2.value; } var name = _ref2; files[name] = []; var _loop2 = function _loop2() { if (_isArray3) { if (_i3 >= _iterator3.length) return 'break'; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) return 'break'; _ref3 = _i3.value; } var url = _ref3; tasks.push(new Promise(function (resolve, reject) { _libs.$.get(url, function (data) { files[name].push({ url: url, data: data }); resolve(); }).fail(function (res) { reject(res); }); })); }; for (var _iterator3 = urls[name], _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; var _ret2 = _loop2(); if (_ret2 === 'break') break; } }; for (var _iterator2 = Object.keys(urls), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; var _ret = _loop(); if (_ret === 'break') break; } return Promise.all(tasks); }; View.prototype.urlResolver = function urlResolver(baseUrl, url) { url = url.replace(/\\/g, '/'); if (url.charAt(0) !== '/') { baseUrl = baseUrl.replace(/\\/g, '/'); var p = baseUrl.lastIndexOf('/'); url = (~p ? baseUrl.substr(0, p + 1) : '') + url; var parts = url.split('/'); url = []; for (var _iterator4 = parts, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref4 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref4 = _i4.value; } var part = _ref4; if (part === '.') {} else if (part === '..') { if (url.length && !(url.length === 1 && url[0] === '')) { url.pop(); } } else { url.push(part); } } url = url.join('/'); } return url; }; View.prototype.objToAttrsStr = function objToAttrsStr(o) { var res = []; for (var _iterator5 = Object.keys(o), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { var _ref5; if (_isArray5) { if (_i5 >= _iterator5.length) break; _ref5 = _iterator5[_i5++]; } else { _i5 = _iterator5.next(); if (_i5.done) break; _ref5 = _i5.value; } var _name = _ref5; res.push([_name, '="', o[_name], '"'].join('')); } return res.join(' '); }; View.prototype.checkIframeSize = function checkIframeSize() { if (this.frame) { if (Math.abs(this.frame.width - this.parentContainer.width()) > 1 || Math.abs(this.frame.height - this.parentContainer.height()) > 1) { this.onResize(); } setTimeout(this.checkIframeSize.bind(this), 250); } }; View.prototype.onResize = function onResize() { this.frame.width = this.parentContainer.width(); this.frame.height = this.parentContainer.height(); }; View.prototype.translate = function translate(html) { return html.replace(/<\$tr>(.*)<\/\$tr>/gi, function (s0, s1) { return (0, _libs.tr)(s1); }); }; View.prototype.fireLinksOnLoadEvent = function fireLinksOnLoadEvent() { var _this2 = this; if (this.templateObject && this.templateObject.linkLoaded) { var loaded = true; var _loop3 = function _loop3() { if (_isArray6) { if (_i6 >= _iterator6.length) return 'break'; _ref6 = _iterator6[_i6++]; } else { _i6 = _iterator6.next(); if (_i6.done) return 'break'; _ref6 = _i6.value; } var jLink = _ref6; var link = jLink[0]; var img = new Image(); img.onerror = function () { return _this2.templateObject.linkLoaded(link); }; img.src = link.href; }; for (var _iterator6 = this.jLinks, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { var _ref6; var _ret3 = _loop3(); if (_ret3 === 'break') break; } } }; function View(parentContainer, onLoad) { var _this3 = this; var template = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; _classCallCheck(this, View); this.pendings = {}; this.binds = { onResize: this.onResize.bind(this) }; this.parentContainer = (0, _libs.$)(parentContainer); this.isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; this.parentContainer.html(''); this.frame = this.parentContainer.find('iframe')[0]; if (this.frame.contentWindow.stop) { this.frame.contentWindow.stop(); } if (this.isIOS) { (0, _libs.$)(this.parentContainer[0].ownerDocument.defaultView).on('resize', this.binds.onResize); this.onResize(); setTimeout(this.checkIframeSize.bind(this), 250); } this.container = (0, _libs.$)(this.frame.contentDocument.body); this.container.css('margin', '0'); this.head = (0, _libs.$)(this.frame.contentDocument.head); this.onLoad = onLoad; this.handlers = []; var script = template.html ? template.script : this.getTemplate().script; var urls = { styles: template.styles || this.getTemplate().styles, html: [template.html || this.getTemplate().html], script: script ? [script] : [] }, files = {}, links = template.links || this.getTemplate().links; this.loadFiles(urls, files).then(function () { var _loop4 = function _loop4() { if (_isArray7) { if (_i7 >= _iterator7.length) return 'break'; _ref7 = _iterator7[_i7++]; } else { _i7 = _iterator7.next(); if (_i7.done) return 'break'; _ref7 = _i7.value; } var style = _ref7; var textCss = style.data, url = style.url; textCss = textCss.replace(/url\(['"](.*?)["']\)/g, function (r, r1) { return ['url(', _this3.urlResolver(url, r1), ')'].join(''); }); (0, _libs.$)('').appendTo(_this3.head); }; for (var _iterator7 = files.styles, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { var _ref7; var _ret4 = _loop4(); if (_ret4 === 'break') break; } _this3.container.html(_this3.translate(files.html[0].data)); _this3.jLinks = []; for (var _iterator8 = links, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { var _ref8; if (_isArray8) { if (_i8 >= _iterator8.length) break; _ref8 = _iterator8[_i8++]; } else { _i8 = _iterator8.next(); if (_i8.done) break; _ref8 = _i8.value; } var _link = _ref8; _this3.jLinks.push((0, _libs.$)([''].join('')).appendTo(_this3.head)); } if (files.script[0]) { var init = eval(files.script[0].data); _this3.templateObject = init(_this3.container); } else { _this3.templateObject = {}; } _this3.linkControls = {}; for (var _iterator9 = _this3.getLinks(), _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { var _ref9; if (_isArray9) { if (_i9 >= _iterator9.length) break; _ref9 = _iterator9[_i9++]; } else { _i9 = _iterator9.next(); if (_i9.done) break; _ref9 = _i9.value; } var id = _ref9; _this3.linkControls[id] = _this3.container.find('.' + id); _this3.binds[id] = View.handleLinkEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: id, ctrl: _this3.linkControls[id] }); _this3.linkControls[id].on('click', _this3.binds[id]); } _this3.widgetControls = {}; for (var _iterator10 = _this3.getWidgets(), _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { var _ref10; if (_isArray10) { if (_i10 >= _iterator10.length) break; _ref10 = _iterator10[_i10++]; } else { _i10 = _iterator10.next(); if (_i10.done) break; _ref10 = _i10.value; } var _id = _ref10; _this3.widgetControls[_id] = _this3.container.find('.' + _id); } _this3.inputControls = {}; for (var _iterator11 = _this3.getInputs(), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { var _ref11; if (_isArray11) { if (_i11 >= _iterator11.length) break; _ref11 = _iterator11[_i11++]; } else { _i11 = _iterator11.next(); if (_i11.done) break; _ref11 = _i11.value; } var _id2 = _ref11; _this3.inputControls[_id2] = _this3.container.find('.' + _id2); _this3.binds[_id2] = View.handleInputEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: _id2, ctrl: _this3.inputControls[_id2] }); _this3.inputControls[_id2].on('keyup', _this3.binds[_id2]); } _this3.formControls = {}; for (var _iterator12 = _this3.getForms(), _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { var _ref12; if (_isArray12) { if (_i12 >= _iterator12.length) break; _ref12 = _iterator12[_i12++]; } else { _i12 = _iterator12.next(); if (_i12.done) break; _ref12 = _i12.value; } var _id3 = _ref12; _this3.formControls[_id3] = _this3.container.find('.' + _id3); _this3.binds[_id3] = View.handleFormEvent.bind({ getHandlers: _this3.getHandlers.bind(_this3), id: _id3, ctrl: _this3.formControls[_id3] }); _this3.formControls[_id3].on('submit', _this3.binds[_id3]); } _this3.textControls = {}; for (var _iterator13 = _this3.getTexts(), _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { var _ref13; if (_isArray13) { if (_i13 >= _iterator13.length) break; _ref13 = _iterator13[_i13++]; } else { _i13 = _iterator13.next(); if (_i13.done) break; _ref13 = _i13.value; } var _id4 = _ref13; _this3.textControls[_id4] = _this3.container.find('.' + _id4); } _this3.stateSetters = [{ map: _this3.linkControls, setter: _this3.setLinkControlState.bind(_this3) }, { map: _this3.widgetControls, setter: _this3.setWidgetControlState.bind(_this3) }, { map: _this3.inputControls, setter: _this3.setInputControlState.bind(_this3) }, { map: _this3.textControls, setter: _this3.setTextControlState.bind(_this3) }]; _this3.initView(); if (_this3.onLoad) { _this3.onLoad(); } _this3.fireLinksOnLoadEvent(); }).catch(function (res) { return console.error(res); }); } View.prototype.dispose = function dispose() { delete this.textControls; for (var _iterator14 = this.getLinks(), _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { var _ref14; if (_isArray14) { if (_i14 >= _iterator14.length) break; _ref14 = _iterator14[_i14++]; } else { _i14 = _iterator14.next(); if (_i14.done) break; _ref14 = _i14.value; } var id = _ref14; this.linkControls[id].off('click', this.binds[id]); } delete this.linkControls; delete this.widgetControls; for (var _iterator15 = this.getInputs(), _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { var _ref15; if (_isArray15) { if (_i15 >= _iterator15.length) break; _ref15 = _iterator15[_i15++]; } else { _i15 = _iterator15.next(); if (_i15.done) break; _ref15 = _i15.value; } var _id5 = _ref15; this.inputControls[_id5].off('keyup', this.binds[_id5]); } delete this.inputControls; for (var _iterator16 = this.getForms(), _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) { var _ref16; if (_isArray16) { if (_i16 >= _iterator16.length) break; _ref16 = _iterator16[_i16++]; } else { _i16 = _iterator16.next(); if (_i16.done) break; _ref16 = _i16.value; } var _id6 = _ref16; this.formControls[_id6].off('submit', this.binds[_id6]); } delete this.formControls; !this.templateObject.dispose || this.templateObject.dispose(); delete this.templateObject; if (this.isIOS) { (0, _libs.$)(this.parentContainer[0].ownerDocument.defaultView).off('resize', this.binds.onResize); } this.parentContainer.html(''); delete this.frame; }; View.prototype.getContainer = function getContainer() { return this.container[0]; }; View.prototype.getParentContainer = function getParentContainer() { return this.parentContainer[0]; }; View.prototype.addHandler = function addHandler(handler) { this.handlers.push(handler); }; View.prototype.initView = function initView() {}; View.setControlState = function setControlState(ctrl, defaults, state, stateHandlers) { if (ctrl) { var st = _extends({}, defaults, state); for (var _name2 in st) { if (st.hasOwnProperty(_name2) && stateHandlers[_name2]) { stateHandlers[_name2](ctrl, st[_name2]); } } } }; View.prototype.setLinkControlState = function setLinkControlState(id, state) { View.setControlState(this.linkControls[id], { visible: true, active: false, enable: true }, state, View.linkStateHandlers); }; View.prototype.setWidgetControlState = function setWidgetControlState(id, state) { View.setControlState(this.widgetControls[id], { visible: true, active: false, enable: true }, state, View.widgetStateHandlers); }; View.prototype.setInputControlState = function setInputControlState(id, state) { View.setControlState(this.inputControls[id], { visible: true, enable: true, value: '' }, state, View.inputStateHandlers); }; View.prototype.setTextControlState = function setTextControlState(id, state) { View.setControlState(this.textControls[id], { visible: true, value: '' }, state, View.textStateHandlers); }; View.prototype.onItemStateChanged = function onItemStateChanged() {}; View.prototype.setState = function setState(id, state) { for (var _iterator17 = this.stateSetters, _isArray17 = Array.isArray(_iterator17), _i17 = 0, _iterator17 = _isArray17 ? _iterator17 : _iterator17[Symbol.iterator]();;) { var _ref17; if (_isArray17) { if (_i17 >= _iterator17.length) break; _ref17 = _iterator17[_i17++]; } else { _i17 = _iterator17.next(); if (_i17.done) break; _ref17 = _i17.value; } var item = _ref17; if (item.map[id]) { item.setter(id, state); this.onItemStateChanged(id, state); break; } } }; return View; }(); View.linkStateHandlers = { visible: function visible(ctrl, value) { return View.classProperty(ctrl, 'hidden', !value); }, active: function active(ctrl, value) { return View.classProperty(ctrl, 'active', value); }, enable: function enable(ctrl, value) { return View.classProperty(ctrl, 'disabled', !value); } }; View.widgetStateHandlers = { visible: function visible(ctrl, value) { return View.classProperty(ctrl, 'hidden', !value); }, active: function active(ctrl, value) { return View.classProperty(ctrl, 'active', value); }, enable: function enable(ctrl, value) { return View.classProperty(ctrl, 'disabled', !value); } }; View.inputStateHandlers = { visible: function visible(ctrl, value) { return View.classProperty(ctrl, 'hidden', !value); }, value: function value(ctrl, _value) { return ctrl[0].value = _value; }, enable: function enable(ctrl, value) { return View.attributeProperty(ctrl, 'disabled', !value); } }; View.textStateHandlers = { visible: function visible(ctrl, value) { return View.classProperty(ctrl, 'hidden', !value); }, value: function value(ctrl, _value2) { return ctrl.text(_value2); } }; exports.default = View; /***/ }, /* 66 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _libs = __webpack_require__(0); var _Orbit = __webpack_require__(56); var _Orbit2 = _interopRequireDefault(_Orbit); var _ThreeMouseEventConverter = __webpack_require__(61); var _ThreeMouseEventConverter2 = _interopRequireDefault(_ThreeMouseEventConverter); var _ThreeTouchEventConverter = __webpack_require__(62); var _ThreeTouchEventConverter2 = _interopRequireDefault(_ThreeTouchEventConverter); var _Drag = __webpack_require__(48); var _Drag2 = _interopRequireDefault(_Drag); var _CSS3DRenderer = __webpack_require__(12); var _CSS3DRenderer2 = _interopRequireDefault(_CSS3DRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var VisualWorld = function (_THREE$EventDispatche) { _inherits(VisualWorld, _THREE$EventDispatche); function VisualWorld(wnd, doc, container) { var useHelpers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; _classCallCheck(this, VisualWorld); var _this = _possibleConstructorReturn(this, _THREE$EventDispatche.call(this)); _this.wnd = wnd; _this.doc = doc; _this.jContainer = container; _this.renderCallbacks = []; _this.clock = new _libs.THREE.Clock(); _this.raycaster = new _libs.THREE.Raycaster(); _this.scene = new _libs.THREE.Scene(); _this.cssScene = new _libs.THREE.Scene(); _this.camera = new _libs.THREE.PerspectiveCamera(30, _this.width() / _this.height(), 0.2, 2000); var scale = 1; _this.camera.position.x = 0; _this.camera.position.y = 5.5 * scale; _this.camera.position.z = 0; _this.renderer = new _libs.THREE.WebGLRenderer({ alpha: true, antialias: true }); _this.renderer.setClearColor(0x000000, 0); _this.renderer.setPixelRatio(_this.wnd.devicePixelRatio); _this.renderer.setSize(_this.width(), _this.height()); _this.jContainer.append(_this.renderer.domElement); _this.cssRenderer = new _CSS3DRenderer2.default(); _this.cssRenderer.setSize(_this.width(), _this.height()); (0, _libs.$)(_this.cssRenderer.domElement).css({ position: 'absolute', top: 0, margin: 0, padding: 0 }); _this.jContainer.append(_this.cssRenderer.domElement); _this.element = _this.cssRenderer.domElement; _this.controls = new _Orbit2.default(_this.camera, _this.element); _this.controls.target.y = 0.5; var cssScene = (0, _libs.$)(_this.cssRenderer.domElement).find('div'), tmpVector = new _libs.THREE.Vector3(); _this.controls.addEventListener('change', function () { _this.camera.getWorldDirection(tmpVector); cssScene.css('display', tmpVector.y - _this.camera.position.y > 0 ? 'none' : 'block'); }); _this.textureLoader = new _libs.THREE.TextureLoader(); _this.scene.add(new _libs.THREE.AmbientLight(0xD0D0D0)); //0xC0C0C0 _this.light = new _libs.THREE.DirectionalLight(0x404040, 1); _this.light.position.set(0, 6 * scale, 0); _this.light.castShadow = false; // const d = 20*scale; // this.light.shadow.camera.left = -d; // this.light.shadow.camera.right = d; // this.light.shadow.camera.top = d; // this.light.shadow.camera.bottom = -d; // this.light.shadow.camera.near = 1*scale; // this.light.shadow.camera.far = 25*scale; // this.light.shadow.mapSize.x = 1024; // this.light.shadow.mapSize.y = 1024; _this.scene.add(_this.light); if (useHelpers) { _this.scene.add(new _libs.THREE.AxisHelper(5)); } _this.binds = { onWindowResize: _this.onWindowResize.bind(_this), animate: _this.animate.bind(_this) }; (0, _libs.$)(_this.wnd).on('resize', _this.binds.onWindowResize); _this.mouseEvents = new _ThreeMouseEventConverter2.default(_this.wnd, _this.doc, _this); _this.touchEvents = new _ThreeTouchEventConverter2.default(_this.wnd, _this.doc, _this); var filterData = { type: 'mousemove' }; _this.mouseEvents.filter = function (element, e) { var types = ['mouseenter', 'mouseover', 'mouseleave', 'mouseout'], contains = function contains(p, c) { return p === c || _libs.$.contains(p, c); }; if (e.type === 'mousemove') { filterData.pageX = e.pageX; filterData.pageY = e.pageY; } return e.relatedTarget && ~types.indexOf(e.type) && contains(element, e.target) && contains(element, e.relatedTarget) ? _extends({}, e, filterData) : e; }; _this.drag = new _Drag2.default(_this.wnd, _this.doc, _this); _this.animate(); return _this; } VisualWorld.prototype.dispose = function dispose() { delete this.binds.animate; (0, _libs.$)(this.wnd).off('resize', this.binds.onWindowResize); this.mouseEvents.dispose(); this.touchEvents.dispose(); this.drag.dispose(); this.controls.dispose(); }; VisualWorld.prototype.width = function width() { return this.jContainer.width(); }; VisualWorld.prototype.height = function height() { return this.jContainer.height(); }; VisualWorld.prototype.setExtraLighting = function setExtraLighting(v) { this.light.intensity = v; }; VisualWorld.prototype.getOrbit = function getOrbit() { return this.controls; }; VisualWorld.prototype.setControlsState = function setControlsState(state) { this.controls.enabled = state; }; VisualWorld.prototype.getControlsState = function getControlsState() { return this.controls.enabled; }; VisualWorld.prototype.onWindowResize = function onWindowResize() { var _this2 = this; var updateCamera = function updateCamera(camera) { camera.aspect = _this2.width() / _this2.height(); camera.updateProjectionMatrix(); }, updateRenderer = function updateRenderer(renderer) { renderer.setSize(_this2.width(), _this2.height()); }; updateCamera(this.camera); updateRenderer(this.renderer); updateRenderer(this.cssRenderer); this.dispatchEvent({ type: 'resize' }); }; VisualWorld.prototype.addObject = function addObject(object) { this.scene.add(object); }; VisualWorld.prototype.addCssObject = function addCssObject(object) { this.cssScene.add(object); }; VisualWorld.prototype.removeCssObject = function removeCssObject(object) { this.cssScene.remove(object); }; VisualWorld.prototype.removeObject = function removeObject(object) { this.scene.remove(object); }; VisualWorld.prototype.animate = function animate() { if (this.binds.animate) { requestAnimationFrame(this.binds.animate); } this.render(); }; VisualWorld.prototype.addRenderCallback = function addRenderCallback(clb) { this.renderCallbacks.push(clb); }; VisualWorld.prototype.removeRenderCallback = function removeRenderCallback(clb) { var i = this.renderCallbacks.indexOf(clb); if (~i) { this.renderCallbacks.splice(i, 1); } }; VisualWorld.prototype.render = function render() { var deltaTime = this.clock.getDelta(); this.controls.update(deltaTime); for (var _iterator = this.renderCallbacks, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var clb = _ref; clb(deltaTime); } this.cssRenderer.render(this.cssScene, this.camera); this.renderer.render(this.scene, this.camera); }; VisualWorld.prototype.processGeometry = function processGeometry(bufGeometry, mesh) { mesh.geometry = bufGeometry; // Obtain a Geometry var geometry = new _libs.THREE.Geometry().fromBufferGeometry(bufGeometry); // Merge the vertices so the triangle soup is converted to indexed triangles geometry.mergeVertices(); // Convert again to BufferGeometry, indexed var indexedBufferGeom = this.createIndexedBufferGeometryFromGeometry(geometry); // Create index arrays mapping the indexed vertices to bufGeometry vertices return this.mapIndices(bufGeometry, indexedBufferGeom); }; VisualWorld.prototype.createIndexedBufferGeometryFromGeometry = function createIndexedBufferGeometryFromGeometry(geometry) { var numVertices = geometry.vertices.length; var numFaces = geometry.faces.length; var bufferGeom = new _libs.THREE.BufferGeometry(); var vertices = new Float32Array(numVertices * 3); var indices = new (numFaces * 3 > 65535 ? Uint32Array : Uint16Array)(numFaces * 3); for (var i = 0; i < numVertices; i++) { var p = geometry.vertices[i]; var i3 = i * 3; vertices[i3] = p.x; vertices[i3 + 1] = p.y; vertices[i3 + 2] = p.z; } for (var _i2 = 0; _i2 < numFaces; _i2++) { var f = geometry.faces[_i2]; var _i3 = _i2 * 3; indices[_i3] = f.a; indices[_i3 + 1] = f.b; indices[_i3 + 2] = f.c; } bufferGeom.setIndex(new _libs.THREE.BufferAttribute(indices, 1)); bufferGeom.addAttribute('position', new _libs.THREE.BufferAttribute(vertices, 3)); return bufferGeom; }; VisualWorld.prototype.isEqual = function isEqual(x1, y1, z1, x2, y2, z2) { var delta = 0.000001; return Math.abs(x2 - x1) < delta && Math.abs(y2 - y1) < delta && Math.abs(z2 - z1) < delta; }; VisualWorld.prototype.mapIndices = function mapIndices(bufGeometry, indexedBufferGeom) { // Creates mappedVertices, mappedIndices and mappedAssociation in bufGeometry var vertices = bufGeometry.attributes.position.array; var idxVertices = indexedBufferGeom.attributes.position.array; var indices = indexedBufferGeom.index.array; var numIdxVertices = idxVertices.length / 3; var numVertices = vertices.length / 3; bufGeometry.mappedVertices = idxVertices; bufGeometry.mappedIndices = indices; bufGeometry.mappedAssociation = []; for (var i = 0; i < numIdxVertices; i++) { var association = []; bufGeometry.mappedAssociation.push(association); var i3 = i * 3; for (var j = 0; j < numVertices; j++) { var j3 = j * 3; if (this.isEqual(idxVertices[i3], idxVertices[i3 + 1], idxVertices[i3 + 2], vertices[j3], vertices[j3 + 1], vertices[j3 + 2])) { association.push(j3); } } } return { vertices: bufGeometry.mappedVertices, indices: bufGeometry.mappedIndices }; }; VisualWorld.prototype.oneNodePositionCallback = function oneNodePositionCallback(p, q) { this.position.set(p.x, p.y, p.z); this.quaternion.set(q.x, q.y, q.z, q.w); }; VisualWorld.prototype.multyNodePositionCallback = function multyNodePositionCallback(node, p, n) { var geometry = this.geometry; var volumePositions = geometry.attributes.position.array; var volumeNormals = geometry.attributes.normal.array; var assocVertex = geometry.mappedAssociation[node]; for (var k = 0; k < assocVertex.length; k++) { var indexVertex = assocVertex[k]; volumePositions[indexVertex] = p.x; volumeNormals[indexVertex] = n.x; ++indexVertex; volumePositions[indexVertex] = p.y; volumeNormals[indexVertex] = n.y; ++indexVertex; volumePositions[indexVertex] = p.z; volumeNormals[indexVertex] = n.z; } }; VisualWorld.prototype.multyNodePositionPostCallback = function multyNodePositionPostCallback() { var geometry = this.geometry; geometry.attributes.position.needsUpdate = true; geometry.attributes.normal.needsUpdate = true; }; VisualWorld.prototype.pathPositionCallback = function pathPositionCallback(node, p) { var positions = this.geometry.attributes.position.array; var i = 3 * node; positions[i++] = p.x; positions[i++] = p.y; positions[i] = p.z; }; VisualWorld.prototype.pathPositionPostCallback = function pathPositionPostCallback() { var geometry = this.geometry; geometry.computeVertexNormals(); geometry.attributes.position.needsUpdate = true; geometry.attributes.normal.needsUpdate = true; }; return VisualWorld; }(_libs.THREE.EventDispatcher); exports.default = VisualWorld; /***/ }, /* 67 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Controller2 = __webpack_require__(15); var _Controller3 = _interopRequireDefault(_Controller2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var WidgetController = function (_Controller) { _inherits(WidgetController, _Controller); function WidgetController(view) { _classCallCheck(this, WidgetController); var _this = _possibleConstructorReturn(this, _Controller.call(this)); _this.view = view; _this.visible = false; return _this; } WidgetController.prototype.togle = function togle() { this.visible = !this.visible; this.fireChange(); }; WidgetController.prototype.hide = function hide() { this.visible = false; this.fireChange(); }; WidgetController.prototype.fireChange = function fireChange() { if (this.onChange) { this.onChange(); } this.updateView(); }; WidgetController.prototype.updateView = function updateView() { if (this.view) { this.view.setState('widFloatWnd', { enable: true, visible: this.visible, active: false }); } }; return WidgetController; }(_Controller3.default); exports.default = WidgetController; /***/ }, /* 68 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Target2 = __webpack_require__(21); var _Target3 = _interopRequireDefault(_Target2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var CircleTarget = function (_Target) { _inherits(CircleTarget, _Target); function CircleTarget(x, y, r) { _classCallCheck(this, CircleTarget); var _this = _possibleConstructorReturn(this, _Target.call(this)); _this.p = { x: x, y: y, r: r }; return _this; } CircleTarget.prototype.testIntersection = function testIntersection(e, data) { var res = void 0; var x = data.x, y = data.y, p = this.p; if ((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y) <= p.r * p.r) { res = { target: this, data: data }; } return res; }; return CircleTarget; }(_Target3.default); exports.default = CircleTarget; /***/ }, /* 69 */ /***/ function(module, exports, __webpack_require__) { "use strict"; 'use strict'; exports.__esModule = true; var _Target2 = __webpack_require__(21); var _Target3 = _interopRequireDefault(_Target2); var _BaseMathUtils = __webpack_require__(2); var _BaseMathUtils2 = _interopRequireDefault(_BaseMathUtils); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var PolyTarget = function (_Target) { _inherits(PolyTarget, _Target); function PolyTarget(poly) { _classCallCheck(this, PolyTarget); var _this = _possibleConstructorReturn(this, _Target.call(this)); _this.poly = poly; return _this; } PolyTarget.prototype.testIntersection = function testIntersection(e, p) { return _BaseMathUtils2.default.isInsidePoly(this.poly, p) ? { target: this, data: p } : undefined; }; return PolyTarget; }(_Target3.default); exports.default = PolyTarget; /***/ }, /* 70 */ /***/ function(module, exports, __webpack_require__) { // stats.js - http://github.com/mrdoob/stats.js (function(f,e){ true?module.exports=e():"function"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;dg+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/ 1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v); b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f}); /***/ }, /* 71 */ /***/ function(module, exports, __webpack_require__) { /*** IMPORTS FROM imports-loader ***/ var define = false; /*! * jQuery Mousewheel 3.1.13 * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license */ (function (factory) { if ( typeof define === 'function' && define.amd ) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (true) { // Node/CommonJS style for Browserify module.exports = factory; } else { // Browser globals factory(jQuery); } }(function ($) { var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], slice = Array.prototype.slice, nullLowestDeltaTimeout, lowestDelta; if ( $.event.fixHooks ) { for ( var i = toFix.length; i; ) { $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; } } var special = $.event.special.mousewheel = { version: '3.1.12', setup: function() { if ( this.addEventListener ) { for ( var i = toBind.length; i; ) { this.addEventListener( toBind[--i], handler, false ); } } else { this.onmousewheel = handler; } // Store the line height and page height for this particular element $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); }, teardown: function() { if ( this.removeEventListener ) { for ( var i = toBind.length; i; ) { this.removeEventListener( toBind[--i], handler, false ); } } else { this.onmousewheel = null; } // Clean up the data we added to the element $.removeData(this, 'mousewheel-line-height'); $.removeData(this, 'mousewheel-page-height'); }, getLineHeight: function(elem) { var $elem = $(elem), $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); if (!$parent.length) { $parent = $('body'); } return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; }, getPageHeight: function(elem) { return $(elem).height(); }, settings: { adjustOldDeltas: true, // see shouldAdjustOldDeltas() below normalizeOffset: true // calls getBoundingClientRect for each event } }; $.fn.extend({ mousewheel: function(fn) { return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); }, unmousewheel: function(fn) { return this.unbind('mousewheel', fn); } }); function handler(event) { var orgEvent = event || window.event, args = slice.call(arguments, 1), delta = 0, deltaX = 0, deltaY = 0, absDelta = 0, offsetX = 0, offsetY = 0; event = $.event.fix(orgEvent); event.type = 'mousewheel'; // Old school scrollwheel delta if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } // Firefox < 17 horizontal scrolling related to DOMMouseScroll event if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { deltaX = deltaY * -1; deltaY = 0; } // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy delta = deltaY === 0 ? deltaX : deltaY; // New school wheel delta (wheel event) if ( 'deltaY' in orgEvent ) { deltaY = orgEvent.deltaY * -1; delta = deltaY; } if ( 'deltaX' in orgEvent ) { deltaX = orgEvent.deltaX; if ( deltaY === 0 ) { delta = deltaX * -1; } } // No change actually happened, no reason to go any further if ( deltaY === 0 && deltaX === 0 ) { return; } // Need to convert lines and pages to pixels if we aren't already in pixels // There are three delta modes: // * deltaMode 0 is by pixels, nothing to do // * deltaMode 1 is by lines // * deltaMode 2 is by pages if ( orgEvent.deltaMode === 1 ) { var lineHeight = $.data(this, 'mousewheel-line-height'); delta *= lineHeight; deltaY *= lineHeight; deltaX *= lineHeight; } else if ( orgEvent.deltaMode === 2 ) { var pageHeight = $.data(this, 'mousewheel-page-height'); delta *= pageHeight; deltaY *= pageHeight; deltaX *= pageHeight; } // Store lowest absolute delta to normalize the delta values absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; // Adjust older deltas if necessary if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { lowestDelta /= 40; } } // Adjust older deltas if necessary if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { // Divide all the things by 40! delta /= 40; deltaX /= 40; deltaY /= 40; } // Get a whole, normalized value for the deltas delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); // Normalise offsetX and offsetY properties if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { var boundingRect = this.getBoundingClientRect(); offsetX = event.clientX - boundingRect.left; offsetY = event.clientY - boundingRect.top; } // Add information to the event object event.deltaX = deltaX; event.deltaY = deltaY; event.deltaFactor = lowestDelta; event.offsetX = offsetX; event.offsetY = offsetY; // Go ahead and set deltaMode to 0 since we converted to pixels // Although this is a little odd since we overwrite the deltaX/Y // properties with normalized deltas. event.deltaMode = 0; // Add event and delta to the front of the arguments args.unshift(event, delta, deltaX, deltaY); // Clearout lowestDelta after sometime to better // handle multiple device types that give different // a different lowestDelta // Ex: trackpad = 3 and mouse wheel = 120 if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); return ($.event.dispatch || $.event.handle).apply(this, args); } function nullLowestDelta() { lowestDelta = null; } function shouldAdjustOldDeltas(orgEvent, absDelta) { // If this is an older event and the delta is divisable by 120, // then we are assuming that the browser is treating this as an // older mouse wheel event and that we should divide the deltas // by 40 to try and get a more usable deltaFactor. // Side note, this actually impacts the reported scroll distance // in older browsers and can cause scrolling to be slower than native. // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; } })); /***/ }, /* 72 */ /***/ function(module, exports, __webpack_require__) { __webpack_require__(23); module.exports = __webpack_require__(22); /***/ } /******/ ]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNzI0ZTU4ZGY1OGM2NWM0ODA4YjQiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2xpYnMuanMiLCJ3ZWJwYWNrOi8vLy4vanMvbGlicy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9CYXNlTWF0aFV0aWxzLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL01hdGhVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9VdGlscy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9JbWFnZUJhc2UuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvR3JhcGhVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9JbWFnZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9Cb29rUHJvcHNCdWlsZGVyLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvU2hlZXRCbG9jay5qcyIsIndlYnBhY2s6Ly8vLi9qcy9wcm9wcy9ib29rLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL0NTUzNEUmVuZGVyZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvQ1NTTGF5ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9DdXN0b21FdmVudENvbnZlcnRlci5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9GaW5kZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvUGRmLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVVdGlscy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy90YXJnZXRzL1RhcmdldC5qcyIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9BdXRvTmF2aWdhdG9yLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvQmluZGVyLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvQm9vay5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL0Jvb2tDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvQm9va1ByaW50ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9Cb29rVmlldy5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL0NsYkJvb2tQcm9wc0J1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9Db3Zlci5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL0Nzc0xheWVyc01hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9QYWdlTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL1BkZkJvb2tQcm9wc0J1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9QZGZMaW5rc0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9TZWFyY2hFbmdpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vanMvY2xhc3Nlcy9TaGVldENzc0xheWVyLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvU2hlZXRQaHlzaWNzLmpzIiwid2VicGFjazovLy8uL2pzL2NsYXNzZXMvU291bmRzRW52aXJvbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9qcy9jbGFzc2VzL1RvY0NvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vanMvbW9kZWxzL3NoZWV0QmxvY2suanMiLCJ3ZWJwYWNrOi8vLy4vanMvcHJvcHMvYm9va0NvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvQmxhbmtJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9Cb29rbWFya3MuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRGV0ZWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRG9jTW91c2VTaW11bGF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRG9tMkltYWdlLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL0RyYWcuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvRXZlbnRzVG9BY3Rpb25zLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL0Z1bGxTY3JlZW4uanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvSW50ZXJhY3RpdmVJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9Mb2FkaW5nQW5pbWF0aW9uLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL0xvYWRpbmdDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL01vdXNlRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvT2JqZWN0M0RXYXRjaGVyLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL09yYml0LmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1BkZkltYWdlLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1NlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9TdGF0aWNJbWFnZS5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9UZXh0dXJlQW5pbWF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVNb3VzZUV2ZW50Q29udmVydGVyLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlVG91Y2hFdmVudENvbnZlcnRlci5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9UaHVtYm5haWxzLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL1RvdWNoRXZlbnRDb252ZXJ0ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vLi4vY29tbW9uL2NsYXNzZXMvVmlldy5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9WaXN1YWxXb3JsZC5qcyIsIndlYnBhY2s6Ly8vLi8uLi9jb21tb24vY2xhc3Nlcy9XaWRnZXRDb250cm9sbGVyLmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL3RhcmdldHMvQ2lyY2xlVGFyZ2V0LmpzIiwid2VicGFjazovLy8uLy4uL2NvbW1vbi9jbGFzc2VzL3RhcmdldHMvUG9seVRhcmdldC5qcyIsIndlYnBhY2s6Ly8vLi9+L3N0YXRzLmpzL2J1aWxkL3N0YXRzLm1pbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS1tb3VzZXdoZWVsL2pxdWVyeS5tb3VzZXdoZWVsLmpzIl0sIm5hbWVzIjpbIl8kIiwid2luZG93IiwialF1ZXJ5IiwicmVxdWlyZSIsIl9odG1sMmNhbnZhcyIsImh0bWwyY2FudmFzIiwiX1RIUkVFIiwiVEhSRUUiLCJfUmVhY3QiLCJSZWFjdCIsIl9SZWFjdERPTSIsIlJlYWN0RE9NIiwiX1BERkpTIiwiUERGSlMiLCJfdHIiLCJzIiwiaWJlcmV6YW5za3kiLCJ0ciIsIiQiLCJGQjNEX0xPQ0FMRSIsImRpY3Rpb25hcnkiLCJCYXNlTWF0aFV0aWxzIiwic3VtMSIsImthIiwiYSIsImtiIiwiYiIsInN1bTIiLCJzdW0zIiwic3VtNCIsInJrNCIsImR5IiwidCIsImR0IiwieSIsInN1bSIsImxlbmd0aCIsImsxIiwiazIiLCJrMyIsIms0IiwiZXh0cmFwb2xhdGVMaW5lYXIiLCJ4IiwieGkiLCJpbnRlcnBvbGF0ZUxpbmVhciIsInlpIiwicmV2ZXJzZSIsImNhbGNTY2FsZSIsInNyY1ciLCJzcmNIIiwiZHN0VyIsImRzdEgiLCJNYXRoIiwibWluIiwibXVsTSIsInIiLCJpIiwicHVzaCIsImoiLCJrIiwidHJhbnNNIiwibSIsIm1hdCIsImRhdGEiLCJkaXNwIiwiTSIsInByZWRpY3QiLCJudW0iLCJsIiwiRCIsImFtIiwiYm0iLCJ0YSIsImQiLCJwIiwidiIsInJvdW5kIiwiaW5kZXhPZiIsImdldFVuaXF1ZSIsImNlaWwiLCJyYW5kb20iLCJzZXRTcGxpbmVQb2ludHMiLCJzcGxpbmUiLCJwcyIsInBvaW50cyIsImNvbnNvbGUiLCJ3YXJuIiwic2V0IiwieiIsIm1hcGwyTCIsImxzIiwibGVuIiwibiIsImYiLCJkTCIsIkwiLCJhYnMiLCJkZXQyIiwiYyIsInNvbHZlMkxpbiIsImExIiwiYjEiLCJhMiIsImIyIiwicmVzIiwiZXBzIiwiZHgiLCJpc0luc2lkZVBvbHkiLCJkb25lIiwiY3QiLCJ2MmRpc3QiLCJucCIsInJuIiwicDAiLCJwMSIsImlwIiwibWF4IiwidG4iLCJpc0luc2lkZUNvbnZQb2x5Iiwic2ciLCJ2MmxlbiIsInYyIiwic3FydCIsInYyMSIsInYyMiIsImNvbXB1dGVTcXVhcmUiLCJjb21wdXRlSW50ZXJwQ29lZnMiLCJ0cmkiLCJjb2VmcyIsIk1hdGhVdGlscyIsInNwbGl0U3BsaW5lIiwiTiIsIm8iLCJkbCIsImdldFBvaW50IiwidjEiLCJkaXN0YW5jZVRvIiwiY29weSIsImdldExpbmVhckluZGVjZXMiLCJkZWwiLCJkRGVsIiwicmVmaW5lUG9seSIsInBvbHkiLCJtYXhEbCIsIlZlY3RvcjIiLCJWZWN0b3IzIiwiVXRpbHMiLCJub3JtYWxpemVVcmwiLCJ1cmwiLCJzcGxpdCIsInJlcGxhY2UiLCJiYXNlIiwibG9jYXRpb24iLCJocmVmIiwiam9pbiIsImV4dGVuZHMiLCJkZXIiLCJuYW1lIiwiaGFzT3duUHJvcGVydHkiLCJkZWZhdWx0Q21wIiwibG93ZXJCb3VuZCIsImNtcCIsImgiLCJtaWQiLCJmbG9vciIsIkltYWdlQmFzZSIsImNvbnRleHQiLCJ3aWR0aCIsImhlaWdodCIsImNvbG9yIiwid25kIiwiZG9jIiwiZWxlbWVudCIsImJvZHkiLCJyZW5kZXJDYW52YXMiLCJjdHgiLCJyZW5kZXJDYW52YXNDdHgiLCJyZXNXIiwicmVzSCIsInNldFJlc29sdXRpb24iLCJkaXNwb3NlIiwicmVuZGVyQmxhbmtQYWdlIiwiYmVnaW5QYXRoIiwiZmlsbFN0eWxlIiwiY29sb3IyUmdiYSIsInJlY3QiLCJmaWxsIiwicmVuZGVySW1hZ2UiLCJpbWFnZSIsInB1c2hDdHgiLCJkcmF3SW1hZ2UiLCJwb3BDdHgiLCJub3JtVG9Db252IiwicmVuZGVySGl0IiwibW92ZVRvIiwibGluZVRvIiwiY2xvc2VQYXRoIiwic2F2ZSIsInNjYWxlIiwicmVzdG9yZSIsInJlbmRlck5vdEZvdW5kUGFnZSIsImZpbmlzaFJlbmRlciIsIm9uQ2hhbmdlIiwiZmluaXNoTG9hZCIsIm9uTG9hZCIsInN0YXJ0UmVuZGVyIiwiZ2V0U2ltdWxhdGVkRG9jIiwidW5kZWZpbmVkIiwiZ2V0Q29udGV4dCIsIkV2ZW50Q29udmVydGVyIiwiZW5hYmxlZCIsInNldEVuYWJsZSIsInZsIiwibUNhcE9iamVjdCIsIm5vdGlmeSIsIkV2ZW50IiwibUhvdk9iamVjdCIsImdldENhbGxiYWNrIiwib2JqZWN0IiwiZSIsInR5cGUiLCJjYWxsYmFjayIsInByb3BzIiwidmlldyIsImpFIiwiY29udmVydCIsImZpbHRlciIsImdldE9iamVjdCIsImNvbnZlcnRUb3VjaCIsImNvbnZlcnRNb3VzZSIsInRDYXBPYmplY3QiLCJ0ZXN0IiwiR3JhcGhVdGlscyIsImludGVycG9sYXRlMDEiLCJ5MSIsInkyIiwiZ2V0Q29sb3JCeXRlcyIsImludmVyc2VDb2xvciIsImJzIiwiaWJzIiwibmJzIiwiYnl0ZXMyQ29sb3IiLCJieXRlczJSZ2JhIiwiSW1hZ2VGYWN0b3J5IiwiY2FjaGUiLCJidWlsZCIsImluZm8iLCJ3aWR0aFRleGVscyIsImhlaWdodFRleGVscyIsImluamVjdG9yIiwic3JjIiwiQm9va1Byb3BzQnVpbGRlciIsIm9uUmVhZHkiLCJkZWZhdWx0cyIsImNhbGNTaXplIiwiY2FsY1RleGVscyIsInNoZWV0IiwiY2FsY1Byb3BzIiwiY292ZXIiLCJwYWdlIiwiY2FsY1NoZWV0cyIsInBhZ2VzIiwic2hlZXRzIiwiZ2V0U2hlZXRzIiwiZ2V0UHJvcHMiLCJnZXRQYWdlQ2FsbGJhY2siLCJiaW5kcyIsInBhZ2VDYWxsYmFjayIsInJlYWR5IiwiU2hlZXRCbG9jayIsInZpc3VhbCIsImZpcnN0IiwibGFzdCIsImFuZ2xlIiwic3RhdGUiLCJsb2FkZWRQb2ludHMiLCJsb2FkUG9pbnRzIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsInNoYXBlIiwicFNwbGluZSIsIlNwbGluZSIsImludGVycG9sYXRpb25Qb2ludHMiLCJpU3BsaW5lIiwicmVzWCIsImFTcGxpbmVzIiwiZ2VvbWV0cnkiLCJjbG9uZSIsInNpZGVGYWNlcyIsImZhY2VzIiwic2lkZVRleHR1cmUiLCJUZXh0dXJlIiwid3JhcFQiLCJSZXBlYXRXcmFwcGluZyIsInJlcGVhdCIsIm5lZWRzVXBkYXRlIiwibWF0ZXJpYWxzIiwiTWVzaFBob25nTWF0ZXJpYWwiLCJzZXRUZXh0dXJlIiwibWVzaCIsIk1lc2giLCJNZXNoRmFjZU1hdGVyaWFsIiwiY2FzdFNoYWRvdyIsInJlY2VpdmVTaGFkb3ciLCJ0aHJlZSIsInVzZXJEYXRhIiwic2VsZiIsIm1hcmtlcnMiLCJtYXJrZXIiLCJ1c2UiLCJ2ZXJ0aWNlcyIsImlzIiwiQXJyYXkiLCJhcHBseSIsIl8iLCJjcmVhdGVNYXJrZXIiLCJzaXplIiwidmVydGV4IiwiYWRkIiwiY29ybmVyIiwibWF4RGlzdGFuY2UiLCJPWiIsImF4aXMiLCJnZXRTaXplIiwiZ2V0VG9wQ2VybmVycyIsIm9mZiIsIlBJIiwicmVzWiIsImdldFRvcFNpemUiLCJ2cyIsImdldFRvcFdvcmxkUm90YXRpb24iLCJxIiwiZ2V0VG9wV29ybGRQb3NpdGlvbiIsInZpIiwibG9jYWxUb1dvcmxkIiwiZ2V0SW50ZXJwb2xhdGlvblBvaW50cyIsImluZHMiLCJtb2QiLCJLIiwid2F2ZSIsImNsb3NlZEFuZ2xlIiwiYmluZGVyVHVybiIsIm9wZW5lZEFuZ2xlIiwiY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMiLCJmbGF0SW50ZXJwb2xhdGlvbkluZGVjZXMiLCJnZXRQb2ludHNBdEFuZ2xlIiwib3BlbmVkSW50ZXJwb2xhdGlvbkluZGVjZXMiLCJobCIsImhyIiwib2Zmc2V0IiwiZGVwdGgiLCJpbkFuZ2xlIiwiaEFuZ2xlIiwiZ2V0UG9pbnRzQXRBbmdsZUFuZEhzIiwibGVmdCIsInJpZ2h0IiwiaW52ZXJzZSIsInNldFBvaW50cyIsInlzIiwicmVzWSIsInBsYW5lIiwiUGxhbmUiLCJub3JtYWwiLCJwbGFuZU9mZnNldCIsImZsZXhpYmxlQ29ybmVyIiwicHJvaiIsInNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50Iiwibm9ybWFsaXplIiwicHJvamVjdFBvaW50Iiwic3ViIiwiZGlzdGFuY2UiLCJkMkFuZ2xlIiwiY29ybmVyRGV2aWF0aW9uIiwiZXhwIiwiYmVuZGluZyIsImFwcGx5QXhpc0FuZ2xlIiwicG9pbnQiLCJwb3NpdGlvbiIsImNvbXB1dGVWZXJ0ZXhOb3JtYWxzIiwiY29tcHV0ZUJvdW5kaW5nU3BoZXJlIiwidmVydGljZXNOZWVkVXBkYXRlIiwibWFya3VwIiwiY29tcHV0ZVZlcnRpY2VzIiwiZ2V0UG9pbnRzQXRIcyIsImhzIiwiYmwiLCJwMiIsImRwIiwibG4iLCJzcCIsInNpbiIsImNvcyIsIm5wcyIsImFuZ2xlcyIsInhwcyIsInlwcyIsImludGVycG9sYXRlIiwiZ3Jhdml0eSIsImNhY2hlZFBhZ2VzIiwicmVuZGVySW5hY3RpdmVQYWdlcyIsInJlbmRlckluYWN0aXZlUGFnZXNPbk1vYmlsZSIsInJlbmRlcldoaWxlRmxpcHBpbmciLCJwYWdlc0ZvclByZWRpY3RpbmciLCJwcmVsb2FkUGFnZXMiLCJydGwiLCJzdGFydFZlbG9jaXR5IiwiZmxleGliaWxpdHkiLCJiaW5kZXJUZXh0dXJlIiwicGFkZGluZyIsIm1hc3MiLCJjc3NMYXllclByb3BzIiwiQ1NTM0RPYmplY3QiLCJzdHlsZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJPYmplY3QzRCIsIkNTUzNEU3ByaXRlIiwiQ1NTM0RSZW5kZXJlciIsIl93aWR0aCIsIl9oZWlnaHQiLCJfd2lkdGhIYWxmIiwiX2hlaWdodEhhbGYiLCJtYXRyaXgiLCJNYXRyaXg0IiwiY2FtZXJhIiwiZm92Iiwib2JqZWN0cyIsImRvbUVsZW1lbnQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJvdmVyZmxvdyIsImNhbWVyYUVsZW1lbnQiLCJXZWJraXRUcmFuc2Zvcm1TdHlsZSIsIk1velRyYW5zZm9ybVN0eWxlIiwidHJhbnNmb3JtU3R5bGUiLCJhcHBlbmRDaGlsZCIsImlzSUUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJzZXRDbGVhckNvbG9yIiwic2V0U2l6ZSIsImVwc2lsb24iLCJ2YWx1ZSIsImdldENhbWVyYUNTU01hdHJpeCIsImVsZW1lbnRzIiwiZ2V0T2JqZWN0Q1NTTWF0cml4IiwiY2FtZXJhQ1NTTWF0cml4IiwibWF0cml4M2QiLCJyZW5kZXJPYmplY3QiLCJtYXRyaXhXb3JsZEludmVyc2UiLCJ0cmFuc3Bvc2UiLCJjb3B5UG9zaXRpb24iLCJtYXRyaXhXb3JsZCIsImNhY2hlZFN0eWxlIiwiaWQiLCJXZWJraXRUcmFuc2Zvcm0iLCJNb3pUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iLCJkaXN0YW5jZVRvQ2FtZXJhU3F1YXJlZCIsImdldERpc3RhbmNlVG9TcXVhcmVkIiwiY2hpbGRyZW4iLCJvYmplY3QxIiwib2JqZWN0MiIsInNldEZyb21NYXRyaXhQb3NpdGlvbiIsImRpc3RhbmNlVG9TcXVhcmVkIiwiek9yZGVyIiwic2NlbmUiLCJvcmRlciIsInNvcnQiLCJ6TWF4IiwidHJhdmVyc2UiLCJpbmRleCIsInpJbmRleCIsInJlbmRlciIsInByb2plY3Rpb25NYXRyaXgiLCJXZWJraXRQZXJzcGVjdGl2ZSIsIk1velBlcnNwZWN0aXZlIiwicGVyc3BlY3RpdmUiLCJ1cGRhdGVNYXRyaXhXb3JsZCIsInBhcmVudCIsIl9DU1MzRE9iamVjdCIsIl9DU1MzRFNwcml0ZSIsIkNTU0xheWVyIiwiaW5pdCIsImRlbGF5IiwiYXBwZW5kVG8iLCJoZWFkIiwicmVtb3ZlIiwiakNvbnRhaW5lciIsIndpZHRoUHhzIiwiaGVpZ2h0UHhzIiwic2V0RGF0YSIsImNhbGxJbnRlcm5hbCIsImVycm9yIiwiY2xlYXJJbnRlcm5hbHMiLCJjc3MiLCJodG1sIiwianMiLCJldmFsIiwicGVuZGVkQ2FsbCIsImNsYiIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJzZXRUaW1lb3V0IiwiaXNIaWRkZW4iLCJoYXNDbGFzcyIsImhpZGUiLCJhZGRDbGFzcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2hvdyIsInJlbW92ZUNsYXNzIiwiQ2FjaGUiLCJtYXhTaXplIiwiSW5maW5pdHkiLCJzaXplb2YiLCJjb3VudFNpemVvZiIsIm9zIiwiTWFwIiwiZm9yRWFjaCIsImdldCIsImxvY2tlZCIsImRlbGV0ZSIsImZyZWVTcGFjZSIsImFyciIsImtleSIsInJlY3Vyc2lvblNpemVvZiIsImdldFRpbWVzdGFtcCIsInB1dCIsIkNvbnRyb2xsZXIiLCJoYW5kbGVEZWZhdWx0IiwiZGlzcGF0Y2hBc3luYyIsInRoZW4iLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnREaXNwYXRjaGVyIiwiQ3VzdG9tRXZlbnRDb252ZXJ0ZXIiLCJjdXN0b21UZXN0IiwiZURvYyIsImN1c3RvbXMiLCJ0YXJnZXQiLCJhZGRDdXN0b20iLCJjdXN0b20iLCJ0ZXN0SW50ZXJzZWN0aW9uIiwiRmluZGVyIiwiaXNEZWxpbWV0ciIsIkRFTElNSVRFUiIsIm1lcmdlIiwiYXMiLCJzdHJzIiwiY2hhckF0Iiwic3RyIiwiYWRkSGl0cyIsImNoYXJzIiwicGF0dGVybiIsImRlbGltZXRlciIsImhpdHMiLCJhZGRDb250ZXh0IiwiZGVscyIsImNvbnRleHRMZW5ndGgiLCJwcmV2RGVscyIsImNvbnRleHRzIiwic3Vic3RyIiwiZ2V0SGl0cyIsImdldENvbnRleHRzIiwidG9Mb3dlckNhc2UiLCJsc3RyIiwid29ya2VyU3JjIiwiUERGSlNfTE9DQUxFIiwicGRmSnNXb3JrZXIiLCJjTWFwVXJsIiwicGRmSnNDTWFwVXJsIiwiY01hcFBhY2tlZCIsIlBkZiIsImxvYWRpbmdQcm9ncmVzcyIsImhhbmRsZXJRdWV1ZSIsInByb2dyZXNEYXRhIiwibG9hZGVkIiwidG90YWwiLCJnZXREb2N1bWVudCIsInJhbmdlQ2h1bmtTaXplIiwiY3VyIiwib2xkIiwiaXNOYU4iLCJoYW5kbGVyIiwibnVtUGFnZXMiLCJhbGwiLCJnZXRQYWdlIiwiZG91YmxlZFBhZ2VzIiwiZ2V0UGFnZVNpemUiLCJnZXRQYWdlVHlwZSIsImdldFBhZ2VzTnVtIiwic3BsaWNlIiwic2V0TG9hZGluZ1Byb2dyZXNzQ2xiIiwiZ2V0SGFuZGxlciIsIlRocmVlRXZlbnRDb252ZXJ0ZXJGcyIsIm9iamVjdHNUZXN0Iiwib2JqZWN0c0FuZEZhY2VzVGVzdCIsImZhY2UiLCJtYXRlcmlhbEluZGV4IiwidmlzdWFsV29ybGQiLCJjb29yZHMiLCJyYXljYXN0ZXIiLCJ0aHJlZXMiLCJhZGRUaHJlZSIsInJlbW92ZVRocmVlIiwic2V0Q29vcmRzRnJvbUV2ZW50Iiwic2V0RnJvbUNhbWVyYSIsImludGVyc2VjdHMiLCJpbnRlcnNlY3RPYmplY3RzIiwiVGhyZWVVdGlscyIsInZlcnRpY2VzMlVWcyIsImluZGVjZXMiLCJjb252ZXJDbGIiLCJ2aXMiLCJjb21wdXRlRmFjZVZlcnRleFV2cyIsInV2cyIsInV2c2kiLCJmYWNlVmVydGV4VXZzIiwiU3BoZXJlR2VvbWV0cnkiLCJmaW5kVXZUcmlzIiwiZm91bmQiLCJmaW5kSW50ZXJuYWxWZXJ0aWNlcyIsInZlcnRleE5vcm1hbHMiLCJ2YWx1ZXMiLCJUYXJnZXQiLCJmbiIsIkZsaXBCb29rIiwib3B0aW9ucyIsInBkZkxpbmtzSGFuZGxlciIsInNvdW5kcyIsInRvY0N0cmwiLCJ0aHVtYm5haWxzIiwiYm9va21hcmtzIiwiY3RybCIsImJvb2tQcmludGVyIiwiYm9vayIsInByb3BzQnVpbGRlciIsImJvb2tCdWlsZGVyIiwicGVuZGluZ0Rpc3Bvc2UiLCJ3ZWJnbCIsImFkZEdldFdlYkdMTWVzc2FnZSIsImdldFZpZXciLCJsb2FkaW5nQ3RybCIsInByb2dyZXNzIiwiZ2V0Q29udGFpbmVyIiwib3duZXJEb2N1bWVudCIsImRlZmF1bHRWaWV3IiwicHJvcGVydGllc0NhbGxiYWNrIiwidGVtcGxhdGUiLCJwcmludFN0eWxlIiwiY29udHJvbHNQcm9wcyIsInNldEluamVjdG9yIiwidyIsImJvb2tDdHJsIiwiYWRkSGFuZGxlciIsInNldFByaW50ZXIiLCJzZWFyY2giLCJnZXRTZWFyY2hWaWV3IiwiZ2V0UGFnZXMiLCJvblF1ZXJ5Iiwic2V0UXVlcnkiLCJiaW5kIiwic2V0UmVzdWx0cyIsInJlc3VsdHMiLCJsYXN0UGFnZSIsImdldFRodW1ibmFpbHNWaWV3Iiwia1d0b0giLCJzZXRUaHVtYm5haWxzIiwic2V0U2VhcmNoIiwic2V0VG9jQ3RybCIsImhhbmRsZUV2ZW50IiwiZ2V0T3V0bGluZSIsIm91dGxpbmUiLCJnZXRCb29rbWFya3NWaWV3Iiwic2V0Qm9va21hcmtzIiwicGRmTGlua3MiLCJzZXRIYW5kbGVyIiwic2V0U291bmRzIiwic3Vic2NyaWJlRmxpcHMiLCJhdXRvTmF2aWdhdGlvbiIsInBkZiIsInNldFByb2dyZXNzIiwiY29udGFpbmVycyIsImF0dHIiLCJwcm90b3R5cGUiLCJUeXBlRXJyb3IiLCJPIiwic3RhcnQiLCJhcmd1bWVudHMiLCJyZWxhdGl2ZVN0YXJ0IiwiZW5kIiwicmVsYXRpdmVFbmQiLCJmaW5hbCIsImZpbmQiLCJkZWZpbmVQcm9wZXJ0eSIsInByZWRpY2F0ZSIsImxpc3QiLCJ0aGlzQXJnIiwiY2FsbCIsImZpbmRJbmRleCIsIkF1dG9OYXZpZ2F0b3IiLCJ1cmxQYXJhbSIsIm5hdmlnYXRlcyIsImZiM2QiLCJpbnN0YW5jZXMiLCJnb1RvUGFnZSIsImdldFBhZ2VOdW1iZXIiLCJnZXRQYXJhbWV0ZXJCeU5hbWUiLCJyZWdleCIsIlJlZ0V4cCIsImV4ZWMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJudW1iZXIiLCJwYXJzZUludCIsIkJpbmRlciIsImJhY2tTaXplIiwiYmFja0ciLCJCb3hHZW9tZXRyeSIsImJhY2tNIiwidGV4dHVyZUxvYWRlciIsImxvYWQiLCJ0ZXh0dXJlIiwic2V0SGV4IiwibWluRmlsdGVyIiwiTGluZWFyRmlsdGVyIiwiYmFjayIsImJhY2tSVCIsImJhY2tSUiIsImJhY2tMVCIsImJhY2tMUiIsImxlZnRQaXZvdCIsInJpZ2h0UGl2b3QiLCJ0cjEiLCJxdWF0ZXJuaW9uIiwic2V0RnJvbUF4aXNBbmdsZSIsInRyMiIsInNldExlZnQiLCJzZXRSaWdodCIsImpvaW5MZWZ0Q292ZXIiLCJkaXNjb25uZWN0TGVmdENvdmVyIiwiam9pblJpZ2h0Q292ZXIiLCJkaXNjb25uZWN0UmlnaHRDb3ZlciIsIkJvb2siLCJhcHBlbmQiLCJtb3VzZUNvbnRyb2xsZXIiLCJwcmVwYXJlUHJvcHMiLCJ6b29tIiwic2luZ2xlUGFnZSIsImF1dG9SZXNvbHV0aW9uIiwiZW5hYmxlIiwicGFnZU1hbmFnZXIiLCJsYXllck1hbmFnZXIiLCJzZWFyY2hFbmdpbmUiLCJvblBhZ2VIaXRzQ2hhbmdlZCIsInF1ZXJ5IiwicmVmcmVzaFBhZ2VRdWVyeSIsImJpbmRlciIsImxlZnRDb3ZlciIsInNldExlZnRDb3ZlclRleHR1cmUiLCJzdWJzY3JpYmVTaGVldEJsb2NrIiwicmlnaHRDb3ZlciIsInNldFJpZ2h0Q292ZXJUZXh0dXJlIiwidGhyZWVTaGVldEJsb2NrcyIsInNoZWV0QmxvY2tzIiwiYWRkU2hlZXRCbG9jayIsInNldFBhZ2VUZXh0dXJlIiwibGFzdE1vdXNlUG9zIiwic2hlZXRQaHlzaWNzIiwidXBkYXRlIiwicGFnZVgiLCJwYWdlWSIsImFkZFJlbmRlckNhbGxiYWNrIiwib24iLCJvblBpY2tDYWxsYmFjayIsImRyYWciLCJvbkRyYWdDYWxsYmFjayIsIm9uUmVsZWFzZUNhbGxiYWNrIiwiZHJhZ0FuZ2xlIiwidG1wIiwiYm94cyIsIkJveDMiLCJhZGRPYmplY3QiLCJyZWZyZXNoWm9vbSIsIm5vdGlmeUJlZm9yZUFuaW1hdGlvbiIsIm5vdGlmeUFmdGVyQW5pbWF0aW9uIiwicmVtb3ZlT2JqZWN0IiwicmVtb3ZlUmVuZGVyQ2FsbGJhY2siLCJyZW1vdmVTaGVldEJsb2NrcyIsInJlbW92ZVNoZWV0QmxvY2siLCJzZXRBdXRvUmVzb2x1dGlvbiIsInNldFpvb20iLCJpc1Byb2Nlc3NpbmciLCJzZXRGbGlwUHJvZ3Jlc3NDbGIiLCJmbGlwUHJvZ3Jlc3NDbGIiLCJpc0FjdGl2ZVBhZ2UiLCJnZXRCbG9ja0J5UGFnZSIsImJsb2NrIiwiZ2V0QmxvY2tQYWdlcyIsInJhbmdlIiwiZ2V0VG9wUGFnZXMiLCJnZXRQYWdlU3RhdGUiLCJlbmFibGVMb2FkaW5nQW5pbWF0aW9uIiwiZ2V0TGVmdEZsaXBwaW5nIiwiZ2V0UmlnaHRGbGlwcGluZyIsImdldENsb3NlZEJsb2NrQW5nbGUiLCJwaHlzaWNJZCIsImdldFBhcmFtZXRyIiwiZmxpcExlZnQiLCJwcm9ncmVzc0NsYiIsImNvbm5lY3RQaHlzaWNzIiwic2V0U2hlZXRCbG9ja3MiLCJzcGxpdFNoZWV0QmxvY2siLCJmaW5pc2hBbmltYXRpb25DbGIiLCJmbGlwUmlnaHQiLCJjbGVhckhvdmVySW5mbyIsInR1cm5PbkV2ZW50cyIsImhvdmVySW5mbyIsImZvcmNlIiwiY29ybmVyRm9yY2UiLCJ4U2VnbWVudCIsInNldEZyb21PYmplY3QiLCJ1bmlvbiIsImNvbXB1dGVUYXJnZXQiLCJzZWciLCJ1diIsImNvcm5lclRhcmdldCIsImRyYWdGb3JjZUNsYiIsImdldERyYWdDb3JuZXJGb3JjZUNsYiIsImRyYWdJbmZvIiwidHVybk9mZkV2ZW50cyIsImdldEZsaXBwaW5nIiwiZmxpcCIsImVuYWJsZU1vdXNlIiwiY29ybmVyQ2FsbGJhY2siLCJwZW5kaW5ncyIsImhvdmVyQW5nbGUiLCJob3ZlciIsInBvc3NpYmxlIiwibmV4dEJsb2NrIiwic2V0UGFyYW1ldHIiLCJnZXRUYXJnZXRGb3JjZUNsYiIsImhvdmVyQ29ybmVyRm9yY2VDbGIiLCJjb3JuZXJDbGlja0RhdGEiLCJwb3ciLCJldmVudENvbnZlcnRlciIsIm1vdXNlQ2FsbGJhY2siLCJ0cmFuc2ZlckV2ZW50VG9UZXh0dXJlIiwidG91Y2hDYWxsYmFjayIsIm1vdXNlRXZlbnRzIiwidG91Y2hFdmVudHMiLCJibG9ja3MiLCJtYXRlcmlhbCIsIm1lcmdlU2hlZXRCbG9ja3MiLCJjYWxjQmxvY2tGb3JjZSIsInZlbG9jaXR5IiwiY29ybmVySGVpZ2h0IiwiY2FsY0Jsb2NrQ29ybmVyRm9yY2UiLCJhbmltYXRpb25Ob3RpZmljYXRpb24iLCJyZWplY3QiLCJjb3ZlckhlaWdodCIsInNpbXVsYXRlQ2xiIiwicmVtb3ZlQ2xiIiwiYW5nbCIsImNoIiwiY2F0Y2giLCJsYXN0VCIsInRyaWdnZXIiLCJzaW11bGF0ZSIsImxlZnRTaXplIiwibmV3QmxvY2siLCJmaXJzdEJsb2NrIiwibGFzdEJsb2NrIiwiY3JlYXRlU2lkZVRleHR1cmUiLCJqQyIsIm1lcmdlUHJvcHMiLCJzZWNvbmQiLCJCb29rQ29udHJvbGxlciIsIm5hdmlnYXRpb25Db250cm9scyIsImRldmljZVBpeGVsUmF0aW8iLCJvcmJpdCIsImdldE9yYml0IiwidXBkYXRlVmlld0lmU3RhdGUiLCJiaW5kQWN0aW9ucyIsInNtYXJ0UGFuIiwiYWN0aW9ucyIsImFjdGl2ZSIsImFjdGl2ZUZvck1vYmlsZSIsInN0YXRzIiwibGlnaHRpbmciLCJkZWZhdWx0IiwiYWN0aXZlU2lkZSIsImJvb2tXYXRjaGVyIiwiU3RhdHMiLCJ0b3AiLCJzZXRFeHRyYUxpZ2h0aW5nIiwib25TY3JlZW5Nb2RlQ2hhbmdlZCIsIm9uVXBkYXRlVmlldyIsInVwZGF0ZVZpZXciLCJnZXRQYXJlbnRDb250YWluZXIiLCJjbWRTbWFydFBhbiIsInRlbXBsYXRlT2JqZWN0IiwiYXBwTG9hZGVkIiwibG9hZGluZ0FuaW1hdGlvbiIsInNraW4iLCJpbml0TG9hZGluZ0FuaW1hdGlvbiIsImNvZWZmaWNpZW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInZpc2libGUiLCJzZXRTdGF0ZSIsImVuYWJsZU5hdmlnYXRpb24iLCJwcmludGVyIiwic2V0RW5hYmxlZCIsImNhblpvb21JbiIsImNhblpvb21PdXQiLCJjYW5EZWZhdWx0Wm9vbSIsInNldEJvb2tab29tIiwiY21kWm9vbUluIiwiZGVsdGEiLCJ6b29tSW4iLCJjbWRab29tT3V0Iiwiem9vbU91dCIsImNtZERlZmF1bHRab29tIiwiY21kVG9jIiwidG9nbGUiLCJjbWRGYXN0QmFja3dhcmQiLCJzdGFydEZsaXAiLCJjbWRCYWNrd2FyZCIsImNtZEZvcndhcmQiLCJjbWRGYXN0Rm9yd2FyZCIsImNtZFNhdmUiLCJvcGVuIiwiZG93bmxvYWRVUkwiLCJjbWRQcmludCIsInByaW50IiwiY21kRnVsbFNjcmVlbiIsImFjdGl2YXRlZCIsInJlcXVlc3QiLCJjYW5jZWwiLCJtaW5BemltdXRoQW5nbGUiLCJtYXhBemltdXRoQW5nbGUiLCJtaW5Qb2xhckFuZ2xlIiwibWF4UG9sYXJBbmdsZSIsImNtZFNpbmdsZVBhZ2UiLCJjbWRTb3VuZHMiLCJjbWRTdGF0cyIsImNtZExpZ2h0aW5nVXAiLCJjbWRMaWdodGluZ0Rvd24iLCJwYWdlTnVtIiwiY3VycmVudCIsImZsaXBzIiwiY292cyIsImN2Iiwic2V0Q2xiIiwiZmwiLCJ0aW1lIiwiZmxpcFJlcyIsImVuZEZsaXAiLCJnZXRQYWdlRm9yR1VJIiwiaW5wUGFnZSIsInVwZGF0ZVZpZXdTdGF0ZSIsInZpZXdTdGF0ZSIsImF2YWlsYWJsZSIsImZsaXBwZXJzRW5hYmxlIiwiZ2V0QWN0aW9ucyIsImlzU3dpcHBpbmciLCJ0b3VjaENtZFN3aXBlIiwiY29kZSIsImNtZHMiLCJhY3RpdmF0ZSIsImNtZFBhbkxlZnQiLCJwYW4iLCJzcGVlZCIsImNtZFBhblJpZ2h0IiwiY21kUGFuVXAiLCJjbWRQYW5Eb3duIiwibW91c2VDbWRSb3RhdGUiLCJyb3RhdGUiLCJtb3VzZUNtZERyYWdab29tIiwibW91c2VDbWRQYW4iLCJtb3VzZUNtZFdoZWVsWm9vbSIsInByZXZlbnREZWZhdWx0IiwiZGVsdGFZIiwidG91Y2hDbWRSb3RhdGUiLCJ0b3VjaENtZFpvb20iLCJ0b3VjaENtZFBhbiIsInRvdWNoIiwidG91Y2hlcyIsIm9yaWdpbmFsRXZlbnQiLCJzd2lwZURhdGEiLCJoYW5kbGVkIiwieDAiLCJ5MCIsIndpZFNldHRpbmdzIiwiZVRvQSIsImFkZEFjdGlvbiIsIm1vdXNlQnV0dG9ucyIsIlJpZ2h0IiwiYWN0aW9uIiwiZmxhZ3MiLCJzZXRBY3Rpb25zIiwibGV2ZWxzIiwiQm9va1ByaW50ZXIiLCJzdHlsZVNoZWV0IiwicGRmU3JjIiwiY2FuY2VsZWQiLCJmcmFtZSIsInByaW50V25kIiwiY2FsbE1hbnVhbGx5IiwidXNlSUZyYW1lIiwiY29udGVudFdpbmRvdyIsInJlbmRlckNvbnRlbnQiLCJjb250ZW50IiwicHJpbnREb2MiLCJ3cml0ZSIsImNsb3NlIiwib25Qcm9ncmVzcyIsIlNldCIsInJlbmRlckh0bWwiLCJyZW5kZXJIZWFkIiwid3JhcCIsImxpbmtzIiwibWF0Y2giLCJsaW5rIiwiZmFpbCIsInJlc3BvbnNlVGV4dCIsImRlZmF1bHRTdHlsZVNoZWV0IiwiaXNDaHJvbWl1bSIsImNocm9tZSIsIndpbk5hdiIsInZlbmRvck5hbWUiLCJ2ZW5kb3IiLCJpc0lFZWRnZSIsImlzSU9TQ2hyb21lIiwiQm9va1ZpZXciLCJjb250YWluZXIiLCJpbml0VmlldyIsImJvb2ttYXJrc1ZpZXciLCJ0aHVtYm5haWxzVmlldyIsInNlYXJjaFZpZXciLCJnZXRIYW5kbGVycyIsImhhbmRsZXJzIiwiY2FsbExhdGVyIiwiUEFHRV9IQU5ETEVSX0RFTEFZIiwib25JdGVtU3RhdGVDaGFuZ2VkIiwicGFyZW50Q29udGFpbmVyIiwiZ2V0Rm9ybXMiLCJnZXRMaW5rcyIsImdldFdpZGdldHMiLCJnZXRJbnB1dHMiLCJnZXRUZXh0cyIsImdldFRlbXBsYXRlIiwic3R5bGVzIiwicmVsIiwic2NyaXB0IiwiQ2xiQm9va1Byb3BzQnVpbGRlciIsImltYWdlRmFjdG9yeSIsIkNvdmVyIiwiQ3NzTGF5ZXJzTWFuYWdlciIsIndyYXBwZXJzIiwiZ2V0QWN0aXZlcyIsImxheWVycyIsImhpZGRlbiIsImdldExheWVycyIsInNsIiwid2FpdCIsIlBhZ2VNYW5hZ2VyIiwicGFnZVF1ZXJ5IiwicGFnZUNhY2hlIiwicmVzb3VyY2VzQ2FjaGUiLCJjYW52YXMiLCJsb2FkaW5ncyIsInJlbmRlclF1ZXVlIiwicGFnZVJlcXVlc3RzIiwicHJlZGljdGVkUmVxdWVzdHMiLCJ0bXBNYXRlcmlhbCIsIk1lc2hCYXNpY01hdGVyaWFsIiwiUGxhbmVHZW9tZXRyeSIsImxvYWRpbmciLCJjcmVhdGVMb2FkaW5nVGV4dHVyZSIsInVwZGF0ZVJlbmRlclF1ZXVlIiwic3ByaXRlVGlsZXMiLCJhbmltYXRpb24iLCJhbmltYXRvciIsImNyZWF0ZVNwcml0ZSIsImlzQ292ZXIiLCJpc01vYmlsZSIsInNldHVwTWF0ZXJpYWwiLCJpc0FjdGl2ZSIsInJlbW92ZUZyb21Mb2FkaW5ncyIsInJlbW92ZUZyb21SZW5kZXJRdWV1ZSIsIndyYXBwZXIiLCJwdXNoSW5SZW5kZXJRdWV1ZSIsImVzIiwiY3NzTGF5ZXJzTG9hZGVyIiwiYXJncyIsInJlc29sdmVQZW5kaW5ncyIsInJ0bFBhZ2VOIiwicGkiLCJpc1RvcCIsInNldE1hdGVyaWFsIiwiY2FsY1Jlc29sdXRpb24iLCJpbnRlcmFjdGl2ZSIsIkNvbG9yIiwib25VcGRhdGUiLCJyZW5kZXJpbmciLCJpc1NpbmdsZVBhZ2UiLCJ0cmFuc2ZlckV2ZW50cyIsIm1vdXNldXAiLCJtb3VzZW91dCIsImVudCIsInRvT2JqZWN0IiwiZ2V0T3JMb2FkVGV4dHVyZU9iamVjdCIsInRvRG9jIiwibG9hZFByZWRpY3RlZFBhZ2VzIiwiYWRkUGFnZVJlcXVlc3QiLCJzaGlmdCIsIm9iIiwiUGRmQm9va1Byb3BzQnVpbGRlciIsInBhZ2VEZXNjcmlwdGlvbiIsIlBkZkxpbmtzSGFuZGxlciIsImN1cnNvcnMiLCJkZWZhdWx0SGFuZGxlciIsImRlc3RpbmF0aW9uIiwiY2FsbEhhbmRsZXJzIiwiZXZlbnQiLCJhbm5vIiwiYW5ub3RhdGlvbiIsInBvcCIsImRlc3QiLCJkZXN0UHJvbWlzZSIsImdldERlc3RpbmF0aW9uIiwiZ2V0UGFnZUluZGV4IiwiU2VhcmNoRW5naW5lIiwicHJvY2VzcyIsInN0YW1wIiwibmV4dCIsImdldFRleHRDb250ZW50IiwidGV4dENvbnRlbnQiLCJpdGVtcyIsIml0ZW0iLCJTaGVldENzc0xheWVyIiwibGF5ZXIiLCJhZGRDc3NPYmplY3QiLCJyZW1vdmVDc3NPYmplY3QiLCJyb3RhdGlvbiIsIlNoZWV0UGh5c2ljcyIsInRhcmdldEZvcmNlQ2xiIiwiZyIsInRsIiwidGFyZ2V0QW5nbGUiLCJmbGJ0IiwiZHJhZ0Nvcm5lckZvcmNlQ2xiIiwiZnBzIiwic3RhcnREdCIsIm1hcmdpbiIsImluZk0iLCJhdHRlbXB0cyIsIm1heEl0ZXJhdGlvbnMiLCJmb3JjZUNsYiIsImNvcm5lckZvcmNlQ2xiIiwibm8iLCJjZiIsImdldFBhcmFtZXRyTWFwIiwiVCIsImF0dGVtcHQiLCJpdCIsIm5vcyIsImludGVncmF0ZSIsImNpIiwiZmluZENvbGxpc2lvbnMiLCJzY29zIiwic29sdmVDb2xsaXNpb24iLCJncyIsImkwIiwiZmluZEFuZFNvbHZlQ29ybmVyQ29sbGlzaW9ucyIsInJlbW92ZVN0YXRpY3MiLCJhbCIsImRDaCIsImR2IiwibW0iLCJhdiIsImJ2IiwiaXNDb2xsaXNpb24iLCJTb3VuZHNFbnZpcm9tZW50IiwiYXVkaW8iLCJBdWRpbyIsInBsYXkiLCJwYXVzZSIsImN1cnJlbnRUaW1lIiwiZW1pdHRlciIsIlRvY0NvbnRyb2xsZXIiLCJ0YWIiLCJvbk5hdmlnYXRlIiwibmF2aWdhdGVUaHVtYm5haWxzIiwiZmlyZUNoYW5nZSIsIm5hdmlnYXRlU2VhcmNoIiwibmF2aWdhdGVCb29rbWFya3MiLCJpc0Jvb2ttYXJrcyIsImNtZEJvb2ttYXJrcyIsImNtZFRodW1ibmFpbHMiLCJjbWRTZWFyY2giLCJjbWRDbG9zZVRvYyIsImZyb250R2VvbWV0cnkiLCJ0cmFuc2xhdGUiLCJiYWNrR2VvbWV0cnkiLCJyb3RhdGVZIiwibGVmdEdlb21ldHJ5IiwicmlnaHRHZW9tZXRyeSIsInRvcEdlb21ldHJ5Iiwicm90YXRlWCIsImJvdHRvbUdlb21ldHJ5IiwiR2VvbWV0cnkiLCJhZGRGYWNlcyIsImZzIiwiRmFjZTMiLCJtYXBWZXJ0aWNlcyIsImRzdCIsImVxIiwiZnJvbnRNYXAiLCJiYWNrTWFwIiwibGVmdE1hcCIsInJpZ2h0TWFwIiwiTGVmdCIsIk1pZGRsZSIsIkJsYW5rSW1hZ2UiLCJCb29rbWFya3MiLCJnZXRUaXRsZSIsInRpdGxlIiwiZ2V0SXRlbXMiLCJub2RlcyIsIm1hcE5vZGVzIiwibGkiLCJjbWQiLCJub2RlIiwibWluaW1pemVkIiwicmVuZGVyTm9kZSIsInJlbmRlck5vZGVzIiwiZXhwYW5kIiwibWluaW1pemUiLCJsZXZlbCIsIkRldGVjdG9yIiwiZ2V0V2ViR0xFcnJvck1lc3NhZ2UiLCJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwidGV4dEFsaWduIiwiYmFja2dyb3VuZCIsImlubmVySFRNTCIsIldlYkdMUmVuZGVyaW5nQ29udGV4dCIsInBhcmFtZXRlcnMiLCJDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiLCJ3b3JrZXJzIiwiV29ya2VyIiwiZmlsZWFwaSIsIkZpbGUiLCJGaWxlUmVhZGVyIiwiRmlsZUxpc3QiLCJCbG9iIiwiRG9jTW91c2VTaW11bGF0b3IiLCJqRnJhbWUiLCJiRWxlbWVudCIsImNvbnRlbnREb2N1bWVudCIsInJlc2VuZFByb3BlcnRpZXMiLCJnZXREZWZhdWx0UmVzZW5kUHJvcGVydGllcyIsInVuZGVmaW5lZFByb3BlcnRpZXMiLCJnZXREZWZhdWx0VW5kZWZpbmVkUHJvcGVydGllcyIsIm9uRG9jQ2hhbmdlQ2xicyIsInRlcm1zIiwiSE9WRVIiLCJBQ1RJVkUiLCJzdHlsZVNoZWV0cyIsInNzIiwiY3NzUnVsZXMiLCJjc3NUZXh0IiwidGVybSIsInNlbGVjdG9yVGV4dCIsImNvbnZlcnRDb29yZHMiLCJqRWxlbWVudCIsInRyaWdnZXJFdmVudCIsImFkdmFuY2VkUHJvcHMiLCJ0aW1lU3RhbXAiLCJnZXRDb21wdXRlZFN0eWxlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsImVudGVyRWxlbWVudCIsImxlYXZlRWxlbWVudCIsImFjdGl2YXRlRWxlbWVudCIsImRlYWN0aXZhdGVFbGVtZW50IiwiYWRkRG9jQ2hhbmdlQ2xiIiwiZWxlbWVudEZyb21Qb2ludCIsImNoaWxkTm9kZXMiLCJjaGlsZCIsIkVsZW1lbnQiLCJnZXRFbGVtZW50Iiwib2ZmMCIsImlubmVyV2lkdGgiLCJpbm5lckhlaWdodCIsImNhcEVsZW1lbnQiLCJsZWF2ZWQiLCJob3ZFbGVtZW50IiwicmVsYXRlZFRhcmdldCIsIkRvbTJJbWFnZSIsInV0aWwiLCJuZXdVdGlsIiwiaW5saW5lciIsIm5ld0lubGluZXIiLCJmb250RmFjZXMiLCJuZXdGb250RmFjZXMiLCJpbWFnZXMiLCJuZXdJbWFnZXMiLCJ0b1N2ZyIsInRvUG5nIiwidG9KcGVnIiwidG9CbG9iIiwidG9QaXhlbERhdGEiLCJpbXBsIiwiY2xvbmVOb2RlIiwiZW1iZWRGb250cyIsImlubGluZUltYWdlcyIsImFwcGx5T3B0aW9ucyIsIm1ha2VTdmdEYXRhVXJpIiwiYmdjb2xvciIsImJhY2tncm91bmRDb2xvciIsInByb3BlcnR5IiwiZHJhdyIsImdldEltYWdlRGF0YSIsInRvRGF0YVVSTCIsInF1YWxpdHkiLCJjYW52YXNUb0Jsb2IiLCJkb21Ob2RlIiwibWFrZUltYWdlIiwibmV3Q2FudmFzIiwiZmlsbFJlY3QiLCJyb290IiwibWFrZU5vZGVDb3B5IiwiY2xvbmVDaGlsZHJlbiIsInByb2Nlc3NDbG9uZSIsImlzQ2FudmFzIiwib3JpZ2luYWwiLCJjbG9uZUNoaWxkcmVuSW5PcmRlciIsImFzQXJyYXkiLCJjaGlsZENsb25lIiwiaXNFbGVtZW50IiwiY2xvbmVTdHlsZSIsImNsb25lUHNldWRvRWxlbWVudHMiLCJjb3B5VXNlcklucHV0IiwiZml4U3ZnIiwiY29weVN0eWxlIiwic291cmNlIiwiY29weVByb3BlcnRpZXMiLCJzZXRQcm9wZXJ0eSIsImdldFByb3BlcnR5UHJpb3JpdHkiLCJjbG9uZVBzZXVkb0VsZW1lbnQiLCJjbGFzc05hbWUiLCJ1aWQiLCJzdHlsZUVsZW1lbnQiLCJmb3JtYXRQc2V1ZG9FbGVtZW50U3R5bGUiLCJzZWxlY3RvciIsImZvcm1hdENzc1RleHQiLCJmb3JtYXRDc3NQcm9wZXJ0aWVzIiwiY3JlYXRlVGV4dE5vZGUiLCJmb3JtYXRQcm9wZXJ0eSIsImlzVGV4dEFyZWEiLCJpc0lucHV0Iiwic2V0QXR0cmlidXRlIiwiaXNTVkciLCJpc1NWR1JlY3QiLCJhdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJyZXNvbHZlQWxsIiwic3R5bGVOb2RlIiwiaW5saW5lQWxsIiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwiZXNjYXBlWGh0bWwiLCJ4aHRtbCIsImVzY2FwZSIsInBhcnNlRXh0ZW5zaW9uIiwibWltZVR5cGUiLCJkYXRhQXNVcmwiLCJpc0RhdGFVcmwiLCJyZXNvbHZlVXJsIiwiZ2V0QW5kRW5jb2RlIiwiaXNJbWFnZSIsIm1pbWVzIiwiV09GRiIsIkpQRUciLCJleHRlbnNpb24iLCJiaW5hcnlTdHJpbmciLCJhdG9iIiwiYmluYXJ5QXJyYXkiLCJVaW50OEFycmF5IiwiY2hhckNvZGVBdCIsImJhc2VVcmwiLCJpbXBsZW1lbnRhdGlvbiIsImNyZWF0ZUhUTUxEb2N1bWVudCIsImZvdXJSYW5kb21DaGFycyIsInRvU3RyaW5nIiwic2xpY2UiLCJ1cmkiLCJJbWFnZSIsIm9ubG9hZCIsIm9uZXJyb3IiLCJUSU1FT1VUIiwiWE1MSHR0cFJlcXVlc3QiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJvbnRpbWVvdXQiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwic2VuZCIsInJlYWR5U3RhdGUiLCJzdGF0dXMiLCJlbmNvZGVyIiwib25sb2FkZW5kIiwicmVzdWx0IiwicmVhZEFzRGF0YVVSTCIsInJlc3BvbnNlIiwibWVzc2FnZSIsInN0cmluZyIsIm1zIiwiYXJnIiwiYXJyYXlMaWtlIiwiYXJyYXkiLCJsZWZ0Qm9yZGVyIiwicHgiLCJyaWdodEJvcmRlciIsInNjcm9sbFdpZHRoIiwidG9wQm9yZGVyIiwiYm90dG9tQm9yZGVyIiwic2Nyb2xsSGVpZ2h0Iiwic3R5bGVQcm9wZXJ0eSIsInBhcnNlRmxvYXQiLCJIVE1MQ2FudmFzRWxlbWVudCIsIkhUTUxUZXh0QXJlYUVsZW1lbnQiLCJIVE1MSW5wdXRFbGVtZW50IiwiU1ZHRWxlbWVudCIsIlNWR1JlY3RFbGVtZW50IiwiSFRNTEltYWdlRWxlbWVudCIsIlVSTF9SRUdFWCIsInNob3VsZFByb2Nlc3MiLCJyZWFkVXJscyIsImlubGluZSIsImRhdGFVcmwiLCJ1cmxBc1JlZ2V4Iiwibm90aGluZ1RvSW5saW5lIiwidXJscyIsInJlYWRBbGwiLCJ3ZWJGb250cyIsIndlYkZvbnQiLCJjc3NTdHJpbmdzIiwiZ2V0Q3NzUnVsZXMiLCJzZWxlY3RXZWJGb250UnVsZXMiLCJydWxlcyIsIm5ld1dlYkZvbnQiLCJydWxlIiwiQ1NTUnVsZSIsIkZPTlRfRkFDRV9SVUxFIiwibG9nIiwid2ViRm9udFJ1bGUiLCJwYXJlbnRTdHlsZVNoZWV0IiwibmV3SW1hZ2UiLCJpbmxpbmVCYWNrZ3JvdW5kIiwiaW5saW5lZCIsIkRyYWciLCJpbnRlcnNlY3Rpb24iLCJzZWxlY3RlZCIsImNvbnRyb2xzU3RhdGUiLCJnZXRDb250cm9sc1N0YXRlIiwib25Nb3VzZU1vdmUiLCJvbk1vdXNlRG93biIsIm9uTW91c2VVcCIsInJheSIsIm9yaWdpbiIsInNldENvbnRyb2xzU3RhdGUiLCJnZXRXb3JsZERpcmVjdGlvbiIsImludGVyc2VjdFBsYW5lIiwiRXZlbnRzVG9BY3Rpb25zIiwiZ2V0RXZlbnRGbGFncyIsImN0cmxLZXkiLCJzaGlmdEtleSIsImFsdEtleSIsImdldFBvc2l0aW9uIiwiY29udGV4dE1lbnUiLCJtb3VzZURvd24iLCJtb3VzZU1vdmUiLCJtb3VzZVVwIiwibW91c2VXaGVlbCIsIm1vdXNlTW92ZURvYyIsIm1vdXNlVXBEb2MiLCJjbGljayIsImRibGNsaWNrIiwidG91Y2hTdGFydCIsInRvdWNoTW92ZSIsInRvdWNoRW5kIiwia2V5RG93biIsImtleVByZXNzIiwia2V5VXAiLCJmaXJlQWN0aW9ucyIsImJ1dHRvbiIsInBpY2tlZCIsImNsaWNrcyIsInRvdWNoUGljayIsInRvdWNoUGlja2VkIiwicG9zIiwia2V5Q29kZSIsIm1vZEtleXMiLCJDdHJsIiwiU2hpZnQiLCJBbHQiLCJGdWxsU2NyZWVuIiwiX2hhc1dlYmtpdEZ1bGxTY3JlZW4iLCJfaGFzTW96RnVsbFNjcmVlbiIsIl9oYXNNc0Z1bGxzY3JlZW4iLCJ3ZWJraXRJc0Z1bGxTY3JlZW4iLCJtb3pGdWxsU2NyZWVuIiwibXNGdWxsc2NyZWVuRWxlbWVudCIsImFzc2VydCIsIndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuIiwibW96UmVxdWVzdEZ1bGxTY3JlZW4iLCJtc1JlcXVlc3RGdWxsc2NyZWVuIiwid2Via2l0Q2FuY2VsRnVsbFNjcmVlbiIsIm1vekNhbmNlbEZ1bGxTY3JlZW4iLCJtc0V4aXRGdWxsc2NyZWVuIiwiZG9jdW1lbnRFbGVtZW50IiwiSW50ZXJhY3RpdmVJbWFnZSIsImlJZCIsImhhc0ZlYXR1cmUiLCJpbWFnZUxvYWQiLCJzdmdSZW5kZXIiLCJmcmFtZUxvYWQiLCJzaW11bGF0b3IiLCJMb2FkaW5nQW5pbWF0aW9uIiwiY2FsY1RpbWVUbyIsInVwZGF0ZUludGVydmFsIiwiY2xlYXJSZWN0Iiwic2hhZG93Qmx1ciIsInNoYWRvd0NvbG9yIiwic2hhZG93T2Zmc2V0WCIsInNoYWRvd09mZnNldFkiLCJmb250IiwidGV4dEJhc2VsaW5lIiwiZmlsbFRleHQiLCJkYSIsIl9hIiwiX3IiLCJjeCIsImN5IiwibngiLCJueSIsImFyYyIsImdldEltYWdlIiwic2lnbiIsIkxvYWRpbmdDb250cm9sbGVyIiwic2hvd1Byb2dyZXNzIiwibG9hZGluZ01zZyIsImdldExvYWRpbmdNc2ciLCJkZWZhdWx0TG9hZGluZ01zZyIsIk1vdXNlRXZlbnRDb252ZXJ0ZXIiLCJPYmplY3QzRFdhdGNoZXIiLCJib3VuZEJveENsYiIsInRlc3RTY2FsZSIsImVsZW1lbnRTaXplIiwidngiLCJ2eSIsImJveCIsImNvbXB1dGVDbGllbnRCb3VuZEJveCIsIm1vdmVQYW4iLCJ2VG9DYW1lcmEiLCJwcm9qZWN0IiwieHMiLCJ6cyIsInNldE9iamVjdCIsImNvbXB1dGVDb3JyIiwiY29yciIsImdldFNjYWxlIiwiS3giLCJLeSIsImNlbnRlclZpZXciLCJzZXRTY2FsZSIsInRmIiwiWSIsInZkIiwiT3JiaXQiLCJtaW5EaXN0YW5jZSIsIm1pblpvb20iLCJtYXhab29tIiwiZW5hYmxlRGFtcGluZyIsImRhbXBpbmdGYWN0b3IiLCJlbmFibGVab29tIiwiem9vbVNwZWVkIiwiZW5hYmxlUm90YXRlIiwicm90YXRlU3BlZWQiLCJlbmFibGVQYW4iLCJhdXRvUm90YXRlIiwiYXV0b1JvdGF0ZVNwZWVkIiwidGFyZ2V0MCIsInBvc2l0aW9uMCIsInpvb20wIiwiZ2V0UG9sYXJBbmdsZSIsInNwaGVyaWNhbCIsInBoaSIsImdldEF6aW11dGhhbEFuZ2xlIiwidGhldGEiLCJyZXNldCIsInNjb3BlIiwidXBkYXRlUHJvamVjdGlvbk1hdHJpeCIsImNoYW5nZUV2ZW50IiwiX3NwZWVkIiwiZG9sbHlJbiIsImdldFpvb21TY2FsZSIsImRvbGx5T3V0IiwibmV3U2NhbGUiLCJxdWF0IiwiUXVhdGVybmlvbiIsInNldEZyb21Vbml0VmVjdG9ycyIsInVwIiwicXVhdEludmVyc2UiLCJsYXN0UG9zaXRpb24iLCJsYXN0UXVhdGVybmlvbiIsImFwcGx5UXVhdGVybmlvbiIsInNldEZyb21WZWN0b3IzIiwicm90YXRlTGVmdCIsImdldEF1dG9Sb3RhdGlvbkFuZ2xlIiwic3BoZXJpY2FsRGVsdGEiLCJtYWtlU2FmZSIsInJhZGl1cyIsInBhbk9mZnNldCIsInNldEZyb21TcGhlcmljYWwiLCJsb29rQXQiLCJ6b29tQ2hhbmdlZCIsIkVQUyIsImRvdCIsIlNwaGVyaWNhbCIsInJvdGF0ZVVwIiwicGFuTGVmdCIsIm9iamVjdE1hdHJpeCIsInNldEZyb21NYXRyaXhDb2x1bW4iLCJtdWx0aXBseVNjYWxhciIsInBhblVwIiwiZGVsdGFYIiwiUGVyc3BlY3RpdmVDYW1lcmEiLCJ0YXJnZXREaXN0YW5jZSIsInRhbiIsImNsaWVudEhlaWdodCIsIk9ydGhvZ3JhcGhpY0NhbWVyYSIsImNsaWVudFdpZHRoIiwiYm90dG9tIiwiZG9sbHlTY2FsZSIsIm9mZnNldERvbGx5Iiwid2hlZWxEb2xseSIsIlBkZkltYWdlIiwibTAwIiwibTAxIiwibTAyIiwibTEwIiwibTExIiwibTEyIiwibTIwIiwibTIxIiwibTIyIiwidHJpbSIsInNldEhpdHMiLCJyZWN0U2l6ZSIsImNyZWF0ZVBvbHkiLCJzZXRBbm5vdGF0aW9ucyIsImFubm9zIiwidmlld3BvcnQiLCJ0YXJnZXRzIiwic3VidHlwZSIsImFQb3MiLCJhU3oiLCJhbm5vQ2xiIiwiZmluZGVyIiwicmVuZGVySGl0cyIsInRlc3RTeiIsInRleHREaXYiLCJiYXNlT2Zmc2V0IiwiaGl0IiwiVXRpbCIsImZvbnROYW1lIiwiYXRhbjIiLCJ2ZXJ0aWNhbCIsImZvbnRIZWlnaHQiLCJmb250QXNjZW50IiwiYXNjZW50IiwiZGVzY2VudCIsInRlc3RTcGFuIiwiaXdpZHRoIiwicmVsYXRpdmVPZmZzZXQiLCJjYWxjVmlld3BvcnQiLCJnZXRWaWV3cG9ydCIsIm9mZnNldFgiLCJnZXRBbm5vdGF0aW9ucyIsImNhbnZhc0NvbnRleHQiLCJTZWFyY2giLCJwcmV2UmVzdWx0cyIsIm5hdmlnYXRlIiwiZG9RdWVyeSIsInF1ZXJ5U3RhbXAiLCJodG1scyIsIlN0YXRpY0ltYWdlIiwiY3Jvc3NPcmlnaW4iLCJpbWFnZUVycm9yIiwiVGV4dHVyZUFuaW1hdG9yIiwiaW1nIiwidGlsZXNIb3JpeiIsInRpbGVzVmVydCIsIm51bVRpbGVzIiwidGlsZURpc3BEdXJhdGlvbiIsInRpbGVzSG9yaXpvbnRhbCIsInRpbGVzVmVydGljYWwiLCJudW1iZXJPZlRpbGVzIiwidGlsZURpc3BsYXlEdXJhdGlvbiIsImN1cnJlbnREaXNwbGF5VGltZSIsImN1cnJlbnRUaWxlIiwibWlsbGlTZWMiLCJjdXJyZW50Q29sdW1uIiwiY3VycmVudFJvdyIsIlRocmVlTW91c2VFdmVudENvbnZlcnRlciIsIlRocmVlVG91Y2hFdmVudENvbnZlcnRlciIsImxhc3RUb3VjaGVzIiwiVGh1bWJuYWlscyIsInRodW1ibmFpbHNDbGIiLCJoZWFkaW5nIiwidGh1bWJuYWlsIiwiZGF0YVRodW1ibmFpbCIsInNldEltYWdlIiwiZ2V0QWN0aXZlIiwic2Nyb2xsVG9wIiwiYnVpbHQiLCJUb3VjaENvbnZlcnRlciIsIlZpZXciLCJjbGFzc1Byb3BlcnR5IiwiYXR0cmlidXRlUHJvcGVydHkiLCJhdHRyaWJ1dGVOYW1lIiwicmVtb3ZlQXR0ciIsImhhbmRsZUxpbmtFdmVudCIsImhhbmRsZUlucHV0RXZlbnQiLCJoYW5kbGVGb3JtRXZlbnQiLCJnZXRUaW1lIiwicGVuZGluZyIsImxvYWRGaWxlcyIsImZpbGVzIiwidGFza3MiLCJ1cmxSZXNvbHZlciIsImxhc3RJbmRleE9mIiwicGFydHMiLCJwYXJ0Iiwib2JqVG9BdHRyc1N0ciIsImNoZWNrSWZyYW1lU2l6ZSIsIm9uUmVzaXplIiwiczAiLCJzMSIsImZpcmVMaW5rc09uTG9hZEV2ZW50IiwibGlua0xvYWRlZCIsImpMaW5rIiwiakxpbmtzIiwiaXNJT1MiLCJNU1N0cmVhbSIsInN0b3AiLCJ0ZXh0Q3NzIiwicjEiLCJsaW5rQ29udHJvbHMiLCJ3aWRnZXRDb250cm9scyIsImlucHV0Q29udHJvbHMiLCJmb3JtQ29udHJvbHMiLCJ0ZXh0Q29udHJvbHMiLCJzdGF0ZVNldHRlcnMiLCJzZXR0ZXIiLCJzZXRMaW5rQ29udHJvbFN0YXRlIiwic2V0V2lkZ2V0Q29udHJvbFN0YXRlIiwic2V0SW5wdXRDb250cm9sU3RhdGUiLCJzZXRUZXh0Q29udHJvbFN0YXRlIiwic2V0Q29udHJvbFN0YXRlIiwic3RhdGVIYW5kbGVycyIsInN0IiwibGlua1N0YXRlSGFuZGxlcnMiLCJ3aWRnZXRTdGF0ZUhhbmRsZXJzIiwiaW5wdXRTdGF0ZUhhbmRsZXJzIiwidGV4dFN0YXRlSGFuZGxlcnMiLCJ0ZXh0IiwiVmlzdWFsV29ybGQiLCJ1c2VIZWxwZXJzIiwicmVuZGVyQ2FsbGJhY2tzIiwiY2xvY2siLCJDbG9jayIsIlJheWNhc3RlciIsIlNjZW5lIiwiY3NzU2NlbmUiLCJyZW5kZXJlciIsIldlYkdMUmVuZGVyZXIiLCJhbHBoYSIsImFudGlhbGlhcyIsInNldFBpeGVsUmF0aW8iLCJjc3NSZW5kZXJlciIsImNvbnRyb2xzIiwidG1wVmVjdG9yIiwiVGV4dHVyZUxvYWRlciIsIkFtYmllbnRMaWdodCIsImxpZ2h0IiwiRGlyZWN0aW9uYWxMaWdodCIsIkF4aXNIZWxwZXIiLCJvbldpbmRvd1Jlc2l6ZSIsImFuaW1hdGUiLCJmaWx0ZXJEYXRhIiwidHlwZXMiLCJjb250YWlucyIsImludGVuc2l0eSIsInVwZGF0ZUNhbWVyYSIsImFzcGVjdCIsInVwZGF0ZVJlbmRlcmVyIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiZGVsdGFUaW1lIiwiZ2V0RGVsdGEiLCJwcm9jZXNzR2VvbWV0cnkiLCJidWZHZW9tZXRyeSIsImZyb21CdWZmZXJHZW9tZXRyeSIsIm1lcmdlVmVydGljZXMiLCJpbmRleGVkQnVmZmVyR2VvbSIsImNyZWF0ZUluZGV4ZWRCdWZmZXJHZW9tZXRyeUZyb21HZW9tZXRyeSIsIm1hcEluZGljZXMiLCJudW1WZXJ0aWNlcyIsIm51bUZhY2VzIiwiYnVmZmVyR2VvbSIsIkJ1ZmZlckdlb21ldHJ5IiwiRmxvYXQzMkFycmF5IiwiaW5kaWNlcyIsIlVpbnQzMkFycmF5IiwiVWludDE2QXJyYXkiLCJpMyIsInNldEluZGV4IiwiQnVmZmVyQXR0cmlidXRlIiwiYWRkQXR0cmlidXRlIiwiaXNFcXVhbCIsIngxIiwiejEiLCJ4MiIsInoyIiwiYXR0cmlidXRlcyIsImlkeFZlcnRpY2VzIiwibnVtSWR4VmVydGljZXMiLCJtYXBwZWRWZXJ0aWNlcyIsIm1hcHBlZEluZGljZXMiLCJtYXBwZWRBc3NvY2lhdGlvbiIsImFzc29jaWF0aW9uIiwiajMiLCJvbmVOb2RlUG9zaXRpb25DYWxsYmFjayIsIm11bHR5Tm9kZVBvc2l0aW9uQ2FsbGJhY2siLCJ2b2x1bWVQb3NpdGlvbnMiLCJ2b2x1bWVOb3JtYWxzIiwiYXNzb2NWZXJ0ZXgiLCJpbmRleFZlcnRleCIsIm11bHR5Tm9kZVBvc2l0aW9uUG9zdENhbGxiYWNrIiwicGF0aFBvc2l0aW9uQ2FsbGJhY2siLCJwb3NpdGlvbnMiLCJwYXRoUG9zaXRpb25Qb3N0Q2FsbGJhY2siLCJXaWRnZXRDb250cm9sbGVyIiwiQ2lyY2xlVGFyZ2V0IiwiUG9seVRhcmdldCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVy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QSxDQUFDIiwiZmlsZSI6ImpzL2Rpc3QvM2RmbGlwYm9vay5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDcyKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA3MjRlNThkZjU4YzY1YzQ4MDhiNCIsImNvbnN0IF8kID0gR0xPQkFMX0xJQlMualF1ZXJ5PyB3aW5kb3cualF1ZXJ5OiByZXF1aXJlKCdqcXVlcnknKSxcclxuICAgICAgX2h0bWwyY2FudmFzID0gR0xPQkFMX0xJQlMuaHRtbDJjYW52YXM/IHdpbmRvdy5odG1sMmNhbnZhczogcmVxdWlyZSgnaHRtbDJjYW52YXMnKSxcclxuICAgICAgX1RIUkVFID0gR0xPQkFMX0xJQlMuVEhSRUU/IHdpbmRvdy5USFJFRTogcmVxdWlyZSgndGhyZWUnKSxcclxuICAgICAgX1JlYWN0ID0gR0xPQkFMX0xJQlMuUmVhY3Q/IHdpbmRvdy5SZWFjdDogcmVxdWlyZSgncmVhY3QnKSxcclxuICAgICAgX1JlYWN0RE9NID0gR0xPQkFMX0xJQlMuUmVhY3Q/IHdpbmRvdy5SZWFjdERPTTogcmVxdWlyZSgncmVhY3QtZG9tJyksXHJcbiAgICAgIF9QREZKUyA9IEdMT0JBTF9MSUJTLlBERkpTPyB3aW5kb3cuUERGSlM6IHJlcXVpcmUoJ3BkZmpzJyksXHJcbiAgICAgIF90ciA9IChzKT0+ICh3aW5kb3cuaWJlcmV6YW5za3kgfHwge30pLnRyICYmIHdpbmRvdy5pYmVyZXphbnNreS50cihzKSB8fCBzO1xyXG5cclxuZXhwb3J0IHtcclxuICBfJCBhcyAkLFxyXG4gIF9odG1sMmNhbnZhcyBhcyBodG1sMmNhbnZhcyxcclxuICBfVEhSRUUgYXMgVEhSRUUsXHJcbiAgX1JlYWN0IGFzIFJlYWN0LFxyXG4gIF9SZWFjdERPTSBhcyBSZWFjdERPTSxcclxuICBfUERGSlMgYXMgUERGSlMsXHJcbiAgX3RyIGFzIHRyXHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9saWJzLmpzIiwiY29uc3QgXyQgPSBHTE9CQUxfTElCUy5qUXVlcnk/IHdpbmRvdy5qUXVlcnk6IHJlcXVpcmUoJ2pxdWVyeScpLFxyXG4gICAgICBfaHRtbDJjYW52YXMgPSBHTE9CQUxfTElCUy5odG1sMmNhbnZhcz8gd2luZG93Lmh0bWwyY2FudmFzOiByZXF1aXJlKCdodG1sMmNhbnZhcycpLFxyXG4gICAgICBfVEhSRUUgPSBHTE9CQUxfTElCUy5USFJFRT8gd2luZG93LlRIUkVFOiByZXF1aXJlKCd0aHJlZScpLFxyXG4gICAgICBfUERGSlMgPSBHTE9CQUxfTElCUy5QREZKUz8gd2luZG93LlBERkpTOiByZXF1aXJlKCdwZGZqcycpLFxyXG4gICAgICBfdHIgPSAocyk9PiAod2luZG93LmliZXJlemFuc2t5IHx8IHt9KS50ciAmJiB3aW5kb3cuaWJlcmV6YW5za3kudHIocykgfHwgcztcclxuXHJcbmlmKHdpbmRvdy5GQjNEX0xPQ0FMRSkge1xyXG4gIHdpbmRvdy5pYmVyZXphbnNreSA9IHtcclxuICAgIC4uLndpbmRvdy5pYmVyZXphbnNreSxcclxuICAgIHRyOiAocyk9PiAoRkIzRF9MT0NBTEUuZGljdGlvbmFyeSB8fCB7fSlbc10gfHwgc1xyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcbiAgXyQgYXMgJCxcclxuICBfaHRtbDJjYW52YXMgYXMgaHRtbDJjYW52YXMsXHJcbiAgX1RIUkVFIGFzIFRIUkVFLFxyXG4gIF9QREZKUyBhcyBQREZKUyxcclxuICBfdHIgYXMgdHJcclxufTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvbGlicy5qcyIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VNYXRoVXRpbHMge1xyXG4gIHN0YXRpYyBzdW0gPSBbQmFzZU1hdGhVdGlscy5zdW0xLCBCYXNlTWF0aFV0aWxzLnN1bTIsIEJhc2VNYXRoVXRpbHMuc3VtMywgQmFzZU1hdGhVdGlscy5zdW00XTtcclxuICBzdGF0aWMgZXBzID0gMWUtNDtcclxuXHJcbiAgc3RhdGljIHN1bTEoa2EsYSxrYixiKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBrYSphWzBdK2tiKmJbMF1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc3VtMihrYSxhLGtiLGIpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIGthKmFbMF0ra2IqYlswXSxcclxuICAgICAga2EqYVsxXStrYipiWzFdXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHN1bTMoa2EsYSxrYixiKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBrYSphWzBdK2tiKmJbMF0sXHJcbiAgICAgIGthKmFbMV0ra2IqYlsxXSxcclxuICAgICAga2EqYVsyXStrYipiWzJdXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHN1bTQoa2EsYSxrYixiKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBrYSphWzBdK2tiKmJbMF0sXHJcbiAgICAgIGthKmFbMV0ra2IqYlsxXSxcclxuICAgICAga2EqYVsyXStrYipiWzJdLFxyXG4gICAgICBrYSphWzNdK2tiKmJbM11cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcms0KGR5LCB0LCBkdCwgeSwgc3VtPUJhc2VNYXRoVXRpbHMuc3VtW3kubGVuZ3RoLTFdKSB7XHJcbiAgICBjb25zdCBrMT1keSh0LHkpLFxyXG4gICAgICAgICAgazI9ZHkodCtkdC8yLHN1bSgxLHksZHQvMixrMSkpLFxyXG4gICAgICAgICAgazM9ZHkodCtkdC8yLHN1bSgxLHksZHQvMixrMikpLFxyXG4gICAgICAgICAgazQ9ZHkodCtkdCxzdW0oMSx5LGR0LGszKSk7XHJcbiAgICByZXR1cm4gc3VtKDEseSxkdC82LHN1bSgxLHN1bSgxLGsxLDIsazIpLDEsc3VtKDIsazMsMSxrNCkpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBleHRyYXBvbGF0ZUxpbmVhcih4LHkseGkpIHtcclxuICAgIHJldHVybiB5WzBdKyh5WzFdLXlbMF0pLyh4WzFdLXhbMF0pKih4aS14WzBdKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpbnRlcnBvbGF0ZUxpbmVhcih4LHkseGkpIHtcclxuICAgIGxldCB5aTtcclxuICAgIGlmKHhbMF0+eFsxXSkge1xyXG4gICAgICB4PXgucmV2ZXJzZSgpO1xyXG4gICAgICB5PXkucmV2ZXJzZSgpO1xyXG4gICAgfVxyXG4gICAgaWYoeGk8eFswXSkge1xyXG4gICAgICB5aT15WzBdO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih4aT54WzFdKSB7XHJcbiAgICAgIHlpPXlbMV07XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgeWk9QmFzZU1hdGhVdGlscy5leHRyYXBvbGF0ZUxpbmVhcih4LHkseGkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHlpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNhbGNTY2FsZShzcmNXLCBzcmNILCBkc3RXLCBkc3RIKSB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4oZHN0Vy9zcmNXLCBkc3RIL3NyY0gpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG11bE0oYSwgYikge1xyXG4gICAgY29uc3Qgcj1bXTtcclxuICAgIGZvcihsZXQgaT0wO2k8YS5sZW5ndGg7KytpKSB7XHJcbiAgICAgIHIucHVzaChbXSk7XHJcbiAgICAgIGZvcihsZXQgaj0wO2o8YlswXS5sZW5ndGg7KytqKSB7XHJcbiAgICAgICAgcltpXVtqXSA9IDA7XHJcbiAgICAgICAgZm9yKGxldCBrPTA7azxiLmxlbmd0aDsrK2spIHtcclxuICAgICAgICAgIHJbaV1bal0rPWFbaV1ba10qYltrXVtqXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHRyYW5zTShtKSB7XHJcbiAgICBjb25zdCByPVtdO1xyXG4gICAgZm9yKGxldCBpPTA7aTxtLmxlbmd0aDsrK2kpIHtcclxuICAgICAgZm9yKGxldCBqPTA7ajxtWzBdLmxlbmd0aDsrK2opIHtcclxuICAgICAgICBpZighcltqXSkge1xyXG4gICAgICAgICAgcltqXT1bXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcltqXVtpXT1tW2ldW2pdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBtYXQoZGF0YSkge1xyXG4gICAgbGV0IHM9MDtcclxuICAgIGZvcihsZXQgeCBvZiBkYXRhKSB7XHJcbiAgICAgIHMrPXg7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy9kYXRhLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkaXNwKGRhdGEpIHtcclxuICAgIGNvbnN0IE09QmFzZU1hdGhVdGlscy5tYXQoZGF0YSk7XHJcbiAgICBsZXQgcz0wO1xyXG4gICAgZm9yKGxldCB4IG9mIGRhdGEpIHtcclxuICAgICAgcys9KHgtTSkqKHgtTSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy9kYXRhLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBwcmVkaWN0KGRhdGEsIG51bSkge1xyXG4gICAgY29uc3Qgcj1bXSwgbD1kYXRhLmxlbmd0aCwgRD1CYXNlTWF0aFV0aWxzLmRpc3AoZGF0YSk7XHJcbiAgICBpZihEPGwgJiYgbD4xKSB7XHJcbiAgICAgIGNvbnN0IGFtPVtdLCBibT1bXTtcclxuICAgICAgZm9yKGxldCBpPTA7aTxsOysraSkge1xyXG4gICAgICAgIGFtLnB1c2goW2ksMV0pO1xyXG4gICAgICAgIGJtLnB1c2goW2RhdGFbaV1dKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB0YT1CYXNlTWF0aFV0aWxzLnRyYW5zTShhbSksIGE9QmFzZU1hdGhVdGlscy5tdWxNKHRhLGFtKSwgYj1CYXNlTWF0aFV0aWxzLm11bE0odGEsYm0pLFxyXG4gICAgICBkPShhWzBdWzBdKmFbMV1bMV0tYVsxXVswXSphWzBdWzFdKSxcclxuICAgICAgcD1bXHJcbiAgICAgICAgLShhWzBdWzFdKmJbMV1bMF0tYlswXVswXSphWzFdWzFdKS9kLFxyXG4gICAgICAgIChhWzBdWzBdKmJbMV1bMF0tYVsxXVswXSpiWzBdWzBdKS9kXHJcbiAgICAgIF07XHJcbiAgICAgIGZvcihsZXQgaT0wO2k8bnVtOysraSkge1xyXG4gICAgICAgIGNvbnN0IHYgPSBNYXRoLnJvdW5kKHBbMF0qKGkrbCkrcFsxXSk7XHJcbiAgICAgICAgaWYoci5pbmRleE9mKHYpPT09LTEpIHtcclxuICAgICAgICAgIHIucHVzaCh2KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFVuaXF1ZSgpIHtcclxuICAgIHJldHVybiBNYXRoLmNlaWwoMWU5Kk1hdGgucmFuZG9tKCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHNldFNwbGluZVBvaW50cyhzcGxpbmUsIHBzKSB7XHJcbiAgICBpZihzcGxpbmUucG9pbnRzLmxlbmd0aCE9PXBzLngubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnNvbGUud2Fybignc2V0U3BsaW5lUG9pbnRzOiBiYWQgcG9pbnRzJyk7XHJcbiAgICB9XHJcbiAgICBmb3IobGV0IGk9MDsgaTxzcGxpbmUucG9pbnRzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHNwbGluZS5wb2ludHNbaV0uc2V0KHBzLnhbaV0sIHBzLnlbaV0sIHBzLno/IHBzLnpbaV06IDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1hcGwyTChscywgbGVuLCBuLCBmKSB7XHJcbiAgICBjb25zdCBkTCA9IGxlbi8obi0xKTtcclxuICAgIGxldCBMPTA7XHJcbiAgICBmb3IobGV0IGk9MCwgZD1sc1swXTsgaTxscy5sZW5ndGgtMSAmJiBMPGxlbiswLjEqZEw7ICsraSwgZCs9bHNbaV0pIHtcclxuICAgICAgaWYoTWF0aC5hYnMoTC1kKTxNYXRoLmFicyhMLWQtbHNbaSsxXSkpIHtcclxuICAgICAgICBmKGksIEwpO1xyXG4gICAgICAgIEwrPWRMO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihMPGxlbiswLjEqZEwpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdtYXBsMkw6IGxzIGlzIG5vdCBlbm91Z2h0Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGV0MihhLGIsYyxkKSB7XHJcbiAgICByZXR1cm4gYSpkLWIqYztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBzb2x2ZTJMaW4oYTEsYjEsYTIsYjIpIHtcclxuICAgIGxldCByZXM7XHJcbiAgICBjb25zdCBkPUJhc2VNYXRoVXRpbHMuZGV0MihhMVswXSxhMVsxXSxhMlswXSxhMlsxXSk7XHJcbiAgICBpZihNYXRoLmFicyhkKT5CYXNlTWF0aFV0aWxzLmVwcykge1xyXG4gICAgICBjb25zdCBkeD1CYXNlTWF0aFV0aWxzLmRldDIoYjEsYTFbMV0sYjIsYTJbMV0pLCBkeT1CYXNlTWF0aFV0aWxzLmRldDIoYTFbMF0sYjEsYTJbMF0sYjIpO1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgeDogZHgvZCxcclxuICAgICAgICB5OiBkeS9kXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzSW5zaWRlUG9seShwcywgcCkge1xyXG4gICAgbGV0IGRvbmUgPSBmYWxzZSwgY3Q7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBpZihCYXNlTWF0aFV0aWxzLnYyZGlzdChwLCBwc1tpXSk8QmFzZU1hdGhVdGlscy5lcHMpIHtcclxuICAgICAgICBjdD0xO1xyXG4gICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB3aGlsZSghZG9uZSkge1xyXG4gICAgICBkb25lID0gdHJ1ZTtcclxuICAgICAgY3QgPSAwO1xyXG4gICAgICBsZXQgbnAgPSB7eDogcC54K01hdGgucmFuZG9tKCktMC41LCB5OiBwLnkrTWF0aC5yYW5kb20oKS0wLjV9LCBybiA9IHt4OiBucC54LXAueCwgeTogbnAueS1wLnl9LCBhMT1bcm4ueSwgLXJuLnhdLCBiMT1wLngqcm4ueS1wLnkqcm4ueDtcclxuICAgICAgZm9yKGxldCBpPTA7IGk8cHMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICBjb25zdCBwMD1wc1tpXSwgcDE9cHNbKGkrMSklcHMubGVuZ3RoXSwgbiA9IHt4OiBwMS54LXAwLngsIHk6IHAxLnktcDAueX0sIGEyPVtuLnksIC1uLnhdLCBiMj1wMC54Km4ueS1wMC55Km4ueCxcclxuICAgICAgICAgIGlwID0gQmFzZU1hdGhVdGlscy5zb2x2ZTJMaW4oYTEsYjEsYTIsYjIpO1xyXG4gICAgICAgIGlmKGlwKSB7XHJcbiAgICAgICAgICBpZihCYXNlTWF0aFV0aWxzLnYyZGlzdChpcCwgcDApPEJhc2VNYXRoVXRpbHMuZXBzIHx8IEJhc2VNYXRoVXRpbHMudjJkaXN0KGlwLCBwMSk8QmFzZU1hdGhVdGlscy5lcHMpIHtcclxuICAgICAgICAgICAgZG9uZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYoaXAueD5NYXRoLm1pbihwMC54LHAxLngpLUJhc2VNYXRoVXRpbHMuZXBzJiZpcC54PE1hdGgubWF4KHAwLngscDEueCkrQmFzZU1hdGhVdGlscy5lcHMgJiZcclxuICAgICAgICAgICAgICAgICAgaXAueT5NYXRoLm1pbihwMC55LHAxLnkpLUJhc2VNYXRoVXRpbHMuZXBzJiZpcC55PE1hdGgubWF4KHAwLnkscDEueSkrQmFzZU1hdGhVdGlscy5lcHMpIHtcclxuICAgICAgICAgICAgaWYoQmFzZU1hdGhVdGlscy52MmRpc3QoaXAsIHApPEJhc2VNYXRoVXRpbHMuZXBzKSB7XHJcbiAgICAgICAgICAgICAgY3Q9MTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCB0bj17eDogaXAueC1wLngsIHk6IGlwLnktcC55fTtcclxuICAgICAgICAgICAgICBjdCArPSB0bi54KnJuLngrdG4ueSpybi55PjA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdCUyO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzSW5zaWRlQ29udlBvbHkocHMsIHApIHtcclxuICAgIGxldCBzZyA9IFswLCAwXTtcclxuICAgIGZvcihsZXQgaT0wOyBpPHBzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHAwPXBzW2ldLCBwMT1wc1soaSsxKSVwcy5sZW5ndGhdLCBhPXt4OiBwMC54LXAueCwgeTogcDAueS1wLnl9LCBiPXt4OiBwMS54LXAueCwgeTogcDEueS1wLnl9O1xyXG4gICAgICArK3NnWyhhLngqYi55LWEueSpiLng8MCkrMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gfnNnLmluZGV4T2YocHMubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB2Mmxlbih2Mikge1xyXG4gICAgcmV0dXJuIE1hdGguc3FydCh2Mi54KnYyLngrdjIueSp2Mi55KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB2MmRpc3QodjIxLCB2MjIpIHtcclxuICAgIHJldHVybiBCYXNlTWF0aFV0aWxzLnYybGVuKHtcclxuICAgICAgeDogdjIyLngtdjIxLngsXHJcbiAgICAgIHk6IHYyMi55LXYyMS55XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjb21wdXRlU3F1YXJlKHBzKSB7XHJcbiAgICBjb25zdCBhID0gW107XHJcbiAgICBsZXQgcCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxwcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBhLnB1c2goQmFzZU1hdGhVdGlscy52MmRpc3QocHNbaV0sIHBzWyhpKzEpJXBzLmxlbmd0aF0pKTtcclxuICAgICAgcCArPSAwLjUqYVtpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLnNxcnQocCoocC1hWzBdKSoocC1hWzFdKSoocC1hWzJdKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY29tcHV0ZUludGVycENvZWZzKHRyaSwgcCkge1xyXG4gICAgY29uc3QgcyA9IEJhc2VNYXRoVXRpbHMuY29tcHV0ZVNxdWFyZSh0cmkpLCBjb2Vmcz1bXSwgbCA9IHRyaS5sZW5ndGg7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxsOyArK2kpIHtcclxuICAgICAgY29lZnNbaV0gPSBCYXNlTWF0aFV0aWxzLmNvbXB1dGVTcXVhcmUoW3AsIHRyaVsoaSsxKSVsXSwgdHJpWyhpKzIpJWxdXSkvcztcclxuICAgIH1cclxuICAgIHJldHVybiBjb2VmcztcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0Jhc2VNYXRoVXRpbHMuanMiLCJpbXBvcnQge1RIUkVFfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEJhc2VNYXRoVXRpbHMgZnJvbSAnLi9CYXNlTWF0aFV0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hdGhVdGlscyBleHRlbmRzIEJhc2VNYXRoVXRpbHMge1xyXG4gIHN0YXRpYyB2MSA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcblxyXG4gIHN0YXRpYyBzcGxpdFNwbGluZShzcGxpbmUsIE4pIHtcclxuICAgIGNvbnN0IG8gPSB7bGVuOiAwLCBsczogWzBdfSwgZGw9MS9OO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8PU47ICsraSkge1xyXG4gICAgICBjb25zdCBwID0gc3BsaW5lLmdldFBvaW50KGkqZGwpO1xyXG4gICAgICBpZihpKSB7XHJcbiAgICAgICAgY29uc3QgZCA9IE1hdGhVdGlscy52MS5kaXN0YW5jZVRvKHApO1xyXG4gICAgICAgIG8ubGVuICs9IGQ7XHJcbiAgICAgICAgby5scy5wdXNoKGQpO1xyXG4gICAgICB9XHJcbiAgICAgIE1hdGhVdGlscy52MS5jb3B5KHApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG87XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0TGluZWFySW5kZWNlcyhzcGxpbmUsIG4pIHtcclxuICAgIGNvbnN0IGRlbCA9IDUwMDAsIGREZWwgPSAxL2RlbDtcclxuICAgIGNvbnN0IGxzPVswXTtcclxuICAgIGxldCBsID0gMDtcclxuICAgIGZvcihsZXQgaT0wOyBpPD1kZWw7ICsraSkge1xyXG4gICAgICBjb25zdCBwID0gc3BsaW5lLmdldFBvaW50KGkqZERlbCk7XHJcbiAgICAgIGlmKGkpIHtcclxuICAgICAgICBjb25zdCBkPU1hdGhVdGlscy52MS5kaXN0YW5jZVRvKHApO1xyXG4gICAgICAgIGwgKz0gZDtcclxuICAgICAgICBscy5wdXNoKGQpO1xyXG4gICAgICB9XHJcbiAgICAgIE1hdGhVdGlscy52MS5jb3B5KHApO1xyXG4gICAgfVxyXG4gICAgbHMucHVzaCgxZTcpO1xyXG5cclxuICAgIGNvbnN0IHJlcyA9IFtdLCBkbCA9IGwvKG4tMSk7XHJcbiAgICBmb3IobGV0IGk9MCwgTD0wLCBkPWxzWzBdOyBpPGxzLmxlbmd0aC0xOyArK2ksIGQrPWxzW2ldKSB7XHJcbiAgICAgIGlmKE1hdGguYWJzKEwtZCk8TWF0aC5hYnMoTC1kLWxzW2krMV0pKSB7XHJcbiAgICAgICAgcmVzLnB1c2goaSpkRGVsKTtcclxuICAgICAgICBMKz1kbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVmaW5lUG9seShwb2x5LCBtYXhEbCkge1xyXG4gICAgY29uc3QgcmVzID0gW107XHJcbiAgICBmb3IobGV0IGk9MDsgaTxwb2x5Lmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHAwID0gcG9seVtpXSwgcDEgPSBwb2x5WyhpKzEpJXBvbHkubGVuZ3RoXSwgbCA9IEJhc2VNYXRoVXRpbHMudjJkaXN0KHAwLCBwMSksIG4gPSBNYXRoLmNlaWwobC9tYXhEbCksIGRsID0gbC9uO1xyXG4gICAgICByZXMucHVzaChwMCk7XHJcbiAgICAgIGZvcihsZXQgaj0xOyBqPG47ICsraikge1xyXG4gICAgICAgIHJlcy5wdXNoKG5ldyBUSFJFRS5WZWN0b3IyKFxyXG4gICAgICAgICAgcDAueCtqKmRsKihwMS54LXAwLngpL2wsXHJcbiAgICAgICAgICBwMC55K2oqZGwqKHAxLnktcDAueSkvbFxyXG4gICAgICAgICkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvTWF0aFV0aWxzLmpzIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbHMge1xyXG5cclxuICBzdGF0aWMgbm9ybWFsaXplVXJsKHVybCkge1xyXG4gICAgZnVuY3Rpb24gc3BsaXQocykge1xyXG4gICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXFxcL2csICcvJykuc3BsaXQoJy8nKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGJhc2UgPSBzcGxpdCh3aW5kb3cubG9jYXRpb24uaHJlZik7XHJcbiAgICB1cmwgPSBzcGxpdCh1cmwpO1xyXG4gICAgaWYoYmFzZVsyXT09PXVybFsyXSkge1xyXG4gICAgICB1cmxbMF0gPSBiYXNlWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVybC5qb2luKCcvJyk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZXh0ZW5kcyhkZXIsIGJhc2UpIHtcclxuICAgIGZvcihsZXQgbmFtZSBpbiBiYXNlKSB7XHJcbiAgICAgIGlmKCFkZXIuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICBkZXJbbmFtZV0gPSBiYXNlW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGVmYXVsdENtcChhLCBiKSB7XHJcbiAgICByZXR1cm4gYS1iO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGxvd2VyQm91bmQoYSwgeCwgY21wKSB7XHJcbiAgICBjbXAgPSBjbXAgfHwgVXRpbHMuZGVmYXVsdENtcDtcclxuICAgIGxldCBsID0gMCwgaCA9IGEubGVuZ3RoLTE7XHJcbiAgICB3aGlsZShoLWw+MSkge1xyXG4gICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobCArIGgpIC8gMik7XHJcbiAgICAgIGlmKGNtcCh4LCBhW21pZF0pPDApIHtcclxuICAgICAgICBoID0gbWlkO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGwgPSBtaWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjbXAoeCwgYVtoXSk+PTA/IGg6IGw7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9VdGlscy5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBHcmFwaFV0aWxzIGZyb20gJy4vR3JhcGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUJhc2Uge1xyXG5cclxuICBzdGF0aWMgcmVuZGVyQ2FudmFzID0gICQoJzxjYW52YXM+JylbMF07XHJcbiAgc3RhdGljIHJlbmRlckNhbnZhc0N0eCA9IEltYWdlQmFzZS5yZW5kZXJDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLnduZCA9IGNvbnRleHQud25kO1xyXG4gICAgdGhpcy5kb2MgPSBjb250ZXh0LmRvYztcclxuICAgIHRoaXMuZWxlbWVudCA9IGNvbnRleHQuZWxlbWVudCB8fCBjb250ZXh0LmRvYy5ib2R5O1xyXG4gICAgdGhpcy5jID0gY29udGV4dC5yZW5kZXJDYW52YXMgfHwgSW1hZ2VCYXNlLnJlbmRlckNhbnZhcztcclxuICAgIHRoaXMuY3R4ID0gY29udGV4dC5yZW5kZXJDYW52YXNDdHggfHwgSW1hZ2VCYXNlLnJlbmRlckNhbnZhc0N0eDtcclxuICAgIHRoaXMucmVzVyA9IHRoaXMud2lkdGggPSB3aWR0aDtcclxuICAgIHRoaXMucmVzSCA9IHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgdGhpcy5jb2xvciA9IGNvbG9yO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVzb2x1dGlvbihyZXMpIHtcclxuICAgIHRoaXMucmVzVyA9IHJlcy53aWR0aDtcclxuICAgIHRoaXMucmVzSCA9IHJlcy5oZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG5cclxuICB9XHJcblxyXG4gIHJlbmRlckJsYW5rUGFnZSgpIHtcclxuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgdGhpcy5jdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKHRoaXMuY29sb3IsIDEpO1xyXG4gICAgdGhpcy5jdHgucmVjdCgwLCAwLCB0aGlzLmMud2lkdGgsIHRoaXMuYy5oZWlnaHQpO1xyXG4gICAgdGhpcy5jdHguZmlsbCgpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVySW1hZ2UoaW1hZ2UpIHtcclxuICAgIHRoaXMucHVzaEN0eCgpO1xyXG4gICAgdGhpcy5jdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcclxuICAgIHRoaXMucG9wQ3R4KCk7XHJcbiAgfVxyXG5cclxuICBub3JtVG9Db252KHApIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHg6IHAueCp0aGlzLmMud2lkdGgsXHJcbiAgICAgIHk6ICgxLXAueSkqdGhpcy5jLmhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlbmRlckhpdChwb2x5KSB7XHJcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcclxuICAgIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyNTUsMjU1LDAsMC40KSc7XHJcbiAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICBsZXQgcCA9IHRoaXMubm9ybVRvQ29udihwb2x5WzBdKTtcclxuICAgIGN0eC5tb3ZlVG8ocC54LCBwLnkpO1xyXG4gICAgZm9yKGxldCBpPTE7IGk8cG9seS5sZW5ndGg7ICsraSkge1xyXG4gICAgICBwID0gdGhpcy5ub3JtVG9Db252KHBvbHlbaV0pO1xyXG4gICAgICBjdHgubGluZVRvKHAueCwgcC55KTtcclxuICAgIH1cclxuICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgIGN0eC5maWxsKCk7XHJcbiAgfVxyXG5cclxuICBwdXNoQ3R4KCkge1xyXG4gICAgaWYodGhpcy5yZXNXIT10aGlzLmMud2lkdGgpIHtcclxuICAgICAgdGhpcy5jLndpZHRoID0gdGhpcy5yZXNXO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5yZXNIIT10aGlzLmMuaGVpZ2h0KSB7XHJcbiAgICAgIHRoaXMuYy5oZWlnaHQgPSB0aGlzLnJlc0g7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN0eC5zYXZlKCk7XHJcbiAgICB0aGlzLmN0eC5zY2FsZSh0aGlzLmMud2lkdGgvdGhpcy53aWR0aCwgdGhpcy5jLmhlaWdodC90aGlzLmhlaWdodCk7XHJcbiAgICByZXR1cm4gdGhpcy5jdHg7XHJcbiAgfVxyXG5cclxuICBwb3BDdHgoKSB7XHJcbiAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJOb3RGb3VuZFBhZ2UoKSB7XHJcbiAgICB0aGlzLnJlbmRlckJsYW5rUGFnZSgpO1xyXG4gIH1cclxuXHJcbiAgZmluaXNoUmVuZGVyKCkge1xyXG4gICAgaWYodGhpcy5vbkNoYW5nZSkge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuYyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmaW5pc2hMb2FkKCkge1xyXG4gICAgaWYodGhpcy5vbkxvYWQpIHtcclxuICAgICAgdGhpcy5vbkxvYWQoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXJ0UmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTaW11bGF0ZWREb2MoKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvSW1hZ2VCYXNlLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50Q29udmVydGVyIHtcclxuXHJcbiAgLy8gdmlydHVhbHNcclxuICAvLyBnZXRPYmplY3QoZSwgZGF0YSk7XHJcbiAgLy8gZ2V0Q2FsbGJhY2sob2JqZWN0KTtcclxuICAvLyB0ZXN0KG9iamVjdDEsIG9iamVjdDEpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYykge1xyXG4gICAgdGhpcy53bmQgPSB3bmQ7XHJcbiAgICB0aGlzLmRvYyA9IGRvYztcclxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZXRFbmFibGUodmwpIHtcclxuICAgIGlmKCF2bCkge1xyXG4gICAgICBpZih0aGlzLm1DYXBPYmplY3QpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLm1DYXBPYmplY3QsICQuRXZlbnQoJ21vdXNldXAnKSwgJ21vdXNldXAnKTtcclxuICAgICAgICB0aGlzLm1DYXBPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYodGhpcy5tSG92T2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZnkodGhpcy5tSG92T2JqZWN0LCAkLkV2ZW50KCdtb3VzZW91dCcpLCAnbW91c2VvdXQnKTtcclxuICAgICAgICB0aGlzLm1Ib3ZPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZW5hYmxlZCA9IHZsO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2FsbGJhY2sob2JqZWN0KSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgbm90aWZ5KG9iamVjdCwgZSwgdHlwZSkge1xyXG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmdldENhbGxiYWNrKG9iamVjdCk7XHJcbiAgICBpZihjYWxsYmFjaykge1xyXG4gICAgICBjb25zdCBwcm9wcyA9IHtcclxuICAgICAgICAuLi5lLFxyXG4gICAgICAgIHR5cGUsXHJcbiAgICAgICAgdmlldzogdGhpcy53bmRcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgakUgPSAkLkV2ZW50KHR5cGUsIHByb3BzKTtcclxuICAgICAgY2FsbGJhY2soakUsIG9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0KGUsIGRhdGEpIHtcclxuICAgIGlmKCF0aGlzLmVuYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBpZih0aGlzLmZpbHRlcikge1xyXG4gICAgICBlID0gdGhpcy5maWx0ZXIodGhpcy5lbGVtZW50LCBlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvYmplY3QgPSB0aGlzLmdldE9iamVjdChlLCBkYXRhKSxcclxuICAgICAgbm90aWZ5ID0gfmUudHlwZS5pbmRleE9mKCd0b3VjaCcpPyB0aGlzLmNvbnZlcnRUb3VjaChlLCBkYXRhLCBvYmplY3QpOiB0aGlzLmNvbnZlcnRNb3VzZShlLCBkYXRhLCBvYmplY3QpO1xyXG4gICAgaWYobm90aWZ5ICYmIG9iamVjdCkge1xyXG4gICAgICB0aGlzLm5vdGlmeShvYmplY3QsIGUsIGUudHlwZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0VG91Y2goZSwgZGF0YSwgb2JqZWN0KSB7XHJcbiAgICBsZXQgbm90aWZ5ID0gdHJ1ZTtcclxuICAgIHN3aXRjaChlLnR5cGUpIHtcclxuICAgICAgY2FzZSAndG91Y2hzdGFydCc6IHtcclxuICAgICAgICBpZih0aGlzLnRDYXBPYmplY3QpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMudENhcE9iamVjdCwgZSwgJ3RvdWNoZW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudENhcE9iamVjdCA9IG9iamVjdDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICd0b3VjaGVuZCc6IHtcclxuICAgICAgICBpZih0aGlzLnRDYXBPYmplY3QgJiYgIXRoaXMudGVzdCh0aGlzLnRDYXBPYmplY3QsIG9iamVjdCkpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMudENhcE9iamVjdCwgZSwgJ3RvdWNoZW5kJyk7XHJcbiAgICAgICAgICBub3RpZnkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihvYmplY3QgJiYgdGhpcy50ZXN0KHRoaXMudENhcE9iamVjdCwgb2JqZWN0KSkge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZnkob2JqZWN0LCBlLCAndG91Y2h0YXAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50Q2FwT2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ3RvdWNodGFwJzoge1xyXG4gICAgICAgIG5vdGlmeSA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm90aWZ5O1xyXG4gIH1cclxuXHJcbiAgY29udmVydE1vdXNlKGUsIGRhdGEsIG9iamVjdCkge1xyXG4gICAgbGV0IG5vdGlmeSA9IHRydWU7XHJcbiAgICBzd2l0Y2goZS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ21vdXNlZG93bic6IHtcclxuICAgICAgICBpZih0aGlzLm1DYXBPYmplY3QpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMubUNhcE9iamVjdCwgZSwgJ21vdXNldXAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tQ2FwT2JqZWN0ID0gb2JqZWN0O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ21vdXNldXAnOiB7XHJcbiAgICAgICAgaWYodGhpcy5tQ2FwT2JqZWN0ICYmICF0aGlzLnRlc3QodGhpcy5tQ2FwT2JqZWN0LCBvYmplY3QpKSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLm1DYXBPYmplY3QsIGUsICdtb3VzZXVwJyk7XHJcbiAgICAgICAgICBub3RpZnkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnY2xpY2snOiB7XHJcbiAgICAgICAgbm90aWZ5ID0gdGhpcy50ZXN0KHRoaXMubUNhcE9iamVjdCwgb2JqZWN0KTtcclxuICAgICAgICB0aGlzLm1DYXBPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbW91c2VlbnRlcic6XHJcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XHJcbiAgICAgIGNhc2UgJ21vdXNlbW92ZSc6IHtcclxuICAgICAgICBpZighdGhpcy50ZXN0KHRoaXMubUhvdk9iamVjdCwgb2JqZWN0KSAmJiB0aGlzLm1Ib3ZPYmplY3QpIHtcclxuICAgICAgICAgIHRoaXMubm90aWZ5KHRoaXMubUhvdk9iamVjdCwgZSwgJ21vdXNlb3V0Jyk7XHJcbiAgICAgICAgICB0aGlzLm1Ib3ZPYmplY3QgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLm1Ib3ZPYmplY3QgJiYgb2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeShvYmplY3QsIGUsICdtb3VzZW92ZXInKTtcclxuICAgICAgICAgIHRoaXMubUhvdk9iamVjdCA9IG9iamVjdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm90aWZ5ID0gZS50eXBlID09PSAnbW91c2Vtb3ZlJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdtb3VzZWxlYXZlJzpcclxuICAgICAgY2FzZSAnbW91c2VvdXQnOiB7XHJcbiAgICAgICAgaWYodGhpcy5tSG92T2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmeSh0aGlzLm1Ib3ZPYmplY3QsIGUsICdtb3VzZW91dCcpO1xyXG4gICAgICAgICAgdGhpcy5tSG92T2JqZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBub3RpZnkgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vdGlmeTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0V2ZW50Q29udmVydGVyLmpzIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgR3JhcGhVdGlscyB7XHJcblxyXG4gIHN0YXRpYyBleHRyYXBvbGF0ZUxpbmVhcih4LHkseGkpIHtcclxuICAgIHJldHVybiB5WzBdKyh5WzFdLXlbMF0pLyh4WzFdLXhbMF0pKih4aS14WzBdKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpbnRlcnBvbGF0ZTAxKHkxLHkyLHQpIHtcclxuICAgIHJldHVybiBHcmFwaFV0aWxzLmV4dHJhcG9sYXRlTGluZWFyKFswLDFdLFt5MSx5Ml0sdCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0Q29sb3JCeXRlcyhjb2xvcikge1xyXG4gICAgcmV0dXJuIFsoY29sb3I+PjE2KSYweEZGLCAoY29sb3I+PjgpJjB4RkYsIGNvbG9yJjB4RkZdO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGludmVyc2VDb2xvcihjb2xvciwgdD0xKSB7XHJcbiAgICBjb25zdCBicz1HcmFwaFV0aWxzLmdldENvbG9yQnl0ZXMoY29sb3IpLFxyXG4gICAgICAgICAgaWJzPVsweEZGLWJzWzBdLDB4RkYtYnNbMV0sMHhGRi1ic1syXV0sXHJcbiAgICAgICAgICBuYnM9W01hdGgucm91bmQoR3JhcGhVdGlscy5pbnRlcnBvbGF0ZTAxKGJzWzBdLGlic1swXSx0KSksTWF0aC5yb3VuZChHcmFwaFV0aWxzLmludGVycG9sYXRlMDEoYnNbMV0saWJzWzFdLHQpKSxNYXRoLnJvdW5kKEdyYXBoVXRpbHMuaW50ZXJwb2xhdGUwMShic1syXSxpYnNbMl0sdCkpXTtcclxuICAgIHJldHVybiBHcmFwaFV0aWxzLmJ5dGVzMkNvbG9yKG5icyk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY29sb3IyUmdiYShjb2xvciwgYSkge1xyXG4gICAgcmV0dXJuIEdyYXBoVXRpbHMuYnl0ZXMyUmdiYShHcmFwaFV0aWxzLmdldENvbG9yQnl0ZXMoY29sb3IpLCBhKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBieXRlczJSZ2JhKGJzLCBhKSB7XHJcbiAgICByZXR1cm4gJ3JnYmEoJyticy5qb2luKCcsJykrJywnK2ErJyknO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGJ5dGVzMkNvbG9yKGJzKSB7XHJcbiAgICByZXR1cm4gYnNbMl18KGJzWzFdPDw4KXwoYnNbMF08PDE2KVxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9HcmFwaFV0aWxzLmpzIiwiaW1wb3J0IENhY2hlIGZyb20gJy4vQ2FjaGUnO1xyXG5pbXBvcnQgQmxhbmtJbWFnZSBmcm9tICcuL0JsYW5rSW1hZ2UnO1xyXG5pbXBvcnQgU3RhdGljSW1hZ2UgZnJvbSAnLi9TdGF0aWNJbWFnZSc7XHJcbmltcG9ydCBQZGZJbWFnZSBmcm9tICcuL1BkZkltYWdlJztcclxuaW1wb3J0IEludGVyYWN0aXZlSW1hZ2UgZnJvbSAnLi9JbnRlcmFjdGl2ZUltYWdlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlRmFjdG9yeSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNhY2hlKSB7XHJcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlIHx8IG5ldyBDYWNoZSgpO1xyXG4gIH1cclxuXHJcbiAgYnVpbGQoaW5mbywgbj0wLCB3aWR0aFRleGVscz0yMTAsIGhlaWdodFRleGVscz0yOTcsIGNvbG9yPTB4RkZGRkZGLCBpbmplY3Rvcj11bmRlZmluZWQpIHtcclxuICAgIGxldCBpbWFnZTtcclxuICAgIHN3aXRjaChpbmZvLnR5cGUpIHtcclxuICAgICAgY2FzZSAnaHRtbCc6IHtcclxuICAgICAgICBpbWFnZSA9IG5ldyBJbnRlcmFjdGl2ZUltYWdlKHRoaXMuY29udGV4dCwgd2lkdGhUZXhlbHMsIGhlaWdodFRleGVscywgY29sb3IsIGluZm8uc3JjLCB0aGlzLmNhY2hlLCBpbmplY3Rvcik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnaW1hZ2UnOiB7XHJcbiAgICAgICAgaW1hZ2UgPSBuZXcgU3RhdGljSW1hZ2UodGhpcy5jb250ZXh0LCB3aWR0aFRleGVscywgaGVpZ2h0VGV4ZWxzLCBjb2xvciwgaW5mby5zcmMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ3BkZic6IHtcclxuICAgICAgICBpbWFnZSA9IG5ldyBQZGZJbWFnZSh0aGlzLmNvbnRleHQsIHdpZHRoVGV4ZWxzLCBoZWlnaHRUZXhlbHMsIGNvbG9yLCBpbmZvLnNyYywgbik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnYmxhbmsnOlxyXG4gICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgaW1hZ2UgPSBuZXcgQmxhbmtJbWFnZSh0aGlzLmNvbnRleHQsIHdpZHRoVGV4ZWxzLCBoZWlnaHRUZXhlbHMsIGNvbG9yKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGltYWdlO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9JbWFnZUZhY3RvcnkuanMiLCJpbXBvcnQge3Byb3BzIGFzICBib29rUHJvcHN9IGZyb20gJy4uL3Byb3BzL2Jvb2snO1xyXG5pbXBvcnQgQmFzZU1hdGhVdGlscyBmcm9tICdCYXNlTWF0aFV0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvb2tQcm9wc0J1aWxkZXIge1xyXG4gIGNvbnN0cnVjdG9yKG9uUmVhZHkpIHtcclxuICAgIHRoaXMub25SZWFkeSA9IG9uUmVhZHk7XHJcbiAgICB0aGlzLmRlZmF1bHRzID0gYm9va1Byb3BzKCk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG5cclxuICB9XHJcblxyXG4gIGNhbGNTaXplKHdpZHRoLCBoZWlnaHQpIHtcclxuICAgIGNvbnN0IHNjYWxlID0gQmFzZU1hdGhVdGlscy5jYWxjU2NhbGUod2lkdGgsIGhlaWdodCwgdGhpcy5kZWZhdWx0cy53aWR0aCwgdGhpcy5kZWZhdWx0cy5oZWlnaHQpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkdGg6IHNjYWxlKndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IHNjYWxlKmhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNhbGNUZXhlbHMod2lkdGgsIGhlaWdodCkge1xyXG4gICAgY29uc3Qgc2hlZXQgPSB0aGlzLmRlZmF1bHRzLnNoZWV0LCBzY2FsZSA9IEJhc2VNYXRoVXRpbHMuY2FsY1NjYWxlKHdpZHRoLCBoZWlnaHQsIHNoZWV0LndpZHRoVGV4ZWxzLCBzaGVldC5oZWlnaHRUZXhlbHMpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgd2lkdGhUZXhlbHM6IHNjYWxlKndpZHRoLFxyXG4gICAgICBoZWlnaHRUZXhlbHM6IHNjYWxlKmhlaWdodFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNhbGNQcm9wcyh3aWR0aCwgaGVpZ2h0KSB7XHJcbiAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICAuLi50aGlzLmRlZmF1bHRzLFxyXG4gICAgICAuLi50aGlzLmNhbGNTaXplKHdpZHRoLCBoZWlnaHQpLFxyXG4gICAgICBzaGVldDoge1xyXG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdHMuc2hlZXQsXHJcbiAgICAgICAgLi4udGhpcy5jYWxjVGV4ZWxzKHdpZHRoLCBoZWlnaHQpXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvdmVyOiB7XHJcbiAgICAgICAgLi4udGhpcy5kZWZhdWx0cy5jb3ZlcixcclxuICAgICAgfSxcclxuICAgICAgcGFnZToge1xyXG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdHMucGFnZSxcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNhbGNTaGVldHMocGFnZXMpIHtcclxuICAgIHJldHVybiB0aGlzLnNoZWV0cyA9IE1hdGguY2VpbChNYXRoLm1heCgwLCBwYWdlcy00KS8yKTtcclxuICB9XHJcblxyXG4gIGdldFNoZWV0cygpIHtcclxuICAgIHJldHVybiB0aGlzLnNoZWV0cztcclxuICB9XHJcblxyXG4gIGdldFByb3BzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvcHM7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlQ2FsbGJhY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5iaW5kcy5wYWdlQ2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICByZWFkeSgpIHtcclxuICAgIGlmKHRoaXMub25SZWFkeSkge1xyXG4gICAgICB0aGlzLm9uUmVhZHkodGhpcy5nZXRQcm9wcygpLCB0aGlzLmdldFNoZWV0cygpLCB0aGlzLmdldFBhZ2VDYWxsYmFjaygpKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9Cb29rUHJvcHNCdWlsZGVyLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBzaGVldEJsb2NrIGZyb20gJy4uL21vZGVscy9zaGVldEJsb2NrJztcclxuaW1wb3J0IE1hdGhVdGlscyBmcm9tICdNYXRoVXRpbHMnO1xyXG5pbXBvcnQgVGhyZWVVdGlscyBmcm9tICdUaHJlZVV0aWxzJztcclxuLy8gaW1wb3J0IFRocmVlTWFya3VwIGZyb20gJy4vVGhyZWVNYXJrdXAnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlZXRCbG9jayB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgcCwgZmlyc3QsIGxhc3QsIGFuZ2xlPTAsIHN0YXRlPSdjbG9zZWQnLCBoZWlnaHQ9MCkge1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWw7XHJcbiAgICB0aGlzLnAgPSB7XHJcbiAgICAgIC4uLnAsXHJcbiAgICAgIGZpcnN0LFxyXG4gICAgICBsYXN0XHJcbiAgICB9O1xyXG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKCk7XHJcblxyXG4gICAgY29uc3QgbG9hZGVkUG9pbnRzID0gdGhpcy5sb2FkUG9pbnRzKCk7XHJcbiAgICBPYmplY3Qua2V5cyhsb2FkZWRQb2ludHMpLm1hcCgoayk9PiB7XHJcbiAgICAgIHRoaXNba10gPSBsb2FkZWRQb2ludHNba11bcHJvcHMuc2hhcGVdIHx8IGxvYWRlZFBvaW50c1trXVswXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucFNwbGluZSA9IG5ldyBUSFJFRS5TcGxpbmUoW10pO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8dGhpcy5pbnRlcnBvbGF0aW9uUG9pbnRzLnhbMF0ubGVuZ3RoOyArK2kpIHtcclxuICAgIFx0dGhpcy5wU3BsaW5lLnBvaW50cy5wdXNoKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaVNwbGluZSA9IG5ldyBUSFJFRS5TcGxpbmUoW10pO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8c2hlZXRCbG9jay5yZXNYOyArK2kpIHtcclxuICAgIFx0dGhpcy5pU3BsaW5lLnBvaW50cy5wdXNoKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYVNwbGluZXMgPSBbXTtcclxuXHJcbiAgICAvL3RoaXMudGhyZWUgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuXHJcbiAgICB0aGlzLmdlb21ldHJ5ID0gc2hlZXRCbG9jay5nZW9tZXRyeS5jbG9uZSgpO1xyXG5cclxuICAgIHRoaXMucC5zaWRlRmFjZXMgPSBbe1xyXG4gICAgICAgIGZpcnN0OiAwLFxyXG4gICAgICAgIGxhc3Q6IHNoZWV0QmxvY2suZmFjZXNbMF1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGZpcnN0OiBzaGVldEJsb2NrLmZhY2VzWzBdLFxyXG4gICAgICAgIGxhc3Q6IHNoZWV0QmxvY2suZmFjZXNbMV1cclxuICAgICAgfVxyXG4gICAgXTtcclxuXHJcbiAgICB0aGlzLnNpZGVUZXh0dXJlID0gbmV3IFRIUkVFLlRleHR1cmUoKTtcclxuICAgIHRoaXMuc2lkZVRleHR1cmUud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZztcclxuICAgIHRoaXMuc2lkZVRleHR1cmUucmVwZWF0LnNldCgwLCBsYXN0LWZpcnN0KTtcclxuICAgIHRoaXMuc2lkZVRleHR1cmUuaW1hZ2UgPSBwcm9wcy5zaWRlVGV4dHVyZTtcclxuICAgIHRoaXMuc2lkZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMubWF0ZXJpYWxzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7bWFwOiB0aGlzLnNpZGVUZXh0dXJlfSksXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHttYXA6IHRoaXMuc2lkZVRleHR1cmV9KSxcclxuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe21hcDogdGhpcy5zaWRlVGV4dHVyZX0pLFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7bWFwOiB0aGlzLnNpZGVUZXh0dXJlfSlcclxuICAgICAgICAgICAgICAgICAgXTtcclxuXHJcbiAgICB0aGlzLnAuc2V0VGV4dHVyZSh0aGlzLm1hdGVyaWFsc1swXSwgMipmaXJzdCk7XHJcbiAgICB0aGlzLnAuc2V0VGV4dHVyZSh0aGlzLm1hdGVyaWFsc1sxXSwgMipsYXN0LTEpO1xyXG5cclxuICAgIHRoaXMubWVzaCA9IG5ldyBUSFJFRS5NZXNoKHRoaXMuZ2VvbWV0cnksIG5ldyBUSFJFRS5NZXNoRmFjZU1hdGVyaWFsKHRoaXMubWF0ZXJpYWxzKSk7XHJcbiAgICB0aGlzLm1lc2guY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG4gICAgdGhpcy5tZXNoLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcclxuICAgIC8vIHRoaXMubWVzaC5mcnVzdHVtQ3VsbGVkID0gdHJ1ZTtcclxuXHJcbiAgICAvL3RoaXMudGhyZWUuYWRkKHRoaXMubWVzaCk7XHJcbiAgICB0aGlzLnRocmVlID0gdGhpcy5tZXNoO1xyXG4gICAgdGhpcy50aHJlZS51c2VyRGF0YS5zZWxmID0gdGhpcztcclxuXHJcbiAgICB0aGlzLm1hcmtlcnMgPSBbXTtcclxuICAgIGlmKHRoaXMucC5tYXJrZXIudXNlKSB7XHJcbiAgICAgIGNvbnN0IGw9dGhpcy5nZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICAgIGxldCBpcztcclxuICAgICAgLy8gaXMgPSBbMCwgc2hlZXRCbG9jay5yZXNYLTEsIChzaGVldEJsb2NrLnJlc1otMSkqc2hlZXRCbG9jay5yZXNYLCBzaGVldEJsb2NrLnJlc1oqc2hlZXRCbG9jay5yZXNYLTFdO1xyXG4gICAgICBpcyA9IEFycmF5LmFwcGx5KDAsIEFycmF5KGwpKS5tYXAoKF8sIGkpPT4gaSk7XHJcblxyXG4gICAgICBmb3IobGV0IGkgb2YgaXMpIHtcclxuICAgICAgICBjb25zdCBtYXJrZXIgPSBUaHJlZVV0aWxzLmNyZWF0ZU1hcmtlcih0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW2ldLCBpPGwvMj8weEZGMDAwMDoweDAwRkYwMCwgdGhpcy5wLm1hcmtlci5zaXplKTtcclxuICAgICAgICB0aGlzLm1hcmtlcnMucHVzaCh7XHJcbiAgICAgICAgICBtYXJrZXIsXHJcbiAgICAgICAgICB2ZXJ0ZXg6IGlcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnRocmVlLmFkZChtYXJrZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb3JuZXIgPSB7XHJcbiAgICAgIHVzZTogdHJ1ZSxcclxuICAgICAgaGVpZ2h0OiAwLFxyXG4gICAgICBtYXhEaXN0YW5jZTogMCxcclxuICAgICAgcG9pbnRzOiBbXSxcclxuICAgICAgT1o6IG5ldyBUSFJFRS5WZWN0b3IzKDAsMCwxKSxcclxuICAgICAgYXhpczogbmV3IFRIUkVFLlZlY3RvcjMoKVxyXG4gICAgfTtcclxuICAgIHRoaXMuc2V0KDAsICdjbG9zZWQnLCBoZWlnaHQsIGZpcnN0LCBsYXN0KTsgLy8gY2FsY3VsYXRlIGNvcm5lciBwb2ludHNcclxuXHJcbiAgICB0aGlzLnNldChhbmdsZSwgc3RhdGUsIGhlaWdodCwgZmlyc3QsIGxhc3QpOyAvLyBpbml0IHBvc2l0aW9uXHJcblxyXG4gICAgLy8gaWYoIVNoZWV0QmxvY2subWFya3VwKSB7XHJcbiAgICAvLyAgIFNoZWV0QmxvY2subWFya3VwPXRydWU7XHJcbiAgICAvLyAgIHRoaXMubWFya3VwID0gbmV3IFRocmVlTWFya3VwKHRoaXMsIDAsIFt7XHJcbiAgICAvLyAgICAgeDogMCxcclxuICAgIC8vICAgICB5OiAwLFxyXG4gICAgLy8gICB9LCB7XHJcbiAgICAvLyAgICAgeDogMC41LFxyXG4gICAgLy8gICAgIHk6IDFcclxuICAgIC8vICAgfSwge1xyXG4gICAgLy8gICAgIHg6IDEsXHJcbiAgICAvLyAgICAgeTogMFxyXG4gICAgLy8gICB9XS5tYXAoKHApPT5uZXcgVEhSRUUuVmVjdG9yMihwLngsIHAueSkpLCB7fSk7XHJcbiAgICAvLyB9XHJcblxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGZvcihsZXQgbSBvZiB0aGlzLm1hdGVyaWFscykge1xyXG4gICAgICBpZihtLm1hcCkge1xyXG4gICAgICAgIG0ubWFwID0gbnVsbDtcclxuICAgICAgICBtLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBtLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLm1hdGVyaWFscztcclxuICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnAubGFzdC10aGlzLnAuZmlyc3Q7XHJcbiAgfVxyXG5cclxuICBnZXRQcm9wcygpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLnRoaXMucC5wYWdlLFxyXG4gICAgICBzaGVldHM6IHRoaXMucC5zaGVldHNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRUb3BDZXJuZXJzKCkge1xyXG4gICAgY29uc3Qgb2ZmID0gdGhpcy5hbmdsZT5NYXRoLlBJLzI/IHRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoLzI6IDA7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbb2ZmXSxcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW3NoZWV0QmxvY2sucmVzWC0xK29mZl0sXHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1soc2hlZXRCbG9jay5yZXNaLTEpKnNoZWV0QmxvY2sucmVzWCtvZmZdLFxyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbc2hlZXRCbG9jay5yZXNaKnNoZWV0QmxvY2sucmVzWC0xK29mZl1cclxuICAgICAgXTtcclxuICB9XHJcblxyXG4gIGdldFRvcFNpemUoKSB7XHJcbiAgICAvLyBjb25zdCBsPXRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoLCBvZmYgPSB0aGlzLmFuZ2xlPk1hdGguUEkvMj8gbC8yOiAwLFxyXG4gICAgLy8gICB2MCA9IHRoaXMuZ2VvbWV0cnkudmVydGljZXNbb2ZmXSwgdjEgPSB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW3NoZWV0QmxvY2sucmVzWipzaGVldEJsb2NrLnJlc1gtMStvZmZdO1xyXG4gICAgLy8gLy8gaXMgPSBbMCwgc2hlZXRCbG9jay5yZXNYLTEsIChzaGVldEJsb2NrLnJlc1otMSkqc2hlZXRCbG9jay5yZXNYLCBzaGVldEJsb2NrLnJlc1oqc2hlZXRCbG9jay5yZXNYLTFdO1xyXG4gICAgLy8gcmV0dXJuIHtcclxuICAgIC8vICAgd2lkdGg6IE1hdGguYWJzKHYxLngtdjAueCksXHJcbiAgICAvLyAgIGhlaWdodDogTWF0aC5hYnModjEuei12MC56KVxyXG4gICAgLy8gfTtcclxuICAgIGNvbnN0IHZzID0gdGhpcy5nZXRUb3BDZXJuZXJzKCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogdnNbMF0uZGlzdGFuY2VUbyh2c1sxXSksXHJcbiAgICAgIGhlaWdodDogdnNbMF0uZGlzdGFuY2VUbyh2c1syXSlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRUb3BXb3JsZFJvdGF0aW9uKHEpIHtcclxuICAgIHEueCA9IC1NYXRoLlBJLzI7XHJcbiAgICByZXR1cm4gcTtcclxuICB9XHJcblxyXG4gIGdldFRvcFdvcmxkUG9zaXRpb24odikge1xyXG4gICAgY29uc3QgbD10aGlzLmdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCwgb2ZmID0gdGhpcy5hbmdsZT5NYXRoLlBJLzI/IGwvMjogMCwgdnMgPSBbXHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tvZmZdLFxyXG4gICAgICAgIHRoaXMuZ2VvbWV0cnkudmVydGljZXNbc2hlZXRCbG9jay5yZXNYLTErb2ZmXSxcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzWyhzaGVldEJsb2NrLnJlc1otMSkqc2hlZXRCbG9jay5yZXNYK29mZl0sXHJcbiAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tzaGVldEJsb2NrLnJlc1oqc2hlZXRCbG9jay5yZXNYLTErb2ZmXVxyXG4gICAgICBdO1xyXG4gICAgdi5zZXQoMCwgMCwgMCk7XHJcbiAgICBmb3IobGV0IHZpIG9mIHZzKSB7XHJcbiAgICAgIHYueCArPSAwLjI1KnZpLng7XHJcbiAgICAgIHYueSArPSAwLjI1KnZpLnk7XHJcbiAgICAgIHYueiArPSAwLjI1KnZpLno7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRocmVlLmxvY2FsVG9Xb3JsZCh2KTtcclxuICAgIHJldHVybiB2O1xyXG4gIH1cclxuXHJcbiAgZ2V0SW50ZXJwb2xhdGlvblBvaW50cyhpbmRzLCBtb2QpIHtcclxuICAgIGNvbnN0IHBzID0ge3g6IFtdLCB5OiBbXX0sIEsgPSB0aGlzLmdldFByb3BzKCkud2F2ZTtcclxuICAgIGZvcihsZXQgaSBvZiBpbmRzKSB7XHJcbiAgICAgIHBzLngucHVzaChbLi4udGhpcy5pbnRlcnBvbGF0aW9uUG9pbnRzLnhbaV1dKTtcclxuICAgICAgcHMueS5wdXNoKH5tb2QuaW5kZXhPZihpKT8gdGhpcy5pbnRlcnBvbGF0aW9uUG9pbnRzLnlbaV0ubWFwKChuKT0+IEsqbik6IFsuLi50aGlzLmludGVycG9sYXRpb25Qb2ludHMueVtpXV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBzO1xyXG4gIH1cclxuXHJcbiAgc2V0KGFuZ2xlLCBzdGF0ZT10aGlzLnN0YXRlLCBoZWlnaHQ9dGhpcy5jb3JuZXIuaGVpZ2h0LCBmaXJzdD10aGlzLnAuZmlyc3QsIGxhc3Q9dGhpcy5wLmxhc3QpIHtcclxuICAgIGNvbnN0IFBJID0gTWF0aC5QSTtcclxuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcclxuICAgIGxldCBjbG9zZWRBbmdsZSwgYmluZGVyVHVybjtcclxuICAgIGlmKHR5cGVvZiBhbmdsZT09PSdvYmplY3QnKSB7XHJcbiAgICAgIHRoaXMuYW5nbGUgPSBhbmdsZS5vcGVuZWRBbmdsZTtcclxuICAgICAgY2xvc2VkQW5nbGUgPSBhbmdsZS5jbG9zZWRBbmdsZTtcclxuICAgICAgYmluZGVyVHVybiA9IGFuZ2xlLmJpbmRlclR1cm4+UEkvMj9QSS1hbmdsZS5iaW5kZXJUdXJuOmFuZ2xlLmJpbmRlclR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb3JuZXIuaGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgaWYodGhpcy5wLmZpcnN0IT09Zmlyc3QgfHwgdGhpcy5wLmxhc3QhPT1sYXN0KSB7XHJcbiAgICAgIHRoaXMuc2lkZVRleHR1cmUucmVwZWF0LnNldCgwLCBsYXN0LWZpcnN0KTtcclxuICAgICAgdGhpcy5zaWRlVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIGlmKHRoaXMucC5maXJzdCE9PWZpcnN0KSB7XHJcbiAgICAgICAgdGhpcy5wLnNldFRleHR1cmUodGhpcy5tYXRlcmlhbHNbMF0sIDIqZmlyc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHRoaXMucC5sYXN0IT09bGFzdCkge1xyXG4gICAgICAgIHRoaXMucC5zZXRUZXh0dXJlKHRoaXMubWF0ZXJpYWxzWzFdLCAyKmxhc3QtMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucC5maXJzdCA9IGZpcnN0O1xyXG4gICAgdGhpcy5wLmxhc3QgPSBsYXN0O1xyXG4gICAgbGV0IHBvaW50cztcclxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcygpO1xyXG4gICAgaWYodGhpcy5zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcclxuICAgICAgcG9pbnRzID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uUG9pbnRzKHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMsIHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLnN0YXRlID09PSAnb3BlbmVkJykge1xyXG4gICAgICBpZihjbG9zZWRBbmdsZSE9PXVuZGVmaW5lZCAmJiBNYXRoLmFicyhjbG9zZWRBbmdsZS1QSS8yKT4xZS0yKSB7XHJcbiAgICAgICAgcG9pbnRzID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uUG9pbnRzKHRoaXMuZmxhdEludGVycG9sYXRpb25JbmRlY2VzLCBbXSk7XHJcbiAgICAgICAgY29uc3QgcHMgPSB0aGlzLmdldFBvaW50c0F0QW5nbGUodGhpcy5nZXRJbnRlcnBvbGF0aW9uUG9pbnRzKHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMsIHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMpLCBjbG9zZWRBbmdsZT5QSS8yP1BJLWNsb3NlZEFuZ2xlOmNsb3NlZEFuZ2xlKTtcclxuICAgICAgICBwb2ludHMueCA9IFtwcy54LC4uLnBvaW50cy54XTtcclxuICAgICAgICBwb2ludHMueSA9IFtwcy55LC4uLnBvaW50cy55XTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhwcyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcG9pbnRzID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uUG9pbnRzKHRoaXMub3BlbmVkSW50ZXJwb2xhdGlvbkluZGVjZXMsIHRoaXMuY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgaGwsIGhyLCBvZmZzZXQgPSAwLjUqcHJvcHMuc2hlZXRzKnByb3BzLmRlcHRoO1xyXG4gICAgaWYodGhpcy5zdGF0ZT09PSdjbG9zZWQnKSB7XHJcbiAgICAgIG9mZnNldCAtPSA3ZS02KnRoaXMucC5zY2FsZTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuYW5nbGU8PVBJLzIpIHtcclxuICAgICAgaGwgPSAocHJvcHMuc2hlZXRzLWZpcnN0KSpwcm9wcy5kZXB0aDtcclxuICAgICAgaHIgPSAocHJvcHMuc2hlZXRzLWxhc3QpKnByb3BzLmRlcHRoO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGhsID0gZmlyc3QqcHJvcHMuZGVwdGg7XHJcbiAgICAgIGhyID0gbGFzdCpwcm9wcy5kZXB0aDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbkFuZ2xlID0gdGhpcy5hbmdsZT5QSS8yP1BJLXRoaXMuYW5nbGU6dGhpcy5hbmdsZSwgaEFuZ2xlID0gdGhpcy5zdGF0ZSA9PT0gJ2Nsb3NlZCc/IGluQW5nbGU6IChiaW5kZXJUdXJuPT09dW5kZWZpbmVkPyBQSS8yOiBiaW5kZXJUdXJuKTtcclxuICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSB0aGlzLmdldFBvaW50c0F0QW5nbGVBbmRIcyhwb2ludHMsIGluQW5nbGUsIGhBbmdsZSwgW2hsL3Byb3BzLndpZHRoLCBoci9wcm9wcy53aWR0aF0pO1xyXG4gICAgaWYodGhpcy5hbmdsZT5QSS8yKSB7XHJcbiAgICAgIHRoaXMuaW52ZXJzZShsZWZ0KTtcclxuICAgICAgdGhpcy5pbnZlcnNlKHJpZ2h0KTtcclxuICAgICAgb2Zmc2V0ID0gLW9mZnNldDtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0UG9pbnRzKGxlZnQsIHJpZ2h0LCBvZmZzZXQpO1xyXG4gIH1cclxuXHJcbiAgc2V0UG9pbnRzKGxlZnQsIHJpZ2h0LCBvZmZzZXQpIHtcclxuICAgIGNvbnN0IHAgPSB0aGlzLmdldFByb3BzKCk7XHJcbiAgICBsZXQgaSA9IDA7XHJcblxyXG4gICAgY29uc3QgeXMgPSBbcmlnaHQsIGxlZnRdO1xyXG4gICAgZm9yKGxldCB5ID0gMDsgeTxzaGVldEJsb2NrLnJlc1k7ICsreSkge1xyXG4gICAgICBmb3IobGV0IHogPSAwOyB6PHNoZWV0QmxvY2sucmVzWjsgKyt6KSB7XHJcbiAgICAgICAgZm9yKGxldCB4ID0gMDsgeDxzaGVldEJsb2NrLnJlc1g7ICsreCkge1xyXG4gICAgICAgICAgdGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tpKytdLnNldChcclxuICAgICAgICAgICAgeXNbeV0ueFt4XSpwLndpZHRoK29mZnNldCxcclxuICAgICAgICAgICAgeXNbeV0ueVt4XSpwLndpZHRoLFxyXG4gICAgICAgICAgICB6KnAuaGVpZ2h0LyhzaGVldEJsb2NrLnJlc1otMSktMC41KnAuaGVpZ2h0XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoaSE9PXRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnNvbGUud2Fybignc2V0UG9pbnRzOiBiYWQgbWFwcGluZyEnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmNvcm5lci51c2UgJiYgIXRoaXMuY29ybmVyLnBvaW50cy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgcGxhbmUgPSBuZXcgVEhSRUUuUGxhbmUoKSwgbm9ybWFsID0gcGxhbmUubm9ybWFsLCBwbGFuZU9mZnNldCA9ICgxLXRoaXMuZ2V0UHJvcHMoKS5mbGV4aWJsZUNvcm5lcikqTWF0aC5taW4ocC53aWR0aCwgcC5oZWlnaHQpLCBwcm9qID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgICAgcGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQobmV3IFRIUkVFLlZlY3RvcjMoLTEsMCwtMSkubm9ybWFsaXplKCksIG5ldyBUSFJFRS5WZWN0b3IzKHBsYW5lT2Zmc2V0K29mZnNldCwgMCwgMC41KnAuaGVpZ2h0KSk7XHJcbiAgICAgIGZvcihsZXQgaT0wLCBsPXRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoO2k8bDsrK2kpIHtcclxuICAgICAgICBwbGFuZS5wcm9qZWN0UG9pbnQodGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tpXSwgcHJvaik7XHJcbiAgICAgICAgcHJvai5zdWIodGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1tpXSk7XHJcbiAgICAgICAgaWYocHJvai54Km5vcm1hbC54K3Byb2oueSpub3JtYWwueStwcm9qLnoqbm9ybWFsLno+MCkge1xyXG4gICAgICAgICAgY29uc3QgZCA9IHByb2oubGVuZ3RoKCkvcGxhbmVPZmZzZXQ7XHJcbiAgICAgICAgICB0aGlzLmNvcm5lci5tYXhEaXN0YW5jZSA9IE1hdGgubWF4KHRoaXMuY29ybmVyLm1heERpc3RhbmNlLCBkKTtcclxuICAgICAgICAgIHRoaXMuY29ybmVyLnBvaW50cy5wdXNoKHt2ZXJ0ZXg6IGksIGRpc3RhbmNlOiBkfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5jb3JuZXIudXNlICYmIE1hdGguYWJzKHRoaXMuY29ybmVyLmhlaWdodCk+MWUtMykge1xyXG4gICAgICBjb25zdCBkMkFuZ2xlID0gKGQpPT4gcC5jb3JuZXJEZXZpYXRpb24qdGhpcy5jb3JuZXIuaGVpZ2h0LygxK01hdGguZXhwKC1wLmJlbmRpbmcqKGQtMC41KnRoaXMuY29ybmVyLm1heERpc3RhbmNlKSkpO1xyXG4gICAgICB0aGlzLmNvcm5lci5heGlzLnNldCgtMSwwLDEpLm5vcm1hbGl6ZSgpO1xyXG4gICAgICB0aGlzLmNvcm5lci5heGlzLmFwcGx5QXhpc0FuZ2xlKHRoaXMuY29ybmVyLk9aLCB0aGlzLmFuZ2xlKTtcclxuICAgICAgZm9yKGxldCBwb2ludCBvZiB0aGlzLmNvcm5lci5wb2ludHMpIHtcclxuICAgICAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzW3BvaW50LnZlcnRleF0uYXBwbHlBeGlzQW5nbGUodGhpcy5jb3JuZXIuYXhpcywgZDJBbmdsZShwb2ludC5kaXN0YW5jZSkpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IobGV0IG0gb2YgdGhpcy5tYXJrZXJzKSB7XHJcbiAgICAgIG0ubWFya2VyLnBvc2l0aW9uLmNvcHkodGhpcy5nZW9tZXRyeS52ZXJ0aWNlc1ttLnZlcnRleF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuICAgIC8vdGhpcy5nZW9tZXRyeS5jb21wdXRlRmFjZU5vcm1hbHMoKTtcclxuICAgIHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XHJcbiAgICAvL3RoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgICB0aGlzLmdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgaWYodGhpcy5tYXJrdXApIHtcclxuICAgICAgdGhpcy5tYXJrdXAuY29tcHV0ZVZlcnRpY2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnZlcnNlKHBzKSB7XHJcbiAgICBmb3IobGV0IGkgPSAwO2k8cHMueC5sZW5ndGg7ICsraSkge1xyXG4gICAgICBwcy54W2ldPS1wcy54W2ldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBzO1xyXG4gIH1cclxuXHJcbiAgZ2V0UG9pbnRzQXRIcyhwcywgYW5nbGUsIGhzKSB7XHJcbiAgICBjb25zdCBOID0gMTAwMDtcclxuICAgIE1hdGhVdGlscy5zZXRTcGxpbmVQb2ludHModGhpcy5wU3BsaW5lLCBwcyk7XHJcbiAgICBsZXQgYmwgPSBNYXRoVXRpbHMuc3BsaXRTcGxpbmUodGhpcy5wU3BsaW5lLCBOKSwgcj1bXTtcclxuICAgIHtcclxuICAgICAgY29uc3QgcDEgPSB7Li4udGhpcy5wU3BsaW5lLmdldFBvaW50KChOLTEpL04pfSwgcDIgPSB7Li4udGhpcy5wU3BsaW5lLmdldFBvaW50KDEpfSxcclxuICAgICAgICBkcCA9IHt4OiBwMi54LXAxLngsIHk6IHAyLnktcDEueX0sIGxuID0gTWF0aC5zcXJ0KGRwLngqZHAueCtkcC55KmRwLnkpLFxyXG4gICAgICAgIHNwID0gdGhpcy5wU3BsaW5lLnBvaW50c1t0aGlzLnBTcGxpbmUucG9pbnRzLmxlbmd0aC0xXTtcclxuICAgICAgc3Auc2V0KHNwLngrMC4xKmRwLngvbG4sIHNwLnkrMC4xKmRwLnkvbG4sIDApO1xyXG4gICAgICBibCA9IE1hdGhVdGlscy5zcGxpdFNwbGluZSh0aGlzLnBTcGxpbmUsIE4pO1xyXG4gICAgfVxyXG4gICAgYmwubHMucHVzaCgxZTcpO1xyXG4gICAgTWF0aFV0aWxzLm1hcGwyTChibC5scywgYmwubGVuLCBzaGVldEJsb2NrLnJlc1gsIChpKT0+IHtcclxuICAgICAgZm9yKGxldCBqPTA7IGo8aHMubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBpZighaSkge1xyXG4gICAgICAgICAgcltqXSA9IHt4OiBbLWhzW2pdKk1hdGguc2luKGFuZ2xlKV0sIHk6IFtoc1tqXSpNYXRoLmNvcyhhbmdsZSldfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBwMCA9IHsuLi50aGlzLnBTcGxpbmUuZ2V0UG9pbnQoKGktMSkvTil9LFxyXG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLnBTcGxpbmUuZ2V0UG9pbnQoaS9OKSxcclxuICAgICAgICAgICAgICAgIHg9LShwMS55LXAwLnkpLCB5PShwMS54LXAwLngpLCBsPU1hdGguc3FydCh4KngreSp5KTtcclxuICAgICAgICAgIHJbal0ueC5wdXNoKHAxLngreC9sKmhzW2pdKTtcclxuICAgICAgICAgIHJbal0ueS5wdXNoKHAxLnkreS9sKmhzW2pdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IG5wcz1bXTtcclxuICAgIGZvcihsZXQgaj0wOyBqPGhzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIG5wc1tqXT17eDpbXSx5OltdfTtcclxuICAgICAgTWF0aFV0aWxzLnNldFNwbGluZVBvaW50cyh0aGlzLmlTcGxpbmUsIHJbal0pO1xyXG4gICAgICBjb25zdCBsID0gTWF0aFV0aWxzLnNwbGl0U3BsaW5lKHRoaXMuaVNwbGluZSwgTik7XHJcbiAgICAgIGwubHMucHVzaCgxZTcpO1xyXG4gICAgICBNYXRoVXRpbHMubWFwbDJMKGwubHMsIDEsIHNoZWV0QmxvY2sucmVzWCwgKGkpPT4ge1xyXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmlTcGxpbmUuZ2V0UG9pbnQoaS9OKTtcclxuICAgICAgICBucHNbal0ueC5wdXNoKHAueCk7XHJcbiAgICAgICAgbnBzW2pdLnkucHVzaChwLnkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBucHM7XHJcbiAgfVxyXG5cclxuICBnZXRQb2ludHNBdEFuZ2xlQW5kSHMocG9pbnRzLCBhbmdsZSwgaEFuZ2xlLCBocykge1xyXG4gICAgY29uc3QgcHMgPSB0aGlzLmdldFBvaW50c0F0QW5nbGUocG9pbnRzLCBhbmdsZSk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRQb2ludHNBdEhzKHBzLCBoQW5nbGUsIGhzKTtcclxuICB9XHJcblxyXG4gIGdldFBvaW50c0F0QW5nbGUocG9pbnRzLCBhbmdsZSkge1xyXG4gICAgY29uc3QgcHM9e3g6IFtdLCB5OltdfSwgYW5nbGVzPVtdO1xyXG4gICAgYW5nbGUvPU1hdGguUEkvMjtcclxuICAgIGZvcihsZXQgaiA9IDA7IGo8cG9pbnRzLngubGVuZ3RoOyArK2opIHtcclxuICAgICAgYW5nbGVzLnB1c2goai8ocG9pbnRzLngubGVuZ3RoLTEpKTtcclxuICAgIH1cclxuICAgIGZvcihsZXQgaSA9IDA7IGk8cG9pbnRzLnhbMF0ubGVuZ3RoOyArK2kpIHtcclxuICAgICAgY29uc3QgeHBzID0gW10sIHlwcyA9IFtdO1xyXG4gICAgICBmb3IobGV0IGogPSAwOyBqPHBvaW50cy54Lmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgeHBzLnB1c2gocG9pbnRzLnhbal1baV0pO1xyXG4gICAgICAgIHlwcy5wdXNoKHBvaW50cy55W2pdW2ldKTtcclxuICAgICAgfVxyXG4gICAgICBwcy54LnB1c2godGhpcy5pbnRlcnBvbGF0ZShhbmdsZXMseHBzLGFuZ2xlKSk7XHJcbiAgICAgIHBzLnkucHVzaCh0aGlzLmludGVycG9sYXRlKGFuZ2xlcyx5cHMsYW5nbGUpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcztcclxuICB9XHJcblxyXG4gIGludGVycG9sYXRlKHgseSx4aSkge1xyXG4gICAgaWYoIXRoaXMuYVNwbGluZXNbeC5sZW5ndGhdKSB7XHJcbiAgICAgIHRoaXMuYVNwbGluZXNbeC5sZW5ndGhdID0gbmV3IFRIUkVFLlNwbGluZShbXSk7XHJcbiAgICAgIGNvbnN0IHBzID0gdGhpcy5hU3BsaW5lc1t4Lmxlbmd0aF0ucG9pbnRzO1xyXG4gICAgICBmb3IobGV0IGk9MDtpPHgubGVuZ3RoOysraSkge1xyXG4gICAgICAgIHBzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHNwbGluZSA9IHRoaXMuYVNwbGluZXNbeC5sZW5ndGhdO1xyXG4gICAgZm9yKGxldCBpPTA7aTx4Lmxlbmd0aDsrK2kpIHtcclxuICAgICAgc3BsaW5lLnBvaW50c1tpXS5zZXQoeFtpXSwgeVtpXSwgMCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3BsaW5lLmdldFBvaW50KE1hdGgubWluKDEsIE1hdGgubWF4KHhpLCAwKSkpLnk7XHJcbiAgfVxyXG5cclxuICBsb2FkUG9pbnRzKCkge1xyXG4gICAgY29uc3QgeD1bXSx5PVtdO1xyXG4gICAgZm9yKGxldCByIG9mIFswLCAwLjI4NzcsIDAuNjM0NywgMC44MTc0LCAxLjAwMDBdKSB7XHJcbiAgICAgIHgucHVzaChyKk1hdGguY29zKDAuOSpNYXRoLlBJLzQpKTtcclxuICAgICAgeS5wdXNoKHIqTWF0aC5zaW4oMC45Kk1hdGguUEkvNCkpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3BlbmVkSW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFsyLDMsNF0sXHJcbiAgICAgIFsyLDMsNCw1LDZdXHJcbiAgICBdLFxyXG4gICAgY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFswLDEsMl0sXHJcbiAgICAgIFswLDEsMl1cclxuICAgIF0sXHJcbiAgICBmbGF0SW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFs1LDRdLFxyXG4gICAgICBbNyw2XVxyXG4gICAgXSxcclxuICAgIGludGVycG9sYXRpb25Qb2ludHMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICB4OiBbXHJcbiAgICAgICAgICBbMCwwLjI4NzcsMC42MzQ3LDAuODE3NCwxLjAwMDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjg2LDAuNjMyLDAuODE1LDAuOTk3XSxcclxuICAgICAgICAgIFswLjAwMCwwLjI3OSwwLjYyMywwLjgwNiwwLjk4OF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4xMjYsMC40MTEsMC41OTMsMC43NzRdLFxyXG4gICAgICAgICAgWzAsMCwwLDAsMF0sXHJcbiAgICAgICAgICB4XHJcbiAgICAgICAgXSxcclxuICAgICAgICB5OiBbXHJcbiAgICAgICAgICBbMCwwLDAsMCwwXSxcclxuICAgICAgICAgIFswLjAwMCwwLjAzMCwwLjAxMCwwLjAwMiwwLjAwMF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4wNjAsMC4wMTcsMC4wMDQsMC4wMDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjU5LDAuNDQwLDAuNDQ2LDAuNDI5XSxcclxuICAgICAgICAgIFswLCAwLjI4NzcsIDAuNjM0NywgMC44MTc0LCAxLjAwMDBdLFxyXG4gICAgICAgICAgeVxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHg6IFtcclxuICAgICAgICAgIFswLDAuMjg3NywwLjYzNDcsMC44MTc0LDEuMDAwMF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4yODYsMC42MzIsMC44MTUsMC45OTddLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjc5LDAuNjIzLDAuODA2LDAuOTg4XSxcclxuICAgICAgICAgIFswLjAwMCwwLjIzMywwLjU2MywwLjc0NiwwLjkyN10sXHJcbiAgICAgICAgICBbMC4wMDAsMC4xNDQsMC40MzMsMC42MTMsMC43OTZdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMDcwLDAuMjg4LDAuNDU1LDAuNjI2XSxcclxuICAgICAgICAgIFswLDAsMCwwLDBdLFxyXG4gICAgICAgICAgeFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgeTogW1xyXG4gICAgICAgICAgWzAsMCwwLDAsMF0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4wMzAsMC4wMTAsMC4wMDIsMC4wMDBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMDYwLDAuMDE3LDAuMDA0LDAuMDAwXSxcclxuICAgICAgICAgIFswLjAwMCwwLjE2OCwwLjI2OSwwLjI3MCwwLjI1NV0sXHJcbiAgICAgICAgICBbMC4wMDAsMC4yNDUsMC40MzUsMC40NTgsMC40NjBdLFxyXG4gICAgICAgICAgWzAuMDAwLDAuMjc4LDAuNTQ0LDAuNjE0LDAuNjczXSxcclxuICAgICAgICAgIFswLCAwLjI4NzcsIDAuNjM0NywgMC44MTc0LCAxLjAwMDBdLFxyXG4gICAgICAgICAgeVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpbnRlcnBvbGF0aW9uUG9pbnRzLFxyXG4gICAgICBvcGVuZWRJbnRlcnBvbGF0aW9uSW5kZWNlcyxcclxuICAgICAgY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMsXHJcbiAgICAgIGZsYXRJbnRlcnBvbGF0aW9uSW5kZWNlc1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9TaGVldEJsb2NrLmpzIiwiXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9wcygpIHtcclxuICAvLyBjb25zdCBwcm9wcyA9IHtcclxuICAvLyAgIGhlaWdodCxcclxuICAvLyAgIHdpZHRoLFxyXG4gIC8vICAgZ3Jhdml0eSxcclxuICAvLyAgIGluamVjdG9yLFxyXG4gIC8vICAgY2FjaGVkUGFnZXMsXHJcbiAgLy8gICByZW5kZXJJbmFjdGl2ZVBhZ2VzLFxyXG4gIC8vICAgcmVuZGVyV2hpbGVGbGlwcGluZyxcclxuICAvLyAgIHBhZ2VzRm9yUHJlZGljdGluZyxcclxuICAvLyAgIHByZWxvYWRQYWdlcyxcclxuICAvLyAgIHNoZWV0OiB7XHJcbiAgLy8gICAgIHN0YXJ0VmVsb2NpdHksXHJcbiAgLy8gICAgIGNvcm5lckRldmlhdGlvbixcclxuICAvLyAgICAgZmxleGliaWxpdHksXHJcbiAgLy8gICAgIGZsZXhpYmxlQ29ybmVyLFxyXG4gIC8vICAgICBiZW5kaW5nLFxyXG4gIC8vICAgICB3YXZlLFxyXG4gIC8vICAgICBzaGFwZSxcclxuICAvLyAgICAgd2lkdGhUZXhlbHMsXHJcbiAgLy8gICAgIGhlaWdodFRleGVscyxcclxuICAvLyAgICAgY29sb3IsXHJcbiAgLy8gICAgIHNpZGVUZXh0dXJlXHJcbiAgLy8gICB9LFxyXG4gIC8vICAgY292ZXI6IHtcclxuICAvLyAgICAgLi4uc2hlZXQsXHJcbiAgLy8gICAgIHBhZGRpbmcsXHJcbiAgLy8gICAgIGJpbmRlclRleHR1cmUsXHJcbiAgLy8gICAgIGRlcHRoLFxyXG4gIC8vICAgICBtYXNzXHJcbiAgLy8gICB9LFxyXG4gIC8vICAgcGFnZToge1xyXG4gIC8vICAgICAuLi5zaGVldCxcclxuICAvLyAgICAgZGVwdGgsXHJcbiAgLy8gICAgIG1hc3NcclxuICAvLyAgIH1cclxuICAvLyB9O1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgaGVpZ2h0OiAwLjI5NyxcclxuICAgIHdpZHRoOiAwLjIxLFxyXG4gICAgZ3Jhdml0eTogMSxcclxuICAgIGNhY2hlZFBhZ2VzOiA1MCxcclxuICAgIHJlbmRlckluYWN0aXZlUGFnZXM6IHRydWUsXHJcbiAgICByZW5kZXJJbmFjdGl2ZVBhZ2VzT25Nb2JpbGU6IGZhbHNlLFxyXG4gICAgcmVuZGVyV2hpbGVGbGlwcGluZzogZmFsc2UsXHJcbiAgICBwYWdlc0ZvclByZWRpY3Rpbmc6IDUsXHJcbiAgICBwcmVsb2FkUGFnZXM6IDUsXHJcbiAgICBydGw6IGZhbHNlLFxyXG4gICAgc2hlZXQ6IHtcclxuICAgICAgc3RhcnRWZWxvY2l0eTogMC45LFxyXG4gICAgICBjb3JuZXJEZXZpYXRpb246IDAuMjUsXHJcbiAgICAgIGZsZXhpYmlsaXR5OiAxMCxcclxuICAgICAgZmxleGlibGVDb3JuZXI6IDAuNSxcclxuICAgICAgYmVuZGluZzogMTEsXHJcbiAgICAgIHdhdmU6IDAuNSxcclxuICAgICAgc2hhcGU6IDAsXHJcbiAgICAgIHdpZHRoVGV4ZWxzOiA1KjIxMCxcclxuICAgICAgaGVpZ2h0VGV4ZWxzOiA1KjI5NyxcclxuICAgICAgY29sb3I6IDB4RkZGRkZGXHJcbiAgICB9LFxyXG4gICAgY292ZXI6IHtcclxuICAgICAgYmluZGVyVGV4dHVyZTogJycsXHJcbiAgICAgIGRlcHRoOiAwLjAwMDMsXHJcbiAgICAgIHBhZGRpbmc6IDAsXHJcbiAgICAgIG1hc3M6IDAuMDAzXHJcbiAgICB9LFxyXG4gICAgcGFnZToge1xyXG4gICAgICBkZXB0aDogMC4wMDAxLFxyXG4gICAgICBtYXNzOiAwLjAwMVxyXG4gICAgfSxcclxuICAgIGNzc0xheWVyUHJvcHM6IHtcclxuICAgICAgd2lkdGg6IDEwMjRcclxuICAgIH1cclxuICB9O1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9wcm9wcy9ib29rLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5USFJFRS5DU1MzRE9iamVjdCA9IGNsYXNzIENTUzNET2JqZWN0IGV4dGVuZHMgVEhSRUUuT2JqZWN0M0Qge1xyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ9dW5kZWZpbmVkKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgXHJcbiAgICBpZihlbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuc2V0KGVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0KGVsZW1lbnQpIHtcclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgXHR0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG5cclxuICBcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZlZCcsIGZ1bmN0aW9uKCkge1xyXG4gIFx0XHRpZiAodGhpcy5lbGVtZW50LnBhcmVudE5vZGUgIT09IG51bGwpIHtcclxuICBcdFx0XHR0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xyXG4gIFx0XHR9XHJcbiAgXHR9KTtcclxuICB9XHJcbn07XHJcblxyXG5USFJFRS5DU1MzRFNwcml0ZSA9IGNsYXNzIENTUzNEU3ByaXRlIGV4dGVuZHMgVEhSRUUuQ1NTM0RPYmplY3Qge1xyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcclxuICAgIHN1cGVyKGVsZW1lbnQpO1xyXG4gIH1cclxufTtcclxuXHJcblRIUkVFLkNTUzNEUmVuZGVyZXIgPSBjbGFzcyBDU1MzRFJlbmRlcmVyIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgXHR2YXIgX3dpZHRoLCBfaGVpZ2h0O1xyXG4gIFx0dmFyIF93aWR0aEhhbGYsIF9oZWlnaHRIYWxmO1xyXG5cclxuICBcdHZhciBtYXRyaXggPSBuZXcgVEhSRUUuTWF0cml4NCgpO1xyXG5cclxuICBcdHZhciBjYWNoZSA9IHtcclxuICBcdFx0Y2FtZXJhOiB7IGZvdjogMCwgc3R5bGU6ICcnIH0sXHJcbiAgXHRcdG9iamVjdHM6IHt9XHJcbiAgXHR9O1xyXG5cclxuICBcdHZhciBkb21FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicpO1xyXG4gIFx0ZG9tRWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG5cclxuICBcdHRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7XHJcblxyXG4gIFx0dmFyIGNhbWVyYUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2Jyk7XHJcblxyXG4gIFx0Y2FtZXJhRWxlbWVudC5zdHlsZS5XZWJraXRUcmFuc2Zvcm1TdHlsZSA9ICdwcmVzZXJ2ZS0zZCc7XHJcbiAgXHRjYW1lcmFFbGVtZW50LnN0eWxlLk1velRyYW5zZm9ybVN0eWxlID0gJ3ByZXNlcnZlLTNkJztcclxuICBcdGNhbWVyYUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtU3R5bGUgPSAncHJlc2VydmUtM2QnO1xyXG5cclxuICBcdGRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNhbWVyYUVsZW1lbnQpO1xyXG5cclxuICBcdHZhciBpc0lFID0gL1RyaWRlbnQvaS50ZXN0KCBuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuXHJcbiAgXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7fTtcclxuXHJcbiAgXHR0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7XHJcblxyXG4gIFx0XHRyZXR1cm4ge1xyXG4gIFx0XHRcdHdpZHRoOiBfd2lkdGgsXHJcbiAgXHRcdFx0aGVpZ2h0OiBfaGVpZ2h0XHJcbiAgXHRcdH07XHJcblxyXG4gIFx0fTtcclxuXHJcbiAgXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XHJcblxyXG4gIFx0XHRfd2lkdGggPSB3aWR0aDtcclxuICBcdFx0X2hlaWdodCA9IGhlaWdodDtcclxuICBcdFx0X3dpZHRoSGFsZiA9IF93aWR0aCAvIDI7XHJcbiAgXHRcdF9oZWlnaHRIYWxmID0gX2hlaWdodCAvIDI7XHJcblxyXG4gIFx0XHRkb21FbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG4gIFx0XHRkb21FbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcblxyXG4gIFx0XHRjYW1lcmFFbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG4gIFx0XHRjYW1lcmFFbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcblxyXG4gIFx0fTtcclxuXHJcbiAgXHRmdW5jdGlvbiBlcHNpbG9uKCB2YWx1ZSkge1xyXG5cclxuICBcdFx0cmV0dXJuIE1hdGguYWJzKCB2YWx1ZSkgPCAxZS0xMCA/IDAgOiB2YWx1ZTtcclxuXHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gZ2V0Q2FtZXJhQ1NTTWF0cml4KCBtYXRyaXgpIHtcclxuXHJcbiAgXHRcdHZhciBlbGVtZW50cyA9IG1hdHJpeC5lbGVtZW50cztcclxuXHJcbiAgXHRcdHJldHVybiAnbWF0cml4M2QoJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDAgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDEgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAyIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMyBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDQgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDUgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyA2IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgNyBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDggXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDkgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxMCBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDExIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTIgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDEzIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTQgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxNSBdKSArXHJcbiAgXHRcdCcpJztcclxuXHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gZ2V0T2JqZWN0Q1NTTWF0cml4KCBtYXRyaXgsIGNhbWVyYUNTU01hdHJpeCkge1xyXG5cclxuICBcdFx0dmFyIGVsZW1lbnRzID0gbWF0cml4LmVsZW1lbnRzO1xyXG4gIFx0XHR2YXIgbWF0cml4M2QgPSAnbWF0cml4M2QoJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDAgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMiBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDMgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDQgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDUgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDYgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIC0gZWxlbWVudHNbIDcgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyA4IF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgOSBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDEwIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTEgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxMiBdKSArICcsJyArXHJcbiAgXHRcdFx0ZXBzaWxvbiggZWxlbWVudHNbIDEzIF0pICsgJywnICtcclxuICBcdFx0XHRlcHNpbG9uKCBlbGVtZW50c1sgMTQgXSkgKyAnLCcgK1xyXG4gIFx0XHRcdGVwc2lsb24oIGVsZW1lbnRzWyAxNSBdKSArXHJcbiAgXHRcdCcpJztcclxuXHJcbiAgXHRcdGlmKGlzSUUpIHtcclxuXHJcbiAgXHRcdFx0cmV0dXJuICd0cmFuc2xhdGUoLTUwJSwtNTAlKScgK1xyXG4gIFx0XHRcdFx0J3RyYW5zbGF0ZSgnICsgX3dpZHRoSGFsZiArICdweCwnICsgX2hlaWdodEhhbGYgKyAncHgpJyArXHJcbiAgXHRcdFx0XHRjYW1lcmFDU1NNYXRyaXggK1xyXG4gIFx0XHRcdFx0bWF0cml4M2Q7XHJcblxyXG4gIFx0XHR9XHJcblxyXG4gIFx0XHRyZXR1cm4gJ3RyYW5zbGF0ZSgtNTAlLC01MCUpJyArIG1hdHJpeDNkO1xyXG5cclxuICBcdH1cclxuXHJcbiAgXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBjYW1lcmFDU1NNYXRyaXgpIHtcclxuXHJcbiAgXHRcdGlmKG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLkNTUzNET2JqZWN0KSB7XHJcblxyXG4gIFx0XHRcdHZhciBzdHlsZTtcclxuXHJcbiAgXHRcdFx0aWYob2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuQ1NTM0RTcHJpdGUpIHtcclxuICBcdFx0XHRcdG1hdHJpeC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcclxuICBcdFx0XHRcdG1hdHJpeC50cmFuc3Bvc2UoKTtcclxuICBcdFx0XHRcdG1hdHJpeC5jb3B5UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCk7XHJcbiAgXHRcdFx0XHRtYXRyaXguc2NhbGUoIG9iamVjdC5zY2FsZSk7XHJcblxyXG4gIFx0XHRcdFx0bWF0cml4LmVsZW1lbnRzWyAzIF0gPSAwO1xyXG4gIFx0XHRcdFx0bWF0cml4LmVsZW1lbnRzWyA3IF0gPSAwO1xyXG4gIFx0XHRcdFx0bWF0cml4LmVsZW1lbnRzWyAxMSBdID0gMDtcclxuICBcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMTUgXSA9IDE7XHJcblxyXG4gIFx0XHRcdFx0c3R5bGUgPSBnZXRPYmplY3RDU1NNYXRyaXgoIG1hdHJpeCwgY2FtZXJhQ1NTTWF0cml4KTtcclxuXHJcbiAgXHRcdFx0fSBlbHNlIHtcclxuXHJcbiAgXHRcdFx0XHRzdHlsZSA9IGdldE9iamVjdENTU01hdHJpeCggb2JqZWN0Lm1hdHJpeFdvcmxkLCBjYW1lcmFDU1NNYXRyaXgpO1xyXG5cclxuICBcdFx0XHR9XHJcblxyXG4gIFx0XHRcdHZhciBlbGVtZW50ID0gb2JqZWN0LmVsZW1lbnQ7XHJcbiAgXHRcdFx0dmFyIGNhY2hlZFN0eWxlID0gY2FjaGUub2JqZWN0c1sgb2JqZWN0LmlkIF0gJiYgY2FjaGUub2JqZWN0c1sgb2JqZWN0LmlkIF0uc3R5bGU7XHJcblxyXG4gIFx0XHRcdGlmKGNhY2hlZFN0eWxlID09PSB1bmRlZmluZWQgfHwgY2FjaGVkU3R5bGUgIT09IHN0eWxlKSB7XHJcbiAgXHRcdFx0XHRlbGVtZW50LnN0eWxlLldlYmtpdFRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gIFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5Nb3pUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICBcdFx0XHRcdGVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcblxyXG4gIFx0XHRcdFx0Y2FjaGUub2JqZWN0c1sgb2JqZWN0LmlkIF0gPSB7IHN0eWxlOiBzdHlsZSB9O1xyXG4gIFx0XHRcdFx0aWYoaXNJRSkge1xyXG4gIFx0XHRcdFx0XHRjYWNoZS5vYmplY3RzWyBvYmplY3QuaWQgXS5kaXN0YW5jZVRvQ2FtZXJhU3F1YXJlZCA9IGdldERpc3RhbmNlVG9TcXVhcmVkKCBjYW1lcmEsIG9iamVjdCk7XHJcbiAgXHRcdFx0XHR9XHJcbiAgXHRcdFx0fVxyXG5cclxuICBcdFx0XHRpZihlbGVtZW50LnBhcmVudE5vZGUgIT09IGNhbWVyYUVsZW1lbnQpIHtcclxuICBcdFx0XHRcdGNhbWVyYUVsZW1lbnQuYXBwZW5kQ2hpbGQoIGVsZW1lbnQpO1xyXG4gIFx0XHRcdH1cclxuICBcdFx0fVxyXG5cclxuICBcdFx0Zm9yKHZhciBpID0gMCwgbCA9IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrKSB7XHJcblxyXG4gIFx0XHRcdHJlbmRlck9iamVjdCggb2JqZWN0LmNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgY2FtZXJhQ1NTTWF0cml4KTtcclxuXHJcbiAgXHRcdH1cclxuXHJcbiAgXHR9XHJcblxyXG4gIFx0dmFyIGdldERpc3RhbmNlVG9TcXVhcmVkID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICBcdFx0dmFyIGEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIFx0XHR2YXIgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcblxyXG4gIFx0XHRyZXR1cm4gZnVuY3Rpb24ob2JqZWN0MSwgb2JqZWN0Mikge1xyXG5cclxuICBcdFx0XHRhLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0MS5tYXRyaXhXb3JsZCk7XHJcbiAgXHRcdFx0Yi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdDIubWF0cml4V29ybGQpO1xyXG5cclxuICBcdFx0XHRyZXR1cm4gYS5kaXN0YW5jZVRvU3F1YXJlZCggYik7XHJcblxyXG4gIFx0XHR9O1xyXG5cclxuICBcdH0oKTtcclxuXHJcbiAgXHRmdW5jdGlvbiB6T3JkZXIoIHNjZW5lKSB7XHJcblxyXG4gIFx0XHR2YXIgb3JkZXIgPSBPYmplY3Qua2V5cyggY2FjaGUub2JqZWN0cykuc29ydCggZnVuY3Rpb24oYSwgYikge1xyXG5cclxuICBcdFx0XHRyZXR1cm4gY2FjaGUub2JqZWN0c1sgYSBdLmRpc3RhbmNlVG9DYW1lcmFTcXVhcmVkIC0gY2FjaGUub2JqZWN0c1sgYiBdLmRpc3RhbmNlVG9DYW1lcmFTcXVhcmVkO1xyXG5cclxuICBcdFx0fSk7XHJcbiAgXHRcdHZhciB6TWF4ID0gb3JkZXIubGVuZ3RoO1xyXG5cclxuICBcdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uKG9iamVjdCkge1xyXG5cclxuICBcdFx0XHR2YXIgaW5kZXggPSBvcmRlci5pbmRleE9mKCBvYmplY3QuaWQgKyAnJyk7XHJcblxyXG4gIFx0XHRcdGlmKGluZGV4ICE9PSAtIDEpIHtcclxuXHJcbiAgXHRcdFx0XHRvYmplY3QuZWxlbWVudC5zdHlsZS56SW5kZXggPSB6TWF4IC0gaW5kZXg7XHJcblxyXG4gIFx0XHRcdH1cclxuXHJcbiAgXHRcdH0pO1xyXG5cclxuICBcdH1cclxuXHJcbiAgXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uKHNjZW5lLCBjYW1lcmEpIHtcclxuXHJcbiAgXHRcdHZhciBmb3YgPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgNSBdICogX2hlaWdodEhhbGY7XHJcblxyXG4gIFx0XHRpZihjYWNoZS5jYW1lcmEuZm92ICE9PSBmb3YpIHtcclxuXHJcbiAgXHRcdFx0ZG9tRWxlbWVudC5zdHlsZS5XZWJraXRQZXJzcGVjdGl2ZSA9IGZvdiArICdweCc7XHJcbiAgXHRcdFx0ZG9tRWxlbWVudC5zdHlsZS5Nb3pQZXJzcGVjdGl2ZSA9IGZvdiArICdweCc7XHJcbiAgXHRcdFx0ZG9tRWxlbWVudC5zdHlsZS5wZXJzcGVjdGl2ZSA9IGZvdiArICdweCc7XHJcblxyXG4gIFx0XHRcdGNhY2hlLmNhbWVyYS5mb3YgPSBmb3Y7XHJcblxyXG4gIFx0XHR9XHJcblxyXG4gIFx0XHRzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG5cclxuICBcdFx0aWYoY2FtZXJhLnBhcmVudCA9PT0gbnVsbCkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcblxyXG4gIFx0XHR2YXIgY2FtZXJhQ1NTTWF0cml4ID0gJ3RyYW5zbGF0ZVooJyArIGZvdiArICdweCknICtcclxuICBcdFx0XHRnZXRDYW1lcmFDU1NNYXRyaXgoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xyXG5cclxuICBcdFx0dmFyIHN0eWxlID0gY2FtZXJhQ1NTTWF0cml4ICtcclxuICBcdFx0XHQndHJhbnNsYXRlKCcgKyBfd2lkdGhIYWxmICsgJ3B4LCcgKyBfaGVpZ2h0SGFsZiArICdweCknO1xyXG5cclxuICBcdFx0aWYoY2FjaGUuY2FtZXJhLnN0eWxlICE9PSBzdHlsZSAmJiAhIGlzSUUpIHtcclxuXHJcbiAgXHRcdFx0Y2FtZXJhRWxlbWVudC5zdHlsZS5XZWJraXRUcmFuc2Zvcm0gPSBzdHlsZTtcclxuICBcdFx0XHRjYW1lcmFFbGVtZW50LnN0eWxlLk1velRyYW5zZm9ybSA9IHN0eWxlO1xyXG4gIFx0XHRcdGNhbWVyYUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gc3R5bGU7XHJcblxyXG4gIFx0XHRcdGNhY2hlLmNhbWVyYS5zdHlsZSA9IHN0eWxlO1xyXG5cclxuICBcdFx0fVxyXG5cclxuICBcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBjYW1lcmFDU1NNYXRyaXgpO1xyXG5cclxuICBcdFx0aWYoaXNJRSkge1xyXG5cclxuICBcdFx0XHQvLyBJRTEwIGFuZCAxMSBkb2VzIG5vdCBzdXBwb3J0ICdwcmVzZXJ2ZS0zZCcuXHJcbiAgXHRcdFx0Ly8gVGh1cywgei1vcmRlciBpbiAzRCB3aWxsIG5vdCB3b3JrLlxyXG4gIFx0XHRcdC8vIFdlIGhhdmUgdG8gY2FsYyB6LW9yZGVyIG1hbnVhbGx5IGFuZCBzZXQgQ1NTIHotaW5kZXggZm9yIElFLlxyXG4gIFx0XHRcdC8vIEZZSTogei1pbmRleCBjYW4ndCBoYW5kbGUgb2JqZWN0IGludGVyc2VjdGlvblxyXG4gIFx0XHRcdHpPcmRlciggc2NlbmUpO1xyXG5cclxuICBcdFx0fVxyXG5cclxuICBcdH07XHJcbiAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgVEhSRUUuQ1NTM0RSZW5kZXJlcjtcclxuXHJcbmNvbnN0IF9DU1MzRE9iamVjdCA9IFRIUkVFLkNTUzNET2JqZWN0LCBfQ1NTM0RTcHJpdGUgPSBUSFJFRS5DU1MzRFNwcml0ZTtcclxuZXhwb3J0IHtcclxuICBfQ1NTM0RPYmplY3QgYXMgQ1NTM0RPYmplY3QsXHJcbiAgX0NTUzNEU3ByaXRlIGFzIENTUzNEU3ByaXRlXHJcbn07XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0NTUzNEUmVuZGVyZXIuanMiLCJpbXBvcnQge1RIUkVFLCAkfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IHtDU1MzRE9iamVjdH0gZnJvbSAnLi9DU1MzRFJlbmRlcmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENTU0xheWVyIGV4dGVuZHMgQ1NTM0RPYmplY3Qge1xyXG5cclxuICBzdGF0aWMgZGVsYXk7XHJcbiAgc3RhdGljIHN0eWxlO1xyXG4gIHN0YXRpYyBpbml0KGRvYywgZGVsYXk9MTUwKSB7XHJcbiAgICBDU1NMYXllci5kZWxheSA9IGRlbGF5O1xyXG4gICAgQ1NTTGF5ZXIuc3R5bGUgPSAkKGA8c3R5bGUgdHlwZT10ZXh0L2Nzcz5cclxuICAgICAgLmNzcy1sYXllciB7XHJcbiAgICBcdFx0b3BhY2l0eTogMTtcclxuICAgIFx0XHR0cmFuc2l0aW9uOiBvcGFjaXR5ICR7ZGVsYXl9bXMgZWFzZS1vdXQ7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgXHR9XHJcbiAgICBcdC5jc3MtbGF5ZXIuaGlkZGVuIHtcclxuICAgIFx0XHR0cmFuc2l0aW9uOiBvcGFjaXR5ICR7ZGVsYXl9bXMgZWFzZS1pbiwgdmlzaWJpbGl0eSAke2RlbGF5fW1zIHN0ZXAtZW5kO1xyXG4gICAgXHRcdG9wYWNpdHk6IDA7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgICB9XHJcbiAgICA8L3N0eWxlPmApLmFwcGVuZFRvKGRvYy5oZWFkKTtcclxuICB9XHJcbiAgc3RhdGljIGRpc3Bvc2UoKSB7XHJcbiAgICBDU1NMYXllci5zdHlsZS5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQsIHByb3BzKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xyXG4gICAgdGhpcy5qQ29udGFpbmVyID0gJCgnPGRpdiBjbGFzcz1cImhpZGRlbiBjc3MtbGF5ZXJcIj48L2Rpdj4nKTtcclxuICBcdGNvbnN0IHdpZHRoUHhzID0gcHJvcHMud2lkdGgsIGhlaWdodFB4cyA9IGhlaWdodC93aWR0aCp3aWR0aFB4cztcclxuICAgIHRoaXMuakNvbnRhaW5lci53aWR0aCh3aWR0aFB4cykuaGVpZ2h0KGhlaWdodFB4cyk7XHJcbiAgXHR0aGlzLnNjYWxlLnggLz0gd2lkdGhQeHMvd2lkdGg7XHJcbiAgXHR0aGlzLnNjYWxlLnkgLz0gd2lkdGhQeHMvd2lkdGg7XHJcblxyXG4gICAgdGhpcy5zZXREYXRhKCk7XHJcbiAgICB0aGlzLnNldCh0aGlzLmpDb250YWluZXJbMF0pO1xyXG4gIH1cclxuXHJcbiAgY2FsbEludGVybmFsKG5hbWUpIHtcclxuICAgIGlmKHRoaXMub2JqZWN0ICYmIHRoaXMub2JqZWN0W25hbWVdKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5vYmplY3RbbmFtZV0oKTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuY2xlYXJJbnRlcm5hbHMoKTtcclxuICB9XHJcblxyXG4gIGNsZWFySW50ZXJuYWxzKCkge1xyXG4gICAgdGhpcy5jYWxsSW50ZXJuYWwoJ2Rpc3Bvc2UnKTtcclxuICAgICF0aGlzLmNzcyB8fCB0aGlzLmNzcy5yZW1vdmUoKTtcclxuICAgICF0aGlzLmh0bWwgfHwgdGhpcy5odG1sLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0RGF0YShjc3M9JycsIGh0bWw9JycsIGpzPScnKSB7XHJcbiAgICB0aGlzLmNsZWFySW50ZXJuYWxzKCk7XHJcblxyXG4gICAgdGhpcy5jc3MgPSAkKGA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+JHtjc3N9PC9zdHlsZT5gKS5hcHBlbmRUbyh0aGlzLmpDb250YWluZXIpO1xyXG4gICAgdGhpcy5odG1sID0gJChodG1sKS5hcHBlbmRUbyh0aGlzLmpDb250YWluZXIpO1xyXG4gICAgY29uc3QgaW5pdCA9IGV2YWwoanMpO1xyXG4gICAgaWYoaW5pdCkge1xyXG4gICAgICB0aGlzLm9iamVjdCA9IGluaXQodGhpcy5qQ29udGFpbmVyLCB0aGlzLnByb3BzKSB8fCB7fTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBlbmRlZENhbGwoY2xiKSB7XHJcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLnRpbWVzdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICBpZih0aW1lc3RhbXA9PT10aGlzLnRpbWVzdGFtcCkge1xyXG4gICAgICAgIGNsYigpO1xyXG4gICAgICB9XHJcbiAgICB9LCBDU1NMYXllci5kZWxheSk7XHJcbiAgfVxyXG5cclxuICBpc0hpZGRlbigpIHtcclxuICAgIHJldHVybiB0aGlzLmpDb250YWluZXIuaGFzQ2xhc3MoJ2hpZGRlbicpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIGxldCByZXM7XHJcbiAgICBpZighdGhpcy5pc0hpZGRlbigpKSB7XHJcbiAgICAgIHRoaXMuakNvbnRhaW5lci5hZGRDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgIHRoaXMuY2FsbEludGVybmFsKCdoaWRlJyk7XHJcbiAgICAgIHJlcyA9IG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcclxuICAgICAgICB0aGlzLnBlbmRlZENhbGwoKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLmNhbGxJbnRlcm5hbCgnaGlkZGVuJyk7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJlcyA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICBsZXQgcmVzO1xyXG4gICAgaWYodGhpcy5pc0hpZGRlbigpKSB7XHJcbiAgICAgIHRoaXMuakNvbnRhaW5lci5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgIHRoaXMuY2FsbEludGVybmFsKCdzaG93Jyk7XHJcbiAgICAgIHJlcyA9IG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcclxuICAgICAgICB0aGlzLnBlbmRlZENhbGwoKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLmNhbGxJbnRlcm5hbCgnc2hvd24nKTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvQ1NTTGF5ZXIuanMiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBDYWNoZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG1heFNpemU9SW5maW5pdHksIHNpemVvZj1DYWNoZS5jb3VudFNpemVvZikge1xyXG4gICAgdGhpcy5vcyA9IG5ldyBNYXAoKTtcclxuICAgIHRoaXMuc2l6ZW9mID0gc2l6ZW9mO1xyXG4gICAgdGhpcy5tYXhTaXplID0gbWF4U2l6ZTtcclxuICAgIHRoaXMuc2l6ZSA9IDA7XHJcbiAgfVxyXG5cclxuICBmb3JFYWNoKGNsYikge1xyXG4gICAgdGhpcy5vcy5mb3JFYWNoKCh2LCBrKT0+IGNsYihbayx2XSkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNvdW50U2l6ZW9mKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gMTtcclxuICB9XHJcblxyXG4gIHJlbW92ZShrKSB7XHJcbiAgICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgICBjb25zdCB2ID0gdGhpcy5vcy5nZXQoayk7XHJcbiAgICBpZighdi5sb2NrZWQgfHwgIXYubG9ja2VkKGspKSB7XHJcbiAgICAgIHRoaXMuc2l6ZSAtPSB0aGlzLnNpemVvZih2KTtcclxuICAgICAgaWYodi5kaXNwb3NlKSB7XHJcbiAgICAgICAgdi5kaXNwb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vcy5kZWxldGUoayk7XHJcbiAgICAgIHJlcyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgZnJlZVNwYWNlKCkge1xyXG4gICAgY29uc3QgYXJyID0gW107XHJcbiAgICBmb3IobGV0IHAgb2YgdGhpcy5vcykge1xyXG4gICAgICBhcnIucHVzaCh7dGltZXN0YW1wOiBwWzFdLnRpbWVzdGFtcCwga2V5OiBwWzBdfSk7XHJcbiAgICB9XHJcbiAgICBhcnIuc29ydCgoYSwgYik9PiBhLnRpbWVzdGFtcC1iLnRpbWVzdGFtcCk7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxhcnIubGVuZ3RoICYmIHRoaXMuc2l6ZT4zKnRoaXMubWF4U2l6ZS80OyArK2kpIHtcclxuICAgICAgdGhpcy5yZW1vdmUoYXJyW2ldLmtleSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgY29uc3QgYXJyID0gW107XHJcbiAgICBmb3IobGV0IHAgb2YgdGhpcy5vcykge1xyXG4gICAgICBhcnIucHVzaCh7djogcFsxXSwgazogcFswXX0pO1xyXG4gICAgfVxyXG4gICAgZm9yKGxldCBvIG9mIGFycikge1xyXG4gICAgICBpZihvLnYuZGlzcG9zZSkge1xyXG4gICAgICAgIG8udi5kaXNwb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vcy5kZWxldGUoby5rKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyByZWN1cnNpb25TaXplb2YodmFsdWUpIHtcclxuICAgIGxldCBzaXplID0gMDtcclxuICAgIGlmKHZhbHVlKSB7XHJcbiAgICAgICsrc2l6ZTtcclxuICAgICAgY29uc3QgbGVuID0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICBpZihsZW49PT11bmRlZmluZWQpIHtcclxuICAgICAgICBmb3IgKGxldCBwIGluIHZhbHVlKSB7XHJcbiAgICAgICAgICBpZih2YWx1ZS5oYXNPd25Qcm9wZXJ0eShwKSkge1xyXG4gICAgICAgICAgICBzaXplKz1DYWNoZS5yZWN1cnNpb25TaXplb2YodmFsdWVbcF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzaXplKz1sZW5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNpemU7XHJcbiAgfVxyXG5cclxuICBnZXRUaW1lc3RhbXAoKSB7XHJcbiAgICByZXR1cm4gRGF0ZS5ub3coKTtcclxuICB9XHJcblxyXG5cclxuICBnZXQoa2V5KSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMub3MuZ2V0KGtleSk7XHJcbiAgICBpZih2YWx1ZSkge1xyXG4gICAgICB2YWx1ZS50aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHV0KGtleSwgdmFsdWUpIHtcclxuICAgIHZhbHVlLnRpbWVzdGFtcCA9IHRoaXMuZ2V0VGltZXN0YW1wKCk7XHJcbiAgICB0aGlzLm9zLnNldChrZXksIHZhbHVlKTtcclxuICAgIHRoaXMuc2l6ZSs9dGhpcy5zaXplb2YodmFsdWUpO1xyXG4gICAgaWYodGhpcy5zaXplPnRoaXMubWF4U2l6ZSkge1xyXG4gICAgICB0aGlzLmZyZWVTcGFjZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9DYWNoZS5qcyIsImltcG9ydCB7VEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlciB7XHJcblxyXG4gIGhhbmRsZURlZmF1bHQoaWQsIGUsIGRhdGEpIHtcclxuICAgIC8vY29uc29sZS5sb2coaWQrJy0nK2UudHlwZSsnLScrZGF0YSk7XHJcbiAgfVxyXG5cclxuICBkaXNwYXRjaEFzeW5jKGUpIHtcclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB0aGlzLmRpc3BhdGNoRXZlbnQoZSkpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Db250cm9sbGVyLmpzIiwiaW1wb3J0IEV2ZW50Q29udmVydGVyIGZyb20gJy4vRXZlbnRDb252ZXJ0ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3VzdG9tRXZlbnRDb252ZXJ0ZXIgZXh0ZW5kcyBFdmVudENvbnZlcnRlciB7XHJcblxyXG4gIC8vIGN1c3RvbVxyXG4gIC8vIHRlc3RJbnRlcnNlY3Rpb24oZSwgZGF0YSk7XHJcbiAgLy8gY3VzdG9tLm9iamVjdFxyXG4gIC8vIHRlc3Qob2JqZWN0KTtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIGN1c3RvbVRlc3Q9KCk9PiBmYWxzZSwgZURvYykge1xyXG4gICAgc3VwZXIod25kLCBkb2MpO1xyXG5cclxuICAgIHRoaXMuZURvYyA9IGVEb2M7XHJcbiAgICB0aGlzLmN1c3RvbVRlc3QgPSBjdXN0b21UZXN0O1xyXG4gICAgdGhpcy5jdXN0b21zID0gW107XHJcbiAgfVxyXG5cclxuICB0ZXN0KG9iamVjdDEsIG9iamVjdDIpIHtcclxuICAgIHJldHVybiBvYmplY3QxICYmIG9iamVjdDI/IHRoaXMuY3VzdG9tVGVzdChvYmplY3QxLCBvYmplY3QyKTogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRDYWxsYmFjayhvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3QudGFyZ2V0LmNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgYWRkQ3VzdG9tKGN1c3RvbSkge1xyXG4gICAgdGhpcy5jdXN0b21zLnB1c2goY3VzdG9tKTtcclxuICB9XHJcblxyXG4gIGdldE9iamVjdChlLCBkYXRhKSB7XHJcbiAgICBsZXQgb2JqZWN0O1xyXG4gICAgaWYoZGF0YS5kb2M9PT10aGlzLmVEb2MpIHtcclxuICAgICAgZm9yKGxldCBjdXN0b20gb2YgdGhpcy5jdXN0b21zKSB7XHJcbiAgICAgICAgb2JqZWN0ID0gY3VzdG9tLnRlc3RJbnRlcnNlY3Rpb24oZSwgZGF0YSk7XHJcbiAgICAgICAgaWYob2JqZWN0KSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9DdXN0b21FdmVudENvbnZlcnRlci5qcyIsImltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbmRlciB7XHJcblxyXG4gIHN0YXRpYyBERUxJTUlURVIgPSAnICc7XHJcblxyXG4gIHN0YXRpYyBpc0RlbGltZXRyKHMpIHtcclxuICAgIHJldHVybiBzPT09RmluZGVyLkRFTElNSVRFUjtcclxuICB9XHJcblxyXG4gIG1lcmdlKCkge1xyXG4gICAgY29uc3QgYXMgPSBbXSwgbWFwID0gW10sIHN0cnMgPSB0aGlzLnN0cnM7XHJcbiAgICBsZXQgcCA9IDA7XHJcbiAgICBmb3IobGV0IGk9MDsgaTxzdHJzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGlmKHN0cnNbaV0ubGVuZ3RoKSB7XHJcbiAgICAgICAgbWFwLnB1c2goe1xyXG4gICAgICAgICAgYmFzZTogaSxcclxuICAgICAgICAgIG9mZnNldDogcFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGFzLnB1c2goc3Ryc1tpXSk7XHJcbiAgICAgICAgcCArPSBzdHJzW2ldLmxlbmd0aDtcclxuICAgICAgICBpZihpPHN0cnMubGVuZ3RoLTEgJiYgIUZpbmRlci5pc0RlbGltZXRyKHN0cnNbaV0uY2hhckF0KHN0cnNbaV0ubGVuZ3RoLTEpKSAmJiAhRmluZGVyLmlzRGVsaW1ldHIoc3Ryc1tpKzFdLmNoYXJBdCgwKSkpIHtcclxuICAgICAgICAgIGFzLnB1c2goRmluZGVyLkRFTElNSVRFUik7XHJcbiAgICAgICAgICArK3A7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hcCA9IG1hcDtcclxuICAgIHRoaXMuc3RyID0gYXMuam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBhZGRIaXRzKHApIHtcclxuICAgIGNvbnN0IGluZm8gPSB0aGlzLm1hcFtVdGlscy5sb3dlckJvdW5kKHRoaXMubWFwLCB7b2Zmc2V0OiBwfSwgKGEsIGIpPT4gYS5vZmZzZXQtYi5vZmZzZXQpXTtcclxuICAgIGxldCBjaGFycyA9IHRoaXMucGF0dGVybi5sZW5ndGgsIGkgPSBpbmZvLmJhc2U7XHJcbiAgICBwIC09IGluZm8ub2Zmc2V0O1xyXG4gICAgd2hpbGUoY2hhcnMpIHtcclxuICAgICAgaWYodGhpcy5zdHJzW2ldLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGRlbGltZXRlciA9IGk8dGhpcy5zdHJzLmxlbmd0aC0xICYmICFGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cnNbaV0uY2hhckF0KHRoaXMuc3Ryc1tpXS5sZW5ndGgtMSkpICYmICFGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cnNbaSsxXS5jaGFyQXQoMCkpLFxyXG4gICAgICAgICAgICAgIGxlbmd0aCA9IE1hdGgubWluKHRoaXMuc3Ryc1tpXS5sZW5ndGgrKGRlbGltZXRlcj8gMTogMCktcCwgY2hhcnMpO1xyXG4gICAgICAgIGlmKHA8dGhpcy5zdHJzW2ldLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5oaXRzLnB1c2goe1xyXG4gICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgb2Zmc2V0OiBwLFxyXG4gICAgICAgICAgICBsZW5ndGg6IE1hdGgubWluKGxlbmd0aCwgdGhpcy5zdHJzW2ldLmxlbmd0aC1wKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjaGFycyAtPSBsZW5ndGg7XHJcbiAgICAgICAgKytpO1xyXG4gICAgICAgIHAgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRDb250ZXh0KHApIHtcclxuICAgIGxldCBmID0gcCwgbCA9IHArdGhpcy5wYXR0ZXJuLmxlbmd0aC0xLCBkZWxzID0gdGhpcy5wcm9wcy5jb250ZXh0TGVuZ3RoLCBwcmV2RGVscyA9IGRlbHMrMTtcclxuICAgIHdoaWxlKGRlbHMgJiYgcHJldkRlbHMtZGVscykge1xyXG4gICAgICBwcmV2RGVscyA9IGRlbHM7XHJcbiAgICAgIGlmKGRlbHMlMikge1xyXG4gICAgICAgIGZvcihsZXQgaT1mLTI7IGk+PTA7IC0taSkge1xyXG4gICAgICAgICAgaWYoRmluZGVyLmlzRGVsaW1ldHIodGhpcy5zdHJbaV0pIHx8IGk9PT0wKSB7XHJcbiAgICAgICAgICAgIGYgPSBpPT09MD8gMDogaSsxO1xyXG4gICAgICAgICAgICAtLWRlbHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBmb3IobGV0IGk9bCsyOyBpPHRoaXMuc3RyLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICBpZihGaW5kZXIuaXNEZWxpbWV0cih0aGlzLnN0cltpXSkgfHwgaT09PXRoaXMuc3RyLmxlbmd0aC0xKSB7XHJcbiAgICAgICAgICAgIGwgPSBpPT09dGhpcy5zdHIubGVuZ3RoLTE/IGk9PT10aGlzLnN0ci5sZW5ndGgtMTogaS0xO1xyXG4gICAgICAgICAgICAtLWRlbHM7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jb250ZXh0cy5wdXNoKHRoaXMuc3RyLnN1YnN0cihmLCBsLWYrMSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SGl0cygpIHtcclxuICAgIHJldHVybiB0aGlzLmhpdHM7XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZXh0cygpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRleHRzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRlZmF1bHRzID0ge1xyXG4gICAgY29udGV4dExlbmd0aDogNyxcclxuICAgIGhpdHM6IHRydWUsXHJcbiAgICBjb250ZXh0czogdHJ1ZVxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHN0cnMsIHBhdHRlcm4sIHByb3BzKSB7XHJcbiAgICB0aGlzLnByb3BzID0ge1xyXG4gICAgICAuLi5GaW5kZXIuZGVmYXVsdHMsXHJcbiAgICAgIC4uLnByb3BzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdHJzID0gc3RycztcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLm1lcmdlKHN0cnMpO1xyXG4gICAgdGhpcy5oaXRzID0gW107XHJcbiAgICB0aGlzLmNvbnRleHRzID0gW107XHJcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLmxzdHIgPSB0aGlzLnN0ci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgd2hpbGUodHJ1ZSkge1xyXG4gICAgICBwID0gdGhpcy5sc3RyLmluZGV4T2YodGhpcy5wYXR0ZXJuLCBwKTtcclxuICAgICAgaWYocD09PS0xKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRIaXRzKHApO1xyXG4gICAgICAgIHRoaXMuYWRkQ29udGV4dChwKTtcclxuICAgICAgICBwICs9IHRoaXMucGF0dGVybi5sZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvRmluZGVyLmpzIiwiaW1wb3J0IHtQREZKU30gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcblBERkpTLndvcmtlclNyYyA9ICh3aW5kb3cuUERGSlNfTE9DQUxFPyBQREZKU19MT0NBTEU6IEdMT0JBTF9QQVRIUykucGRmSnNXb3JrZXI7XHJcblBERkpTLmNNYXBVcmwgPSAod2luZG93LlBERkpTX0xPQ0FMRT8gUERGSlNfTE9DQUxFOiBHTE9CQUxfUEFUSFMpLnBkZkpzQ01hcFVybDtcclxuUERGSlMuY01hcFBhY2tlZCA9IHRydWU7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZGYge1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcmMsIGxvYWRpbmdQcm9ncmVzcykge1xyXG4gICAgdGhpcy5zcmMgPSBVdGlscy5ub3JtYWxpemVVcmwoc3JjKTtcclxuICAgIHRoaXMuaGFuZGxlclF1ZXVlID0gW107XHJcbiAgICB0aGlzLnByb2dyZXNEYXRhID0ge2xvYWRlZDogLTEsIHRvdGFsOiAxfTtcclxuICAgIHRoaXMubG9hZGluZ1Byb2dyZXNzID0gbG9hZGluZ1Byb2dyZXNzO1xyXG5cclxuICAgIFBERkpTLmdldERvY3VtZW50KHtcclxuICAgICAgdXJsOiB0aGlzLnNyYyxcclxuICAgICAgcmFuZ2VDaHVua1NpemU6IDUxMioxMDI0XHJcbiAgICB9LCBudWxsLCBudWxsLCAoZGF0YSk9PiB7XHJcbiAgICAgIGlmKHRoaXMubG9hZGluZ1Byb2dyZXNzKSB7XHJcbiAgICAgICAgbGV0IGN1ciA9IE1hdGguZmxvb3IoMTAwKmRhdGEubG9hZGVkL2RhdGEudG90YWwpLFxyXG4gICAgICAgICAgICAgIG9sZCA9IE1hdGguZmxvb3IoMTAwKnRoaXMucHJvZ3Jlc0RhdGEubG9hZGVkL3RoaXMucHJvZ3Jlc0RhdGEudG90YWwpO1xyXG4gICAgICAgIGlmKGN1ciE9PW9sZCkge1xyXG4gICAgICAgICAgY3VyID0gaXNOYU4oY3VyKT8gMDogY3VyO1xyXG4gICAgICAgICAgY3VyID0gY3VyPjEwMD8gMTAwOiBjdXI7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdQcm9ncmVzcyhjdXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnByb2dyZXNEYXRhID0gZGF0YTtcclxuICAgIH0pLlxyXG4gICAgdGhlbigoaGFuZGxlcik9PiB7XHJcbiAgICAgIGlmKGhhbmRsZXIubnVtUGFnZXM+MSkge1xyXG4gICAgICAgIFByb21pc2UuYWxsKFtoYW5kbGVyLmdldFBhZ2UoMSksIGhhbmRsZXIuZ2V0UGFnZSgyKV0pLlxyXG4gICAgICAgIHRoZW4oKHBhZ2VzKT0+IHtcclxuICAgICAgICAgIHRoaXMuaW5pdChoYW5kbGVyLCBwYWdlcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pbml0KGhhbmRsZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXQoaGFuZGxlciwgcGFnZXMpIHtcclxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XHJcbiAgICB0aGlzLmRvdWJsZWRQYWdlcyA9IHBhZ2VzPyAoTWF0aC5hYnMoMipQZGYuZ2V0UGFnZVNpemUocGFnZXNbMF0pLndpZHRoLVBkZi5nZXRQYWdlU2l6ZShwYWdlc1sxXSkud2lkdGgpL1BkZi5nZXRQYWdlU2l6ZShwYWdlc1swXSkud2lkdGg8MWUtNCk6IGZhbHNlO1xyXG4gICAgbGV0IGRvbmUgPSBQcm9taXNlLnJlc29sdmUoaGFuZGxlcik7XHJcbiAgICBmb3IobGV0IGNsYiBvZiB0aGlzLmhhbmRsZXJRdWV1ZS5yZXZlcnNlKCkpIHtcclxuICAgICAgZG9uZSA9IGRvbmUudGhlbigoaGFuZGxlcik9PiB7XHJcbiAgICAgICAgY2xiKGhhbmRsZXIpO1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVyO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFBhZ2VUeXBlKG4pIHtcclxuICAgIHJldHVybiAhdGhpcy5kb3VibGVkUGFnZXMgfHwgbj09PTAgfHwgbj09PXRoaXMuZ2V0UGFnZXNOdW0oKS0xPyAnZnVsbCc6IChuJjE/ICdsZWZ0JzogJ3JpZ2h0Jyk7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlKG4pIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIuZ2V0UGFnZSh0aGlzLmRvdWJsZWRQYWdlcz8gTWF0aC5jZWlsKG4vMikrMTogbisxKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLmhhbmRsZXJRdWV1ZS5zcGxpY2UoMCwgdGhpcy5oYW5kbGVyUXVldWUubGVuZ3RoKTtcclxuICAgIGRlbGV0ZSB0aGlzLmhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICBzZXRMb2FkaW5nUHJvZ3Jlc3NDbGIoY2xiKSB7XHJcbiAgICB0aGlzLmxvYWRpbmdQcm9ncmVzcyA9IGNsYjtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VzTnVtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcj8gKHRoaXMuZG91YmxlZFBhZ2VzPyAyKih0aGlzLmhhbmRsZXIubnVtUGFnZXMtMSk6IHRoaXMuaGFuZGxlci5udW1QYWdlcyk6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRQYWdlU2l6ZShwYWdlKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogcGFnZS52aWV3WzJdLXBhZ2Uudmlld1swXSxcclxuICAgICAgaGVpZ2h0OiBwYWdlLnZpZXdbM10tcGFnZS52aWV3WzFdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbi8vICAgaWYocGFnZXM+MSkge1xyXG4vLyAgIGhhbmRsZXIuZ2V0UGFnZSgyKS5cclxuLy8gICB0aGVuKChwYWdlKT0+IHtcclxuLy8gICAgIGNvbnN0IHNpemUxID0gUGRmLmdldFBhZ2VTaXplKHBhZ2UpO1xyXG4vLyAgICAgdGhpcy5wcm9wcy5kb3VibGVkUGFnZXMgPSAyKnNpemUwLndpZHRoPT09c2l6ZTEud2lkdGg7XHJcbi8vICAgICB0aGlzLnJlYWR5KCk7XHJcbi8vICAgfSkuXHJcbi8vICAgY2F0Y2goKCk9PiB0aGlzLnJlYWR5KCkpO1xyXG4vLyB9XHJcbi8vIGVsc2Uge1xyXG5cclxuICBnZXRIYW5kbGVyKGNsYikge1xyXG4gICAgaWYodGhpcy5oYW5kbGVyKSB7XHJcbiAgICAgIGNsYih0aGlzLmhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlclF1ZXVlLnB1c2goY2xiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1BkZi5qcyIsImltcG9ydCB7VEhSRUUsICR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGhyZWVFdmVudENvbnZlcnRlckZzIHtcclxuXHJcbiAgc3RhdGljIG9iamVjdHNUZXN0KG9iamVjdDEsIG9iamVjdDIpIHtcclxuICAgIHJldHVybiBvYmplY3QxICYmIG9iamVjdDI/IG9iamVjdDEub2JqZWN0PT09b2JqZWN0Mi5vYmplY3Q6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG9iamVjdHNBbmRGYWNlc1Rlc3Qob2JqZWN0MSwgb2JqZWN0Mikge1xyXG4gICAgcmV0dXJuIG9iamVjdDEgJiYgb2JqZWN0Mj8gb2JqZWN0MS5vYmplY3Q9PT1vYmplY3QyLm9iamVjdCAmJiBvYmplY3QxLmZhY2UubWF0ZXJpYWxJbmRleD09PW9iamVjdDIuZmFjZS5tYXRlcmlhbEluZGV4OiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbFdvcmxkLCB0ZXN0PVRocmVlRXZlbnRDb252ZXJ0ZXJGcy5vYmplY3RzQW5kRmFjZXNUZXN0KSB7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbFdvcmxkO1xyXG4gICAgdGhpcy5jb29yZHMgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIgPSB0aGlzLnZpc3VhbC5yYXljYXN0ZXI7XHJcbiAgICB0aGlzLmNhbWVyYSA9IHRoaXMudmlzdWFsLmNhbWVyYTtcclxuICAgIHRoaXMudGhyZWVzID0gW107XHJcbiAgICB0aGlzLnRlc3QgPSB0ZXN0O1xyXG4gIH1cclxuXHJcbiAgYWRkVGhyZWUodGhyZWUpIHtcclxuICAgIHRoaXMudGhyZWVzLnB1c2godGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlVGhyZWUodGhyZWUpIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnRocmVlcy5pbmRleE9mKHRocmVlKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMudGhyZWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE9iamVjdChlKSB7XHJcbiAgICB0aGlzLnNldENvb3Jkc0Zyb21FdmVudChlKTtcclxuICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5jb29yZHMsIHRoaXMuY2FtZXJhKTtcclxuICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMudGhyZWVzKTtcclxuICAgIHJldHVybiBpbnRlcnNlY3RzWzBdO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJy4vQmFzZU1hdGhVdGlscyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaHJlZVV0aWxzIHtcclxuXHJcbiAgc3RhdGljIHZlcnRpY2VzMlVWcyh2ZXJ0aWNlcywgaW5kZWNlcywgZmlyc3QsIGxhc3QsIGNvbnZlckNsYikge1xyXG4gICAgY29uc3QgciA9IFtdO1xyXG4gICAgZm9yKGxldCBpID0gZmlyc3Q7IGk8bGFzdDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IHZpcyA9IFtpbmRlY2VzW2ldLmEsaW5kZWNlc1tpXS5iLGluZGVjZXNbaV0uY107XHJcbiAgICAgIGZvcihsZXQgaiA9IDA7IGo8dmlzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgICAgaWYoIXJbdmlzW2pdXSkge1xyXG4gICAgICAgICAgclt2aXNbal1dID0gY29udmVyQ2xiKHZlcnRpY2VzW3Zpc1tqXV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY29tcHV0ZUZhY2VWZXJ0ZXhVdnMoZ2VvbWV0cnksIGZhY2VzKSB7XHJcbiAgICBjb25zdCB1dnMgPSBbXHJcbiAgICAgICAgICAgICAgICBUaHJlZVV0aWxzLnZlcnRpY2VzMlVWcyhnZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkuZmFjZXMsIDAsIGZhY2VzWzBdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKHAueCwgMS1wLnopKSxcclxuICAgICAgICAgICAgICAgIFRocmVlVXRpbHMudmVydGljZXMyVVZzKGdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS5mYWNlcywgZmFjZXNbMF0sIGZhY2VzWzFdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKDEtcC54LCAxLXAueikpLFxyXG4gICAgICAgICAgICAgICAgVGhyZWVVdGlscy52ZXJ0aWNlczJVVnMoZ2VvbWV0cnkudmVydGljZXMsIGdlb21ldHJ5LmZhY2VzLCBmYWNlc1sxXSwgZmFjZXNbMl0sIChwKT0+bmV3IFRIUkVFLlZlY3RvcjIocC54LCBwLnkpKSxcclxuICAgICAgICAgICAgICAgIFRocmVlVXRpbHMudmVydGljZXMyVVZzKGdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS5mYWNlcywgZmFjZXNbMl0sIGZhY2VzWzNdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKDEtcC54LCBwLnkpKSxcclxuICAgICAgICAgICAgICAgIFRocmVlVXRpbHMudmVydGljZXMyVVZzKGdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS5mYWNlcywgZmFjZXNbM10sIGZhY2VzWzRdLCAocCk9Pm5ldyBUSFJFRS5WZWN0b3IyKHAueiwgcC55KSksXHJcbiAgICAgICAgICAgICAgICBUaHJlZVV0aWxzLnZlcnRpY2VzMlVWcyhnZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkuZmFjZXMsIGZhY2VzWzRdLCBnZW9tZXRyeS5mYWNlcy5sZW5ndGgsIChwKT0+bmV3IFRIUkVFLlZlY3RvcjIoMS1wLnosIHAueSkpXHJcbiAgICBdO1xyXG5cclxuICAgIGxldCB1dnNpID0gMDtcclxuICAgIGZvcihsZXQgaSA9IDA7IGk8Z2VvbWV0cnkuZmFjZXMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgdXZzaSArPSBmYWNlc1t1dnNpXSA9PT0gaTtcclxuICAgICAgY29uc3QgZiA9IGdlb21ldHJ5LmZhY2VzW2ldO1xyXG4gICAgICBmLm1hdGVyaWFsSW5kZXggPSB1dnNpO1xyXG4gICAgICBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWzBdW2ldID0gW3V2c1t1dnNpXVtmLmFdLCB1dnNbdXZzaV1bZi5iXSwgdXZzW3V2c2ldW2YuY11dO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGNyZWF0ZU1hcmtlcihwLCBjLCBzaXplKSB7XHJcbiAgICBjb25zdCBtYXJrZXIgPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoc2l6ZSksIG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7IGNvbG9yOiBjIH0pKTtcclxuICAgIG1hcmtlci5wb3NpdGlvbi5zZXQocC54LHAueSxwLnopO1xyXG4gICAgcmV0dXJuIG1hcmtlcjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmaW5kVXZUcmlzKGdlb21ldHJ5LCBwcywgZmlyc3QsIGxhc3QpIHtcclxuICAgIGNvbnN0IHJlcyA9IFtdO1xyXG4gICAgZm9yKGxldCBwIG9mIHBzKSB7XHJcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICBmb3IobGV0IGk9Zmlyc3Q7IGk8bGFzdCAmJiAhZm91bmQ7ICsraSkge1xyXG4gICAgICAgIGNvbnN0IHRyaSA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbMF1baV07XHJcbiAgICAgICAgaWYoQmFzZU1hdGhVdGlscy5pc0luc2lkZUNvbnZQb2x5KHRyaSwgcCkpIHtcclxuICAgICAgICAgIHJlcy5wdXNoKHtcclxuICAgICAgICAgICAgY29lZnM6IEJhc2VNYXRoVXRpbHMuY29tcHV0ZUludGVycENvZWZzKHRyaSwgcCksXHJcbiAgICAgICAgICAgIGlcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZighZm91bmQpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdCYWQgcG9pbnQnKTtcclxuICAgICAgICByZXMucHVzaCh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZpbmRJbnRlcm5hbFZlcnRpY2VzKGdlb21ldHJ5LCBwcywgZmlyc3QsIGxhc3QpIHtcclxuICAgIGNvbnN0IHJlcyA9IHt9O1xyXG4gICAgZm9yKGxldCBpPWZpcnN0OyBpPGxhc3Q7ICsraSkge1xyXG4gICAgICBjb25zdCB0cmkgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWzBdW2ldLCBmID0gZ2VvbWV0cnkuZmFjZXNbaV0sIHZzID0gW2YuYSwgZi5iLCBmLmNdO1xyXG4gICAgICBmb3IobGV0IGo9MDsgajx0cmkubGVuZ3RoOyArK2opIHtcclxuICAgICAgICBpZihyZXNbdnNbal1dPT09dW5kZWZpbmVkICYmIEJhc2VNYXRoVXRpbHMuaXNJbnNpZGVQb2x5KHBzLCB0cmlbal0pKSB7XHJcbiAgICAgICAgICByZXNbdnNbal1dID0ge1xyXG4gICAgICAgICAgICBwOiB0cmlbal0sXHJcbiAgICAgICAgICAgIGk6IHZzW2pdLFxyXG4gICAgICAgICAgICBuOiBmLnZlcnRleE5vcm1hbHNbal1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZXMpO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGhyZWVVdGlscy5qcyIsIlxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYXJnZXQge1xyXG5cclxuICBzdGF0aWMgdGVzdChvYmplY3QxLCBvYmplY3QyKSB7XHJcbiAgICByZXR1cm4gb2JqZWN0MS50YXJnZXQ9PT1vYmplY3QyLnRhcmdldDtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL3RhcmdldHMvVGFyZ2V0LmpzIiwiaW1wb3J0IHskLCB0cn0gZnJvbSAnLi9qcy9saWJzJztcclxuaW1wb3J0IERldGVjdG9yIGZyb20gJ0RldGVjdG9yJztcclxuaW1wb3J0IFZpc3VhbFdvcmxkIGZyb20gJ1Zpc3VhbFdvcmxkJztcclxuaW1wb3J0IFBkZkxpbmtzSGFuZGxlciBmcm9tICcuL2pzL2NsYXNzZXMvUGRmTGlua3NIYW5kbGVyJztcclxuaW1wb3J0IEJvb2sgZnJvbSAnLi9qcy9jbGFzc2VzL0Jvb2snO1xyXG5pbXBvcnQgQm9va1ZpZXcgZnJvbSAnLi9qcy9jbGFzc2VzL0Jvb2tWaWV3JztcclxuaW1wb3J0IEJvb2tDb250cm9sbGVyIGZyb20gJy4vanMvY2xhc3Nlcy9Cb29rQ29udHJvbGxlcic7XHJcbmltcG9ydCBQZGZCb29rUHJvcHNCdWlsZGVyIGZyb20gJy4vanMvY2xhc3Nlcy9QZGZCb29rUHJvcHNCdWlsZGVyJztcclxuaW1wb3J0IENsYkJvb2tQcm9wc0J1aWxkZXIgZnJvbSAnLi9qcy9jbGFzc2VzL0NsYkJvb2tQcm9wc0J1aWxkZXInO1xyXG5pbXBvcnQgTG9hZGluZ0NvbnRyb2xsZXIgZnJvbSAnTG9hZGluZ0NvbnRyb2xsZXInO1xyXG5pbXBvcnQgU2VhcmNoIGZyb20gJ1NlYXJjaCc7XHJcbmltcG9ydCBCb29rbWFya3MgZnJvbSAnQm9va21hcmtzJztcclxuaW1wb3J0IFRodW1ibmFpbHMgZnJvbSAnVGh1bWJuYWlscyc7XHJcbmltcG9ydCBUb2NDb250cm9sbGVyIGZyb20gJy4vanMvY2xhc3Nlcy9Ub2NDb250cm9sbGVyJztcclxuaW1wb3J0IEJvb2tQcmludGVyIGZyb20gJy4vanMvY2xhc3Nlcy9Cb29rUHJpbnRlcic7XHJcbmltcG9ydCBBdXRvTmF2aWdhdG9yIGZyb20gJy4vanMvY2xhc3Nlcy9BdXRvTmF2aWdhdG9yJztcclxuaW1wb3J0IFNvdW5kc0Vudmlyb21lbnQgZnJvbSAnLi9qcy9jbGFzc2VzL1NvdW5kc0Vudmlyb21lbnQnO1xyXG5cclxuJC5mbi5GbGlwQm9vayA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcclxuICBjb25zdCBzY2VuZSA9IHtcclxuICAgIGRpc3Bvc2UoKSB7XHJcbiAgICAgIGlmKHRoaXMucmVhZHkpIHtcclxuICAgICAgICAhc2NlbmUucGRmTGlua3NIYW5kbGVyIHx8IHNjZW5lLnBkZkxpbmtzSGFuZGxlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnBkZkxpbmtzSGFuZGxlcjtcclxuICAgICAgICBzY2VuZS5zb3VuZHMuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5zb3VuZHM7XHJcbiAgICAgICAgc2NlbmUudG9jQ3RybC5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnRvY0N0cmw7XHJcbiAgICAgICAgc2NlbmUudGh1bWJuYWlscy5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnRodW1ibmFpbHM7XHJcbiAgICAgICAgIXNjZW5lLmJvb2ttYXJrcyB8fCBzY2VuZS5ib29rbWFya3MuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5ib29rbWFya3M7XHJcbiAgICAgICAgc2NlbmUuY3RybC5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLmN0cmw7XHJcbiAgICAgICAgc2NlbmUuYm9va1ByaW50ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5ib29rUHJpbnRlcjtcclxuICAgICAgICBzY2VuZS5ib29rLmRpc3Bvc2UoKTtcclxuICAgICAgICBkZWxldGUgc2NlbmUuYm9vaztcclxuICAgICAgICBzY2VuZS5wcm9wc0J1aWxkZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBzY2VuZS5wcm9wc0J1aWxkZXI7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLmJvb2tCdWlsZGVyO1xyXG4gICAgICAgIHNjZW5lLnZpc3VhbC5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLnZpc3VhbDtcclxuICAgICAgICBzY2VuZS52aWV3LmRpc3Bvc2UoKTtcclxuICAgICAgICBkZWxldGUgc2NlbmUudmlldztcclxuICAgICAgICBkZWxldGUgc2NlbmUuZGlzcG9zZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdEaXNwb3NlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfTtcclxuICBzY2VuZS52aWV3ID0gbmV3IEJvb2tWaWV3KHRoaXMubGVuZ3RoPyB0aGlzWzBdOiAkKCc8ZGl2PicpLmFwcGVuZFRvKCdib2R5JyksICgpPT4ge1xyXG4gICAgaWYoIURldGVjdG9yLndlYmdsKSB7XHJcbiAgICAgIERldGVjdG9yLmFkZEdldFdlYkdMTWVzc2FnZSh7cGFyZW50OiBzY2VuZS52aWV3LmdldFZpZXcoKX0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHNjZW5lLmxvYWRpbmdDdHJsID0gbmV3IExvYWRpbmdDb250cm9sbGVyKHNjZW5lLnZpZXcsIHRydWUsIChwcm9ncmVzcyk9PiBwcm9ncmVzcz09PTA/IHRyKCdQbGVhc2Ugd2FpdC4uLiB0aGUgQXBwbGljYXRpb24gaXMgTG9hZGluZycpOiB0cignUERGIGlzIExvYWRpbmc6JykrJyAnK3Byb2dyZXNzKyclJyk7XHJcbiAgICAgIHNjZW5lLnZpc3VhbCA9IG5ldyBWaXN1YWxXb3JsZChzY2VuZS52aWV3LmdldENvbnRhaW5lcigpLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcsIHNjZW5lLnZpZXcuZ2V0Q29udGFpbmVyKCkub3duZXJEb2N1bWVudCwgc2NlbmUudmlldy5nZXRWaWV3KCkpO1xyXG4gICAgICBzY2VuZS5ib29rQnVpbGRlciA9IChwcm9wcywgc2hlZXRzLCBwYWdlQ2FsbGJhY2spPT4ge1xyXG4gICAgICAgIHByb3BzLmNzc0xheWVyUHJvcHMgPSB7XHJcbiAgICAgICAgICAuLi5wcm9wcy5jc3NMYXllclByb3BzLFxyXG4gICAgICAgICAgc2NlbmVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmKG9wdGlvbnMucHJvcGVydGllc0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICBwcm9wcyA9IG9wdGlvbnMucHJvcGVydGllc0NhbGxiYWNrKHByb3BzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2NlbmUuYm9vayA9IG5ldyBCb29rKHNjZW5lLnZpc3VhbCwgc2hlZXRzLCBwYWdlQ2FsbGJhY2ssIHByb3BzKTtcclxuICAgICAgICBzY2VuZS5ib29rUHJpbnRlciA9IG5ldyBCb29rUHJpbnRlcihzY2VuZS52aXN1YWwsIHNjZW5lLmJvb2ssIChvcHRpb25zLnRlbXBsYXRlIHx8IHt9KS5wcmludFN0eWxlKTtcclxuICAgICAgICBzY2VuZS5sb2FkaW5nQ3RybC5kaXNwb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHNjZW5lLmxvYWRpbmdDdHJsO1xyXG4gICAgICAgIHNjZW5lLmN0cmwgPSBuZXcgQm9va0NvbnRyb2xsZXIoc2NlbmUuYm9vaywgc2NlbmUudmlldywgb3B0aW9ucy5jb250cm9sc1Byb3BzKTtcclxuICAgICAgICBzY2VuZS5ib29rLnNldEluamVjdG9yKCh3KT0+IHtcclxuICAgICAgICAgIHcualF1ZXJ5ID0gdy4kID0gJDtcclxuICAgICAgICAgIHcuYm9vayA9IHNjZW5lLmJvb2s7XHJcbiAgICAgICAgICB3LmJvb2tDdHJsID0gc2NlbmUuY3RybDtcclxuICAgICAgICAgIGlmKHByb3BzLmluamVjdG9yKSB7XHJcbiAgICAgICAgICAgIHByb3BzLmluamVjdG9yKHcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNjZW5lLnZpZXcuYWRkSGFuZGxlcihzY2VuZS5jdHJsKTtcclxuICAgICAgICBzY2VuZS5jdHJsLnNldFByaW50ZXIoc2NlbmUuYm9va1ByaW50ZXIpO1xyXG4gICAgICAgIGNvbnN0IHRlc3QgPSBwYWdlQ2FsbGJhY2soMCk7XHJcblxyXG4gICAgICAgIHNjZW5lLnNlYXJjaCA9IG5ldyBTZWFyY2goc2NlbmUudmlldy5nZXRTZWFyY2hWaWV3KCksIHNjZW5lLmJvb2suZ2V0UGFnZXMoKSk7XHJcbiAgICAgICAgc2NlbmUuc2VhcmNoLm9uUXVlcnkgPSBzY2VuZS5ib29rLnNldFF1ZXJ5LmJpbmQoc2NlbmUuYm9vayk7XHJcbiAgICAgICAgc2NlbmUuYm9vay5hZGRFdmVudExpc3RlbmVyKCdzZWFyY2hSZXN1bHRzJywgKGUpPT4ge1xyXG4gICAgICAgICAgc2NlbmUuc2VhcmNoLnNldFJlc3VsdHMoZS5yZXN1bHRzLCBlLmxhc3RQYWdlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2NlbmUudGh1bWJuYWlscyA9IG5ldyBUaHVtYm5haWxzKHNjZW5lLnZpc3VhbCwgc2NlbmUudmlldy5nZXRUaHVtYm5haWxzVmlldygpLCBwYWdlQ2FsbGJhY2ssIDIqKHNoZWV0cysyKSwge2tXdG9IOiBwcm9wcy53aWR0aC9wcm9wcy5oZWlnaHR9KTtcclxuICAgICAgICBzY2VuZS50b2NDdHJsID0gbmV3IFRvY0NvbnRyb2xsZXIoc2NlbmUudmlldywgc2NlbmUuY3RybCk7XHJcbiAgICAgICAgc2NlbmUudG9jQ3RybC5zZXRUaHVtYm5haWxzKHNjZW5lLnRodW1ibmFpbHMpO1xyXG4gICAgICAgIHNjZW5lLnRvY0N0cmwuc2V0U2VhcmNoKHNjZW5lLnNlYXJjaCk7XHJcbiAgICAgICAgc2NlbmUuY3RybC5zZXRUb2NDdHJsKHNjZW5lLnRvY0N0cmwpO1xyXG4gICAgICAgIHNjZW5lLnZpZXcuYWRkSGFuZGxlcihzY2VuZS50b2NDdHJsKTtcclxuXHJcbiAgICAgICAgaWYodGVzdC50eXBlPT09J3BkZicpIHtcclxuICAgICAgICAgIHNjZW5lLnBkZkxpbmtzSGFuZGxlciA9IG5ldyBQZGZMaW5rc0hhbmRsZXIodGVzdC5zcmMsIHNjZW5lLmN0cmwsIHNjZW5lLnZpc3VhbC5lbGVtZW50KTtcclxuICAgICAgICAgIHNjZW5lLmJvb2suYWRkRXZlbnRMaXN0ZW5lcigncGRmQW5ub3RhdGlvbicsIHNjZW5lLnBkZkxpbmtzSGFuZGxlci5oYW5kbGVFdmVudC5iaW5kKHNjZW5lLnBkZkxpbmtzSGFuZGxlcikpO1xyXG4gICAgICAgICAgdGVzdC5zcmMuZ2V0SGFuZGxlcigoaGFuZGxlcik9PiB7XHJcbiAgICAgICAgICAgIGhhbmRsZXIuZ2V0T3V0bGluZSgpLlxyXG4gICAgICAgICAgICAgIHRoZW4oKG91dGxpbmUpPT4ge1xyXG4gICAgICAgICAgICAgICAgc2NlbmUuYm9va21hcmtzID0gbmV3IEJvb2ttYXJrcyhzY2VuZS52aWV3LmdldEJvb2ttYXJrc1ZpZXcoKSwgb3V0bGluZSk7XHJcbiAgICAgICAgICAgICAgICBzY2VuZS50b2NDdHJsLnNldEJvb2ttYXJrcyhzY2VuZS5ib29rbWFya3MsIHRlc3Quc3JjKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYob3B0aW9ucy5wZGZMaW5rcyAmJiBvcHRpb25zLnBkZkxpbmtzLmhhbmRsZXIpIHtcclxuICAgICAgICAgICAgc2NlbmUucGRmTGlua3NIYW5kbGVyLnNldEhhbmRsZXIob3B0aW9ucy5wZGZMaW5rcy5oYW5kbGVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjZW5lLnNvdW5kcyA9IG5ldyBTb3VuZHNFbnZpcm9tZW50KG9wdGlvbnMudGVtcGxhdGUpO1xyXG4gICAgICAgIHNjZW5lLmN0cmwuc2V0U291bmRzKHNjZW5lLnNvdW5kcyk7XHJcbiAgICAgICAgc2NlbmUuc291bmRzLnN1YnNjcmliZUZsaXBzKHNjZW5lLmN0cmwpO1xyXG5cclxuICAgICAgICBzY2VuZS5yZWFkeSA9IHRydWU7XHJcbiAgICAgICAgbmV3IEF1dG9OYXZpZ2F0b3Ioc2NlbmUudmlzdWFsLCBzY2VuZS5jdHJsLCBvcHRpb25zLmF1dG9OYXZpZ2F0aW9uKS5kaXNwb3NlKCk7XHJcbiAgICAgICAgaWYob3B0aW9ucy5yZWFkeSkge1xyXG4gICAgICAgICAgb3B0aW9ucy5yZWFkeShzY2VuZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHNjZW5lLnBlbmRpbmdEaXNwb3NlKSB7XHJcbiAgICAgICAgICBzY2VuZS5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBpZihvcHRpb25zLnBkZikge1xyXG4gICAgICAgIHNjZW5lLnByb3BzQnVpbGRlciA9IG5ldyBQZGZCb29rUHJvcHNCdWlsZGVyKG9wdGlvbnMucGRmLCBzY2VuZS5ib29rQnVpbGRlcik7XHJcbiAgICAgICAgc2NlbmUucHJvcHNCdWlsZGVyLnBkZi5zZXRMb2FkaW5nUHJvZ3Jlc3NDbGIoc2NlbmUubG9hZGluZ0N0cmwuc2V0UHJvZ3Jlc3MuYmluZChzY2VuZS5sb2FkaW5nQ3RybCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYob3B0aW9ucy5wYWdlQ2FsbGJhY2spIHtcclxuICAgICAgICBzY2VuZS5wcm9wc0J1aWxkZXIgPSBuZXcgQ2xiQm9va1Byb3BzQnVpbGRlcihzY2VuZS52aXN1YWwsIG9wdGlvbnMucGFnZUNhbGxiYWNrLCBvcHRpb25zLnBhZ2VzLCBzY2VuZS5ib29rQnVpbGRlcik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2NlbmUucHJvcHNCdWlsZGVyID0gbmV3IENsYkJvb2tQcm9wc0J1aWxkZXIoc2NlbmUudmlzdWFsLCBCb29rLnBhZ2VDYWxsYmFjaywgNiwgc2NlbmUuYm9va0J1aWxkZXIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSwgb3B0aW9ucy50ZW1wbGF0ZSk7XHJcbiAgcmV0dXJuIHNjZW5lO1xyXG59XHJcblxyXG4kKCgpPT4ge1xyXG4gIGxldCBjb250YWluZXJzID0gJCgnLmZsaXAtYm9vay1jb250YWluZXInKTtcclxuICBmb3IobGV0IGkgPSAwOyBpPGNvbnRhaW5lcnMubGVuZ3RoOyArK2kpIHtcclxuICAgIGNvbnN0IGpDb250YWluZXIgPSAkKGNvbnRhaW5lcnNbaV0pLCBzcmMgPSBqQ29udGFpbmVyLmF0dHIoJ3NyYycpO1xyXG4gICAgaWYoISFzcmMpIHtcclxuICAgICAgakNvbnRhaW5lci5GbGlwQm9vayh7cGRmOiBzcmN9KTtcclxuICAgIH1cclxuICB9XHJcbn0pO1xyXG5cclxud2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0gJDtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vaW5kZXguanMiLCJpZiAoIUFycmF5LnByb3RvdHlwZS5maWxsKSB7XHJcbiAgQXJyYXkucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbih2YWx1ZSkge1xyXG5cclxuICAgIC8vINCo0LDQs9C4IDEtMi5cclxuICAgIGlmICh0aGlzID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBudWxsIG9yIG5vdCBkZWZpbmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIE8gPSBPYmplY3QodGhpcyk7XHJcblxyXG4gICAgLy8g0KjQsNCz0LggMy01LlxyXG4gICAgdmFyIGxlbiA9IE8ubGVuZ3RoID4+PiAwO1xyXG5cclxuICAgIC8vINCo0LDQs9C4IDYtNy5cclxuICAgIHZhciBzdGFydCA9IGFyZ3VtZW50c1sxXTtcclxuICAgIHZhciByZWxhdGl2ZVN0YXJ0ID0gc3RhcnQgPj4gMDtcclxuXHJcbiAgICAvLyDQqNCw0LMgOC5cclxuICAgIHZhciBrID0gcmVsYXRpdmVTdGFydCA8IDAgP1xyXG4gICAgICBNYXRoLm1heChsZW4gKyByZWxhdGl2ZVN0YXJ0LCAwKSA6XHJcbiAgICAgIE1hdGgubWluKHJlbGF0aXZlU3RhcnQsIGxlbik7XHJcblxyXG4gICAgLy8g0KjQsNCz0LggOS0xMC5cclxuICAgIHZhciBlbmQgPSBhcmd1bWVudHNbMl07XHJcbiAgICB2YXIgcmVsYXRpdmVFbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/XHJcbiAgICAgIGxlbiA6IGVuZCA+PiAwO1xyXG5cclxuICAgIC8vINCo0LDQsyAxMS5cclxuICAgIHZhciBmaW5hbCA9IHJlbGF0aXZlRW5kIDwgMCA/XHJcbiAgICAgIE1hdGgubWF4KGxlbiArIHJlbGF0aXZlRW5kLCAwKSA6XHJcbiAgICAgIE1hdGgubWluKHJlbGF0aXZlRW5kLCBsZW4pO1xyXG5cclxuICAgIC8vINCo0LDQsyAxMi5cclxuICAgIHdoaWxlIChrIDwgZmluYWwpIHtcclxuICAgICAgT1trXSA9IHZhbHVlO1xyXG4gICAgICBrKys7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g0KjQsNCzIDEzLlxyXG4gICAgcmV0dXJuIE87XHJcbiAgfTtcclxufVxyXG5cclxuaWYgKCFBcnJheS5wcm90b3R5cGUuZmluZCkge1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICdmaW5kJywge1xyXG4gICAgdmFsdWU6IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xyXG4gICAgICd1c2Ugc3RyaWN0JztcclxuICAgICBpZiAodGhpcyA9PSBudWxsKSB7XHJcbiAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcclxuICAgICB9XHJcbiAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgICB9XHJcbiAgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XHJcbiAgICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xyXG4gICAgIHZhciB0aGlzQXJnID0gYXJndW1lbnRzWzFdO1xyXG4gICAgIHZhciB2YWx1ZTtcclxuXHJcbiAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgdmFsdWUgPSBsaXN0W2ldO1xyXG4gICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xyXG4gICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICB9XHJcbiAgICAgfVxyXG4gICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmlmICghQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCkge1xyXG4gIEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXggPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcclxuICAgIGlmICh0aGlzID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcclxuICAgIH1cclxuICAgIHZhciBsaXN0ID0gT2JqZWN0KHRoaXMpO1xyXG4gICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xyXG4gICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XHJcbiAgICB2YXIgdmFsdWU7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICB2YWx1ZSA9IGxpc3RbaV07XHJcbiAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaSwgbGlzdCkpIHtcclxuICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH07XHJcbn1cclxuXHJcbmlmICghT2JqZWN0LnZhbHVlcykge1xyXG5cdE9iamVjdC52YWx1ZXMgPSBmdW5jdGlvbiB2YWx1ZXMoTykge1xyXG5cdFx0cmV0dXJuIE9iamVjdC5rZXlzKE8pLm1hcCgobmFtZSk9Pk9bbmFtZV0pIHx8IFtdO1xyXG5cdH07XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL3BvbHlmaWxsLmpzIiwiXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dG9OYXZpZ2F0b3Ige1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBib29rQ3RybCwgcHJvcHM9e30pIHtcclxuICAgIHByb3BzID0ge1xyXG4gICAgICAuLi5wcm9wcyxcclxuICAgICAgdXJsUGFyYW06IHByb3BzLnVybFBhcmFtIHx8ICdmYjNkLXBhZ2UnLFxyXG4gICAgICBuYXZpZ2F0ZXM6IHByb3BzLm5hdmlnYXRlcz09PXVuZGVmaW5lZD8gMTogcHJvcHMubmF2aWdhdGVzXHJcbiAgICB9O1xyXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMuYm9va0N0cmwgPSBib29rQ3RybDtcclxuICAgIHRoaXMudXJsUGFyYW0gPSBwcm9wcy51cmxQYXJhbTtcclxuICAgIHRoaXMud25kID0gY29udGV4dC53bmQ7XHJcblxyXG4gICAgdGhpcy53bmQuZmIzZCA9IHtcclxuICAgICAgLi4udGhpcy53bmQuZmIzZFxyXG4gICAgfTtcclxuICAgIHRoaXMud25kLmZiM2QubmF2aWdhdG9yID0ge1xyXG4gICAgICAuLi50aGlzLnduZC5mYjNkLm5hdmlnYXRvclxyXG4gICAgfTtcclxuICAgIHRoaXMubmF2aWdhdG9yID0gdGhpcy53bmQuZmIzZC5uYXZpZ2F0b3JbdGhpcy51cmxQYXJhbV0gPSB7XHJcbiAgICAgIC4uLnRoaXMud25kLmZiM2QubmF2aWdhdG9yW3RoaXMudXJsUGFyYW1dXHJcbiAgICB9O1xyXG4gICAgdGhpcy5uYXZpZ2F0b3IuaW5zdGFuY2VzID0gKHRoaXMubmF2aWdhdG9yLmluc3RhbmNlcyB8fCAwKSsxO1xyXG5cclxuICAgIGlmKHRoaXMubmF2aWdhdG9yLmluc3RhbmNlczw9dGhpcy5wcm9wcy5uYXZpZ2F0ZXMpIHtcclxuICAgICAgdGhpcy5ib29rQ3RybC5nb1RvUGFnZSh0aGlzLmdldFBhZ2VOdW1iZXIoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG5cclxuICB9XHJcblxyXG4gIGdldFBhcmFtZXRlckJ5TmFtZShuYW1lLCB1cmwpIHtcclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xyXG4gICAgfVxyXG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW1xcXV0vZywgJ1xcXFwkJicpO1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCdbPyZdJyArIG5hbWUgKyAnKD0oW15dKil8JnwjfCQpJyksXHJcbiAgICByZXN1bHRzID0gcmVnZXguZXhlYyh1cmwpO1xyXG4gICAgaWYgKCFyZXN1bHRzKSByZXR1cm4gbnVsbDtcclxuICAgIGlmICghcmVzdWx0c1syXSkgcmV0dXJuICcnO1xyXG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyZXN1bHRzWzJdLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcclxuICB9XHJcblxyXG4gIGdldFBhZ2VOdW1iZXIoKSB7XHJcbiAgICBsZXQgbnVtYmVyID0gdGhpcy5nZXRQYXJhbWV0ZXJCeU5hbWUodGhpcy51cmxQYXJhbSk7XHJcbiAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIpO1xyXG4gICAgaWYoaXNOYU4obnVtYmVyKSkge1xyXG4gICAgICBudW1iZXIgPSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bWJlci0xO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9BdXRvTmF2aWdhdG9yLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBNYXRoVXRpbHMgZnJvbSAnTWF0aFV0aWxzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmluZGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3IodmlzdWFsLCBwKSB7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbDtcclxuICAgIHRoaXMucCA9IHtcclxuICAgICAgLi4ucCxcclxuICAgICAgYmFja1NpemU6IDIqcC5jb3Zlci5kZXB0aCtwLnNoZWV0cypwLnBhZ2UuZGVwdGhcclxuICAgIH07XHJcbiAgICB0aGlzLk9aID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwwLDEpO1xyXG5cclxuICAgIHRoaXMuYmFja0cgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkocC5jb3Zlci5kZXB0aCwgdGhpcy5wLmJhY2tTaXplLCBwLmNvdmVyLmhlaWdodCk7XHJcblxyXG4gICAgdGhpcy5tYXRlcmlhbHMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiBwLmNvdmVyLmNvbG9yfSlcclxuICAgICAgICAgICAgICAgICAgICAgXTtcclxuXHJcbiAgICBjb25zdCBiYWNrTSA9IG5ldyBUSFJFRS5NZXNoKHRoaXMuYmFja0csIG5ldyBUSFJFRS5NZXNoRmFjZU1hdGVyaWFsKHRoaXMubWF0ZXJpYWxzKSk7XHJcblxyXG4gICAgaWYocC5jb3Zlci5iaW5kZXJUZXh0dXJlIT09JycpIHtcclxuICAgICAgdGhpcy52aXN1YWwudGV4dHVyZUxvYWRlci5sb2FkKHAuY292ZXIuYmluZGVyVGV4dHVyZSwgKHRleHR1cmUpPT4ge1xyXG4gICAgICAgIHRoaXMubWF0ZXJpYWxzWzFdLmNvbG9yLnNldEhleCgweEZGRkZGRik7XHJcbiAgICAgICAgdGhpcy5tYXRlcmlhbHNbMV0ubWFwID0gdGV4dHVyZTtcclxuICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1hdGVyaWFsc1sxXS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGhyZWUgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMuYmFjayA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgdGhpcy5iYWNrUlQgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMuYmFja1JSID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICB0aGlzLmJhY2tMVCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgdGhpcy5iYWNrTFIgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIHRoaXMubGVmdFBpdm90ID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICB0aGlzLnJpZ2h0UGl2b3QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuXHJcbiAgICB0aGlzLmJhY2suYWRkKGJhY2tNKTtcclxuICAgIHRoaXMuYmFjay5hZGQodGhpcy5sZWZ0UGl2b3QpO1xyXG4gICAgdGhpcy5iYWNrLmFkZCh0aGlzLnJpZ2h0UGl2b3QpO1xyXG4gICAgdGhpcy5iYWNrUlQuYWRkKHRoaXMuYmFjayk7XHJcbiAgICB0aGlzLmJhY2tSUi5hZGQodGhpcy5iYWNrUlQpO1xyXG4gICAgdGhpcy5iYWNrTFQuYWRkKHRoaXMuYmFja1JSKTtcclxuICAgIHRoaXMuYmFja0xSLmFkZCh0aGlzLmJhY2tMVCk7XHJcbiAgICB0aGlzLnRocmVlLmFkZCh0aGlzLmJhY2tMUik7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgZm9yKGxldCBtIG9mIHRoaXMubWF0ZXJpYWxzKSB7XHJcbiAgICAgIGlmKG0ubWFwKSB7XHJcbiAgICAgICAgbS5tYXAgPSBudWxsO1xyXG4gICAgICAgIG0ubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIG0uZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlIHRoaXMubWF0ZXJpYWxzO1xyXG4gICAgdGhpcy5iYWNrRy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICBzZXQoYW5nbGUpIHtcclxuICAgIGxldCByaWdodCwgbGVmdDtcclxuICAgIGlmKGFuZ2xlPk1hdGguUEkvMikge1xyXG4gICAgICByaWdodCA9IE1hdGguUEkvMjtcclxuICAgICAgbGVmdCA9IGFuZ2xlLU1hdGguUEkvMjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByaWdodCA9IGFuZ2xlO1xyXG4gICAgICBsZWZ0ID0gMDtcclxuICAgIH1cclxuICAgIGNvbnN0IHAgPSB0aGlzLnAsdHIxPXt4Oi0wLjUqcC5jb3Zlci5kZXB0aCx5OjAuNSpwLmJhY2tTaXplLXAuY292ZXIuZGVwdGh9O1xyXG4gICAgdGhpcy5iYWNrUlQucG9zaXRpb24uc2V0KHRyMS54LHRyMS55LDApO1xyXG4gICAgdGhpcy5iYWNrUlIucG9zaXRpb24uc2V0KC10cjEueCwtdHIxLnksMCk7XHJcbiAgICB0aGlzLmJhY2tSUi5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodGhpcy5PWiwgcmlnaHQpO1xyXG5cclxuICAgIGNvbnN0IHRyMj17eDpwLmJhY2tTaXplLTIqcC5jb3Zlci5kZXB0aC0wLjUqcC5jb3Zlci5kZXB0aCx5OjAuNSpwLmJhY2tTaXplLXAuY292ZXIuZGVwdGh9O1xyXG4gICAgdGhpcy5iYWNrTFQucG9zaXRpb24uc2V0KHRyMi54LHRyMi55LDApO1xyXG4gICAgdGhpcy5iYWNrTFIucG9zaXRpb24uc2V0KC10cjIueCwtdHIyLnksMCk7XHJcbiAgICB0aGlzLmJhY2tMUi5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodGhpcy5PWiwgbGVmdCk7XHJcbiAgfVxyXG5cclxuICBzZXRMZWZ0KGFuZ2xlKSB7XHJcbiAgICBjb25zdCBQSSA9IE1hdGguUEk7XHJcbiAgICB0aGlzLmxlZnRQaXZvdC5wb3NpdGlvbi5zZXQoTWF0aFV0aWxzLmludGVycG9sYXRlTGluZWFyKFstUEksLVBJLzJdLFswLHRoaXMucC5jb3Zlci5kZXB0aF0sYW5nbGUpLDAuNSp0aGlzLnAuYmFja1NpemUtMC41KnRoaXMucC5jb3Zlci5kZXB0aCwwKTtcclxuICAgIHRoaXMubGVmdFBpdm90LnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0aGlzLk9aLCBhbmdsZSk7XHJcbiAgfVxyXG5cclxuICBzZXRSaWdodChhbmdsZSkge1xyXG4gICAgY29uc3QgUEkgPSBNYXRoLlBJO1xyXG4gICAgICB0aGlzLnJpZ2h0UGl2b3QucG9zaXRpb24uc2V0KE1hdGhVdGlscy5pbnRlcnBvbGF0ZUxpbmVhcihbLVBJLzIsMF0sW3RoaXMucC5jb3Zlci5kZXB0aCwwXSxhbmdsZSksLTAuNSp0aGlzLnAuYmFja1NpemUrMC41KnRoaXMucC5jb3Zlci5kZXB0aCwwKTtcclxuICAgICAgdGhpcy5yaWdodFBpdm90LnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0aGlzLk9aLCBhbmdsZSk7XHJcbiAgfVxyXG5cclxuICBqb2luTGVmdENvdmVyKGNvdmVyKSB7XHJcbiAgICBjb3Zlci50aHJlZS5wb3NpdGlvbi5zZXQoMCwtMC41KnRoaXMucC5jb3Zlci5kZXB0aCwwKTtcclxuICAgIHRoaXMubGVmdFBpdm90LmFkZChjb3Zlci50aHJlZSk7XHJcbiAgfVxyXG5cclxuICBkaXNjb25uZWN0TGVmdENvdmVyKGNvdmVyKSB7XHJcbiAgICB0aGlzLmxlZnRQaXZvdC5yZW1vdmUoY292ZXIudGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgam9pblJpZ2h0Q292ZXIoY292ZXIpIHtcclxuICAgIGNvdmVyLnRocmVlLnBvc2l0aW9uLnNldCgwLC0wLjUqdGhpcy5wLmNvdmVyLmRlcHRoLDApO1xyXG4gICAgdGhpcy5yaWdodFBpdm90LmFkZChjb3Zlci50aHJlZSk7XHJcbiAgfVxyXG5cclxuICBkaXNjb25uZWN0UmlnaHRDb3Zlcihjb3Zlcikge1xyXG4gICAgdGhpcy5yaWdodFBpdm90LnJlbW92ZShjb3Zlci50aHJlZSk7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9CaW5kZXIuanMiLCJpbXBvcnQgeyQsIFRIUkVFfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IHtwcm9wcyBhcyAgYm9va1Byb3BzfSBmcm9tICcuLi9wcm9wcy9ib29rJztcclxuaW1wb3J0IEdyYXBoVXRpbHMgZnJvbSAnR3JhcGhVdGlscyc7XHJcbmltcG9ydCBCaW5kZXIgZnJvbSAnLi9CaW5kZXInO1xyXG5pbXBvcnQgQ292ZXIgZnJvbSAnLi9Db3Zlcic7XHJcbmltcG9ydCBTaGVldEJsb2NrIGZyb20gJy4vU2hlZXRCbG9jayc7XHJcbmltcG9ydCBTaGVldFBoeXNpY3MgZnJvbSAnLi9TaGVldFBoeXNpY3MnO1xyXG5pbXBvcnQgUGFnZU1hbmFnZXIgZnJvbSAnLi9QYWdlTWFuYWdlcic7XHJcbmltcG9ydCBDU1NMYXllciBmcm9tICdDU1NMYXllcic7XHJcbmltcG9ydCBDc3NMYXllcnNNYW5hZ2VyIGZyb20gJy4vQ3NzTGF5ZXJzTWFuYWdlcic7XHJcbmltcG9ydCBTZWFyY2hFbmdpbmUgZnJvbSAnLi9TZWFyY2hFbmdpbmUnO1xyXG5pbXBvcnQgQ3VzdG9tRXZlbnRDb252ZXJ0ZXIgZnJvbSAnQ3VzdG9tRXZlbnRDb252ZXJ0ZXInO1xyXG5pbXBvcnQgQ2lyY2xlVGFyZ2V0IGZyb20gJ3RhcmdldHMvQ2lyY2xlVGFyZ2V0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvb2sgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXIge1xyXG4gIC8vIHBhZ2VDYWxsYmFjayBzYW1wbGVzXHJcblxyXG4gIC8vIChuKT0+ICh7XHJcbiAgLy8gICB0eXBlOiAnaW1hZ2UnLFxyXG4gIC8vICAgc3JjOiAnc2FtcGxlLnBuZycsXHJcbiAgLy8gICBpbnRlcmFjdGl2ZTogZmFsc2VcclxuICAvLyB9KTtcclxuICAvL1xyXG4gIC8vIChuKT0+ICh7XHJcbiAgLy8gICB0eXBlOiAnaHRtbCcsXHJcbiAgLy8gICBzcmM6ICdzYW1wbGUuaHRtbCcsXHJcbiAgLy8gICBpbnRlcmFjdGl2ZTogdHJ1ZVxyXG4gIC8vIH0pO1xyXG4gIC8vXHJcbiAgLy8gY29uc3QgcGRmID0gbmV3IFBkZignc2FtcGxlLnBkZicpO1xyXG4gIC8vIChuKT0+ICh7XHJcbiAgLy8gICB0eXBlOiAncGRmJyxcclxuICAvLyAgIHNyYzogcGRmLFxyXG4gIC8vICAgaW50ZXJhY3RpdmU6IGZhbHNlXHJcbiAgLy8gfSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgc2hlZXRzLCBwYWdlQ2FsbGJhY2ssIHByb3BzKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgc2hlZXRzID0gTWF0aC5taW4oMywgc2hlZXRzKTtcclxuICAgIHZpc3VhbC5qQ29udGFpbmVyLmFwcGVuZChgXHJcbiAgICAgIDxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj5cclxuICAgICAgICAuZGVtby1tc2cge1xyXG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgICAgdG9wOiAxMHB4O1xyXG4gICAgICAgICAgcmlnaHQ6IDEwcHg7XHJcbiAgICAgICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZTRlMTtcclxuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICB9XHJcbiAgICAgIDwvc3R5bGU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkZW1vLW1zZ1wiPlxyXG4gICAgICAgIFRoaXMgaXMgdGhlIGRlbW8gdmVyc2lvbiwgb25seSAxMCBwYWdlcyBhcmUgYXZhaWxhYmxlLiBVc2UgdGhlIDxhIGhyZWY9XCJodHRwczovL2dvby5nbC9idDNaaGhcIiB0YXJnZXQ9XCJfYmxhbmtcIj5mdWxsIHZlcnNpb248L2E+LlxyXG4gICAgICA8L2Rpdj5cclxuICAgIGApO1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWw7XHJcbiAgICB0aGlzLm1vdXNlQ29udHJvbGxlciA9IHRydWU7XHJcbiAgICB0aGlzLnAgPSB7XHJcbiAgICAgIC4uLkJvb2sucHJlcGFyZVByb3BzKHByb3BzKSxcclxuICAgICAgc2hlZXRzLFxyXG4gICAgICBwYWdlQ2FsbGJhY2ssXHJcbiAgICAgIHpvb206IDEsXHJcbiAgICAgIHNpbmdsZVBhZ2U6IGZhbHNlLFxyXG4gICAgICBhdXRvUmVzb2x1dGlvbjoge1xyXG4gICAgICAgIGVuYWJsZTogZmFsc2UsXHJcbiAgICAgICAgazogMS41XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyID0gbmV3IFBhZ2VNYW5hZ2VyKHZpc3VhbCwgdGhpcywgdGhpcy5wKTtcclxuICAgIENTU0xheWVyLmluaXQodmlzdWFsLmRvYyk7XHJcbiAgICB0aGlzLmxheWVyTWFuYWdlciA9IG5ldyBDc3NMYXllcnNNYW5hZ2VyKHRoaXMpO1xyXG4gICAgdGhpcy5zZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKHBhZ2VDYWxsYmFjaywgMiooc2hlZXRzKzIpKTtcclxuICAgIHRoaXMuc2VhcmNoRW5naW5lLm9uUGFnZUhpdHNDaGFuZ2VkID0gKHBhZ2UsIHF1ZXJ5KT0+IHtcclxuICAgICAgdGhpcy5wYWdlTWFuYWdlci5yZWZyZXNoUGFnZVF1ZXJ5KHBhZ2UsIHF1ZXJ5KTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgICB0eXBlOiAnc2VhcmNoUmVzdWx0cycsXHJcbiAgICAgICAgcmVzdWx0czogdGhpcy5zZWFyY2hFbmdpbmUucmVzdWx0cyxcclxuICAgICAgICBsYXN0UGFnZTogcGFnZSxcclxuICAgICAgICBxdWVyeVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy50aHJlZSA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG5cclxuICAgIHRoaXMuYmluZGVyID0gbmV3IEJpbmRlcih2aXN1YWwsIHRoaXMucCk7XHJcbiAgICB0aGlzLnRocmVlLmFkZCh0aGlzLmJpbmRlci50aHJlZSk7XHJcblxyXG4gICAgdGhpcy5sZWZ0Q292ZXIgPSBuZXcgQ292ZXIodmlzdWFsLCB7Li4udGhpcy5wLCBzZXRUZXh0dXJlOiB0aGlzLnNldExlZnRDb3ZlclRleHR1cmUuYmluZCh0aGlzKX0sIE1hdGguUEkvMiwgJ29wZW5lZCcpO1xyXG4gICAgdGhpcy5iaW5kZXIuam9pbkxlZnRDb3Zlcih0aGlzLmxlZnRDb3Zlcik7XHJcbiAgICB0aGlzLnN1YnNjcmliZVNoZWV0QmxvY2sodGhpcy5sZWZ0Q292ZXIsIDApO1xyXG4gICAgdGhpcy5yaWdodENvdmVyID0gbmV3IENvdmVyKHZpc3VhbCwgey4uLnRoaXMucCwgc2V0VGV4dHVyZTogdGhpcy5zZXRSaWdodENvdmVyVGV4dHVyZS5iaW5kKHRoaXMpfSwgMCwgJ2Nsb3NlZCcpO1xyXG4gICAgdGhpcy5iaW5kZXIuam9pblJpZ2h0Q292ZXIodGhpcy5yaWdodENvdmVyKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlU2hlZXRCbG9jayh0aGlzLnJpZ2h0Q292ZXIsIDIqKHRoaXMucC5zaGVldHMrMSkpO1xyXG5cclxuICAgIHRoaXMudGhyZWVTaGVldEJsb2NrcyA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xyXG4gICAgdGhpcy50aHJlZS5hZGQodGhpcy50aHJlZVNoZWV0QmxvY2tzKTtcclxuICAgIHRoaXMudGhyZWVTaGVldEJsb2Nrcy5wb3NpdGlvbi5zZXQoMC41KnRoaXMucC5jb3Zlci5kZXB0aC0wLjUqc2hlZXRzKnRoaXMucC5wYWdlLmRlcHRoLC0wLjUqc2hlZXRzKnRoaXMucC5wYWdlLmRlcHRoLDApO1xyXG5cclxuICAgIHRoaXMuc2hlZXRCbG9ja3MgPSBbXTtcclxuICAgIGlmKHNoZWV0cz4wKSB7XHJcbiAgICAgIHRoaXMuYWRkU2hlZXRCbG9jaygwLCBuZXcgU2hlZXRCbG9jayh2aXN1YWwsIHsuLi50aGlzLnAsIHNldFRleHR1cmU6IHRoaXMuc2V0UGFnZVRleHR1cmUuYmluZCh0aGlzKX0sIDAsIHNoZWV0cywgMCwgJ2Nsb3NlZCcpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFuZ2xlID0gdGhpcy5wLnJ0bD8gTWF0aC5QSTogMDtcclxuICAgIHRoaXMuY2xvc2VkQW5nbGUgPSAwO1xyXG4gICAgdGhpcy5zZXQodGhpcy5hbmdsZSwwKTtcclxuICAgIHRoaXMubGFzdE1vdXNlUG9zID0ge1xyXG4gICAgICB0OiAwXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMudGhyZWUucG9zaXRpb24uc2V0KC0wLjUqdGhpcy5wLmNvdmVyLmRlcHRoKzAuNSpzaGVldHMqdGhpcy5wLnBhZ2UuZGVwdGgsMCwwKTtcclxuICAgIHRoaXMuc2hlZXRQaHlzaWNzID0gbmV3IFNoZWV0UGh5c2ljcyh0aGlzLnAucGFnZS53aWR0aC90aGlzLnAuc2NhbGUsIHRoaXMucC5ncmF2aXR5LCB0aGlzLnAucGFnZS5jb3JuZXJEZXZpYXRpb24pO1xyXG5cclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIHVwZGF0ZTogdGhpcy51cGRhdGUuYmluZCh0aGlzKSxcclxuICAgICAgbGFzdE1vdXNlUG9zOiAoZSk9PiB7XHJcbiAgICAgICAgdGhpcy5sYXN0TW91c2VQb3MgPSB7XHJcbiAgICAgICAgICAuLi50aGlzLmxhc3RNb3VzZVBvcyxcclxuICAgICAgICAgIHBhZ2VYOiBlLnBhZ2VYLFxyXG4gICAgICAgICAgcGFnZVk6IGUucGFnZVlcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy52aXN1YWwuYWRkUmVuZGVyQ2FsbGJhY2sodGhpcy5iaW5kcy51cGRhdGUpO1xyXG4gICAgJCh0aGlzLnZpc3VhbC5lbGVtZW50KS5vbignbW91c2Vtb3ZlJywgdGhpcy5iaW5kcy5sYXN0TW91c2VQb3MpO1xyXG5cclxuICAgIHRoaXMuYmluZHMub25QaWNrQ2FsbGJhY2sgPSB0aGlzLm9uUGlja0NhbGxiYWNrLmJpbmQodGhpcylcclxuICAgIHRoaXMudmlzdWFsLmRyYWcub25QaWNrQ2FsbGJhY2sgPSB0aGlzLmJpbmRzLm9uUGlja0NhbGxiYWNrO1xyXG4gICAgdGhpcy5iaW5kcy5vbkRyYWdDYWxsYmFjayA9IHRoaXMub25EcmFnQ2FsbGJhY2suYmluZCh0aGlzKVxyXG4gICAgdGhpcy52aXN1YWwuZHJhZy5vbkRyYWdDYWxsYmFjayA9IHRoaXMuYmluZHMub25EcmFnQ2FsbGJhY2s7XHJcbiAgICB0aGlzLmJpbmRzLm9uUmVsZWFzZUNhbGxiYWNrID0gdGhpcy5vblJlbGVhc2VDYWxsYmFjay5iaW5kKHRoaXMpXHJcbiAgICB0aGlzLnZpc3VhbC5kcmFnLm9uUmVsZWFzZUNhbGxiYWNrID0gdGhpcy5iaW5kcy5vblJlbGVhc2VDYWxsYmFjaztcclxuXHJcbiAgICB0aGlzLmRyYWdBbmdsZSA9IDAuMDU7XHJcbiAgICB0aGlzLnRtcCA9IHtcclxuICAgICAgYm94czogW1xyXG4gICAgICAgIG5ldyBUSFJFRS5Cb3gzKCksXHJcbiAgICAgICAgbmV3IFRIUkVFLkJveDMoKVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMudmlzdWFsLmFkZE9iamVjdCh0aGlzLnRocmVlKTtcclxuICAgIHRoaXMudmlzdWFsLmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucGFnZU1hbmFnZXIucmVmcmVzaFpvb20uYmluZCh0aGlzLnBhZ2VNYW5hZ2VyKSk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKT0+IHtcclxuICAgICAgdGhpcy5ub3RpZnlCZWZvcmVBbmltYXRpb24oKTtcclxuICAgICAgdGhpcy5ub3RpZnlBZnRlckFuaW1hdGlvbigpO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnZpc3VhbC5yZW1vdmVPYmplY3QodGhpcy50aHJlZSk7XHJcbiAgICB0aGlzLnNoZWV0UGh5c2ljcy5kaXNwb3NlKCk7XHJcbiAgICBkZWxldGUgdGhpcy52aXN1YWwuZHJhZy5vblBpY2tDYWxsYmFjaztcclxuICAgIGRlbGV0ZSB0aGlzLnZpc3VhbC5kcmFnLm9uRHJhZ0NhbGxiYWNrO1xyXG4gICAgZGVsZXRlIHRoaXMudmlzdWFsLmRyYWcub25SZWxlYXNlQ2FsbGJhY2s7XHJcbiAgICAkKHRoaXMudmlzdWFsLmVsZW1lbnQpLm9mZignbW91c2Vtb3ZlJywgdGhpcy5iaW5kcy5sYXN0TW91c2VQb3MpO1xyXG4gICAgdGhpcy52aXN1YWwucmVtb3ZlUmVuZGVyQ2FsbGJhY2sodGhpcy5iaW5kcy51cGRhdGUpO1xyXG4gICAgdGhpcy5yZW1vdmVTaGVldEJsb2NrcygwLCB0aGlzLnNoZWV0QmxvY2tzLmxlbmd0aCk7XHJcbiAgICB0aGlzLmJpbmRlci5kaXNjb25uZWN0TGVmdENvdmVyKHRoaXMubGVmdENvdmVyKTtcclxuICAgIHRoaXMucmVtb3ZlU2hlZXRCbG9jayh0aGlzLmxlZnRDb3Zlcik7XHJcbiAgICB0aGlzLmJpbmRlci5kaXNjb25uZWN0UmlnaHRDb3Zlcih0aGlzLnJpZ2h0Q292ZXIpO1xyXG4gICAgdGhpcy5yZW1vdmVTaGVldEJsb2NrKHRoaXMucmlnaHRDb3Zlcik7XHJcbiAgICB0aGlzLmJpbmRlci5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLmxheWVyTWFuYWdlci5kaXNwb3NlKCk7XHJcbiAgICBDU1NMYXllci5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyLmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpY3Mge1xyXG5cclxuICBzZXRBdXRvUmVzb2x1dGlvbihlbmFibGUsIGs9MS41KSB7XHJcbiAgICB0aGlzLnAuYXV0b1Jlc29sdXRpb24gPSB7XHJcbiAgICAgIC4uLnRoaXMucC5hdXRvUmVzb2x1dGlvbixcclxuICAgICAgZW5hYmxlLFxyXG4gICAgICBrXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgc2V0Wm9vbSh6b29tLCBzaW5nbGVQYWdlKSB7XHJcbiAgICBpZihNYXRoLmFicyh0aGlzLnAuem9vbS16b29tKT4xZS0zIHx8IHNpbmdsZVBhZ2UhPT10aGlzLnAuc2luZ2xlUGFnZSkge1xyXG4gICAgICB0aGlzLnAuem9vbSA9IHpvb207XHJcbiAgICAgIHRoaXMucC5zaW5nbGVQYWdlID0gc2luZ2xlUGFnZTtcclxuICAgICAgdGhpcy5wYWdlTWFuYWdlci5yZWZyZXNoWm9vbSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZUNhbGxiYWNrKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucC5wYWdlQ2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBzZXRRdWVyeShxdWVyeSkge1xyXG4gICAgdGhpcy5zZWFyY2hFbmdpbmUuc2V0UXVlcnkocXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgaXNQcm9jZXNzaW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlZXRQaHlzaWNzLmdldFNpemUoKSE9PTA7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlcygpIHtcclxuICAgIHJldHVybiA0KzIqdGhpcy5wLnNoZWV0cztcclxuICB9XHJcblxyXG4gIHNldEZsaXBQcm9ncmVzc0NsYihjbGIpIHtcclxuICAgIHRoaXMucC5mbGlwUHJvZ3Jlc3NDbGIgPSBjbGI7XHJcbiAgfVxyXG5cclxuICBzZXRJbmplY3RvcihpbmplY3Rvcikge1xyXG4gICAgdGhpcy5wLmluamVjdG9yID0gaW5qZWN0b3I7XHJcbiAgfVxyXG5cclxuICBpc0FjdGl2ZVBhZ2Uobikge1xyXG4gICAgbGV0IHJlcyA9IHRydWU7XHJcbiAgICBpZihuPjEgJiYgbjx0aGlzLmdldFBhZ2VzKCktMikge1xyXG4gICAgICBmb3IobGV0IGIgb2YgdGhpcy5zaGVldEJsb2Nrcykge1xyXG4gICAgICAgIGlmKG4tMj4yKmIucC5maXJzdCAmJiBuLTI8MipiLnAubGFzdC0xKSB7XHJcbiAgICAgICAgICByZXMgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmxvY2tCeVBhZ2Uobikge1xyXG4gICAgbGV0IGJsb2NrO1xyXG4gICAgaWYobjwyKSB7XHJcbiAgICAgIGJsb2NrID0gdGhpcy5sZWZ0Q292ZXI7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKG48MioodGhpcy5wLnNoZWV0cysxKSkge1xyXG4gICAgICBmb3IobGV0IGIgb2YgdGhpcy5zaGVldEJsb2Nrcykge1xyXG4gICAgICAgIGlmKG4tMj49MipiLnAuZmlyc3QgJiYgbi0yPDIqYi5wLmxhc3QpIHtcclxuICAgICAgICAgIGJsb2NrID0gYjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGJsb2NrID0gdGhpcy5yaWdodENvdmVyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJsb2NrO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmxvY2tQYWdlcyhibG9jaykge1xyXG4gICAgbGV0IHJhbmdlO1xyXG4gICAgc3dpdGNoIChibG9jaykge1xyXG4gICAgICBjYXNlIHRoaXMubGVmdENvdmVyOiB7XHJcbiAgICAgICAgICByYW5nZSA9IFswLCAxXTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlIHRoaXMucmlnaHRDb3Zlcjoge1xyXG4gICAgICAgIHJhbmdlID0gWzIqKHRoaXMucC5zaGVldHMrMSksIDIqKHRoaXMucC5zaGVldHMrMSkrMV07XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgIHJhbmdlID0gYmxvY2s/IFsyKihibG9jay5wLmZpcnN0KzEpLCAyKihibG9jay5wLmxhc3QrMSktMV06IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhbmdlO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZSgpIHtcclxuICAgIGNvbnN0IFBJID0gTWF0aC5QSTtcclxuICAgIGxldCBwO1xyXG4gICAgaWYodGhpcy5hbmdsZSA9PT0gUEkvMiB8fCB0aGlzLmFuZ2xlID09PSAzKlBJLzIpIHtcclxuICAgICAgZm9yKGxldCBibG9jayBvZiB0aGlzLnNoZWV0QmxvY2tzKSB7XHJcbiAgICAgICAgaWYoYmxvY2suYW5nbGU8PVBJLzIpIHtcclxuICAgICAgICAgIHAgPSB0aGlzLmdldEJsb2NrUGFnZXMoYmxvY2spWzBdLTE7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoIXApIHtcclxuICAgICAgICBwID0gdGhpcy5nZXRQYWdlcygpLTM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYodGhpcy5hbmdsZTxQSS8yKSB7XHJcbiAgICAgIHAgPSAwO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZih0aGlzLmFuZ2xlPjMqUEkvMikge1xyXG4gICAgICBwID0gMTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYodGhpcy5hbmdsZTxQSSkge1xyXG4gICAgICBwID0gdGhpcy5nZXRQYWdlcygpLTM7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHRoaXMuYW5nbGU+PVBJKSB7XHJcbiAgICAgIHAgPSB0aGlzLmdldFBhZ2VzKCktMTtcclxuICAgIH1cclxuICAgIHJldHVybiBwO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9wUGFnZXMoKSB7XHJcbiAgICBjb25zdCBwID0gdGhpcy5nZXRQYWdlKCk7XHJcbiAgICByZXR1cm4gcD09PTAgfHwgcD09PXRoaXMuZ2V0UGFnZXMoKS0xPyBbcF06IFtwLCBwKzFdO1xyXG4gIH1cclxuXHJcbiAgZ2V0UGFnZVN0YXRlKG4pIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2VNYW5hZ2VyLmdldFBhZ2VTdGF0ZShuKTtcclxuICB9XHJcblxyXG4gIGVuYWJsZUxvYWRpbmdBbmltYXRpb24oZW5hYmxlKSB7XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyLmVuYWJsZUxvYWRpbmdBbmltYXRpb24oZW5hYmxlKTtcclxuICB9XHJcblxyXG4gIGdldExlZnRGbGlwcGluZygpIHtcclxuICAgIGxldCBibG9jaztcclxuICAgIGNvbnN0IGxlZnQgPSB0aGlzLnNoZWV0QmxvY2tzWzBdLCBQSSA9IE1hdGguUEk7XHJcbiAgICBpZih0aGlzLmFuZ2xlPT09UEkpIHtcclxuICAgICAgYmxvY2sgPSB0aGlzLnJpZ2h0Q292ZXI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYobGVmdCAmJiBsZWZ0LnN0YXRlPT09J2Nsb3NlZCcgJiYgbGVmdC5hbmdsZT5QSS8yKSB7XHJcbiAgICAgICAgYmxvY2sgPSBsZWZ0O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYodGhpcy5hbmdsZSA9PT0gUEkvMiB8fCB0aGlzLmFuZ2xlID09PSAzKlBJLzIpIHtcclxuICAgICAgICBibG9jayA9IHRoaXMubGVmdENvdmVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmxvY2s7XHJcbiAgfVxyXG5cclxuICBnZXRSaWdodEZsaXBwaW5nKCkge1xyXG4gICAgbGV0IGJsb2NrO1xyXG4gICAgY29uc3QgcmlnaHQgPSB0aGlzLnNoZWV0QmxvY2tzW3RoaXMuc2hlZXRCbG9ja3MubGVuZ3RoLTFdLCBQSSA9IE1hdGguUEk7XHJcbiAgICBpZih0aGlzLmFuZ2xlPT09MCkge1xyXG4gICAgICBibG9jayA9IHRoaXMubGVmdENvdmVyO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmKHJpZ2h0ICYmIHJpZ2h0LnN0YXRlPT09J2Nsb3NlZCcgJiYgcmlnaHQuYW5nbGU8PVBJLzIpIHtcclxuICAgICAgICBibG9jayA9IHJpZ2h0O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYodGhpcy5hbmdsZT09PVBJLzIgfHwgdGhpcy5hbmdsZSA9PT0gMypQSS8yKSB7XHJcbiAgICAgICAgYmxvY2sgPSB0aGlzLnJpZ2h0Q292ZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBibG9jaztcclxuICB9XHJcblxyXG4gIGdldENsb3NlZEJsb2NrQW5nbGUoYW5nbGUpIHtcclxuICAgIGxldCBjbG9zZWRBbmdsZSwge1BJfSA9IE1hdGg7XHJcblxyXG4gICAgaWYodGhpcy5sZWZ0Q292ZXIucGh5c2ljSWQpIHtcclxuICAgICAgbGV0IHRlc3Q7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGVzdCA9IE1hdGguYWJzKHRoaXMuc2hlZXRQaHlzaWNzLmdldFBhcmFtZXRyKHRoaXMubGVmdENvdmVyLnBoeXNpY0lkLCAnYW5nbGUnKS1hbmdsZSlcclxuICAgICAgfVxyXG4gICAgICBjYXRjaChlKSB7XHJcbiAgICAgICAgdGVzdCA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgY2xvc2VkQW5nbGUgPSBhbmdsZT5QSS8yIHx8IHRlc3Q+UEkvNj8gUEkvMjogdGhpcy5jbG9zZWRBbmdsZTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYodGhpcy5yaWdodENvdmVyLnBoeXNpY0lkKSB7XHJcbiAgICAgIGxldCB0ZXN0O1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRlc3QgPSBNYXRoLmFicyh0aGlzLnNoZWV0UGh5c2ljcy5nZXRQYXJhbWV0cih0aGlzLnJpZ2h0Q292ZXIucGh5c2ljSWQsICdhbmdsZScpLWFuZ2xlKVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICB0ZXN0ID0gMDtcclxuICAgICAgfVxyXG4gICAgICBjbG9zZWRBbmdsZSA9IGFuZ2xlPFBJLzIgfHwgdGVzdD5QSS82PyBQSS8yKzFlLTc6IHRoaXMuY2xvc2VkQW5nbGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY2xvc2VkQW5nbGUgPSBQSS8yKyhhbmdsZSE9PTApKjFlLTc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgb3BlbmVkQW5nbGU6IGFuZ2xlLFxyXG4gICAgICBjbG9zZWRBbmdsZSxcclxuICAgICAgYmluZGVyVHVybjogdGhpcy5jbG9zZWRBbmdsZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGZsaXBMZWZ0KHNpemU9MSwgcHJvZ3Jlc3NDbGI9dGhpcy5wLmZsaXBQcm9ncmVzc0NsYikge1xyXG4gICAgbGV0IGJsb2NrLCByZXM7XHJcbiAgICBpZih0aGlzLnNoZWV0UGh5c2ljcy5nZXRTaXplKCk8MjUpIHtcclxuICAgICAgY29uc3QgbGVmdCA9IHRoaXMuc2hlZXRCbG9ja3NbMF0sIFBJID0gTWF0aC5QSTtcclxuICAgICAgaWYodGhpcy5hbmdsZT09PVBJKSB7XHJcbiAgICAgICAgcmVzID0gdGhpcy5jb25uZWN0UGh5c2ljcyhcclxuICAgICAgICAgIGJsb2NrPXRoaXMucmlnaHRDb3ZlcixcclxuICAgICAgICAgIHRoaXMucC5jb3Zlci5tYXNzLFxyXG4gICAgICAgICAgUEksXHJcbiAgICAgICAgICAtdGhpcy5wLmNvdmVyLnN0YXJ0VmVsb2NpdHksXHJcbiAgICAgICAgICB0aGlzLnAuY292ZXIuZmxleGliaWxpdHksXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PnRoaXMuc2V0KDMqUEkvMi1hbmdsZS8yLGhlaWdodCksXHJcbiAgICAgICAgICAoYW5nbGUsaGVpZ2h0KT0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXQoMypQSS8yLWFuZ2xlLzIsMCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoYW5nbGU/IFBJOiBQSS8yKzFlLTcsJ2Nsb3NlZCcpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHByb2dyZXNzQ2xiXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZihsZWZ0ICYmIGxlZnQuc3RhdGU9PT0nY2xvc2VkJyAmJiBsZWZ0LmFuZ2xlPlBJLzIpIHtcclxuICAgICAgICAgIGJsb2NrID0gc2l6ZTxsZWZ0LmdldFNpemUoKT8gdGhpcy5zcGxpdFNoZWV0QmxvY2soMCwgbGVmdC5nZXRTaXplKCktc2l6ZSlbMV06IGxlZnQ7XHJcbiAgICAgICAgICByZXMgPSB0aGlzLmNvbm5lY3RQaHlzaWNzKFxyXG4gICAgICAgICAgICBibG9jayxcclxuICAgICAgICAgICAgdGhpcy5wLnBhZ2UubWFzcypibG9jay5nZXRTaXplKCksXHJcbiAgICAgICAgICAgIFBJLFxyXG4gICAgICAgICAgICAtdGhpcy5wLnBhZ2Uuc3RhcnRWZWxvY2l0eSxcclxuICAgICAgICAgICAgdGhpcy5wLnBhZ2UuZmxleGliaWxpdHksXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT5ibG9jay5zZXQodGhpcy5nZXRDbG9zZWRCbG9ja0FuZ2xlKGFuZ2xlKSwnb3BlbmVkJyxoZWlnaHQpLFxyXG4gICAgICAgICAgICBCb29rLmZpbmlzaEFuaW1hdGlvbkNsYi5iaW5kKHtib29rOiB0aGlzLCBibG9ja30pLFxyXG4gICAgICAgICAgICBwcm9ncmVzc0NsYlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih0aGlzLmFuZ2xlID09PSBQSS8yIHx8IHRoaXMuYW5nbGUgPT09IDMqUEkvMikge1xyXG4gICAgICAgICAgcmVzID0gdGhpcy5jb25uZWN0UGh5c2ljcyhcclxuICAgICAgICAgICAgYmxvY2s9dGhpcy5sZWZ0Q292ZXIsXHJcbiAgICAgICAgICAgIHRoaXMucC5jb3Zlci5tYXNzLFxyXG4gICAgICAgICAgICBQSSxcclxuICAgICAgICAgICAgLXRoaXMucC5jb3Zlci5zdGFydFZlbG9jaXR5LFxyXG4gICAgICAgICAgICB0aGlzLnAuY292ZXIuZmxleGliaWxpdHksXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0KDIqUEktYW5nbGUvMixoZWlnaHQpO1xyXG4gICAgICAgICAgICAgIGlmKGFuZ2xlPlBJLzIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoYW5nbGU/IFBJLzI6IDAsJ2Nsb3NlZCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PiB0aGlzLnNldChhbmdsZT09PTA/IDA6IDIqUEktYW5nbGUvMiwwKSxcclxuICAgICAgICAgICAgcHJvZ3Jlc3NDbGJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgZmxpcFJpZ2h0KHNpemU9MSwgcHJvZ3Jlc3NDbGI9dGhpcy5wLmZsaXBQcm9ncmVzc0NsYikge1xyXG4gICAgbGV0IGJsb2NrLCByZXM7XHJcbiAgICBpZih0aGlzLnNoZWV0UGh5c2ljcy5nZXRTaXplKCk8MjUpIHtcclxuICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLnNoZWV0QmxvY2tzW3RoaXMuc2hlZXRCbG9ja3MubGVuZ3RoLTFdLCBQSSA9IE1hdGguUEk7XHJcbiAgICAgIGlmKHRoaXMuYW5nbGU9PT0wKSB7XHJcbiAgICAgICAgcmVzID0gdGhpcy5jb25uZWN0UGh5c2ljcyhcclxuICAgICAgICAgIGJsb2NrPXRoaXMubGVmdENvdmVyLFxyXG4gICAgICAgICAgdGhpcy5wLmNvdmVyLm1hc3MsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgdGhpcy5wLmNvdmVyLnN0YXJ0VmVsb2NpdHksXHJcbiAgICAgICAgICB0aGlzLnAuY292ZXIuZmxleGliaWxpdHksXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PnRoaXMuc2V0KGFuZ2xlLzIsaGVpZ2h0KSxcclxuICAgICAgICAgIChhbmdsZSxoZWlnaHQpPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldChhbmdsZS8yLDApO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNoZWV0QmxvY2tzKGFuZ2xlPyBQSS8yOiAwLCdjbG9zZWQnKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwcm9ncmVzc0NsYlxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYocmlnaHQgJiYgcmlnaHQuc3RhdGU9PT0nY2xvc2VkJyAmJiByaWdodC5hbmdsZTw9UEkvMikge1xyXG4gICAgICAgICAgYmxvY2sgPSBzaXplPHJpZ2h0LmdldFNpemUoKT8gdGhpcy5zcGxpdFNoZWV0QmxvY2sodGhpcy5zaGVldEJsb2Nrcy5sZW5ndGgtMSwgc2l6ZSlbMF06IHJpZ2h0O1xyXG4gICAgICAgICAgcmVzID0gdGhpcy5jb25uZWN0UGh5c2ljcyhcclxuICAgICAgICAgICAgYmxvY2ssXHJcbiAgICAgICAgICAgIHRoaXMucC5wYWdlLm1hc3MqYmxvY2suZ2V0U2l6ZSgpLFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICB0aGlzLnAucGFnZS5zdGFydFZlbG9jaXR5LFxyXG4gICAgICAgICAgICB0aGlzLnAucGFnZS5mbGV4aWJpbGl0eSxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PmJsb2NrLnNldCh0aGlzLmdldENsb3NlZEJsb2NrQW5nbGUoYW5nbGUpLCdvcGVuZWQnLGhlaWdodCksXHJcbiAgICAgICAgICAgIEJvb2suZmluaXNoQW5pbWF0aW9uQ2xiLmJpbmQoe2Jvb2s6IHRoaXMsIGJsb2NrfSksXHJcbiAgICAgICAgICAgIHByb2dyZXNzQ2xiXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHRoaXMuYW5nbGU9PT1QSS8yIHx8IHRoaXMuYW5nbGUgPT09IDMqUEkvMikge1xyXG4gICAgICAgICAgcmVzID0gdGhpcy5jb25uZWN0UGh5c2ljcyhcclxuICAgICAgICAgICAgYmxvY2s9dGhpcy5yaWdodENvdmVyLFxyXG4gICAgICAgICAgICB0aGlzLnAuY292ZXIubWFzcyxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgdGhpcy5wLmNvdmVyLnN0YXJ0VmVsb2NpdHksXHJcbiAgICAgICAgICAgIHRoaXMucC5jb3Zlci5mbGV4aWJpbGl0eSxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXQoUEkvMithbmdsZS8yLGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgaWYoYW5nbGU8UEkvMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhQSS8yKzFlLTcsJ2Nsb3NlZCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGFuZ2xlLGhlaWdodCk9PnRoaXMuc2V0KFBJLzIrYW5nbGUvMiwwKSxcclxuICAgICAgICAgICAgcHJvZ3Jlc3NDbGJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8gfVxyXG5cclxuICBjbGVhckhvdmVySW5mbygpIHtcclxuICAgIHRoaXMucGFnZU1hbmFnZXIudHVybk9uRXZlbnRzKCk7XHJcbiAgICBkZWxldGUgdGhpcy5ob3ZlckluZm8uYmxvY2suZm9yY2U7XHJcbiAgICBkZWxldGUgdGhpcy5ob3ZlckluZm8uYmxvY2suY29ybmVyRm9yY2U7XHJcbiAgICBkZWxldGUgdGhpcy5ob3ZlckluZm87XHJcbiAgfVxyXG5cclxuICB4U2VnbWVudCgpIHtcclxuICAgIGNvbnN0IGJveHMgPSB0aGlzLnRtcC5ib3hzLCByZXMgPSB7fTtcclxuICAgIGlmKHRoaXMubGVmdENvdmVyLnBoeXNpY0lkKSB7XHJcbiAgICAgIGJveHNbMF0uc2V0RnJvbU9iamVjdCh0aGlzLnJpZ2h0Q292ZXIudGhyZWUpO1xyXG4gICAgICByZXMubWluID0gLShyZXMubWF4ID0gYm94c1swXS5tYXgueCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKHRoaXMucmlnaHRDb3Zlci5waHlzaWNJZCkge1xyXG4gICAgICBib3hzWzBdLnNldEZyb21PYmplY3QodGhpcy5sZWZ0Q292ZXIudGhyZWUpO1xyXG4gICAgICByZXMubWF4ID0gLShyZXMubWluID0gYm94c1swXS5taW4ueCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgYm94c1swXS5zZXRGcm9tT2JqZWN0KHRoaXMubGVmdENvdmVyLnRocmVlKTtcclxuICAgICAgYm94c1sxXS5zZXRGcm9tT2JqZWN0KHRoaXMucmlnaHRDb3Zlci50aHJlZSk7XHJcbiAgICAgIGJveHNbMF0udW5pb24oYm94c1sxXSk7XHJcbiAgICAgIHJlcy5taW4gPSBib3hzWzBdLm1pbi54O1xyXG4gICAgICByZXMubWF4ID0gYm94c1swXS5tYXgueDtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBjb21wdXRlVGFyZ2V0KHBvaW50KSB7XHJcbiAgICBsZXQge3gsIHl9ID0gcG9pbnQsIHNlZyA9IHRoaXMueFNlZ21lbnQoKSwgYW5nbGU7XHJcbiAgICBhbmdsZSA9IChzZWcubWF4LXgpLyhzZWcubWF4LXNlZy5taW4pKk1hdGguUEk7XHJcbiAgICAvLyBhbmdsZSA9IE1hdGguYWNvcyh4L01hdGguc3FydCh4KngreSp5KSk7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5kcmFnQW5nbGUsIE1hdGgubWluKE1hdGguUEktdGhpcy5kcmFnQW5nbGUsIGFuZ2xlKSk7XHJcbiAgfVxyXG5cclxuICBvblBpY2tDYWxsYmFjayhvYmplY3QpIHtcclxuICAgIGxldCByZXMgPSBmYWxzZTtcclxuICAgIGNvbnN0IGJsb2NrID0gb2JqZWN0Lm9iamVjdC51c2VyRGF0YS5zZWxmLFxyXG4gICAgICAgICAgcCA9IHsuLi5vYmplY3QudXZ9LCBpID0gb2JqZWN0LmZhY2UubWF0ZXJpYWxJbmRleDtcclxuICAgIGlmKGk8Mikge1xyXG4gICAgICBwLnggPSBpPT09MD8gcC54OiAxLXAueDtcclxuICAgICAgaWYoYmxvY2suY29ybmVyVGFyZ2V0LnRlc3RJbnRlcnNlY3Rpb24obnVsbCwgcCkgJiYgYmxvY2sucGh5c2ljSWQpIHtcclxuICAgICAgICBpZih0aGlzLmhvdmVySW5mbykge1xyXG4gICAgICAgICAgdGhpcy5jbGVhckhvdmVySW5mbygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBibG9jay5mb3JjZSA9IFNoZWV0UGh5c2ljcy5kcmFnRm9yY2VDbGI7XHJcbiAgICAgICAgYmxvY2suY29ybmVyRm9yY2UgPSBTaGVldFBoeXNpY3MuZ2V0RHJhZ0Nvcm5lckZvcmNlQ2xiKHRoaXMuY29tcHV0ZVRhcmdldChvYmplY3QucG9pbnQpKTtcclxuICAgICAgICB0aGlzLmRyYWdJbmZvID0ge1xyXG4gICAgICAgICAgb2JqZWN0LFxyXG4gICAgICAgICAgYmxvY2tcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wYWdlTWFuYWdlci50dXJuT2ZmRXZlbnRzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBvbkRyYWdDYWxsYmFjayhwb2ludCkge1xyXG4gICAgY29uc3QgYmxvY2sgPSB0aGlzLmRyYWdJbmZvLmJsb2NrLCBwID0gYmxvY2suZ2V0UHJvcHMoKTtcclxuICAgIGJsb2NrLmZvcmNlID0gU2hlZXRQaHlzaWNzLmRyYWdGb3JjZUNsYjtcclxuICAgIGJsb2NrLmNvcm5lckZvcmNlID0gU2hlZXRQaHlzaWNzLmdldERyYWdDb3JuZXJGb3JjZUNsYih0aGlzLmNvbXB1dGVUYXJnZXQocG9pbnQpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25SZWxlYXNlQ2FsbGJhY2soKSB7XHJcbiAgICBkZWxldGUgdGhpcy5kcmFnSW5mby5ibG9jay5mb3JjZTtcclxuICAgIGRlbGV0ZSB0aGlzLmRyYWdJbmZvLmJsb2NrLmNvcm5lckZvcmNlO1xyXG4gICAgZGVsZXRlIHRoaXMuZHJhZ0luZm87XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyLnR1cm5PbkV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmxpcHBpbmcoaSkge1xyXG4gICAgcmV0dXJuIGk/IHRoaXMuZ2V0TGVmdEZsaXBwaW5nKCk6IHRoaXMuZ2V0UmlnaHRGbGlwcGluZygpO1xyXG4gIH1cclxuXHJcbiAgZmxpcChpLCBzaXplPTEpIHtcclxuICAgIHJldHVybiBpPyB0aGlzLmZsaXBMZWZ0KHNpemUpOiB0aGlzLmZsaXBSaWdodChzaXplKTtcclxuICB9XHJcblxyXG4gIGVuYWJsZU1vdXNlKGVuYWJsZSkge1xyXG4gICAgdGhpcy5tb3VzZUNvbnRyb2xsZXIgPSBlbmFibGU7XHJcbiAgfVxyXG5cclxuICBjb3JuZXJDYWxsYmFjayhlLCBkYXRhKSB7XHJcbiAgICBpZih0aGlzLm1vdXNlQ29udHJvbGxlcikge1xyXG4gICAgICBjb25zdCB7aSwgbn0gPSBkYXRhLmRhdGE7XHJcbiAgICAgIGlmKGUudHlwZT09PSdtb3VzZW92ZXInKSB7XHJcbiAgICAgICAgaWYodGhpcy5ob3ZlckluZm8gJiYgdGhpcy5ob3ZlckluZm8ucGVuZGluZ3MhPT11bmRlZmluZWQpIHtcclxuICAgICAgICAgICsrdGhpcy5ob3ZlckluZm8ucGVuZGluZ3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYodGhpcy5ob3ZlckluZm8pIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdXcm9uZyBzdGF0ZTogZWxlbWVudCBpcyBhbHJlYWR5IGhvdmVyJyk7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaG92ZXJJbmZvLm4hPT1uKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jbGVhckhvdmVySW5mbygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZighdGhpcy5ob3ZlckluZm8gJiYgIXRoaXMuZHJhZ0luZm8pIHtcclxuICAgICAgICAgICAgbGV0IHJlcyA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICBjb25zdCBob3ZlckFuZ2xlID0gMC4wMixcclxuICAgICAgICAgICAgICAgICAgaG92ZXIgPSB0aGlzLmdldEJsb2NrQnlQYWdlKG4pLFxyXG4gICAgICAgICAgICAgICAgICBwb3NzaWJsZSA9IHRoaXMuZ2V0RmxpcHBpbmcoaSk7XHJcbiAgICAgICAgICAgIGlmKG4+MSAmJiBuPDIqKHRoaXMucC5zaGVldHMrMSkgJiYgaG92ZXIucGh5c2ljSWQgJiYgKGhvdmVyLmFuZ2xlPGhvdmVyQW5nbGUgfHwgaG92ZXIuYW5nbGU+TWF0aC5QSS1ob3ZlckFuZ2xlKSkge1xyXG4gICAgICAgICAgICAgIHJlcyA9IFByb21pc2UucmVzb2x2ZShob3Zlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZihob3Zlcj09PXBvc3NpYmxlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc2hlZXRCbG9ja3MgPSBbXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnRDb3ZlcixcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMuc2hlZXRCbG9ja3MsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0Q292ZXJcclxuICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGogPSBzaGVldEJsb2Nrcy5pbmRleE9mKGhvdmVyKSwgbmV4dEJsb2NrID0gfmo/IHNoZWV0QmxvY2tzW2orMippLTFdOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgaWYoIW5leHRCbG9jayB8fCAhbmV4dEJsb2NrLnBoeXNpY0lkIHx8IG5leHRCbG9jay5hbmdsZT5ob3ZlckFuZ2xlICYmIG5leHRCbG9jay5hbmdsZTxNYXRoLlBJLWhvdmVyQW5nbGUpIHtcclxuICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuZmxpcChpLCAxKS50aGVuKChibG9jayk9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmhvdmVySW5mbztcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoZWV0UGh5c2ljcy5zZXRQYXJhbWV0cihibG9jay5waHlzaWNJZCwgJ3ZlbG9jaXR5JywgMCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvdmVySW5mbyA9IHtcclxuICAgICAgICAgICAgICAgICAgcGVuZGluZ3M6IDFcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlcy50aGVuKChibG9jayk9PiB7XHJcbiAgICAgICAgICAgICAgaWYodGhpcy5ob3ZlckluZm8gJiYgdGhpcy5ob3ZlckluZm8ucGVuZGluZ3M8MSkge1xyXG4gICAgICAgICAgICAgICAgYmxvY2sgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5ob3ZlckluZm87XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmKGJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VNYW5hZ2VyLnR1cm5PZmZFdmVudHMoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICBwID0gYmxvY2suZ2V0UHJvcHMoKTtcclxuICAgICAgICAgICAgICAgIGJsb2NrLmZvcmNlID0gdGhpcy5zaGVldFBoeXNpY3MuZ2V0VGFyZ2V0Rm9yY2VDbGIocC5tYXNzKmJsb2NrLmdldFNpemUoKSwgaT8gTWF0aC5QSS1ob3ZlckFuZ2xlOiBob3ZlckFuZ2xlKTtcclxuICAgICAgICAgICAgICAgIGJsb2NrLmNvcm5lckZvcmNlID0gKCk9PiAoaT8gLTE6IDEpKlNoZWV0UGh5c2ljcy5ob3ZlckNvcm5lckZvcmNlQ2xiKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNoZWV0UGh5c2ljcy5zZXRQYXJhbWV0cihibG9jay5waHlzaWNJZCwgJ2FuZ2xlJywgaT8gTWF0aC5QSS0wLjUqaG92ZXJBbmdsZTogMC41KmhvdmVyQW5nbGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3ZlckluZm8gPSB7XHJcbiAgICAgICAgICAgICAgICAgIG4sXHJcbiAgICAgICAgICAgICAgICAgIGJsb2NrXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoMS8zMCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYodGhpcy5ob3ZlckluZm8gJiYgZS50eXBlPT09J21vdXNlb3V0Jykge1xyXG4gICAgICAgIGlmKHRoaXMuaG92ZXJJbmZvLnBlbmRpbmdzIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAtLXRoaXMuaG92ZXJJbmZvLnBlbmRpbmdzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKG49PT10aGlzLmhvdmVySW5mby5uKSB7XHJcbiAgICAgICAgICB0aGlzLmNsZWFySG92ZXJJbmZvKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYoZS50eXBlPT09J21vdXNlZG93bicpIHtcclxuICAgICAgICB0aGlzLmNvcm5lckNsaWNrRGF0YSA9IHtcclxuICAgICAgICAgIHg6IGUucGFnZVgsXHJcbiAgICAgICAgICB5OiBlLnBhZ2VZXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKGUudHlwZT09PSdjbGljaycpIHtcclxuICAgICAgICBpZihNYXRoLnNxcnQoTWF0aC5wb3codGhpcy5jb3JuZXJDbGlja0RhdGEueC1lLnBhZ2VYLDIpK01hdGgucG93KHRoaXMuY29ybmVyQ2xpY2tEYXRhLnktZS5wYWdlWSwyKSk8NSkge1xyXG4gICAgICAgICAgY29uc3QgaG92ZXIgPSB0aGlzLmdldEJsb2NrQnlQYWdlKG4pO1xyXG4gICAgICAgICAgaWYoaG92ZXIucGh5c2ljSWQpIHtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSBob3Zlci5waHlzaWNJZCxcclxuICAgICAgICAgICAgICAgICAgcHJvcHMgPSBob3Zlci5nZXRQcm9wcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNoZWV0UGh5c2ljcy5zZXRQYXJhbWV0cihpZCwgJ3ZlbG9jaXR5JywgKGk/IC0xOiAxKSpwcm9wcy5zdGFydFZlbG9jaXR5KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuY29ybmVyQ2xpY2tEYXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRTaGVldEJsb2NrKHAsIGJsb2NrKSB7XHJcbiAgICB0aGlzLnNoZWV0QmxvY2tzLnNwbGljZShwLCAwLCBibG9jayk7XHJcbiAgICB0aGlzLnN1YnNjcmliZVNoZWV0QmxvY2soYmxvY2ssIDIpO1xyXG4gICAgdGhpcy50aHJlZVNoZWV0QmxvY2tzLmFkZChibG9jay50aHJlZSk7XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVTaGVldEJsb2NrKGJsb2NrLCBvZmZzZXQpIHtcclxuICAgIGNvbnN0IGV2ZW50Q29udmVydGVyID0gbmV3IEN1c3RvbUV2ZW50Q29udmVydGVyKHRoaXMudmlzdWFsLnduZCwgdGhpcy52aXN1YWwuZG9jLCBDaXJjbGVUYXJnZXQudGVzdCksXHJcbiAgICAgICAgICByID0gMC4xNSxcclxuICAgICAgICAgIHRhcmdldCA9IG5ldyBDaXJjbGVUYXJnZXQoMS0wLjUqciwgMC41KnIsIHIpO1xyXG4gICAgdGFyZ2V0LmJsb2NrID0gYmxvY2s7XHJcbiAgICB0YXJnZXQuY2FsbGJhY2sgPSB0aGlzLmNvcm5lckNhbGxiYWNrLmJpbmQodGhpcyk7XHJcbiAgICBldmVudENvbnZlcnRlci5hZGRDdXN0b20odGFyZ2V0KTtcclxuICAgIGJsb2NrLmNvcm5lclRhcmdldCA9IHRhcmdldDtcclxuICAgIGJsb2NrLnRocmVlLnVzZXJEYXRhLm1vdXNlQ2FsbGJhY2sgPSAoZSwgZGF0YSk9PiB7XHJcbiAgICAgIGNvbnN0IGkgPSBkYXRhLmZhY2UubWF0ZXJpYWxJbmRleDtcclxuICAgICAgaWYoaTwyKSB7XHJcbiAgICAgICAgY29uc3QgbiA9IGk9PT0wPyBvZmZzZXQrMipibG9jay5wLmZpcnN0OiBvZmZzZXQrMipibG9jay5wLmxhc3QtMTtcclxuICAgICAgICBldmVudENvbnZlcnRlci5jb252ZXJ0KGUsIHt4OiBpPT09MD8gZGF0YS51di54OiAxLWRhdGEudXYueCwgeTogZGF0YS51di55LCBpLCBufSk7XHJcbiAgICAgICAgdGhpcy5wYWdlTWFuYWdlci50cmFuc2ZlckV2ZW50VG9UZXh0dXJlKG4sIGUsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgYmxvY2sudGhyZWUudXNlckRhdGEudG91Y2hDYWxsYmFjayA9IChlLCBkYXRhKT0+IHtcclxuICAgICAgY29uc3QgaSA9IGRhdGEuZmFjZS5tYXRlcmlhbEluZGV4O1xyXG4gICAgICBpZihpPDIpIHtcclxuICAgICAgICBjb25zdCBuID0gaT09PTA/IG9mZnNldCsyKmJsb2NrLnAuZmlyc3Q6IG9mZnNldCsyKmJsb2NrLnAubGFzdC0xO1xyXG4gICAgICAgIHRoaXMucGFnZU1hbmFnZXIudHJhbnNmZXJFdmVudFRvVGV4dHVyZShuLCBlLCBkYXRhKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRoaXMudmlzdWFsLmRyYWcuYWRkVGhyZWUoYmxvY2sudGhyZWUpO1xyXG4gICAgdGhpcy52aXN1YWwubW91c2VFdmVudHMuYWRkVGhyZWUoYmxvY2sudGhyZWUpO1xyXG4gICAgdGhpcy52aXN1YWwudG91Y2hFdmVudHMuYWRkVGhyZWUoYmxvY2sudGhyZWUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2hlZXRCbG9jayhibG9jaykge1xyXG4gICAgdGhpcy52aXN1YWwubW91c2VFdmVudHMucmVtb3ZlVGhyZWUoYmxvY2sudGhyZWUpO1xyXG4gICAgdGhpcy52aXN1YWwudG91Y2hFdmVudHMucmVtb3ZlVGhyZWUoYmxvY2sudGhyZWUpO1xyXG4gICAgdGhpcy52aXN1YWwuZHJhZy5yZW1vdmVUaHJlZShibG9jay50aHJlZSk7XHJcbiAgICB0aGlzLnRocmVlU2hlZXRCbG9ja3MucmVtb3ZlKGJsb2NrLnRocmVlKTtcclxuICAgIGJsb2NrLmRpc3Bvc2UoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVNoZWV0QmxvY2tzKGZpcnN0LCBzaXplKSB7XHJcbiAgICBjb25zdCBibG9ja3MgPSB0aGlzLnNoZWV0QmxvY2tzLnNwbGljZShmaXJzdCwgc2l6ZSk7XHJcbiAgICBmb3IobGV0IGJsb2NrIG9mIGJsb2Nrcykge1xyXG4gICAgICB0aGlzLnJlbW92ZVNoZWV0QmxvY2soYmxvY2spO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0VGV4dHVyZShtYXRlcmlhbCwgbikge1xyXG4gICAgdGhpcy5wYWdlTWFuYWdlci5zZXRUZXh0dXJlKG1hdGVyaWFsLCBuKTtcclxuICB9XHJcblxyXG4gIHNldFBhZ2VUZXh0dXJlKG1hdGVyaWFsLCBuKSB7XHJcbiAgICB0aGlzLnNldFRleHR1cmUobWF0ZXJpYWwsIG4rMik7XHJcbiAgfVxyXG5cclxuICBzZXRMZWZ0Q292ZXJUZXh0dXJlKG1hdGVyaWFsLCBuKSB7XHJcbiAgICB0aGlzLnNldFRleHR1cmUobWF0ZXJpYWwsIG4pO1xyXG4gIH1cclxuXHJcbiAgc2V0UmlnaHRDb3ZlclRleHR1cmUobWF0ZXJpYWwsIG4pIHtcclxuICAgIHRoaXMuc2V0VGV4dHVyZShtYXRlcmlhbCwgbisyKih0aGlzLnAuc2hlZXRzKzEpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBmaW5pc2hBbmltYXRpb25DbGIoYW5nbGUpIHtcclxuICAgIHRoaXMuYmxvY2suc2V0KHRoaXMuYm9vay5nZXRDbG9zZWRCbG9ja0FuZ2xlKGFuZ2xlKS5jbG9zZWRBbmdsZSwnY2xvc2VkJywwKTtcclxuICAgIGNvbnN0IGkgPSB0aGlzLmJvb2suc2hlZXRCbG9ja3MuaW5kZXhPZih0aGlzLmJsb2NrKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIGlmKGFuZ2xlPT09MCkge1xyXG4gICAgICAgIHRoaXMuYm9vay5tZXJnZVNoZWV0QmxvY2tzKGksIHRoaXMuYm9vay5zaGVldEJsb2Nrcy5sZW5ndGgtaSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5ib29rLm1lcmdlU2hlZXRCbG9ja3MoMCwgaSsxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY0Jsb2NrRm9yY2UoYmxvY2ssIG9iamVjdCwgYW5nbGUsIHZlbG9jaXR5LCBjb3JuZXJIZWlnaHQpIHtcclxuICAgIHJldHVybiBibG9jay5mb3JjZT8gYmxvY2suZm9yY2Uob2JqZWN0LCBhbmdsZSwgdmVsb2NpdHksIGNvcm5lckhlaWdodCk6IDA7XHJcbiAgfVxyXG5cclxuICBjYWxjQmxvY2tDb3JuZXJGb3JjZShibG9jaywgb2JqZWN0LCBhbmdsZSwgdmVsb2NpdHksIGNvcm5lckhlaWdodCkge1xyXG4gICAgcmV0dXJuIGJsb2NrLmNvcm5lckZvcmNlPyBibG9jay5jb3JuZXJGb3JjZShvYmplY3QsIGFuZ2xlLCB2ZWxvY2l0eSwgY29ybmVySGVpZ2h0KTogMDtcclxuICB9XHJcblxyXG4gIG5vdGlmeUJlZm9yZUFuaW1hdGlvbigpIHtcclxuICAgIGxldCByZXM7XHJcbiAgICBpZih0aGlzLmFuaW1hdGlvbk5vdGlmaWNhdGlvbikge1xyXG4gICAgICByZXMgPSBQcm9taXNlLnJlamVjdCgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uTm90aWZpY2F0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgICB0eXBlOiAnYmVmb3JlQW5pbWF0aW9uJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzID0gdGhpcy5sYXllck1hbmFnZXIuaGlkZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIG5vdGlmeUFmdGVyQW5pbWF0aW9uKCkge1xyXG4gICAgaWYodGhpcy5hbmltYXRpb25Ob3RpZmljYXRpb24pIHtcclxuICAgICAgZGVsZXRlIHRoaXMuYW5pbWF0aW9uTm90aWZpY2F0aW9uO1xyXG4gICAgICB0aGlzLmxheWVyTWFuYWdlci5zaG93KCk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7XHJcbiAgICAgICAgdHlwZTogJ2FmdGVyQW5pbWF0aW9uJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbm5lY3RQaHlzaWNzKGJsb2NrLCBtYXNzLCBhbmdsZSwgdmVsb2NpdHksIGZsZXhpYmlsaXR5LCBjb3ZlckhlaWdodCwgc2ltdWxhdGVDbGIsIHJlbW92ZUNsYiwgcHJvZ3Jlc3NDbGIpIHtcclxuICAgIGNvbnN0IHR5cGUgPSAoKT0+IHRoaXMuaG92ZXJJbmZvPyAnaG92ZXInOiAodGhpcy5kcmFnSW5mbz8gJ2RyYWcnOiAnZnJlZScpLFxyXG4gICAgICByZXMgPSB0aGlzLnNoZWV0UGh5c2ljcy5nZXRTaXplKCk/IFByb21pc2UucmVzb2x2ZSgpOiB0aGlzLm5vdGlmeUJlZm9yZUFuaW1hdGlvbigpO1xyXG4gICAgcmV0dXJuIHJlcy50aGVuKCgpPT4ge1xyXG4gICAgICBibG9jay5waHlzaWNJZCA9IHRoaXMuc2hlZXRQaHlzaWNzLmFkZE9iamVjdChcclxuICAgICAgICBtYXNzLFxyXG4gICAgICAgIGFuZ2xlLFxyXG4gICAgICAgIHZlbG9jaXR5LFxyXG4gICAgICAgIGZsZXhpYmlsaXR5LFxyXG4gICAgICAgIGNvdmVySGVpZ2h0LFxyXG4gICAgICAgIChhbmdsLCBjaCk9PiB7XHJcbiAgICAgICAgICBzaW11bGF0ZUNsYihhbmdsLCBjaCk7XHJcbiAgICAgICAgICBwcm9ncmVzc0NsYihibG9jaywgTWF0aC5hYnMoYW5nbGUtYW5nbCkvTWF0aC5QSSwgJ3Byb2Nlc3MnLCB0eXBlKCkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGFuZ2wsIGNoKT0+IHtcclxuICAgICAgICAgIHJlbW92ZUNsYihhbmdsLCBjaCk7XHJcbiAgICAgICAgICBkZWxldGUgYmxvY2sucGh5c2ljSWQ7XHJcbiAgICAgICAgICBwcm9ncmVzc0NsYihibG9jaywgTWF0aC5hYnMoYW5nbGUtYW5nbCkvTWF0aC5QSSwgJ2ZpbmlzaCcsIHR5cGUoKSk7XHJcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4ge1xyXG4gICAgICAgICAgICBpZighdGhpcy5zaGVldFBoeXNpY3MuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlBZnRlckFuaW1hdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChvYmplY3QsIGFuZ2xlLCB2ZWxvY2l0eSwgY29ybmVySGVpZ2h0KT0+IHRoaXMuY2FsY0Jsb2NrRm9yY2UoYmxvY2ssIG9iamVjdCwgYW5nbGUsIHZlbG9jaXR5LCBjb3JuZXJIZWlnaHQpLFxyXG4gICAgICAgIChvYmplY3QsIGFuZ2xlLCB2ZWxvY2l0eSwgY29ybmVySGVpZ2h0KT0+IHRoaXMuY2FsY0Jsb2NrQ29ybmVyRm9yY2UoYmxvY2ssIG9iamVjdCwgYW5nbGUsIHZlbG9jaXR5LCBjb3JuZXJIZWlnaHQpXHJcbiAgICAgICk7XHJcbiAgICAgIHByb2dyZXNzQ2xiKGJsb2NrLCAwLCAnaW5pdCcsIHR5cGUoKSk7XHJcbiAgICAgIHJldHVybiBibG9jaztcclxuICAgIH0pLmNhdGNoKCgpPT4gdW5kZWZpbmVkKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZShkdCkge1xyXG4gICAgdGhpcy5sYXN0TW91c2VQb3MudCs9ZHQ7XHJcbiAgICBpZih0aGlzLmlzUHJvY2Vzc2luZygpICYmIHRoaXMubGFzdE1vdXNlUG9zLnBhZ2VYIT09dW5kZWZpbmVkICYmIHRoaXMubGFzdE1vdXNlUG9zLnQtKHRoaXMubGFzdE1vdXNlUG9zLmxhc3RUIHx8IDApPjAuMjUgJiYgIXRoaXMuaG92ZXJJbmZvICYmICF0aGlzLmRyYWdJbmZvKSB7XHJcbiAgICAgIHRoaXMubGFzdE1vdXNlUG9zLmxhc3RUID0gdGhpcy5sYXN0TW91c2VQb3MudDtcclxuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+IHtcclxuICAgICAgICAkKHRoaXMudmlzdWFsLmVsZW1lbnQpLnRyaWdnZXIoJC5FdmVudCgnbW91c2Vtb3ZlJywgdGhpcy5sYXN0TW91c2VQb3MpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNoZWV0UGh5c2ljcy5zaW11bGF0ZShkdCk7XHJcbiAgfVxyXG5cclxuICBzcGxpdFNoZWV0QmxvY2soaSwgbGVmdFNpemUpIHtcclxuICAgIGNvbnN0IGJsb2NrID0gdGhpcy5zaGVldEJsb2Nrc1tpXTtcclxuICAgIGlmKGJsb2NrICYmIGxlZnRTaXplPGJsb2NrLmdldFNpemUoKSkge1xyXG4gICAgICBjb25zdCBuZXdCbG9jayA9IG5ldyBTaGVldEJsb2NrKHRoaXMudmlzdWFsLCB7Li4udGhpcy5wLCBzZXRUZXh0dXJlOiB0aGlzLnNldFBhZ2VUZXh0dXJlLmJpbmQodGhpcyl9LCBibG9jay5wLmZpcnN0LCBibG9jay5wLmZpcnN0K2xlZnRTaXplLCBibG9jay5hbmdsZSwgYmxvY2suc3RhdGUpO1xyXG4gICAgICBibG9jay5zZXQoYmxvY2suYW5nbGUsIGJsb2NrLnN0YXRlLCBibG9jay5jb3JuZXIuaGVpZ2h0LCBibG9jay5wLmZpcnN0K2xlZnRTaXplLCBibG9jay5wLmxhc3QpO1xyXG4gICAgICB0aGlzLmFkZFNoZWV0QmxvY2soaSwgbmV3QmxvY2spO1xyXG4gICAgICByZXR1cm4gW25ld0Jsb2NrLCBibG9ja107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtZXJnZVNoZWV0QmxvY2tzKGZpcnN0LCBzaXplKSB7XHJcbiAgICBpZihmaXJzdDx0aGlzLnNoZWV0QmxvY2tzLmxlbmd0aCkge1xyXG4gICAgICBzaXplID0gTWF0aC5taW4odGhpcy5zaGVldEJsb2Nrcy5sZW5ndGgtZmlyc3QsIHNpemUpO1xyXG4gICAgICBjb25zdCBmaXJzdEJsb2NrID0gdGhpcy5zaGVldEJsb2Nrc1tmaXJzdF0sIGxhc3RCbG9jayA9IHRoaXMuc2hlZXRCbG9ja3NbZmlyc3Qrc2l6ZS0xXTtcclxuICAgICAgZmlyc3RCbG9jay5zZXQoZmlyc3RCbG9jay5hbmdsZSwgZmlyc3RCbG9jay5zdGF0ZSwgZmlyc3RCbG9jay5jb3JuZXIuaGVpZ2h0LCBmaXJzdEJsb2NrLnAuZmlyc3QsIGxhc3RCbG9jay5wLmxhc3QpO1xyXG4gICAgICB0aGlzLnJlbW92ZVNoZWV0QmxvY2tzKGZpcnN0KzEsIHNpemUtMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRTaGVldEJsb2NrcyhhbmdsZSwgc3RhdGUpIHtcclxuICAgIGlmKHN0YXRlPT09J2Nsb3NlZCcpIHtcclxuICAgICAgdGhpcy5jbG9zZWRBbmdsZSA9IGFuZ2xlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zaGVldEJsb2Nrcy5mb3JFYWNoKChzKT0+IHtcclxuICAgICAgaWYoIXMucGh5c2ljSWQpIHtcclxuICAgICAgICBzLnNldChhbmdsZSwgc3RhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldChhbmdsZSwgaGVpZ2h0PTApIHtcclxuICAgIHRoaXMuYW5nbGUgPSBhbmdsZTtcclxuICAgIGNvbnN0IFBJID0gTWF0aC5QSTtcclxuICAgIGlmKGFuZ2xlPFBJLzQpIHtcclxuICAgICAgdGhpcy5iaW5kZXIuc2V0KDApO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0TGVmdCgtUEkvMisyKmFuZ2xlKTtcclxuICAgICAgdGhpcy5sZWZ0Q292ZXIuc2V0KFBJLzIsJ29wZW5lZCcsaGVpZ2h0KTtcclxuXHJcbiAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoMCwnY2xvc2VkJyk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRSaWdodCgwKTtcclxuICAgICAgdGhpcy5yaWdodENvdmVyLnNldCgwLCdjbG9zZWQnLDApO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihhbmdsZTwyKlBJLzQpIHtcclxuICAgICAgY29uc3QgYT0yKihhbmdsZS1QSS80KTtcclxuICAgICAgdGhpcy5iaW5kZXIuc2V0KGEpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0TGVmdCgtYSk7XHJcbiAgICAgIHRoaXMubGVmdENvdmVyLnNldChQSS8yK2EsJ29wZW5lZCcsaGVpZ2h0KTtcclxuXHJcbiAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoYSwnY2xvc2VkJyk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRSaWdodCgtYSk7XHJcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5zZXQoYSwnY2xvc2VkJywwKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoYW5nbGU8MypQSS80KSB7XHJcbiAgICAgIGNvbnN0IGE9MiooYW5nbGUtUEkvMik7XHJcbiAgICAgIHRoaXMuYmluZGVyLnNldChQSS8yKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldExlZnQoLVBJLzIpO1xyXG4gICAgICB0aGlzLmxlZnRDb3Zlci5zZXQoUEksJ29wZW5lZCcsMCk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRSaWdodCgtUEkvMik7XHJcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5zZXQoYSwnb3BlbmVkJyxoZWlnaHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihhbmdsZTw0KlBJLzQpIHtcclxuICAgICAgY29uc3QgYT0yKihhbmdsZS0zKlBJLzQpK1BJLzI7XHJcbiAgICAgIHRoaXMuYmluZGVyLnNldChhKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldExlZnQoLWEpO1xyXG4gICAgICB0aGlzLmxlZnRDb3Zlci5zZXQoYSwnY2xvc2VkJywwKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoYSwnY2xvc2VkJyk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRSaWdodCgtUEkvMik7XHJcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5zZXQoUEkvMiwnb3BlbmVkJyxoZWlnaHQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZihhbmdsZTw1KlBJLzQpIHtcclxuICAgICAgdGhpcy5iaW5kZXIuc2V0KFBJKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldExlZnQoLVBJKTtcclxuICAgICAgdGhpcy5sZWZ0Q292ZXIuc2V0KFBJLCdjbG9zZWQnLDApO1xyXG5cclxuICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhQSSwnY2xvc2VkJyk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRSaWdodCgtUEkvMi0yKihhbmdsZS1QSSkpO1xyXG4gICAgICB0aGlzLnJpZ2h0Q292ZXIuc2V0KFBJLzIsJ29wZW5lZCcsaGVpZ2h0KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoYW5nbGU8NipQSS80KSB7XHJcbiAgICAgIGNvbnN0IGE9MiooYW5nbGUtNSpQSS80KTtcclxuICAgICAgdGhpcy5iaW5kZXIuc2V0KFBJLWEpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0TGVmdCgtUEkrYSk7XHJcbiAgICAgIHRoaXMubGVmdENvdmVyLnNldChQSS1hLCdjbG9zZWQnLDApO1xyXG5cclxuICAgICAgdGhpcy5zZXRTaGVldEJsb2NrcyhQSS1hLCdjbG9zZWQnKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldFJpZ2h0KC1QSSthKTtcclxuICAgICAgdGhpcy5yaWdodENvdmVyLnNldChQSS8yLWEsJ29wZW5lZCcsaGVpZ2h0KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoYW5nbGU8NypQSS80KSB7XHJcbiAgICAgIGNvbnN0IGE9MiooYW5nbGUtNipQSS80KTtcclxuICAgICAgdGhpcy5iaW5kZXIuc2V0KFBJLzIpO1xyXG5cclxuICAgICAgdGhpcy5iaW5kZXIuc2V0TGVmdCgtUEkvMik7XHJcbiAgICAgIHRoaXMubGVmdENvdmVyLnNldChQSS1hLCdvcGVuZWQnLGhlaWdodCk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRSaWdodCgtUEkvMik7XHJcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5zZXQoMCwnb3BlbmVkJywwKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYoYW5nbGU8OCpQSS80KSB7XHJcbiAgICAgIGNvbnN0IGE9MiooYW5nbGUtNypQSS80KTtcclxuICAgICAgdGhpcy5iaW5kZXIuc2V0KFBJLzItYSk7XHJcblxyXG4gICAgICB0aGlzLmJpbmRlci5zZXRMZWZ0KC1QSS8yKTtcclxuICAgICAgdGhpcy5sZWZ0Q292ZXIuc2V0KFBJLzIsJ29wZW5lZCcsaGVpZ2h0KTtcclxuXHJcbiAgICAgIHRoaXMuc2V0U2hlZXRCbG9ja3MoUEkvMi1hLCdjbG9zZWQnKTtcclxuXHJcbiAgICAgIHRoaXMuYmluZGVyLnNldFJpZ2h0KC1QSS8yK2EpO1xyXG4gICAgICB0aGlzLnJpZ2h0Q292ZXIuc2V0KFBJLzItYSwnY2xvc2VkJywwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVTaWRlVGV4dHVyZShjb2xvcikge1xyXG4gICAgY29uc3QgakMgPSAkKCc8Y2FudmFzIHdpZHRoPVwiOFwiIGhlaWdodD1cIjhcIj48L2NhbnZhcz4nKTtcclxuICAgIGNvbnN0IGN0eCA9IGpDWzBdLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICBjdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKGNvbG9yLCAxKTtcclxuICAgIGN0eC5yZWN0KDAsIDAsIDgsIDcpO1xyXG4gICAgY3R4LmZpbGwoKTtcclxuICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgIGN0eC5maWxsU3R5bGUgPSBHcmFwaFV0aWxzLmNvbG9yMlJnYmEoR3JhcGhVdGlscy5pbnZlcnNlQ29sb3IoY29sb3IsMC41KSwgMSk7XHJcbiAgICBjdHgucmVjdCgwLCA3LCA4LCAxKTtcclxuICAgIGN0eC5maWxsKCk7XHJcbiAgICByZXR1cm4gakNbMF07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcHJlcGFyZVByb3BzKHByb3BzKSB7XHJcbiAgICByZXR1cm4gQm9vay5jYWxjUHJvcHMoQm9vay5tZXJnZVByb3BzKGJvb2tQcm9wcygpLCBwcm9wcykpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1lcmdlUHJvcHMoZmlyc3QsIHNlY29uZCkge1xyXG4gICAgc2Vjb25kID0gc2Vjb25kIHx8IHt9O1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uZmlyc3QsXHJcbiAgICAgIC4uLnNlY29uZCxcclxuICAgICAgc2hlZXQ6IHtcclxuICAgICAgICAuLi5maXJzdC5zaGVldCxcclxuICAgICAgICAuLi5zZWNvbmQuc2hlZXQsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvdmVyOiB7XHJcbiAgICAgICAgLi4uZmlyc3QuY292ZXIsXHJcbiAgICAgICAgLi4uc2Vjb25kLmNvdmVyLFxyXG4gICAgICB9LFxyXG4gICAgICBwYWdlOiB7XHJcbiAgICAgICAgLi4uZmlyc3QucGFnZSxcclxuICAgICAgICAuLi5zZWNvbmQucGFnZSxcclxuICAgICAgfSxcclxuICAgICAgY3NzTGF5ZXJQcm9wczoge1xyXG4gICAgICAgIC4uLmZpcnN0LmNzc0xheWVyUHJvcHMsXHJcbiAgICAgICAgLi4uc2Vjb25kLmNzc0xheWVyUHJvcHMsXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2FsY1Byb3BzKHByb3BzKSB7XHJcbiAgICBjb25zdCBwID0ge1xyXG4gICAgICAuLi5wcm9wcyxcclxuICAgICAgc2hlZXQ6IHtcclxuICAgICAgICAuLi5wcm9wcy5zaGVldFxyXG4gICAgICB9LFxyXG4gICAgICBjb3Zlcjoge1xyXG4gICAgICAgIC4uLnByb3BzLnNoZWV0LFxyXG4gICAgICAgIC4uLnByb3BzLmNvdmVyXHJcbiAgICAgIH0sXHJcbiAgICAgIHBhZ2U6IHtcclxuICAgICAgICAuLi5wcm9wcy5zaGVldCxcclxuICAgICAgICAuLi5wcm9wcy5wYWdlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNzc0xheWVyUHJvcHM6IHtcclxuICAgICAgICAuLi5wcm9wcy5jc3NMYXllclByb3BzLFxyXG4gICAgICAgICRcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHNjYWxlID0gMTAsXHJcbiAgICBoZWlnaHQgPSBzY2FsZSpwLmhlaWdodCxcclxuICAgIHdpZHRoID0gc2NhbGUqcC53aWR0aCxcclxuICAgIGZsaXBQcm9ncmVzc0NsYiA9ICgpPT4gdW5kZWZpbmVkLFxyXG4gICAgc2hlZXQgPSB7XHJcbiAgICAgIHNpZGVUZXh0dXJlOiBwLnNoZWV0LnNpZGVUZXh0dXJlIHx8IEJvb2suY3JlYXRlU2lkZVRleHR1cmUocC5zaGVldC5jb2xvciksXHJcbiAgICB9LFxyXG4gICAgY292ZXIgPSB7XHJcbiAgICAgIC4uLnNoZWV0LFxyXG4gICAgICAuLi5wLmNvdmVyLFxyXG4gICAgICBkZXB0aDogc2NhbGUqcC5jb3Zlci5kZXB0aCxcclxuICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcclxuICAgICAgcGFkZGluZzogc2NhbGUqcC5jb3Zlci5wYWRkaW5nXHJcbiAgICB9LFxyXG4gICAgcGFnZSA9IHtcclxuICAgICAgLi4uc2hlZXQsXHJcbiAgICAgIC4uLnAucGFnZSxcclxuICAgICAgZGVwdGg6IHNjYWxlKnAucGFnZS5kZXB0aCxcclxuICAgICAgd2lkdGg6IGNvdmVyLndpZHRoIC0gY292ZXIucGFkZGluZyxcclxuICAgICAgaGVpZ2h0OiBjb3Zlci5oZWlnaHQgLSAyKmNvdmVyLnBhZGRpbmdcclxuICAgIH0sXHJcbiAgICBtYXJrZXIgPSB7XHJcbiAgICAgIHVzZTogZmFsc2UsXHJcbiAgICAgIGNvbG9yOiAwWEZGMDAwMCxcclxuICAgICAgc2l6ZTogc2NhbGUqMC4wMDFcclxuICAgIH07XHJcbiAgICBpZihjb3Zlci5jb2xvciE9PXNoZWV0LmNvbG9yICYmICFwLmNvdmVyLnNpZGVUZXh0dXJlKSB7XHJcbiAgICAgIGNvdmVyLnNpZGVUZXh0dXJlID0gQm9vay5jcmVhdGVTaWRlVGV4dHVyZShjb3Zlci5jb2xvcik7XHJcbiAgICB9XHJcbiAgICBpZihwYWdlLmNvbG9yIT09c2hlZXQuY29sb3IgJiYgIXAucGFnZS5zaWRlVGV4dHVyZSkge1xyXG4gICAgICBwYWdlLnNpZGVUZXh0dXJlID0gQm9vay5jcmVhdGVTaWRlVGV4dHVyZShwYWdlLmNvbG9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7Li4ucCwgc2NhbGUsIGhlaWdodCwgd2lkdGgsIGZsaXBQcm9ncmVzc0NsYiwgY292ZXIsIHBhZ2UsIG1hcmtlcn07XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL0Jvb2suanMiLCJpbXBvcnQgeyQsIFRIUkVFfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IENvbnRyb2xsZXIgZnJvbSAnQ29udHJvbGxlcic7XHJcbmltcG9ydCB7cHJvcHMgYXMgIGJvb2tDb250cm9sbGVyUHJvcHN9IGZyb20gJy4uL3Byb3BzL2Jvb2tDb250cm9sbGVyJztcclxuaW1wb3J0IEV2ZW50c1RvQWN0aW9ucyBmcm9tICdFdmVudHNUb0FjdGlvbnMnO1xyXG5pbXBvcnQgU3RhdHMgZnJvbSAnc3RhdHMuanMnO1xyXG5pbXBvcnQgT2JqZWN0M0RXYXRjaGVyIGZyb20gJ09iamVjdDNEV2F0Y2hlcic7XHJcbmltcG9ydCBGdWxsU2NyZWVuIGZyb20gJ0Z1bGxTY3JlZW4nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9va0NvbnRyb2xsZXIgZXh0ZW5kcyBDb250cm9sbGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3IoYm9vaywgdmlldywgcHJvcHMpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25Db250cm9scyA9IHRydWU7XHJcbiAgICB0aGlzLmJvb2sgPSBib29rO1xyXG4gICAgdGhpcy52aXN1YWwgPSBib29rLnZpc3VhbDtcclxuICAgIHRoaXMucCA9IEJvb2tDb250cm9sbGVyLnByZXBhcmVQcm9wcyhwcm9wcyk7XHJcbiAgICB0aGlzLnAucnRsID0gYm9vay5wLnJ0bDtcclxuICAgIHRoaXMuZGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMudmlzdWFsLnduZC5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XHJcblxyXG4gICAgdGhpcy5vcmJpdCA9IGJvb2sudmlzdWFsLmdldE9yYml0KCk7XHJcbiAgICBib29rLnNldEZsaXBQcm9ncmVzc0NsYih0aGlzLnVwZGF0ZVZpZXdJZlN0YXRlLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy52aWV3ID0gdmlldztcclxuICAgIHRoaXMuYmluZEFjdGlvbnMoKTtcclxuXHJcbiAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICBzbWFydFBhbjogIXRoaXMuYWN0aW9uc1snY21kU21hcnRQYW4nXS5hY3RpdmUsXHJcbiAgICAgIHNpbmdsZVBhZ2U6IHRoaXMuYWN0aW9uc1snY21kU2luZ2xlUGFnZSddLmFjdGl2ZSB8fCB0aGlzLmFjdGlvbnNbJ2NtZFNpbmdsZVBhZ2UnXS5hY3RpdmVGb3JNb2JpbGUgJiYgdGhpcy5kZXZpY2VQaXhlbFJhdGlvPjEsXHJcbiAgICAgIHN0YXRzOiB0aGlzLmFjdGlvbnNbJ2NtZFN0YXRzJ10uYWN0aXZlLFxyXG4gICAgICBsaWdodGluZzogdGhpcy5wLmxpZ2h0aW5nLmRlZmF1bHQsXHJcbiAgICAgIGFjdGl2ZVNpZGU6IDFcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5ib3hzID0gW25ldyBUSFJFRS5Cb3gzKCksIG5ldyBUSFJFRS5Cb3gzKCldO1xyXG4gICAgdGhpcy5ib29rV2F0Y2hlciA9IG5ldyBPYmplY3QzRFdhdGNoZXIodGhpcy52aXN1YWwsICgpPT4ge1xyXG4gICAgICBpZih0aGlzLnN0YXRlLnNpbmdsZVBhZ2UpIHtcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZVNpZGUpIHtcclxuICAgICAgICAgIHRoaXMuYm94c1swXS5zZXRGcm9tT2JqZWN0KGJvb2sucmlnaHRDb3Zlci50aHJlZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5ib3hzWzBdLnNldEZyb21PYmplY3QoYm9vay5sZWZ0Q292ZXIudGhyZWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmJveHNbMF0uc2V0RnJvbU9iamVjdChib29rLmxlZnRDb3Zlci50aHJlZSk7XHJcbiAgICAgICAgdGhpcy5ib3hzWzFdLnNldEZyb21PYmplY3QoYm9vay5yaWdodENvdmVyLnRocmVlKTtcclxuICAgICAgICB0aGlzLmJveHNbMF0udW5pb24odGhpcy5ib3hzWzFdKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5ib3hzWzBdO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmJvb2tXYXRjaGVyLnNjYWxlID0gdGhpcy5wLnNjYWxlLmRlZmF1bHQ7XHJcbiAgICB0aGlzLmJvb2suc2V0Wm9vbSh0aGlzLmJvb2tXYXRjaGVyLnNjYWxlLCB0aGlzLnN0YXRlLnNpbmdsZVBhZ2UpO1xyXG5cclxuICAgIHRoaXMuU3RhdHMgPSBuZXcgU3RhdHMoKTtcclxuICAgIHRoaXMuU3RhdHMuZG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICB0aGlzLlN0YXRzLmRvbUVsZW1lbnQuc3R5bGUudG9wID0gJzBweCc7XHJcblxyXG4gICAgdGhpcy52aXN1YWwuc2V0RXh0cmFMaWdodGluZyh0aGlzLnN0YXRlLmxpZ2h0aW5nKTtcclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIG9uU2NyZWVuTW9kZUNoYW5nZWQ6IHRoaXMub25TY3JlZW5Nb2RlQ2hhbmdlZC5iaW5kKHRoaXMpLFxyXG4gICAgICBzdGF0czogdGhpcy5TdGF0cy51cGRhdGUuYmluZCh0aGlzLlN0YXRzKSxcclxuICAgICAgb25VcGRhdGVWaWV3OiB0aGlzLnVwZGF0ZVZpZXcuYmluZCh0aGlzKVxyXG4gICAgfVxyXG4gICAgRnVsbFNjcmVlbi5hZGRFdmVudExpc3RlbmVyKHRoaXMudmlldy5nZXRQYXJlbnRDb250YWluZXIoKS5vd25lckRvY3VtZW50LCB0aGlzLmJpbmRzLm9uU2NyZWVuTW9kZUNoYW5nZWQpO1xyXG5cclxuICAgIHRoaXMuY21kU21hcnRQYW4oKTtcclxuXHJcbiAgICBpZih0aGlzLnZpZXcudGVtcGxhdGVPYmplY3QuYXBwTG9hZGVkKSB7XHJcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy52aWV3LnRlbXBsYXRlT2JqZWN0LmFwcExvYWRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ib29rLmVuYWJsZUxvYWRpbmdBbmltYXRpb24odGhpcy5wLmxvYWRpbmdBbmltYXRpb24uYm9vayk7XHJcbiAgICBpZih0aGlzLnAubG9hZGluZ0FuaW1hdGlvbi5za2luKSB7XHJcbiAgICAgIHRoaXMuaW5pdExvYWRpbmdBbmltYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJvb2suZW5hYmxlTG9hZGluZ0FuaW1hdGlvbih0aGlzLnAubG9hZGluZ0FuaW1hdGlvbi5ib29rKTtcclxuICAgIHRoaXMuYm9vay5zZXRBdXRvUmVzb2x1dGlvbih0aGlzLnAuYXV0b1Jlc29sdXRpb24uZW5hYmxlZCwgdGhpcy5wLmF1dG9SZXNvbHV0aW9uLmNvZWZmaWNpZW50KTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBGdWxsU2NyZWVuLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy52aWV3LmdldFBhcmVudENvbnRhaW5lcigpLm93bmVyRG9jdW1lbnQsIHRoaXMuYmluZHMub25TY3JlZW5Nb2RlQ2hhbmdlZCk7XHJcbiAgICBkZWxldGUgdGhpcy5ib29rO1xyXG4gICAgZGVsZXRlIHRoaXMudmlldztcclxuICAgIGRlbGV0ZSB0aGlzLnZpc3VhbDtcclxuICB9XHJcblxyXG4gIGluaXRMb2FkaW5nQW5pbWF0aW9uKCkge1xyXG4gICAgY29uc3QgaGFuZGxlciA9ICgpPT4ge1xyXG4gICAgICBjb25zdCBwYWdlcyA9IHRoaXMuYm9vay5nZXRUb3BQYWdlcygpO1xyXG4gICAgICBsZXQgdmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICBmb3IobGV0IG4gb2YgcGFnZXMpIHtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYm9vay5nZXRQYWdlU3RhdGUobik7XHJcbiAgICAgICAgdmlzaWJsZSA9IHN0YXRlPT09dW5kZWZpbmVkIHx8IHN0YXRlPT09J2xvYWRpbmcnO1xyXG4gICAgICAgIGlmKHZpc2libGUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3dpZExvYWRpbmcnLCB7XHJcbiAgICAgICAgdmlzaWJsZVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICB0aGlzLmJvb2suYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JlQW5pbWF0aW9uJywgaGFuZGxlcik7XHJcbiAgICB0aGlzLmJvb2suYWRkRXZlbnRMaXN0ZW5lcignYWZ0ZXJBbmltYXRpb24nLCBoYW5kbGVyKTtcclxuICAgIHRoaXMuYm9vay5hZGRFdmVudExpc3RlbmVyKCdsb2FkUGFnZScsIGhhbmRsZXIpO1xyXG4gICAgdGhpcy5ib29rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZFBhZ2UnLCBoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIGVuYWJsZU5hdmlnYXRpb24oZW5hYmxlKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25Db250cm9scyA9IGVuYWJsZTtcclxuICB9XHJcblxyXG4gIHNldFRvY0N0cmwodG9jQ3RybCkge1xyXG4gICAgdGhpcy50b2NDdHJsID0gdG9jQ3RybDtcclxuICAgIHRoaXMudG9jQ3RybC5vbkNoYW5nZSA9IHRoaXMudXBkYXRlVmlldy5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBzZXRQcmludGVyKHByaW50ZXIpIHtcclxuICAgIHRoaXMucHJpbnRlciA9IHByaW50ZXI7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIHNldFNvdW5kcyhzb3VuZHMpIHtcclxuICAgIHRoaXMuc291bmRzID0gc291bmRzO1xyXG4gICAgc291bmRzLnNldEVuYWJsZWQodGhpcy5hY3Rpb25zWydjbWRTb3VuZHMnXS5hY3RpdmUpO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb25TY3JlZW5Nb2RlQ2hhbmdlZChlKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGNhblpvb21JbigpIHtcclxuICAgIHJldHVybiAhdGhpcy5zdGF0ZS5zbWFydFBhbiB8fCBNYXRoLmFicyh0aGlzLmJvb2tXYXRjaGVyLnNjYWxlLXRoaXMucC5zY2FsZS5tYXgpPnRoaXMucC5lcHM7XHJcbiAgfVxyXG5cclxuICBjYW5ab29tT3V0KCkge1xyXG4gICAgcmV0dXJuICF0aGlzLnN0YXRlLnNtYXJ0UGFuIHx8IE1hdGguYWJzKHRoaXMuYm9va1dhdGNoZXIuc2NhbGUtdGhpcy5wLnNjYWxlLm1pbik+dGhpcy5wLmVwcztcclxuICB9XHJcblxyXG4gIGNhbkRlZmF1bHRab29tKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc21hcnRQYW47XHJcbiAgfVxyXG5cclxuICBzZXRCb29rWm9vbShzY2FsZSkge1xyXG4gICAgc2V0VGltZW91dCgoKT0+IHtcclxuICAgICAgaWYodGhpcy5ib29rV2F0Y2hlci5zY2FsZT09PXNjYWxlKSB7XHJcbiAgICAgICAgdGhpcy5ib29rLnNldFpvb20oc2NhbGUsIHRoaXMuc3RhdGUuc2luZ2xlUGFnZSk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMDApO1xyXG4gIH1cclxuXHJcbiAgY21kWm9vbUluKCkge1xyXG4gICAgaWYodGhpcy5zdGF0ZS5zbWFydFBhbikge1xyXG4gICAgICB0aGlzLmJvb2tXYXRjaGVyLnNjYWxlID0gTWF0aC5taW4odGhpcy5wLnNjYWxlLm1heCwgdGhpcy5ib29rV2F0Y2hlci5zY2FsZSt0aGlzLnAuc2NhbGUuZGVsdGEpO1xyXG4gICAgICB0aGlzLnNldEJvb2tab29tKHRoaXMuYm9va1dhdGNoZXIuc2NhbGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMub3JiaXQuem9vbUluKDYuNip0aGlzLnAuc2NhbGUuZGVsdGEvMC4zMik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGNtZFpvb21PdXQoKSB7XHJcbiAgICBpZih0aGlzLnN0YXRlLnNtYXJ0UGFuKSB7XHJcbiAgICAgIHRoaXMuYm9va1dhdGNoZXIuc2NhbGUgPSBNYXRoLm1heCh0aGlzLnAuc2NhbGUubWluLCB0aGlzLmJvb2tXYXRjaGVyLnNjYWxlLXRoaXMucC5zY2FsZS5kZWx0YSk7XHJcbiAgICAgIHRoaXMuc2V0Qm9va1pvb20odGhpcy5ib29rV2F0Y2hlci5zY2FsZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vcmJpdC56b29tT3V0KDYuNip0aGlzLnAuc2NhbGUuZGVsdGEvMC4zMik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGNtZERlZmF1bHRab29tKCkge1xyXG4gICAgaWYodGhpcy5zdGF0ZS5zbWFydFBhbikge1xyXG4gICAgICB0aGlzLmJvb2tXYXRjaGVyLnNjYWxlID0gdGhpcy5wLnNjYWxlLmRlZmF1bHQ7XHJcbiAgICAgIHRoaXMuc2V0Qm9va1pvb20odGhpcy5ib29rV2F0Y2hlci5zY2FsZSk7XHJcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY21kVG9jKCkge1xyXG4gICAgaWYodGhpcy50b2NDdHJsKSB7XHJcbiAgICAgIHRoaXMudG9jQ3RybC50b2dsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY21kRmFzdEJhY2t3YXJkKCkge1xyXG4gICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBMZWZ0KDUpKTtcclxuICB9XHJcblxyXG4gIGNtZEJhY2t3YXJkKCkge1xyXG4gICAgaWYodGhpcy5zdGF0ZS5zaW5nbGVQYWdlKSB7XHJcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlU2lkZSA9ICh0aGlzLmdldFBhZ2UoKSsxKSUyO1xyXG4gICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZVNpZGUpIHtcclxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNpZGUgPSAwO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhcnRGbGlwKHRoaXMuYm9vay5mbGlwTGVmdCgxKSkudGhlbigoYmxvY2spPT4ge1xyXG4gICAgICAgICAgaWYoYmxvY2spIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTaWRlID0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRGbGlwKHRoaXMuYm9vay5mbGlwTGVmdCgxKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbWRGb3J3YXJkKCkge1xyXG4gICAgaWYodGhpcy5zdGF0ZS5zaW5nbGVQYWdlKSB7XHJcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlU2lkZSA9ICh0aGlzLmdldFBhZ2UoKSsxKSUyO1xyXG4gICAgICBpZighdGhpcy5zdGF0ZS5hY3RpdmVTaWRlKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVTaWRlID0gMTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0YXJ0RmxpcCh0aGlzLmJvb2suZmxpcFJpZ2h0KDEpKS50aGVuKChibG9jayk9PiB7XHJcbiAgICAgICAgICBpZihibG9jaykge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNpZGUgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBSaWdodCgxKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbWRGYXN0Rm9yd2FyZCgpIHtcclxuICAgIHRoaXMuc3RhcnRGbGlwKHRoaXMuYm9vay5mbGlwUmlnaHQoNSkpO1xyXG4gIH1cclxuXHJcbiAgY21kU2F2ZSgpIHtcclxuICAgIHdpbmRvdy5vcGVuKHRoaXMucC5kb3dubG9hZFVSTCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgY21kUHJpbnQoKSB7XHJcbiAgICB0aGlzLnByaW50ZXIucHJpbnQoKTtcclxuICB9XHJcblxyXG4gIGNtZEZ1bGxTY3JlZW4oKSB7XHJcbiAgICBpZighRnVsbFNjcmVlbi5hY3RpdmF0ZWQoKSkge1xyXG4gICAgICBGdWxsU2NyZWVuLnJlcXVlc3QodGhpcy52aWV3LmdldFBhcmVudENvbnRhaW5lcigpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBGdWxsU2NyZWVuLmNhbmNlbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY21kU21hcnRQYW4oKSB7XHJcbiAgICB0aGlzLnN0YXRlLnNtYXJ0UGFuID0gIXRoaXMuc3RhdGUuc21hcnRQYW47XHJcbiAgICBpZih0aGlzLnN0YXRlLnNtYXJ0UGFuKSB7XHJcbiAgICAgIHRoaXMub3JiaXQubWluQXppbXV0aEFuZ2xlID0gMDtcclxuICAgICAgdGhpcy5vcmJpdC5tYXhBemltdXRoQW5nbGUgPSAwO1xyXG4gICAgICB0aGlzLm9yYml0Lm1pblBvbGFyQW5nbGUgPSAwO1xyXG4gICAgXHR0aGlzLm9yYml0Lm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJLzQ7XHJcbiAgICAgIHRoaXMuYm9va1dhdGNoZXIuZW5hYmxlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5vcmJpdC5taW5BemltdXRoQW5nbGUgPSAtSW5maW5pdHk7XHJcbiAgICAgIHRoaXMub3JiaXQubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7XHJcbiAgICAgIHRoaXMub3JiaXQubWluUG9sYXJBbmdsZSA9IDA7XHJcbiAgICBcdHRoaXMub3JiaXQubWF4UG9sYXJBbmdsZSA9IE1hdGguUEk7XHJcbiAgICAgIHRoaXMuYm9va1dhdGNoZXIuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBjbWRTaW5nbGVQYWdlKCkge1xyXG4gICAgdGhpcy5zdGF0ZS5zaW5nbGVQYWdlID0gIXRoaXMuc3RhdGUuc2luZ2xlUGFnZTtcclxuICAgIHRoaXMuc2V0Qm9va1pvb20odGhpcy5ib29rV2F0Y2hlci5zY2FsZSk7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGNtZFNvdW5kcygpIHtcclxuICAgIGlmKHRoaXMuc291bmRzKSB7XHJcbiAgICAgIHRoaXMuc291bmRzLnRvZ2xlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGNtZFN0YXRzKCkge1xyXG4gICAgdGhpcy5zdGF0ZS5zdGF0cyA9ICF0aGlzLnN0YXRlLnN0YXRzO1xyXG4gICAgaWYodGhpcy5zdGF0ZS5zdGF0cykge1xyXG4gICAgICAkKHRoaXMudmlldy5nZXRDb250YWluZXIoKSkuYXBwZW5kKHRoaXMuU3RhdHMuZG9tRWxlbWVudCk7XHJcbiAgICAgIHRoaXMudmlzdWFsLmFkZFJlbmRlckNhbGxiYWNrKHRoaXMuYmluZHMuc3RhdHMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICQodGhpcy52aWV3LmdldENvbnRhaW5lcigpKS5maW5kKHRoaXMuU3RhdHMuZG9tRWxlbWVudCkucmVtb3ZlKCk7XHJcbiAgICAgIHRoaXMudmlzdWFsLnJlbW92ZVJlbmRlckNhbGxiYWNrKHRoaXMuYmluZHMuc3RhdHMpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBjbWRMaWdodGluZ1VwKCkge1xyXG4gICAgdGhpcy5zdGF0ZS5saWdodGluZyA9IE1hdGgubWluKHRoaXMuc3RhdGUubGlnaHRpbmcrdGhpcy5wLmxpZ2h0aW5nLmRlbHRhLCB0aGlzLnAubGlnaHRpbmcubWF4KTtcclxuICAgIHRoaXMudmlzdWFsLnNldEV4dHJhTGlnaHRpbmcodGhpcy5zdGF0ZS5saWdodGluZyk7XHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIGNtZExpZ2h0aW5nRG93bigpIHtcclxuICAgIHRoaXMuc3RhdGUubGlnaHRpbmcgPSBNYXRoLm1heCh0aGlzLnN0YXRlLmxpZ2h0aW5nLXRoaXMucC5saWdodGluZy5kZWx0YSwgdGhpcy5wLmxpZ2h0aW5nLm1pbik7XHJcbiAgICB0aGlzLnZpc3VhbC5zZXRFeHRyYUxpZ2h0aW5nKHRoaXMuc3RhdGUubGlnaHRpbmcpO1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBnb1RvUGFnZShwYWdlKSB7XHJcbiAgICBpZih0aGlzLnAucnRsKSB7XHJcbiAgICAgIHBhZ2UgPSB0aGlzLmJvb2suZ2V0UGFnZXMoKS0xLXBhZ2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYWdlTnVtID0gTWF0aC5tYXgoTWF0aC5taW4ocGFnZSwgdGhpcy5ib29rLmdldFBhZ2VzKCktMSksMCk7XHJcbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVNpZGUgPSAocGFnZU51bSsxKSUyO1xyXG4gICAgbGV0IHRhcmdldCA9IE1hdGgubWF4KE1hdGgubWluKHBhZ2UtMStwYWdlJTIsIHRoaXMuYm9vay5nZXRQYWdlcygpLTEpLDApLCBjdXJyZW50ID0gdGhpcy5ib29rLmdldFBhZ2UoKSwgZmxpcHMgPSBbXSwgY292cyA9IDA7O1xyXG4gICAgaWYodGFyZ2V0IT1jdXJyZW50KSB7XHJcbiAgICAgIGlmKGN1cnJlbnQ9PT0wKSB7XHJcbiAgICAgICAgZmxpcHMucHVzaCgxKTtcclxuICAgICAgICBjdXJyZW50Kz0xO1xyXG4gICAgICAgICsrY292cztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKGN1cnJlbnQ9PT10aGlzLmJvb2suZ2V0UGFnZXMoKS0xKSB7XHJcbiAgICAgICAgZmxpcHMucHVzaCgtMSk7XHJcbiAgICAgICAgY3VycmVudC09MjtcclxuICAgICAgICArK2NvdnM7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGN2ID0gMDtcclxuICAgICAgaWYodGFyZ2V0PT09MCkge1xyXG4gICAgICAgIGN2ID0gLTE7XHJcbiAgICAgICAgdGFyZ2V0Kz0xO1xyXG4gICAgICAgICsrY292cztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKHRhcmdldD09PXRoaXMuYm9vay5nZXRQYWdlcygpLTEpIHtcclxuICAgICAgICBjdiA9IDE7XHJcbiAgICAgICAgdGFyZ2V0LT0yO1xyXG4gICAgICAgICsrY292cztcclxuICAgICAgfVxyXG4gICAgICBpZih0YXJnZXQtY3VycmVudCkge1xyXG4gICAgICAgIGZsaXBzLnB1c2goTWF0aC5jZWlsKCh0YXJnZXQtY3VycmVudCkvMikpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGN2KSB7XHJcbiAgICAgICAgZmxpcHMucHVzaChjdik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZXRDbGIgPSAoZmwsIHRpbWUsIGNsYik9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgaWYoZmw8MCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBMZWZ0KC1mbCwgY2xiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zdGFydEZsaXAodGhpcy5ib29rLmZsaXBSaWdodChmbCwgY2xiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCB0aW1lKTtcclxuICAgIH07XHJcblxyXG4gICAgaWYoY292cz09PTIpIHtcclxuICAgICAgc2V0Q2xiKGZsaXBzWzBdLCAwLCAoYmxvY2ssIHByb2dyZXNzLCBzdGF0ZSk9PiB7XHJcbiAgICAgICAgaWYoc3RhdGU9PSdmaW5pc2gnICYmIHByb2dyZXNzPT0xKSB7XHJcbiAgICAgICAgICBzZXRDbGIoZmxpcHNbZmxpcHMubGVuZ3RoLTFdLCAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBzZXRDbGIoZmxpcHNbMV0sIDUwMCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHRpbWUgPSAwO1xyXG4gICAgICBmb3IobGV0IGZsIG9mIGZsaXBzKSB7XHJcbiAgICAgICAgc2V0Q2xiKGZsLCB0aW1lKTtcclxuICAgICAgICB0aW1lKz0yNTA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0RmxpcChmbGlwUmVzKSB7XHJcbiAgICByZXR1cm4gZmxpcFJlcz8gZmxpcFJlcy50aGVuKChibG9jayk9PiB7XHJcbiAgICAgIGlmKGJsb2NrKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwYXRjaEFzeW5jKHtcclxuICAgICAgICAgIHR5cGU6ICdzdGFydEZsaXAnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGJsb2NrO1xyXG4gICAgfSk6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gIH1cclxuXHJcbiAgZW5kRmxpcChibG9jaykge1xyXG4gICAgdGhpcy5kaXNwYXRjaEFzeW5jKHtcclxuICAgICAgdHlwZTogJ2VuZEZsaXAnXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBibG9jaztcclxuICB9XHJcblxyXG4gIGdldFBhZ2UoKSB7XHJcbiAgICBjb25zdCBwYWdlID0gdGhpcy5ib29rLmdldFBhZ2UoKTtcclxuICAgIHJldHVybiBwYWdlPyBNYXRoLm1pbih0aGlzLmJvb2suZ2V0UGFnZSgpK3RoaXMuc3RhdGUuYWN0aXZlU2lkZSwgdGhpcy5ib29rLmdldFBhZ2VzKCktMSk6IDA7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlRm9yR1VJKCkge1xyXG4gICAgbGV0IG4gPSAodGhpcy5zdGF0ZS5zaW5nbGVQYWdlPyB0aGlzLmdldFBhZ2UoKTogdGhpcy5ib29rLmdldFBhZ2UoKSkrMTtcclxuICAgIGlmKHRoaXMucC5ydGwpIHtcclxuICAgICAgbiA9IHRoaXMuYm9vay5nZXRQYWdlcygpLW4rMTtcclxuICAgIH1cclxuICAgIHJldHVybiBuO1xyXG4gIH1cclxuXHJcbiAgaW5wUGFnZShlLCBkYXRhKSB7XHJcbiAgICB0aGlzLmdvVG9QYWdlKGRhdGEtMSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVWaWV3SWZTdGF0ZShibG9jaywgcHJvZ3Jlc3MsIHN0YXRlLCB0eXBlKSB7XHJcbiAgICBpZihzdGF0ZT09PSdpbml0JyB8fCBzdGF0ZT09PSdmaW5pc2gnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQodGhpcy51cGRhdGVWaWV3LmJpbmQodGhpcyksIDEwMCk7XHJcbiAgICB9XHJcbiAgICBpZihzdGF0ZT09PSdmaW5pc2gnKSB7XHJcbiAgICAgIHRoaXMuZW5kRmxpcChibG9jayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVWaWV3U3RhdGUoKSB7XHJcbiAgICB0aGlzLnZpZXdTdGF0ZSA9IHtcclxuICAgICAgJ2NtZFpvb21Jbic6IHtcclxuICAgICAgICBlbmFibGU6IHRoaXMuY2FuWm9vbUluKCksXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRab29tSW4nXS5lbmFibGVkLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgJ2NtZFpvb21PdXQnOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0aGlzLmNhblpvb21PdXQoKSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmFjdGlvbnNbJ2NtZFpvb21PdXQnXS5lbmFibGVkLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgJ2NtZERlZmF1bHRab29tJzoge1xyXG4gICAgICAgIGVuYWJsZTogdGhpcy5jYW5EZWZhdWx0Wm9vbSgpLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuYWN0aW9uc1snY21kRGVmYXVsdFpvb20nXS5lbmFibGVkLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy5jYW5EZWZhdWx0Wm9vbSgpICYmIE1hdGguYWJzKHRoaXMuYm9va1dhdGNoZXIuc2NhbGUtdGhpcy5wLnNjYWxlLmRlZmF1bHQpPHRoaXMucC5lcHNcclxuICAgICAgfSxcclxuICAgICAgJ2NtZFRvYyc6IHtcclxuICAgICAgICBlbmFibGU6ICEhdGhpcy50b2NDdHJsLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuYWN0aW9uc1snY21kVG9jJ10uZW5hYmxlZCAmJiB0aGlzLnRvY0N0cmwsXHJcbiAgICAgICAgYWN0aXZlOiB0aGlzLnRvY0N0cmwgJiYgdGhpcy50b2NDdHJsLnZpc2libGVcclxuICAgICAgfSxcclxuICAgICAgJ2lucFBhZ2VzJzoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuYm9vay5nZXRQYWdlcygpXHJcbiAgICAgIH0sXHJcbiAgICAgICdpbnBQYWdlJzoge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlOiAhdGhpcy5ib29rLmlzUHJvY2Vzc2luZygpICYmIHRoaXMubmF2aWdhdGlvbkNvbnRyb2xzLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmdldFBhZ2VGb3JHVUkoKVxyXG4gICAgICB9LFxyXG4gICAgICAnY21kU2F2ZSc6IHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRTYXZlJ10uZW5hYmxlZCAmJiAhIXRoaXMucC5kb3dubG9hZFVSTCxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRQcmludCc6IHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRQcmludCddLmVuYWJsZWQgJiYgISF0aGlzLnByaW50ZXIsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICAnY21kRnVsbFNjcmVlbic6IHtcclxuICAgICAgICBlbmFibGU6IEZ1bGxTY3JlZW4uYXZhaWxhYmxlKCksXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRGdWxsU2NyZWVuJ10uZW5hYmxlZCxcclxuICAgICAgICBhY3RpdmU6IEZ1bGxTY3JlZW4uYXZhaWxhYmxlKCkgJiYgRnVsbFNjcmVlbi5hY3RpdmF0ZWQoKVxyXG4gICAgICB9LFxyXG4gICAgICAnd2lkU2V0dGluZ3MnOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuYWN0aW9uc1snd2lkU2V0dGluZ3MnXS5lbmFibGVkLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgJ2NtZFNtYXJ0UGFuJzoge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLmFjdGlvbnNbJ2NtZFNtYXJ0UGFuJ10uZW5hYmxlZCxcclxuICAgICAgICBhY3RpdmU6IHRoaXMuc3RhdGUuc21hcnRQYW5cclxuICAgICAgfSxcclxuICAgICAgJ2NtZFNpbmdsZVBhZ2UnOiB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuYWN0aW9uc1snY21kU2luZ2xlUGFnZSddLmVuYWJsZWQsXHJcbiAgICAgICAgYWN0aXZlOiB0aGlzLnN0YXRlLnNpbmdsZVBhZ2VcclxuICAgICAgfSxcclxuICAgICAgJ2NtZFNvdW5kcyc6IHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogIHRoaXMuYWN0aW9uc1snY21kU291bmRzJ10uZW5hYmxlZCAmJiAhIXRoaXMuc291bmRzLFxyXG4gICAgICAgIGFjdGl2ZTogISF0aGlzLnNvdW5kcyAmJiB0aGlzLnNvdW5kcy5lbmFibGVkXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRTdGF0cyc6IHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zWydjbWRTdGF0cyddLmVuYWJsZWQsXHJcbiAgICAgICAgYWN0aXZlOiB0aGlzLnN0YXRlLnN0YXRzXHJcbiAgICAgIH0sXHJcbiAgICAgICdjbWRMaWdodGluZ1VwJzoge1xyXG4gICAgICAgIGVuYWJsZTogTWF0aC5hYnModGhpcy5zdGF0ZS5saWdodGluZy10aGlzLnAubGlnaHRpbmcubWF4KT50aGlzLnAuZXBzLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuYWN0aW9uc1snY21kTGlnaHRpbmdVcCddLmVuYWJsZWQsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICAnY21kTGlnaHRpbmdEb3duJzoge1xyXG4gICAgICAgIGVuYWJsZTogTWF0aC5hYnModGhpcy5zdGF0ZS5saWdodGluZy10aGlzLnAubGlnaHRpbmcubWluKT50aGlzLnAuZXBzLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMuYWN0aW9uc1snY21kTGlnaHRpbmdEb3duJ10uZW5hYmxlZCxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbGVmdCA9IHRoaXMuYm9vay5nZXRMZWZ0RmxpcHBpbmcoKSxcclxuICAgICAgICAgIHJpZ2h0ID0gdGhpcy5ib29rLmdldFJpZ2h0RmxpcHBpbmcoKTtcclxuICAgIGNvbnN0IGZsaXBwZXJzRW5hYmxlID0ge1xyXG4gICAgICBjbWRGYXN0QmFja3dhcmQ6ICEhbGVmdCAmJiB0aGlzLm5hdmlnYXRpb25Db250cm9scyxcclxuICAgICAgY21kQmFja3dhcmQ6ICEhbGVmdCAmJiB0aGlzLm5hdmlnYXRpb25Db250cm9scyxcclxuICAgICAgY21kRm9yd2FyZDogISFyaWdodCAmJiB0aGlzLm5hdmlnYXRpb25Db250cm9scyxcclxuICAgICAgY21kRmFzdEZvcndhcmQ6ICEhcmlnaHQgJiYgdGhpcy5uYXZpZ2F0aW9uQ29udHJvbHNcclxuICAgIH07XHJcbiAgICBmb3IobGV0IG5hbWUgb2YgT2JqZWN0LmtleXMoZmxpcHBlcnNFbmFibGUpKSB7XHJcbiAgICAgIHRoaXMudmlld1N0YXRlW25hbWVdID0ge1xyXG4gICAgICAgIGVuYWJsZTogZmxpcHBlcnNFbmFibGVbbmFtZV0sXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5hY3Rpb25zW25hbWVdLmVuYWJsZWQsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICBpZih0aGlzLnZpZXcpIHtcclxuICAgICAgdGhpcy51cGRhdGVWaWV3U3RhdGUoKTtcclxuICAgICAgZm9yKGxldCBuYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMudmlld1N0YXRlKSkge1xyXG4gICAgICAgIHRoaXMudmlldy5zZXRTdGF0ZShuYW1lLCB0aGlzLnZpZXdTdGF0ZVtuYW1lXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFjdGlvbnMoKSB7XHJcbiAgICBjb25zdCBpc1N3aXBwaW5nID0gKG5hbWUpPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5hY3Rpb25zLnRvdWNoQ21kU3dpcGUuZW5hYmxlZCAmJiB0aGlzLmFjdGlvbnMudG91Y2hDbWRTd2lwZS5jb2RlPT09dGhpcy5hY3Rpb25zW25hbWVdLmNvZGUgJiYgdGhpcy5zdGF0ZS5zbWFydFBhbiAmJiB0aGlzLmJvb2tXYXRjaGVyLnNjYWxlPD0xO1xyXG4gICAgfSwgY21kcyA9IHt9O1xyXG5cclxuICAgIGZvcihsZXQgbmFtZSBpbiB0aGlzKSB7XHJcbiAgICAgIGlmKG5hbWUuaW5kZXhPZignY21kJyk9PT0wKSB7XHJcbiAgICAgICAgY21kc1tuYW1lXSA9IHtcclxuICAgICAgICAgIGFjdGl2YXRlOiAoLi4uYXJncyk9PiB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMudmlld1N0YXRlICYmIHRoaXMudmlld1N0YXRlW25hbWVdLmVuYWJsZSkge1xyXG4gICAgICAgICAgICAgIHRoaXNbbmFtZV0oLi4uYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uY21kcyxcclxuICAgICAgY21kUGFuTGVmdDoge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSk9PiB0aGlzLm9yYml0LmFjdGlvbnMucGFuKGUsIHtcclxuICAgICAgICAgIHN0YXRlOiAnbW92ZScsXHJcbiAgICAgICAgICBkeDogLXRoaXMucC5wYW4uc3BlZWQsXHJcbiAgICAgICAgICBkeTogMFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFBhblJpZ2h0OiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlKT0+IHRoaXMub3JiaXQuYWN0aW9ucy5wYW4oZSwge1xyXG4gICAgICAgICAgc3RhdGU6ICdtb3ZlJyxcclxuICAgICAgICAgIGR4OiB0aGlzLnAucGFuLnNwZWVkLFxyXG4gICAgICAgICAgZHk6IDBcclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQYW5VcDoge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSk9PiB0aGlzLm9yYml0LmFjdGlvbnMucGFuKGUsIHtcclxuICAgICAgICAgIHN0YXRlOiAnbW92ZScsXHJcbiAgICAgICAgICBkeDogMCxcclxuICAgICAgICAgIGR5OiAtdGhpcy5wLnBhbi5zcGVlZFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFBhbkRvd246IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUpPT4gdGhpcy5vcmJpdC5hY3Rpb25zLnBhbihlLCB7XHJcbiAgICAgICAgICBzdGF0ZTogJ21vdmUnLFxyXG4gICAgICAgICAgZHg6IDAsXHJcbiAgICAgICAgICBkeTogdGhpcy5wLnBhbi5zcGVlZFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0sXHJcbiAgICAgIG1vdXNlQ21kUm90YXRlOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IHRoaXMub3JiaXQuYWN0aW9ucy5yb3RhdGVcclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWREcmFnWm9vbToge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSwgZGF0YSk9PiB7XHJcbiAgICAgICAgICBpZihkYXRhLmR5PjApIHtcclxuICAgICAgICAgICAgdGhpcy5jbWRab29tT3V0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmKGRhdGEuZHk8MCkge1xyXG4gICAgICAgICAgICB0aGlzLmNtZFpvb21JbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWRQYW46IHtcclxuICAgICAgICBhY3RpdmF0ZTogdGhpcy5vcmJpdC5hY3Rpb25zLnBhblxyXG4gICAgICB9LFxyXG4gICAgICBtb3VzZUNtZFdoZWVsWm9vbToge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSk9PiB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICBpZihlLmRlbHRhWTwwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY21kWm9vbU91dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZihlLmRlbHRhWT4wKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY21kWm9vbUluKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFJvdGF0ZToge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSwgZGF0YSk9PiB7XHJcbiAgICAgICAgICBpZighaXNTd2lwcGluZygndG91Y2hDbWRSb3RhdGUnKSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHRoaXMub3JiaXQuYWN0aW9ucy5yb3RhdGUoZSwgZGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFpvb206IHtcclxuICAgICAgICBhY3RpdmF0ZTogKGUsIGRhdGEpPT4ge1xyXG4gICAgICAgICAgaWYoIWlzU3dpcHBpbmcoJ3RvdWNoQ21kWm9vbScpKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgaWYoZGF0YS5keT4wKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jbWRab29tT3V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZihkYXRhLmR5PDApIHtcclxuICAgICAgICAgICAgICB0aGlzLmNtZFpvb21JbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFBhbjoge1xyXG4gICAgICAgIGFjdGl2YXRlOiAoZSwgZGF0YSk9PiB7XHJcbiAgICAgICAgICBpZighaXNTd2lwcGluZygndG91Y2hDbWRQYW4nKSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHRoaXMub3JiaXQuYWN0aW9ucy5wYW4oZSwgZGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFN3aXBlOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6IChlLCBkYXRhKT0+IHtcclxuICAgICAgICAgIGlmKGlzU3dpcHBpbmcoJ3RvdWNoQ21kU3dpcGUnKSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGlmKGRhdGEuc3RhdGU9PT0nc3RhcnQnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG91Y2ggPSAoZS50b3VjaGVzIHx8IGUub3JpZ2luYWxFdmVudC50b3VjaGVzKVt0aGlzLmFjdGlvbnMudG91Y2hDbWRTd2lwZS5jb2RlLTFdO1xyXG4gICAgICAgICAgICAgIHRoaXMuc3dpcGVEYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgaGFuZGxlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB4MDogdG91Y2gucGFnZVgsXHJcbiAgICAgICAgICAgICAgICB5MDogdG91Y2gucGFnZVksXHJcbiAgICAgICAgICAgICAgICB4OiB0b3VjaC5wYWdlWCxcclxuICAgICAgICAgICAgICAgIHk6IHRvdWNoLnBhZ2VZXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKGRhdGEuc3RhdGU9PT0nbW92ZScpIHtcclxuICAgICAgICAgICAgICBpZighdGhpcy5zd2lwZURhdGEuaGFuZGxlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2lwZURhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3dpcGVEYXRhLFxyXG4gICAgICAgICAgICAgICAgICB4OiB0aGlzLnN3aXBlRGF0YS54K2RhdGEuZHgsXHJcbiAgICAgICAgICAgICAgICAgIHk6IHRoaXMuc3dpcGVEYXRhLnkrZGF0YS5keVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoTWF0aC5hYnModGhpcy5zd2lwZURhdGEueDAtdGhpcy5zd2lwZURhdGEueCk+MTAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3dpcGVEYXRhLngwPnRoaXMuc3dpcGVEYXRhLng/IHRoaXMuY21kRm9yd2FyZCgpOiB0aGlzLmNtZEJhY2t3YXJkKCk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc3dpcGVEYXRhLmhhbmRsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zd2lwZURhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHdpZFNldHRpbmdzOiB7XHJcbiAgICAgICAgYWN0aXZhdGU6ICgpPT4gdW5kZWZpbmVkXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBiaW5kQWN0aW9ucygpIHtcclxuICAgIHRoaXMuZVRvQSA9IG5ldyBFdmVudHNUb0FjdGlvbnMoJCh0aGlzLnZpc3VhbC5lbGVtZW50KSk7XHJcbiAgICB0aGlzLmVUb0EuYWRkQWN0aW9uKChlKT0+IGUucHJldmVudERlZmF1bHQoKSwgJ2NvbnRleHRtZW51JywgRXZlbnRzVG9BY3Rpb25zLm1vdXNlQnV0dG9ucy5SaWdodCwgMCk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25zID0gdGhpcy5nZXRBY3Rpb25zKCk7XHJcbiAgICBmb3IobGV0IG5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5hY3Rpb25zKSkge1xyXG4gICAgICBjb25zdCBhY3Rpb24gPSB7XHJcbiAgICAgICAgLi4udGhpcy5hY3Rpb25zW25hbWVdLFxyXG4gICAgICAgIC4uLnRoaXMucC5hY3Rpb25zW25hbWVdXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuYWN0aW9uc1tuYW1lXSA9IGFjdGlvbjtcclxuICAgICAgaWYoYWN0aW9uLmVuYWJsZWQpIHtcclxuICAgICAgICBjb25zdCBmbGFncyA9IGFjdGlvbi5mbGFncyB8fCAwO1xyXG4gICAgICAgIGlmKGFjdGlvbi50eXBlKSB7XHJcbiAgICAgICAgICB0aGlzLmVUb0EuYWRkQWN0aW9uKGFjdGlvbi5hY3RpdmF0ZSwgYWN0aW9uLnR5cGUsIGFjdGlvbi5jb2RlLCBmbGFncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoYWN0aW9uLmNvZGUhPT11bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuZVRvQS5hZGRBY3Rpb24oYWN0aW9uLmFjdGl2YXRlLCAna2V5ZG93bicsIGFjdGlvbi5jb2RlLCBmbGFncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcHJlcGFyZVByb3BzKHByb3BzKSB7XHJcbiAgICByZXR1cm4gQm9va0NvbnRyb2xsZXIuY2FsY1Byb3BzKEJvb2tDb250cm9sbGVyLm1lcmdlUHJvcHMoYm9va0NvbnRyb2xsZXJQcm9wcygpLCBwcm9wcykpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHNldEFjdGlvbnMocHJvcHMsIGFjdGlvbnMpIHtcclxuICAgIGZvcihsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyhhY3Rpb25zIHx8IHt9KSkge1xyXG4gICAgICBwcm9wcy5hY3Rpb25zW25hbWVdID0ge1xyXG4gICAgICAgIC4uLnByb3BzLmFjdGlvbnNbbmFtZV0sXHJcbiAgICAgICAgLi4uYWN0aW9uc1tuYW1lXVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1lcmdlUHJvcHMoZmlyc3QsIHNlY29uZCkge1xyXG4gICAgc2Vjb25kID0gc2Vjb25kIHx8IHt9O1xyXG4gICAgZnVuY3Rpb24gbWVyZ2UoZmlyc3QsIHNlY29uZCkge1xyXG4gICAgICBzZWNvbmQgPSBzZWNvbmQgfHwge307XHJcbiAgICAgIGNvbnN0IHByb3BzID0ge1xyXG4gICAgICAgIC4uLmZpcnN0LFxyXG4gICAgICAgIC4uLnNlY29uZFxyXG4gICAgICB9O1xyXG4gICAgICBmb3IobGV0IG5hbWUgb2YgT2JqZWN0LmtleXMoZmlyc3QpKSB7XHJcbiAgICAgICAgaWYodHlwZW9mIGZpcnN0W25hbWVdPT09J29iamVjdCcpIHtcclxuICAgICAgICAgIHByb3BzW25hbWVdID0gbWVyZ2UoZmlyc3RbbmFtZV0sIHNlY29uZFtuYW1lXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwcm9wcztcclxuICAgIH1cclxuICAgIGNvbnN0IHByb3BzID0gbWVyZ2UoZmlyc3QsIHNlY29uZCk7XHJcbiAgICBCb29rQ29udHJvbGxlci5zZXRBY3Rpb25zKHByb3BzLCBmaXJzdC5hY3Rpb25zKTtcclxuICAgIEJvb2tDb250cm9sbGVyLnNldEFjdGlvbnMocHJvcHMsIHNlY29uZC5hY3Rpb25zKTtcclxuICAgIHJldHVybiBwcm9wcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjYWxjUHJvcHMocHJvcHMpIHtcclxuICAgIHByb3BzLnNjYWxlLmRlbHRhID0gKHByb3BzLnNjYWxlLm1heC1wcm9wcy5zY2FsZS5taW4pL3Byb3BzLnNjYWxlLmxldmVscztcclxuICAgIHByb3BzLmxpZ2h0aW5nLmRlbHRhID0gKHByb3BzLmxpZ2h0aW5nLm1heC1wcm9wcy5saWdodGluZy5taW4pL3Byb3BzLmxpZ2h0aW5nLmxldmVscztcclxuICAgIHJldHVybiBwcm9wcztcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQm9va0NvbnRyb2xsZXIuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9va1ByaW50ZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBib29rLCBzdHlsZVNoZWV0KSB7XHJcbiAgICB0aGlzLmJvb2sgPSBib29rO1xyXG4gICAgdGhpcy5zdHlsZVNoZWV0ID0gc3R5bGVTaGVldDtcclxuICAgIHRoaXMud25kID0gY29udGV4dC53bmQ7XHJcbiAgICB0aGlzLmRvYyA9IGNvbnRleHQuZG9jO1xyXG4gICAgdGhpcy5wYWdlQ2FsbGJhY2sgPSBib29rLmdldFBhZ2VDYWxsYmFjaygpO1xyXG4gICAgY29uc3QgdGVzdCA9IHRoaXMucGFnZUNhbGxiYWNrKDApO1xyXG4gICAgdGhpcy50eXBlID0gdGVzdC50eXBlO1xyXG4gICAgaWYodGhpcy50eXBlPT09J3BkZicpIHtcclxuICAgICAgdGhpcy5wZGZTcmMgPSB0ZXN0LnNyYy5zcmM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWwoKSB7XHJcbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBpZih0aGlzLmZyYW1lKSB7XHJcbiAgICAgIHRoaXMuZnJhbWUucmVtb3ZlKCk7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmZyYW1lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpbnQoKSB7XHJcbiAgICBkZWxldGUgdGhpcy5jYW5jZWxlZDtcclxuICAgIGlmKHRoaXMudHlwZT09PSdwZGYnKSB7XHJcbiAgICAgIGxldCBwcmludFduZCwgY2FsbE1hbnVhbGx5ID0gZmFsc2U7XHJcbiAgICAgIGlmKHRoaXMudXNlSUZyYW1lKCkpIHtcclxuICAgICAgICBjYWxsTWFudWFsbHkgPSAhIXRoaXMuZnJhbWU7XHJcbiAgICAgICAgaWYoIXRoaXMuZnJhbWUpIHtcclxuICAgICAgICAgIHRoaXMuZnJhbWUgPSAkKCc8aWZyYW1lIHNyYz1cIicrdGhpcy5wZGZTcmMrJ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2lmcmFtZT4nKS5hcHBlbmRUbyh0aGlzLmRvYy5ib2R5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJpbnRXbmQgPSB0aGlzLmZyYW1lWzBdLmNvbnRlbnRXaW5kb3c7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgcHJpbnRXbmQgPSB0aGlzLnduZC5vcGVuKHRoaXMucGRmU3JjKTtcclxuICAgICAgfVxyXG4gICAgICBpZihjYWxsTWFudWFsbHkpIHtcclxuICAgICAgICBwcmludFduZC5wcmludCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgICQocHJpbnRXbmQpLm9uKCdsb2FkJywgKCk9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwcmludFduZC5wcmludCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2goZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJDb250ZW50KCkuXHJcbiAgICAgICAgdGhlbigoY29udGVudCk9PiB7XHJcbiAgICAgICAgICBjb25zdCBwcmludFduZCA9IHRoaXMud25kLm9wZW4oKSxcclxuICAgICAgICAgIHByaW50RG9jID0gcHJpbnRXbmQuZG9jdW1lbnQsXHJcbiAgICAgICAgICBodG1sID0gYFxyXG4gICAgICAgICAgICA8IURPQ1RZUEUgaHRtbD5cclxuICAgICAgICAgICAgPGh0bWw+XHJcbiAgICAgICAgICAgICAgPGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cclxuICAgICAgICAgICAgICAgIDx0aXRsZT4zRCBGbGlwQm9vayAtIFByaW50aW5nPC90aXRsZT5cclxuICAgICAgICAgICAgICAgICR7Y29udGVudC5oZWFkfVxyXG4gICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCI+XHJcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHByaW50RG9jdW1lbnQoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnByaW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHByaW50RG9jdW1lbnQsIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvc2NyaXB0PlxyXG4gICAgICAgICAgICAgIDwvaGVhZD5cclxuICAgICAgICAgICAgICA8Ym9keSBvbmxvYWQ9XCJpbml0KClcIj5cclxuICAgICAgICAgICAgICAgICR7Y29udGVudC5ib2R5fVxyXG4gICAgICAgICAgICAgIDwvYm9keT5cclxuICAgICAgICAgICAgPC9odG1sPlxyXG4gICAgICAgICAgYDtcclxuICAgICAgICAgIHByaW50RG9jLm9wZW4oKTtcclxuICAgICAgICAgIHByaW50RG9jLndyaXRlKGh0bWwpO1xyXG4gICAgICAgICAgcHJpbnREb2MuY2xvc2UoKTtcclxuICAgICAgICB9KS5cclxuICAgICAgICBjYXRjaCgoZSk9PiBjb25zb2xlLndhcm4oJzNEIEZsaXBCb29rIC0gUHJpbnRpbmcgd2FzIGNhbmNlbGVkJykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvZ3Jlc3Modikge1xyXG4gICAgaWYodGhpcy5jYW5jZWxlZCkge1xyXG4gICAgICB0aHJvdyAnQ2FuY2VsIFByaW50aW5nJztcclxuICAgIH1cclxuICAgIGlmKHRoaXMub25Qcm9ncmVzcykge1xyXG4gICAgICB0aGlzLm9uUHJvZ3Jlc3MoTWF0aC5mbG9vcih2KjEwMCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZGVyQ29udGVudCgpIHtcclxuICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5ib29rLmdldFBhZ2VzKCksIGhlYWQgPSBuZXcgU2V0KCksIGJvZHkgPSBbXTtcclxuICAgIGxldCBkb25lID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICBmb3IobGV0IHBhZ2U9MDsgcGFnZTxwYWdlczsgKytwYWdlKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnBhZ2VDYWxsYmFjayhwYWdlKTtcclxuICAgICAgaWYoaW5mby50eXBlPT09J2ltYWdlJykge1xyXG4gICAgICAgIGRvbmUgPSBkb25lLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnByb2dyZXNzKHBhZ2UvcGFnZXMpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySW1hZ2UoaGVhZCwgYm9keSwgaW5mby5zcmMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYoaW5mby50eXBlPT09J2h0bWwnKSB7XHJcbiAgICAgICAgZG9uZSA9IGRvbmUudGhlbigoKT0+IHtcclxuICAgICAgICAgIHRoaXMucHJvZ3Jlc3MocGFnZS9wYWdlcyk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIdG1sKGhlYWQsIGJvZHksIGluZm8uc3JjKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRvbmUudGhlbigoKT0+IHtcclxuICAgICAgdGhpcy5wcm9ncmVzcygxKTtcclxuICAgICAgcmV0dXJuIHtoZWFkOiB0aGlzLnJlbmRlckhlYWQoaGVhZCksIGJvZHk6IGJvZHkuam9pbignXFxuJyl9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB3cmFwKGNvbnRlbnQpIHtcclxuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImZiM2QtcHJpbnRlci1wYWdlXCI+JHtjb250ZW50fTwvZGl2PmA7XHJcbiAgfVxyXG5cclxuICByZW5kZXJJbWFnZShoZWFkLCBib2R5LCBzcmMpIHtcclxuICAgIGJvZHkucHVzaChCb29rUHJpbnRlci53cmFwKGA8aW1nIHNyYz1cIiR7c3JjfVwiIC8+YCkpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVySHRtbChoZWFkLCBib2R5LCBzcmMpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+IHtcclxuICAgICAgJC5nZXQoc3JjLCAoaHRtbCk9PiB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBodG1sLm1hdGNoKC88bGluay4qPz4vaWcpIHx8IFtdO1xyXG4gICAgICAgIGZvcihsZXQgbGluayBvZiBsaW5rcykge1xyXG4gICAgICAgICAgaWYobGluay5tYXRjaCgvc3R5bGVzaGVldC9pKSkge1xyXG4gICAgICAgICAgICBjb25zdCBocmVmID0gbGluay5tYXRjaCgvaHJlZlxccyo9XFxzKlsnXCJdKC4qKVsnXCJdL2kpO1xyXG4gICAgICAgICAgICBpZihocmVmKSB7XHJcbiAgICAgICAgICAgICAgaGVhZC5hZGQoaHJlZlsxXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IGh0bWwubWF0Y2goLzxib2R5Lio/PihbXFxTXFxzXSopPFxcL2JvZHk+L2kpO1xyXG4gICAgICAgIGlmKGNvbnRlbnQpIHtcclxuICAgICAgICAgIGJvZHkucHVzaChCb29rUHJpbnRlci53cmFwKGNvbnRlbnRbMV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KS5mYWlsKChlKT0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICByZWplY3QoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmVuZGVySGVhZChoZWFkKSB7XHJcbiAgICBjb25zdCBjb250ZW50ID0gW107XHJcbiAgICBoZWFkLmZvckVhY2goKGspPT4gY29udGVudC5wdXNoKGA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIiR7a31cIj5gKSk7XHJcbiAgICBjb250ZW50LnB1c2godGhpcy5zdHlsZVNoZWV0PyBgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCIke3RoaXMuc3R5bGVTaGVldH1cIj5gOiBCb29rUHJpbnRlci5kZWZhdWx0U3R5bGVTaGVldCgpKTtcclxuICAgIHJldHVybiBjb250ZW50LmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgdXNlSUZyYW1lKCkge1xyXG4gICAgY29uc3QgaXNDaHJvbWl1bSA9IHRoaXMud25kLmNocm9tZSxcclxuICAgICAgd2luTmF2ID0gdGhpcy53bmQubmF2aWdhdG9yLFxyXG4gICAgICB2ZW5kb3JOYW1lID0gd2luTmF2LnZlbmRvcixcclxuICAgICAgaXNJRWVkZ2UgPSB3aW5OYXYudXNlckFnZW50LmluZGV4T2YoXCJFZGdlXCIpPi0xLFxyXG4gICAgICBpc0lPU0Nocm9tZSA9IHdpbk5hdi51c2VyQWdlbnQubWF0Y2goXCJDcmlPU1wiKTtcclxuICAgIGxldCB1c2U7XHJcbiAgICBpZihpc0lPU0Nocm9tZSl7XHJcbiAgICAgIHVzZSA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYoaXNDaHJvbWl1bSAmJiB2ZW5kb3JOYW1lPT09J0dvb2dsZSBJbmMuJyAmJiAhaXNJRWVkZ2UpIHtcclxuICAgICAgdXNlID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVzZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWZhdWx0U3R5bGVTaGVldCgpIHtcclxuICAgIHJldHVybiBgXHJcbiAgICAgIDxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj5cclxuICAgICAgICBib2R5IHtcclxuICAgICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC5mYjNkLXByaW50ZXItcGFnZSB7XHJcbiAgICAgICAgICBwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7XHJcbiAgICAgICAgfVxyXG4gICAgICA8L3N0eWxlPlxyXG4gICAgYDtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQm9va1ByaW50ZXIuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgVmlldyBmcm9tICdWaWV3JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvb2tWaWV3IGV4dGVuZHMgVmlldyB7XHJcblxyXG4gIHN0YXRpYyBQQUdFX0hBTkRMRVJfREVMQVkgPSAxMDAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIG9uTG9hZCwgdGVtcGxhdGUsIGhhbmRsZXIpIHtcclxuICAgIHN1cGVyKGNvbnRhaW5lciwgb25Mb2FkLCB0ZW1wbGF0ZSwgaGFuZGxlcik7XHJcbiAgfVxyXG5cclxuICBpbml0VmlldygpIHtcclxuICAgIHRoaXMudmlldyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy52aWV3Jyk7XHJcbiAgICB0aGlzLmJvb2ttYXJrc1ZpZXcgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcud2lkQm9va21hcmtzJyk7XHJcbiAgICB0aGlzLnRodW1ibmFpbHNWaWV3ID0gdGhpcy5jb250YWluZXIuZmluZCgnLndpZFRodW1ibmFpbHMnKTtcclxuICAgIHRoaXMuc2VhcmNoVmlldyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy53aWRTZWFyY2gnKTtcclxuICB9XHJcblxyXG4gIGdldEhhbmRsZXJzKGlkKSB7XHJcbiAgICBsZXQgaGFuZGxlcnM7XHJcbiAgICBpZihpZD09PSdpbnBQYWdlJykge1xyXG4gICAgICBoYW5kbGVycyA9IFt7XHJcbiAgICAgICAgaW5wUGFnZTogKGUsIGRhdGEpPT4gdGhpcy5jYWxsTGF0ZXIoc3VwZXIuZ2V0SGFuZGxlcnMoaWQpLCBpZCwgZSwgZGF0YSwgQm9va1ZpZXcuUEFHRV9IQU5ETEVSX0RFTEFZKVxyXG4gICAgICB9XTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBoYW5kbGVycyA9IHN1cGVyLmdldEhhbmRsZXJzKGlkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBoYW5kbGVycztcclxuICB9XHJcblxyXG4gIG9uSXRlbVN0YXRlQ2hhbmdlZChpZCwgc3RhdGUpIHtcclxuICAgIGlmKGlkPT09J2NtZEZ1bGxTY3JlZW4nKSB7XHJcbiAgICAgIGlmKHN0YXRlLmFjdGl2ZSkge1xyXG4gICAgICAgIHRoaXMucGFyZW50Q29udGFpbmVyLmFkZENsYXNzKCdmdWxsc2NyZWVuJyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRDb250YWluZXIucmVtb3ZlQ2xhc3MoJ2Z1bGxzY3JlZW4nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0VmlldygpIHtcclxuICAgIHJldHVybiB0aGlzLnZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXRCb29rbWFya3NWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYm9va21hcmtzVmlldztcclxuICB9XHJcblxyXG4gIGdldFRodW1ibmFpbHNWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsc1ZpZXc7XHJcbiAgfVxyXG5cclxuICBnZXRTZWFyY2hWaWV3KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoVmlldztcclxuICB9XHJcblxyXG4gIGdldEZvcm1zKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXRMaW5rcygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdjbWRab29tSW4nLFxyXG4gICAgICAnY21kWm9vbU91dCcsXHJcbiAgICAgICdjbWREZWZhdWx0Wm9vbScsXHJcbiAgICAgICdjbWRUb2MnLFxyXG4gICAgICAnY21kRmFzdEJhY2t3YXJkJyxcclxuICAgICAgJ2NtZEJhY2t3YXJkJyxcclxuICAgICAgJ2NtZEZvcndhcmQnLFxyXG4gICAgICAnY21kRmFzdEZvcndhcmQnLFxyXG4gICAgICAnY21kU2F2ZScsXHJcbiAgICAgICdjbWRQcmludCcsXHJcbiAgICAgICdjbWRGdWxsU2NyZWVuJyxcclxuICAgICAgJ2NtZFNtYXJ0UGFuJyxcclxuICAgICAgJ2NtZFNpbmdsZVBhZ2UnLFxyXG4gICAgICAnY21kU291bmRzJyxcclxuICAgICAgJ2NtZFN0YXRzJyxcclxuICAgICAgJ2NtZExpZ2h0aW5nVXAnLFxyXG4gICAgICAnY21kTGlnaHRpbmdEb3duJyxcclxuICAgICAgJ2NtZENsb3NlVG9jJyxcclxuICAgICAgJ2NtZEJvb2ttYXJrcycsXHJcbiAgICAgICdjbWRTZWFyY2gnLFxyXG4gICAgICAnY21kVGh1bWJuYWlscydcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXRXaWRnZXRzKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ3dpZExvYWRpbmdQcm9ncmVzcycsXHJcbiAgICAgICd3aWRGbG9hdFduZCcsXHJcbiAgICAgICd3aWRUb2NNZW51JyxcclxuICAgICAgJ3dpZEJvb2ttYXJrcycsXHJcbiAgICAgICd3aWRUaHVtYm5haWxzJyxcclxuICAgICAgJ3dpZFNlYXJjaCcsXHJcbiAgICAgICd3aWRTZXR0aW5ncycsXHJcbiAgICAgICd3aWRMb2FkaW5nJ1xyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldElucHV0cygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdpbnBQYWdlJyxcclxuICAgICAgJ2lucFBhZ2VzJ1xyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldFRleHRzKCkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ3R4dExvYWRpbmdQcm9ncmVzcydcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXRUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGh0bWw6ICd0ZW1wbGF0ZXMvZGVmYXVsdC1ib29rLXZpZXcuaHRtbCcsXHJcbiAgICAgIHN0eWxlczogW1xyXG4gICAgICAgICdjc3MvYmxhY2stYm9vay12aWV3LmNzcydcclxuICAgICAgXSxcclxuICAgICAgbGlua3M6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICByZWw6ICdzdHlsZXNoZWV0JyxcclxuICAgICAgICAgIGhyZWY6ICdjc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MnXHJcbiAgICAgICAgfVxyXG4gICAgICBdLFxyXG4gICAgICBzY3JpcHQ6ICdqcy9kZWZhdWx0LWJvb2stdmlldy5qcydcclxuICAgIH07XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL0Jvb2tWaWV3LmpzIiwiaW1wb3J0IEJvb2tQcm9wc0J1aWxkZXIgZnJvbSAnLi9Cb29rUHJvcHNCdWlsZGVyJztcclxuaW1wb3J0IEltYWdlRmFjdG9yeSBmcm9tICdJbWFnZUZhY3RvcnknO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xiQm9va1Byb3BzQnVpbGRlciBleHRlbmRzIEJvb2tQcm9wc0J1aWxkZXIge1xyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHBhZ2VDYWxsYmFjaywgcGFnZXMsIG9uUmVhZHkpIHtcclxuICAgIHN1cGVyKG9uUmVhZHkpO1xyXG4gICAgdGhpcy5jYWxjU2hlZXRzKHBhZ2VzKTtcclxuICAgIHRoaXMucGFnZUNhbGxiYWNrID0gcGFnZUNhbGxiYWNrO1xyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgcGFnZUNhbGxiYWNrOiBwYWdlQ2FsbGJhY2suYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgIHRoaXMuaW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeShjb250ZXh0KTtcclxuXHJcbiAgICBpZihwYWdlcz4wKSB7XHJcbiAgICAgIGNvbnN0IHRlc3QgPSB0aGlzLmltYWdlRmFjdG9yeS5idWlsZChwYWdlQ2FsbGJhY2soMCksIDAsIHRoaXMuZGVmYXVsdHMuc2hlZXQud2lkdGhUZXhlbHMsIHRoaXMuZGVmYXVsdHMuc2hlZXQuaGVpZ2h0VGV4ZWxzLCB0aGlzLmRlZmF1bHRzLnNoZWV0LmNvbG9yKTtcclxuICAgICAgdGVzdC5vbkxvYWQgPSAoKT0+IHtcclxuICAgICAgICB0aGlzLmNhbGNQcm9wcyh0ZXN0LndpZHRoLCB0ZXN0LmhlaWdodCk7XHJcbiAgICAgICAgdGVzdC5kaXNwb3NlKCk7XHJcbiAgICAgICAgdGhpcy5yZWFkeSgpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHJvcHMgPSB0aGlzLmRlZmF1bHRzO1xyXG4gICAgICB0aGlzLnJlYWR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL0NsYkJvb2tQcm9wc0J1aWxkZXIuanMiLCJpbXBvcnQgU2hlZXRCbG9jayBmcm9tICcuL1NoZWV0QmxvY2snO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ292ZXIgZXh0ZW5kcyBTaGVldEJsb2NrIHtcclxuXHJcbiAgY29uc3RydWN0b3IodmlzdWFsLCBwLCBhbmdsZSwgc3RhdGUpIHtcclxuICAgIHN1cGVyKHZpc3VhbCwgcCwgMCwgMSwgYW5nbGUsIHN0YXRlKTtcclxuICB9XHJcblxyXG4gIGdldFByb3BzKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4udGhpcy5wLmNvdmVyLFxyXG4gICAgICBzaGVldHM6IDFcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBsb2FkUG9pbnRzKCkge1xyXG4gICAgY29uc3Qgb3BlbmVkSW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFsyLDMsNF0sXHJcbiAgICAgIFsyLDMsNCw1LDZdXHJcbiAgICBdLFxyXG4gICAgY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXMgPSBbXHJcbiAgICAgIFswLDEsMl0sXHJcbiAgICAgIFswLDEsMl1cclxuICAgIF0sXHJcbiAgICBpbnRlcnBvbGF0aW9uUG9pbnRzID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgeDogW1xyXG4gICAgICAgICAgICAgWzAsMC4yODc3LDAuNjM0NywwLjgxNzQsMS4wMDAwXSxcclxuICAgICAgICAgICAgIFswLDAuMjgzMSwwLjYyNTYsMC44MDgyLDAuOTkwOV0sXHJcbiAgICAgICAgICAgICBbMCwwLjI2MDMsMC41OTM2LDAuNzc2MywwLjk1ODldLFxyXG4gICAgICAgICAgICAgWzAsMC4xMzcwLDAuMzg4MSwwLjUzNDIsMC42NzU4XSxcclxuICAgICAgICAgICAgIFswLDAsMCwwLDBdXHJcbiAgICAgICAgXSxcclxuICAgICAgICB5OiBbXHJcbiAgICAgICAgICAgICBbMCwwLDAsMCwwXSxcclxuICAgICAgICAgICAgIFswLDAuMDIsMC4wMDUsLTAuMDAxLC0wLjAwMjVdLFxyXG4gICAgICAgICAgICAgWzAsMC4wNCwwLjAxLC0wLjAwMiwtMC4wMDVdLFxyXG4gICAgICAgICAgICAgWzAsIDAuMjQ2NiwgMC40Nzk1LCAwLjU3MDgsIDAuNjc1OF0sXHJcbiAgICAgICAgICAgICBbMCwgMC4yODc3LCAwLjYzNDcsIDAuODE3NCwgMS4wMDAwXVxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHg6IFtcclxuICAgICAgICAgICAgIFswLDAuMjg3NywwLjYzNDcsMC44MTc0LDEuMDAwMF0sXHJcbiAgICAgICAgICAgICBbMCwwLjI4MzEsMC42MjU2LDAuODA4MiwwLjk5MDldLFxyXG4gICAgICAgICAgICAgWzAsMC4yNjAzLDAuNTkzNiwwLjc3NjMsMC45NTg5XSxcclxuICAgICAgICAgICAgIFswLjAwMCwwLjIzMywwLjU2MywwLjc0NiwwLjkyN10sXHJcbiAgICAgICAgICAgICBbMC4wMDAsMC4xNDQsMC40MzMsMC42MTMsMC43OTZdLFxyXG4gICAgICAgICAgICAgWzAuMDAwLDAuMDcwLDAuMjg4LDAuNDU1LDAuNjI2XSxcclxuICAgICAgICAgICAgIFswLDAsMCwwLDBdXHJcbiAgICAgICAgXSxcclxuICAgICAgICB5OiBbXHJcbiAgICAgICAgICAgICBbMCwwLDAsMCwwXSxcclxuICAgICAgICAgICAgIFswLDAuMDIsMC4wMDUsLTAuMDAxLC0wLjAwMjVdLFxyXG4gICAgICAgICAgICAgWzAsMC4wNCwwLjAxLC0wLjAwMiwtMC4wMDVdLFxyXG4gICAgICAgICAgICAgWzAuMDAwLDAuMTY4LDAuMjY5LDAuMjcwLDAuMjU1XSxcclxuICAgICAgICAgICAgIFswLjAwMCwwLjI0NSwwLjQzNSwwLjQ1OCwwLjQ2MF0sXHJcbiAgICAgICAgICAgICBbMC4wMDAsMC4yNzgsMC41NDQsMC42MTQsMC42NzNdLFxyXG4gICAgICAgICAgICAgWzAsIDAuMjg3NywgMC42MzQ3LCAwLjgxNzQsIDEuMDAwMF1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpbnRlcnBvbGF0aW9uUG9pbnRzLFxyXG4gICAgICBvcGVuZWRJbnRlcnBvbGF0aW9uSW5kZWNlcyxcclxuICAgICAgY2xvc2VkSW50ZXJwb2xhdGlvbkluZGVjZXNcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQ292ZXIuanMiLCJpbXBvcnQgU2hlZXRDc3NMYXllciBmcm9tICcuL1NoZWV0Q3NzTGF5ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3NzTGF5ZXJzTWFuYWdlciB7XHJcbiAgY29uc3RydWN0b3IoYm9vaykge1xyXG4gICAgdGhpcy5ib29rID0gYm9vaztcclxuICAgIHRoaXMucHJvcHMgPSBib29rLnAuY3NzTGF5ZXJQcm9wcztcclxuICAgIHRoaXMudmlzdWFsID0gYm9vay52aXN1YWw7XHJcbiAgICB0aGlzLnBhZ2VNYW5hZ2VyID0gYm9vay5wYWdlTWFuYWdlcjtcclxuICAgIHRoaXMud3JhcHBlcnMgPSB7fTtcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZXMoKSB7XHJcbiAgICBjb25zdCBwYWdlID0gdGhpcy5ib29rLmdldFBhZ2UoKSwgcGFnZXMgPSB0aGlzLmJvb2suZ2V0UGFnZXMoKTtcclxuICAgIHJldHVybiBwYWdlPT09MCB8fCBwYWdlPT09cGFnZXMtMT8gW3BhZ2VdOiBbcGFnZSwgcGFnZSsxXTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICBmb3IobGV0IHcgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLndyYXBwZXJzKSkge1xyXG4gICAgICB3LmxheWVycy5mb3JFYWNoKChsKT0+IGwuZGlzcG9zZSgpKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLndyYXBwZXJzO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XHJcbiAgICBmb3IobGV0IG4gb2YgdGhpcy5nZXRBY3RpdmVzKCkpIHtcclxuICAgICAgY29uc3QgdyA9IHRoaXMud3JhcHBlcnNbbl07XHJcbiAgICAgIGlmKHcpIHtcclxuICAgICAgICBpZih3LnN0YXRlPT09J3JlYWR5JyAmJiB3LmxheWVycy5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5ib29rLmdldEJsb2NrQnlQYWdlKG4pO1xyXG4gICAgICAgICAgdy5sYXllcnMuZm9yRWFjaCgobCk9PiB7XHJcbiAgICAgICAgICAgIGlmKGwuaXNIaWRkZW4oKSkge1xyXG4gICAgICAgICAgICAgIGwudXBkYXRlKGJsb2NrKTtcclxuICAgICAgICAgICAgICBsLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHcgPSB0aGlzLndyYXBwZXJzW25dID0ge1xyXG4gICAgICAgICAgc3RhdGU6ICdsb2FkaW5nJyxcclxuICAgICAgICAgIGxheWVyczogW11cclxuICAgICAgICB9O1xyXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnBhZ2VNYW5hZ2VyLmdldExheWVycyhuLCAobGF5ZXJzKT0+IHtcclxuICAgICAgICAgICAgaWYobGF5ZXJzLmxlbmd0aCAmJiB0aGlzLndyYXBwZXJzKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmJvb2suZ2V0QmxvY2tCeVBhZ2Uobik7XHJcbiAgICAgICAgICAgICAgZm9yKGxldCBsIG9mIGxheWVycykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2wgPSBuZXcgU2hlZXRDc3NMYXllcih0aGlzLnZpc3VhbCwgYmxvY2ssIHRoaXMucHJvcHMpO1xyXG4gICAgICAgICAgICAgICAgdy5sYXllcnMucHVzaChzbCk7XHJcbiAgICAgICAgICAgICAgICBzbC5zZXQobC5jc3MsIGwuaHRtbCwgbC5qcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgICAgICAgICBpZighdGhpcy5oaWRkZW4gJiYgfnRoaXMuZ2V0QWN0aXZlcygpLmluZGV4T2YobikpIHtcclxuICAgICAgICAgICAgICAgICAgdy5sYXllcnMuZm9yRWFjaCgobCk9PiBsLnNob3coKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHcuc3RhdGUgPSAncmVhZHknO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcclxuICAgIGNvbnN0IHdhaXQgPSBbXTtcclxuICAgIGZvcihsZXQgdyBvZiBPYmplY3QudmFsdWVzKHRoaXMud3JhcHBlcnMpKSB7XHJcbiAgICAgIHcubGF5ZXJzLmZvckVhY2goKGwpPT4gd2FpdC5wdXNoKGwuaGlkZSgpKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdCk7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvQ3NzTGF5ZXJzTWFuYWdlci5qcyIsImltcG9ydCB7JCwgVEhSRUV9IGZyb20gJy4uL2xpYnMnXHJcbmltcG9ydCBDYWNoZSBmcm9tICdDYWNoZSc7XHJcbmltcG9ydCBMb2FkaW5nQW5pbWF0aW9uIGZyb20gJ0xvYWRpbmdBbmltYXRpb24nO1xyXG5pbXBvcnQgSW1hZ2VGYWN0b3J5IGZyb20gJ0ltYWdlRmFjdG9yeSc7XHJcbmltcG9ydCBCYXNlTWF0aFV0aWxzIGZyb20gJ0Jhc2VNYXRoVXRpbHMnO1xyXG5pbXBvcnQgVGV4dHVyZUFuaW1hdG9yIGZyb20gJ1RleHR1cmVBbmltYXRvcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlTWFuYWdlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgYm9vaywgcCkge1xyXG4gICAgdGhpcy52aXN1YWwgPSB2aXN1YWw7XHJcbiAgICB0aGlzLmJvb2sgPSBib29rO1xyXG4gICAgdGhpcy5wYWdlUXVlcnkgPSAnJztcclxuICAgIHRoaXMucCA9IHA7XHJcbiAgICB0aGlzLnBhZ2VDYWNoZSA9IG5ldyBDYWNoZShwLmNhY2hlZFBhZ2VzKTtcclxuICAgIHRoaXMucmVzb3VyY2VzQ2FjaGUgPSBuZXcgQ2FjaGUoKTtcclxuICAgIHRoaXMuY2FudmFzID0gJCgnPGNhbnZhcz4nKVswXTtcclxuICAgIHRoaXMuaW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeSh7Li4udmlzdWFsLCBkaXNwYXRjaEV2ZW50OiBib29rLmRpc3BhdGNoRXZlbnQuYmluZChib29rKSwgcmVuZGVyQ2FudmFzOiB0aGlzLmNhbnZhcywgcmVuZGVyQ2FudmFzQ3R4OiB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpfSwgdGhpcy5yZXNvdXJjZXNDYWNoZSk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5ncyA9IFtdO1xyXG4gICAgdGhpcy5yZW5kZXJRdWV1ZSA9IFtdO1xyXG4gICAgdGhpcy5wYWdlUmVxdWVzdHMgPSBbXTtcclxuICAgIHRoaXMucHJlZGljdGVkUmVxdWVzdHMgPSBbXTtcclxuXHJcbiAgICB0aGlzLnRtcE1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCk7XHJcbiAgICB2aXN1YWwuYWRkT2JqZWN0KG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KDAsIDApLCB0aGlzLnRtcE1hdGVyaWFsKSk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nQW5pbWF0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZGluZyA9IHt9O1xyXG4gICAgdGhpcy5sb2FkaW5nW3AuY292ZXIuY29sb3JdID0gdGhpcy5jcmVhdGVMb2FkaW5nVGV4dHVyZShwLmNvdmVyKTtcclxuICAgIGlmKHAucGFnZS5jb2xvciE9PXAuY292ZXIuY29sb3IpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nW3AucGFnZS5jb2xvcl0gPSB0aGlzLmNyZWF0ZUxvYWRpbmdUZXh0dXJlKHAucGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50dXJuT25FdmVudHMoKTtcclxuXHJcbiAgICB2aXN1YWwuYWRkUmVuZGVyQ2FsbGJhY2sodGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgc2V0VGltZW91dCh0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMb2FkaW5nVGV4dHVyZShwKSB7XHJcbiAgICBjb25zdCBzcHJpdGVUaWxlcyA9IDYsXHJcbiAgICAgIHNjYWxlID0gTWF0aC5zcXJ0KDQuNSoyMTAqNC41KjI5Ny8ocC53aWR0aFRleGVscypwLmhlaWdodFRleGVscykpLFxyXG4gICAgICBhbmltYXRpb24gPSBuZXcgTG9hZGluZ0FuaW1hdGlvbihzY2FsZSpwLndpZHRoVGV4ZWxzLCBzY2FsZSpwLmhlaWdodFRleGVscywgcC5jb2xvciksXHJcbiAgICAgIGFuaW1hdG9yID0gbmV3IFRleHR1cmVBbmltYXRvcihhbmltYXRpb24uY3JlYXRlU3ByaXRlKHNwcml0ZVRpbGVzKSwgc3ByaXRlVGlsZXMsIDEsIHNwcml0ZVRpbGVzLCAwLjIpO1xyXG4gICAgYW5pbWF0aW9uLmRpc3Bvc2UoKTtcclxuICAgIHJldHVybiBhbmltYXRvcjtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnR1cm5PZmZFdmVudHMoKTtcclxuICAgIGZvcihsZXQgY29sb3Igb2YgT2JqZWN0LmtleXModGhpcy5sb2FkaW5nKSkge1xyXG4gICAgICB0aGlzLmxvYWRpbmdbY29sb3JdLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmc7XHJcbiAgICB0aGlzLnJlc291cmNlc0NhY2hlLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGFnZUNhY2hlLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuY2FudmFzLndpZHRoID0gMDtcclxuICAgIGRlbGV0ZSB0aGlzLmNhbnZhcztcclxuICB9XHJcblxyXG4gIGlzQ292ZXIobikge1xyXG4gICAgcmV0dXJuIG48MiB8fCBuPj0yKih0aGlzLnAuc2hlZXRzKzEpO1xyXG4gIH1cclxuXHJcbiAgaXNNb2JpbGUoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMudmlzdWFsLnduZC5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpPjE7XHJcbiAgfVxyXG5cclxuICBnZXRQYWdlU3RhdGUobikge1xyXG4gICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5wYWdlQ2FjaGUuZ2V0KG4pO1xyXG4gICAgcmV0dXJuIG9iamVjdD8gb2JqZWN0LnN0YXRlOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBlbmFibGVMb2FkaW5nQW5pbWF0aW9uKGVuYWJsZSkge1xyXG4gICAgdGhpcy5sb2FkaW5nQW5pbWF0aW9uID0gZW5hYmxlO1xyXG4gICAgZm9yKGxldCBvIG9mIHRoaXMubG9hZGluZ3MpIHtcclxuICAgICAgdGhpcy5zZXR1cE1hdGVyaWFsKG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGR0KSB7XHJcbiAgICBpZih0aGlzLmxvYWRpbmdBbmltYXRpb24pIHtcclxuICAgICAgY29uc3QgbG9hZGluZyA9IHt9O1xyXG4gICAgICBmb3IobGV0IG8gb2YgdGhpcy5sb2FkaW5ncykge1xyXG4gICAgICAgIGlmKG8uaXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgbG9hZGluZ1tvLmNvbG9yXSA9IHRydWU7O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmb3IobGV0IGNvbG9yIG9mIE9iamVjdC5rZXlzKGxvYWRpbmcpKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nW2NvbG9yXS51cGRhdGUoZHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVGcm9tTG9hZGluZ3Mobykge1xyXG4gICAgY29uc3QgaSA9IHRoaXMubG9hZGluZ3MuaW5kZXhPZihvKTtcclxuICAgIGlmKH5pKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZ3Muc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRnJvbVJlbmRlclF1ZXVlKG8pIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnJlbmRlclF1ZXVlLmluZGV4T2Yobyk7XHJcbiAgICBpZih+aSkge1xyXG4gICAgICB0aGlzLnJlbmRlclF1ZXVlLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hQYWdlUXVlcnkobiwgcXVlcnk9JycpIHtcclxuICAgIHRoaXMucGFnZVF1ZXJ5ID0gcXVlcnk7XHJcbiAgICBjb25zdCBvYmplY3QgPSB0aGlzLnBhZ2VDYWNoZS5nZXQobik7XHJcbiAgICBpZihvYmplY3QgJiYgb2JqZWN0LndyYXBwZXIgJiYgb2JqZWN0LndyYXBwZXIuc2V0UXVlcnkpIHtcclxuICAgICAgaWYoIXRoaXMucGFnZUNhY2hlLnJlbW92ZShuKSkge1xyXG4gICAgICAgIG9iamVjdC53cmFwcGVyLnNldFF1ZXJ5KHF1ZXJ5KTtcclxuICAgICAgICB0aGlzLnB1c2hJblJlbmRlclF1ZXVlKG9iamVjdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hab29tKCkge1xyXG4gICAgaWYodGhpcy5wLmF1dG9SZXNvbHV0aW9uLmVuYWJsZSkge1xyXG4gICAgICBjb25zdCBlcyA9IFtdO1xyXG4gICAgICB0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKChlKT0+IHtcclxuICAgICAgICBlcy5wdXNoKGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgZXMuZm9yRWFjaCgoZSk9PiB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gZVsxXTtcclxuICAgICAgICBpZihvYmplY3QgJiYgb2JqZWN0LndyYXBwZXIpIHtcclxuICAgICAgICAgIGlmKCF0aGlzLnBhZ2VDYWNoZS5yZW1vdmUoZVswXSkpIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoSW5SZW5kZXJRdWV1ZShvYmplY3QpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRMYXllcnMobiwgY2xiKSB7XHJcbiAgICBpZih0aGlzLnAuY3NzTGF5ZXJzTG9hZGVyKSB7XHJcbiAgICAgIHRoaXMucC5jc3NMYXllcnNMb2FkZXIobiwgKC4uLmFyZ3MpPT4ge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMucGFnZUNhY2hlLmdldChuKTtcclxuICAgICAgICBpZihvYmplY3QpIHtcclxuICAgICAgICAgIGlmKG9iamVjdC5zdGF0ZSE9PSdhY3RpdmUnKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5wZW5kaW5ncy5wdXNoKHtjbGIsIGFyZ3N9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjbGIoLi4uYXJncyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjbGIoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZVBlbmRpbmdzKHBlbmRpbmdzKSB7XHJcbiAgICBmb3IobGV0IHAgb2YgcGVuZGluZ3MpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBwLmNsYiguLi5wLmFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBwZW5kaW5ncy5zcGxpY2UoMCwgcGVuZGluZ3MubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIHJ0bFBhZ2VOKG4pIHtcclxuICAgIHJldHVybiB0aGlzLnAucnRsPyAyKih0aGlzLnAuc2hlZXRzKzIpLTEtbjogbjtcclxuICB9XHJcblxyXG4gIGxvYWQobWF0ZXJpYWwsIG4pIHtcclxuICAgIGNvbnN0IHBpID0gdGhpcy5wLnBhZ2VDYWxsYmFjayh0aGlzLnJ0bFBhZ2VOKG4pKSwgcCA9IHRoaXMuaXNDb3ZlcihuKT8gdGhpcy5wLmNvdmVyOiB0aGlzLnAucGFnZTtcclxuICAgIGNvbnN0IG8gPSB7XHJcbiAgICAgIG4sXHJcbiAgICAgIHRleHR1cmU6IG5ldyBUSFJFRS5UZXh0dXJlKCksXHJcbiAgICAgIHdyYXBwZXI6IG51bGwsXHJcbiAgICAgIHN0YXRlOiAnbG9hZGluZycsXHJcbiAgICAgIGxvY2tlZDogKG4pPT4gby5zdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IG8uc3RhdGUgPT09ICdyZW5kZXJpbmcnIHx8IHRoaXMuYm9vay5pc0FjdGl2ZVBhZ2UobiksXHJcbiAgICAgIGNvbG9yOiBwLmNvbG9yLFxyXG4gICAgICBpc0FjdGl2ZTogKCk9PiB0aGlzLmJvb2suaXNBY3RpdmVQYWdlKG4pLFxyXG4gICAgICBpc1RvcDogKCk9PiB+dGhpcy5ib29rLmdldFRvcFBhZ2VzKCkuaW5kZXhPZihuKSxcclxuICAgICAgZGlzcG9zZTogKCk9PiB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tTG9hZGluZ3Mobyk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVGcm9tUmVuZGVyUXVldWUobyk7XHJcbiAgICAgICAgaWYoby53cmFwcGVyICYmIG8ud3JhcHBlci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICBvLndyYXBwZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvLnRleHR1cmUuZGlzcG9zZSgpO1xyXG4gICAgICAgIGRlbGV0ZSBvLnRleHR1cmU7XHJcbiAgICAgICAgZGVsZXRlIG8ud3JhcHBlcjtcclxuICAgICAgfSxcclxuICAgICAgcGVuZGluZ3M6IFtdXHJcbiAgICB9O1xyXG4gICAgby50ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgIHRoaXMubG9hZGluZ3MucHVzaChvKTtcclxuICAgIHRoaXMuc2V0TWF0ZXJpYWwobywgbWF0ZXJpYWwpO1xyXG5cclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB7XHJcbiAgICAgIGlmKG8udGV4dHVyZSkge1xyXG4gICAgICAgIG8ud2lkdGhUZXhlbHMgPSBwaS53aWR0aFRleGVscyB8fCBwLndpZHRoVGV4ZWxzO1xyXG4gICAgICAgIG8uaGVpZ2h0VGV4ZWxzID0gcGkuaGVpZ2h0VGV4ZWxzIHx8IHAuaGVpZ2h0VGV4ZWxzO1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuY2FsY1Jlc29sdXRpb24obyk7XHJcbiAgICAgICAgby53cmFwcGVyID0gdGhpcy5pbWFnZUZhY3RvcnkuYnVpbGQocGksIHBpLm51bWJlcj09PXVuZGVmaW5lZD8gbjogcGkubnVtYmVyLCByZXMud2lkdGgsIHJlcy5oZWlnaHQsIHAuY29sb3IsIHRoaXMucC5pbmplY3Rvcik7XHJcbiAgICAgICAgaWYoby53cmFwcGVyLnNldFF1ZXJ5KSB7XHJcbiAgICAgICAgICBvLndyYXBwZXIuc2V0UXVlcnkodGhpcy5wYWdlUXVlcnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvLnNpbXVsYXRlID0gcGkuaW50ZXJhY3RpdmU/IChvLndyYXBwZXIuc2ltdWxhdGUgfHwgKCgpPT4gdW5kZWZpbmVkKSkuYmluZChvLndyYXBwZXIpOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgby53cmFwcGVyLm9uTG9hZCA9ICgpPT4ge1xyXG4gICAgICAgICAgdGhpcy5wdXNoSW5SZW5kZXJRdWV1ZShvKTtcclxuICAgICAgICAgIHRoaXMuYm9vay5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgICAgICAgdHlwZTogJ2xvYWRlZFBhZ2UnLFxyXG4gICAgICAgICAgICBwYWdlOiBuXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIG8ud3JhcHBlci5vbkNoYW5nZSA9IChpbWFnZSk9PiB7XHJcbiAgICAgICAgICBpZihvLnRleHR1cmUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVGcm9tTG9hZGluZ3Mobyk7XHJcbiAgICAgICAgICAgIGlmKG8ubWF0ZXJpYWwpIHtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLm1hcCA9IG8udGV4dHVyZTtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLmNvbG9yID0gbmV3IFRIUkVFLkNvbG9yKDB4RkZGRkZGKTtcclxuICAgICAgICAgICAgICBvLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvLnRleHR1cmUuaW1hZ2UgPSBpbWFnZTtcclxuICAgICAgICAgICAgby50ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgby50ZXh0dXJlLm9uVXBkYXRlID0gKCk9PiB7XHJcbiAgICAgICAgICAgICAgaWYoby5zdGF0ZSAhPT0gJ3F1ZXVlZEZvclJlbmRlcicpIHtcclxuICAgICAgICAgICAgICAgIG8uc3RhdGUgPSAnYWN0aXZlJztcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVBlbmRpbmdzKG8ucGVuZGluZ3MpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5yZW5kZXJpbmc7XHJcbiAgICAgICAgICAgICAgLy90aGlzLnVwZGF0ZVJlbmRlclF1ZXVlKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMudG1wTWF0ZXJpYWwubWFwID0gby50ZXh0dXJlO1xyXG4gICAgICAgICAgICB0aGlzLnRtcE1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYm9vay5kaXNwYXRjaEV2ZW50KHtcclxuICAgICAgdHlwZTogJ2xvYWRQYWdlJyxcclxuICAgICAgcGFnZTogblxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlQ2FjaGUucHV0KG4sIG8pO1xyXG4gIH1cclxuXHJcbiAgaXNTaW5nbGVQYWdlKG8pIHtcclxuICAgIHJldHVybiB0aGlzLnAuc2luZ2xlUGFnZSB8fCAhby5uIHx8IG8ubj09PXRoaXMuYm9vay5nZXRQYWdlcygpLTE7XHJcbiAgfVxyXG5cclxuICBjYWxjUmVzb2x1dGlvbihvKSB7XHJcbiAgICBsZXQgcmVzO1xyXG4gICAgaWYodGhpcy5wLmF1dG9SZXNvbHV0aW9uLmVuYWJsZSkge1xyXG4gICAgICBjb25zdCBrID0gTWF0aC5taW4oKHRoaXMuaXNTaW5nbGVQYWdlKG8pPyAxOiAwLjUpKnRoaXMudmlzdWFsLndpZHRoKCkvby53aWR0aFRleGVscywgdGhpcy52aXN1YWwuaGVpZ2h0KCkvby5oZWlnaHRUZXhlbHMpO1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgd2lkdGg6IHRoaXMucC5hdXRvUmVzb2x1dGlvbi5rKnRoaXMucC56b29tKmsqby53aWR0aFRleGVscyxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMucC5hdXRvUmVzb2x1dGlvbi5rKnRoaXMucC56b29tKmsqby5oZWlnaHRUZXhlbHNcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgd2lkdGg6IG8ud2lkdGhUZXhlbHMsXHJcbiAgICAgICAgaGVpZ2h0OiBvLmhlaWdodFRleGVsc1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHB1c2hJblJlbmRlclF1ZXVlKG8pIHtcclxuICAgIGlmKG8uc3RhdGUgIT09ICdxdWV1ZWRGb3JSZW5kZXInKSB7XHJcbiAgICAgIG8uc3RhdGUgPSAncXVldWVkRm9yUmVuZGVyJztcclxuICAgICAgdGhpcy5yZW5kZXJRdWV1ZS5wdXNoKG8pO1xyXG4gICAgICAvLyB0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVSZW5kZXJRdWV1ZSgpIHtcclxuICAgIGlmKHRoaXMuY2FudmFzKSB7XHJcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnA7XHJcbiAgICAgIGlmKCF0aGlzLnJlbmRlcmluZyAmJiAocC5yZW5kZXJXaGlsZUZsaXBwaW5nIHx8ICF0aGlzLmJvb2suaXNQcm9jZXNzaW5nKCkpKSB7XHJcbiAgICAgICAgbGV0IGFjdGl2ZSwgdG9wO1xyXG4gICAgICAgIGZvcihsZXQgbyBvZiB0aGlzLnJlbmRlclF1ZXVlKSB7XHJcbiAgICAgICAgICBpZighYWN0aXZlICYmIG8uaXNBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICBhY3RpdmUgPSBvO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYoby5pc1RvcCgpKSB7XHJcbiAgICAgICAgICAgIHRvcCA9IG87XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbmRlcmluZyA9IHRvcCB8fCBhY3RpdmU7XHJcbiAgICAgICAgaWYodGhpcy5pc01vYmlsZSgpICYmIHAucmVuZGVySW5hY3RpdmVQYWdlc09uTW9iaWxlIHx8ICF0aGlzLmlzTW9iaWxlKCkgJiYgcC5yZW5kZXJJbmFjdGl2ZVBhZ2VzKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmluZyA9IHRoaXMucmVuZGVyaW5nIHx8IHRoaXMucmVuZGVyUXVldWVbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMucmVuZGVyaW5nKSB7XHJcbiAgICAgICAgICBpZih0aGlzLnJlbmRlcmluZy53cmFwcGVyLnN0YXJ0UmVuZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVJlbmRlclF1ZXVlKHRoaXMucmVuZGVyaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcuc3RhdGUgPSAncmVuZGVyaW5nJztcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcud3JhcHBlci5zZXRSZXNvbHV0aW9uKHRoaXMuY2FsY1Jlc29sdXRpb24odGhpcy5yZW5kZXJpbmcpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJpbmcud3JhcHBlci5zdGFydFJlbmRlcigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlbmRlcmluZztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgc2V0VGltZW91dCh0aGlzLnVwZGF0ZVJlbmRlclF1ZXVlLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0dXJuT25FdmVudHMoKSB7XHJcbiAgICB0aGlzLnRyYW5zZmVyRXZlbnRzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHR1cm5PZmZFdmVudHMoKSB7XHJcbiAgICBjb25zdCBtb3VzZXVwID0gJC5FdmVudCgnbW91c2V1cCcpLCBtb3VzZW91dCA9ICQuRXZlbnQoJ21vdXNlb3V0Jyk7XHJcbiAgICB0aGlzLnBhZ2VDYWNoZS5mb3JFYWNoKChlbnQpPT4ge1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBlbnRbMV07XHJcbiAgICAgIGlmKG9iamVjdC5zaW11bGF0ZSkge1xyXG4gICAgICAgIG9iamVjdC5zaW11bGF0ZShtb3VzZXVwLCB1bmRlZmluZWQsIDAsIDApO1xyXG4gICAgICAgIG9iamVjdC5zaW11bGF0ZShtb3VzZW91dCwgdW5kZWZpbmVkLCAwLCAwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyYW5zZmVyRXZlbnRzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0cmFuc2ZlckV2ZW50VG9UZXh0dXJlKG4sIGUsIGRhdGEpIHtcclxuICAgIGlmKHRoaXMudHJhbnNmZXJFdmVudHMpIHtcclxuICAgICAgY29uc3QgdG9PYmplY3QgPSB0aGlzLmdldE9yTG9hZFRleHR1cmVPYmplY3QodW5kZWZpbmVkLCBuKTtcclxuICAgICAgaWYodG9PYmplY3Qud3JhcHBlcikge1xyXG4gICAgICAgIGNvbnN0IHt1dn0gPSBkYXRhLCB0b0RvYyA9IHRvT2JqZWN0LndyYXBwZXIuZ2V0U2ltdWxhdGVkRG9jKCk7XHJcbiAgICAgICAgdGhpcy5wYWdlQ2FjaGUuZm9yRWFjaCgoZW50KT0+IHtcclxuICAgICAgICAgIGNvbnN0IG9iamVjdCA9IGVudFsxXTtcclxuICAgICAgICAgIGlmKG9iamVjdC5zaW11bGF0ZSkge1xyXG4gICAgICAgICAgICBvYmplY3Quc2ltdWxhdGUoZSwgdG9Eb2MsIHV2LngsIHV2LnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkUHJlZGljdGVkUGFnZXMoKSB7XHJcbiAgICB0aGlzLnByZWRpY3RlZFJlcXVlc3RzID0gQmFzZU1hdGhVdGlscy5wcmVkaWN0KHRoaXMucGFnZVJlcXVlc3RzLCB0aGlzLnAucHJlbG9hZFBhZ2VzKTtcclxuICAgIGZvcihsZXQgcCBvZiB0aGlzLnByZWRpY3RlZFJlcXVlc3RzKSB7XHJcbiAgICAgIGlmKHA8dGhpcy5ib29rLmdldFBhZ2VzKCkgJiYgIXRoaXMucGFnZUNhY2hlLmdldChwKSkge1xyXG4gICAgICAgIHRoaXMubG9hZCh1bmRlZmluZWQsIHApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRQYWdlUmVxdWVzdChuKSB7XHJcbiAgICB0aGlzLnBhZ2VSZXF1ZXN0cy5wdXNoKG4pO1xyXG4gICAgaWYodGhpcy5wYWdlUmVxdWVzdHMubGVuZ3RoPnRoaXMucC5wYWdlc0ZvclByZWRpY3RpbmcpIHtcclxuICAgICAgdGhpcy5wYWdlUmVxdWVzdHMuc2hpZnQoKTtcclxuICAgIH1cclxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5sb2FkUHJlZGljdGVkUGFnZXMuYmluZCh0aGlzKSk7XHJcbiAgfVxyXG5cclxuICBzZXRNYXRlcmlhbChvLCBtYXRlcmlhbCkge1xyXG4gICAgdGhpcy5wYWdlQ2FjaGUuZm9yRWFjaCgoZSk9PiB7XHJcbiAgICAgIGNvbnN0IG9iID0gZVsxXTtcclxuICAgICAgaWYobyE9PW9iICYmIG9iLm1hdGVyaWFsPT09bWF0ZXJpYWwpIHtcclxuICAgICAgICBkZWxldGUgb2IubWF0ZXJpYWw7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYobWF0ZXJpYWwgJiYgbWF0ZXJpYWwhPT1vLm1hdGVyaWFsKSB7XHJcbiAgICAgIG8ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcclxuICAgICAgdGhpcy5zZXR1cE1hdGVyaWFsKG8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0dXBNYXRlcmlhbChvKSB7XHJcbiAgICBvLm1hdGVyaWFsLm1hcCA9IG8udGV4dHVyZS5pbWFnZT8gby50ZXh0dXJlOiAodGhpcy5sb2FkaW5nQW5pbWF0aW9uPyB0aGlzLmxvYWRpbmdbby5jb2xvcl0udGV4dHVyZTogbnVsbCk7XHJcbiAgICBpZighby5tYXRlcmlhbC5tYXApIHtcclxuICAgICAgby5tYXRlcmlhbC5jb2xvciA9IG5ldyBUSFJFRS5Db2xvcihvLmNvbG9yKTtcclxuICAgIH1cclxuICAgIG8ubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3JMb2FkVGV4dHVyZU9iamVjdChtYXRlcmlhbCwgbikge1xyXG4gICAgbGV0IG9iamVjdCA9IHRoaXMucGFnZUNhY2hlLmdldChuKTtcclxuICAgIGlmKCFvYmplY3QpIHtcclxuICAgICAgb2JqZWN0ID0gdGhpcy5sb2FkKG1hdGVyaWFsLCBuKTtcclxuICAgICAgdGhpcy5hZGRQYWdlUmVxdWVzdChuKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNldE1hdGVyaWFsKG9iamVjdCwgbWF0ZXJpYWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfVxyXG5cclxuICBzZXRUZXh0dXJlKG1hdGVyaWFsLCBuKSB7XHJcbiAgICBpZih+dGhpcy5wcmVkaWN0ZWRSZXF1ZXN0cy5pbmRleE9mKG4pKSB7XHJcbiAgICAgIHRoaXMuYWRkUGFnZVJlcXVlc3Qobik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdldE9yTG9hZFRleHR1cmVPYmplY3QobWF0ZXJpYWwsIG4pO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL1BhZ2VNYW5hZ2VyLmpzIiwiaW1wb3J0IEJvb2tQcm9wc0J1aWxkZXIgZnJvbSAnLi9Cb29rUHJvcHNCdWlsZGVyJztcclxuaW1wb3J0IFBkZiBmcm9tICdQZGYnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGRmQm9va1Byb3BzQnVpbGRlciBleHRlbmRzIEJvb2tQcm9wc0J1aWxkZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihzcmMsIG9uUmVhZHkpIHtcclxuICAgIHN1cGVyKG9uUmVhZHkpO1xyXG4gICAgdGhpcy5wZGYgPSBuZXcgUGRmKHNyYyk7XHJcbiAgICB0aGlzLnBhZ2VEZXNjcmlwdGlvbiA9IHtcclxuICAgICAgdHlwZTogJ3BkZicsXHJcbiAgICAgIHNyYzogdGhpcy5wZGYsXHJcbiAgICAgIGludGVyYWN0aXZlOiB0cnVlXHJcbiAgICB9O1xyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgcGFnZUNhbGxiYWNrOiB0aGlzLnBhZ2VDYWxsYmFjay5iaW5kKHRoaXMpXHJcbiAgICB9O1xyXG4gICAgdGhpcy5wZGYuZ2V0SGFuZGxlcih0aGlzLmluaXQuYmluZCh0aGlzKSk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5wZGYuZGlzcG9zZSgpO1xyXG4gICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdChoYW5kbGVyKSB7XHJcbiAgICBjb25zdCBwYWdlcyA9IHRoaXMucGRmLmdldFBhZ2VzTnVtKCk7XHJcbiAgICB0aGlzLmNhbGNTaGVldHMocGFnZXMpO1xyXG4gICAgaWYocGFnZXM+MCkge1xyXG4gICAgICBoYW5kbGVyLmdldFBhZ2UoMSkuXHJcbiAgICAgIHRoZW4oKHBhZ2UpPT4ge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSBQZGYuZ2V0UGFnZVNpemUocGFnZSk7XHJcbiAgICAgICAgdGhpcy5jYWxjUHJvcHMoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpO1xyXG4gICAgICAgIHRoaXMucmVhZHkoKTtcclxuICAgICAgfSkuXHJcbiAgICAgIGNhdGNoKChlKT0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnByb3BzID0gdGhpcy5kZWZhdWx0cztcclxuICAgICAgdGhpcy5yZWFkeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcGFnZUNhbGxiYWNrKG4pIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2VEZXNjcmlwdGlvbjtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvUGRmQm9va1Byb3BzQnVpbGRlci5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicydcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBkZkxpbmtzSGFuZGxlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBkZiwgY3RybCwgZWxlbWVudCkge1xyXG4gICAgdGhpcy5wZGYgPSBwZGY7XHJcbiAgICB0aGlzLmN0cmwgPSBjdHJsO1xyXG4gICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTtcclxuICAgIHRoaXMuY3Vyc29ycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBzZXRIYW5kbGVyKGhhbmRsZXIpIHtcclxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0SGFuZGxlcih0eXBlLCBkZXN0aW5hdGlvbikge1xyXG4gICAgaWYodHlwZT09PSdpbnRlcm5hbCcpIHtcclxuICAgICAgdGhpcy5jdHJsLmdvVG9QYWdlKGRlc3RpbmF0aW9uKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYodHlwZT09PSdleHRlcm5hbCcpIHtcclxuICAgICAgd2luZG93Lm9wZW4oZGVzdGluYXRpb24sICdfYmxhbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGxIYW5kbGVycyh0eXBlLCBkZXN0aW5hdGlvbikge1xyXG4gICAgaWYoIXRoaXMuaGFuZGxlciB8fCAhdGhpcy5oYW5kbGVyKHR5cGUsIGRlc3RpbmF0aW9uKSkge1xyXG4gICAgICB0aGlzLmRlZmF1bHRIYW5kbGVyKHR5cGUsIGRlc3RpbmF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUV2ZW50KGRhdGEpIHtcclxuICAgIGNvbnN0IGUgPSBkYXRhLmV2ZW50LCBhbm5vID0gZGF0YS5hbm5vdGF0aW9uO1xyXG4gICAgc3dpdGNoKGUudHlwZSkge1xyXG4gICAgICBjYXNlICdtb3VzZW92ZXInOiB7XHJcbiAgICAgICAgdGhpcy5jdXJzb3JzLnB1c2godGhpcy5lbGVtZW50LmNzcygnY3Vyc29yJykpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5jc3MoJ2N1cnNvcicsICdwb2ludGVyJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbW91c2VvdXQnOiB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmNzcygnY3Vyc29yJywgdGhpcy5jdXJzb3JzLnBvcCgpIHx8ICcnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICd0b3VjaHRhcCc6XHJcbiAgICAgIGNhc2UgJ2NsaWNrJzoge1xyXG4gICAgICAgIGlmKGFubm8udXJsKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGxIYW5kbGVycygnZXh0ZXJuYWwnLCBhbm5vLnVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoYW5uby5kZXN0KSB7XHJcbiAgICAgICAgICBsZXQgZGVzdFByb21pc2U7XHJcbiAgICAgICAgICBpZih0eXBlb2YgYW5uby5kZXN0PT09J3N0cmluZycpIHtcclxuICAgICAgICAgICAgZGVzdFByb21pc2UgPSB0aGlzLnBkZi5oYW5kbGVyLmdldERlc3RpbmF0aW9uKGFubm8uZGVzdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGVzdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoYW5uby5kZXN0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRlc3RQcm9taXNlLlxyXG4gICAgICAgICAgICB0aGVuKChkZXN0KT0+IHR5cGVvZiBkZXN0WzBdPT09J251bWJlcic/IGRlc3RbMF06IHRoaXMucGRmLmhhbmRsZXIuZ2V0UGFnZUluZGV4KGRlc3RbMF0pKS5cclxuICAgICAgICAgICAgdGhlbigobnVtYmVyKT0+IHRoaXMuY2FsbEhhbmRsZXJzKCdpbnRlcm5hbCcsIG51bWJlcikpLlxyXG4gICAgICAgICAgICBjYXRjaCgoKT0+IGNvbnNvbGUuZXJyb3IoJ0JhZCBsaW5rJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9QZGZMaW5rc0hhbmRsZXIuanMiLCJpbXBvcnQgRmluZGVyIGZyb20gJ0ZpbmRlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2hFbmdpbmUge1xyXG4gIGNvbnN0cnVjdG9yKHBhZ2VDYWxsYmFjaywgcGFnZXMpIHtcclxuICAgIHRoaXMucGFnZUNhbGxiYWNrID0gcGFnZUNhbGxiYWNrO1xyXG4gICAgdGhpcy5wYWdlcyA9IHBhZ2VzO1xyXG4gICAgdGhpcy5yZXN1bHRzID0gW107XHJcbiAgfVxyXG5cclxuICBzZXRRdWVyeShxdWVyeSkge1xyXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xyXG4gICAgdGhpcy51cGRhdGUgPSB0cnVlO1xyXG4gICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzKCkge1xyXG4gICAgaWYodGhpcy51cGRhdGUpIHtcclxuICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMucmVzdWx0cztcclxuICAgICAgdGhpcy5yZXN1bHRzID0gW107XHJcbiAgICAgIGlmKHRoaXMub25QYWdlSGl0c0NoYW5nZWQpIHtcclxuICAgICAgICBmb3IobGV0IHJlcyBvZiByZXN1bHRzKSB7XHJcbiAgICAgICAgICB0aGlzLm9uUGFnZUhpdHNDaGFuZ2VkKHVuZGVmaW5lZCwgJycpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnBhZ2UgPSAwO1xyXG4gICAgICB0aGlzLnN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgaWYodGhpcy5xdWVyeS5sZW5ndGg+MSkge1xyXG4gICAgICAgIHRoaXMucHJvY2VzcygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYodGhpcy5wYWdlPHRoaXMucGFnZXMpIHtcclxuICAgICAgICBjb25zdCBzdGFtcCA9IHRoaXMuc3RhbXA7XHJcbiAgICAgICAgdGhpcy5maW5kKHRoaXMucGFnZUNhbGxiYWNrKHRoaXMucGFnZSkpLlxyXG4gICAgICAgICAgdGhlbigoY29udGV4dHMpPT4ge1xyXG4gICAgICAgICAgICBpZihzdGFtcCA9PT0gdGhpcy5zdGFtcCkge1xyXG4gICAgICAgICAgICAgIGlmKGNvbnRleHRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXHJcbiAgICAgICAgICAgICAgICAgIGNvbnRleHRzXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKyt0aGlzLnBhZ2U7XHJcbiAgICAgICAgICAgICAgaWYodGhpcy5vblBhZ2VIaXRzQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblBhZ2VIaXRzQ2hhbmdlZCh0aGlzLnBhZ2UsIHRoaXMucXVlcnkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbmQocGkpIHtcclxuICAgIGxldCBuZXh0O1xyXG4gICAgaWYocGkudHlwZT09PSdwZGYnKSB7XHJcbiAgICAgIG5leHQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcbiAgICAgICAgcGkuc3JjLmdldEhhbmRsZXIoKCk9PiB7XHJcbiAgICAgICAgICBjb25zdCBuID0gcGkubnVtYmVyPT09dW5kZWZpbmVkPyB0aGlzLnBhZ2U6IHBpLm51bWJlcjtcclxuICAgICAgICAgIGlmKHBpLnNyYy5nZXRQYWdlVHlwZShuKT09PSdyaWdodCcpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcGkuc3JjLmdldFBhZ2UobikuXHJcbiAgICAgICAgICAgIHRoZW4oKHBhZ2UpPT4ge1xyXG4gICAgICAgICAgICAgIHBhZ2UuZ2V0VGV4dENvbnRlbnQoKS5cclxuICAgICAgICAgICAgICB0aGVuKCh0ZXh0Q29udGVudCk9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBGaW5kZXIodGV4dENvbnRlbnQuaXRlbXMubWFwKChpdGVtKT0+IGl0ZW0uc3RyKSwgdGhpcy5xdWVyeSwge2hpdHM6IGZhbHNlfSkuZ2V0Q29udGV4dHMoKSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLlxyXG4gICAgICAgICAgICBjYXRjaCgoKT0+IHJlc29sdmUoW10pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbmV4dCA9IFByb21pc2UucmVzb2x2ZShbXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dDtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvU2VhcmNoRW5naW5lLmpzIiwiaW1wb3J0IENTU0xheWVyIGZyb20gJ0NTU0xheWVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoZWV0Q3NzTGF5ZXIge1xyXG4gIGNvbnN0cnVjdG9yKHZpc3VhbCwgYmxvY2ssIHByb3BzKSB7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbDtcclxuICAgIGNvbnN0IHNpemUgPSBibG9jay5nZXRUb3BTaXplKCk7XHJcbiAgICB0aGlzLmxheWVyID0gbmV3IENTU0xheWVyKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0LCBwcm9wcyk7XHJcblxyXG4gICAgdGhpcy51cGRhdGUoYmxvY2spO1xyXG4gICAgdGhpcy52aXN1YWwuYWRkQ3NzT2JqZWN0KHRoaXMubGF5ZXIpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMubGF5ZXIuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy52aXN1YWwucmVtb3ZlQ3NzT2JqZWN0KHRoaXMubGF5ZXIpO1xyXG4gIH1cclxuXHJcbiAgaXNIaWRkZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXllci5pc0hpZGRlbigpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmxheWVyLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICByZXR1cm4gdGhpcy5sYXllci5zaG93KCk7XHJcbiAgfVxyXG5cclxuICBzZXQoY3NzLCBodG1sLCBqcykge1xyXG4gICAgdGhpcy5sYXllci5zZXREYXRhKGNzcywgaHRtbCwganMpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKGJsb2NrKSB7XHJcbiAgICB0aGlzLmJsb2NrID0gYmxvY2s7XHJcbiAgICB0aGlzLmJsb2NrLmdldFRvcFdvcmxkUm90YXRpb24odGhpcy5sYXllci5yb3RhdGlvbik7XHJcbiAgICB0aGlzLmJsb2NrLmdldFRvcFdvcmxkUG9zaXRpb24odGhpcy5sYXllci5wb3NpdGlvbik7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2pzL2NsYXNzZXMvU2hlZXRDc3NMYXllci5qcyIsImltcG9ydCBNYXRoVXRpbHMgZnJvbSAnTWF0aFV0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoZWV0UGh5c2ljcyB7XHJcblxyXG4gIHN0YXRpYyB0YXJnZXRGb3JjZUNsYihvLGEsdixjaCkge1xyXG4gICAgY29uc3QgbCA9IGEqdGhpcy5yO1xyXG4gICAgcmV0dXJuIDEwMCp0aGlzLm0qdGhpcy5nKigyLygxK01hdGguZXhwKDEwKihsLXRoaXMudGwpKSktMSktdGhpcy5tKjQwKnY7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaG92ZXJDb3JuZXJGb3JjZUNsYihvLHYsbCxjaCkge1xyXG4gICAgcmV0dXJuIDU7XHJcbiAgfVxyXG5cclxuICBnZXRUYXJnZXRGb3JjZUNsYihtYXNzLCB0YXJnZXRBbmdsZSkge1xyXG4gICAgcmV0dXJuIFNoZWV0UGh5c2ljcy50YXJnZXRGb3JjZUNsYi5iaW5kKHtcclxuICAgICAgZzogdGhpcy5wLmdyYXZpdHksXHJcbiAgICAgIG06IG1hc3MsXHJcbiAgICAgIHRsOiB0YXJnZXRBbmdsZSp0aGlzLnAucixcclxuICAgICAgcjogdGhpcy5wLnJcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRyYWdGb3JjZUNsYihvLGEsdixjaCkge1xyXG4gICAgcmV0dXJuIG8uZmxidCpvLm0qKDEwKm8uZypjaC01MCp2LygxK01hdGguZXhwKDMuNSpNYXRoLmFicyhjaCkpKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZHJhZ0Nvcm5lckZvcmNlQ2xiKG8sYSx2LGNoKSB7XHJcbiAgICByZXR1cm4gMTUqKDIvKDErTWF0aC5leHAoMTAqKGEtdGhpcy50YSkqby5yKSktMSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0RHJhZ0Nvcm5lckZvcmNlQ2xiKHRhcmdldEFuZ2xlKSB7XHJcbiAgICByZXR1cm4gU2hlZXRQaHlzaWNzLmRyYWdDb3JuZXJGb3JjZUNsYi5iaW5kKHtcclxuICAgICAgdGE6IHRhcmdldEFuZ2xlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHI9MSwgZ3Jhdml0eT0xLCBjb3JuZXJEZXZpYXRpb249MC4xNSwgZnBzPTI0MCkge1xyXG4gICAgdGhpcy5wID0ge1xyXG4gICAgICByLFxyXG4gICAgICBjb3JuZXJEZXZpYXRpb24sXHJcbiAgICAgIGw6IE1hdGguUEkqcixcclxuICAgICAgc3RhcnREdDogMS9mcHMsXHJcbiAgICAgIGdyYXZpdHksXHJcbiAgICAgIG1hcmdpbjogMC4wMDIqcixcclxuICAgICAgaW5mTTogMWU0LFxyXG4gICAgICBhdHRlbXB0czogMTYsXHJcbiAgICAgIG1heEl0ZXJhdGlvbnM6IDEwMFxyXG4gICAgfTtcclxuICAgIHRoaXMub3MgPSBbXTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLm9zID0gW107XHJcbiAgfVxyXG5cclxuICBnZXRTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3MubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgYWRkT2JqZWN0KG1hc3MsIGFuZ2xlLCB2ZWxvY2l0eSwgZmxleGliaWxpdHksIGNvcm5lckhlaWdodCwgc2ltdWxhdGVDbGIsIHJlbW92ZUNsYiwgZm9yY2VDbGI9KCk9PiAwLCBjb3JuZXJGb3JjZUNsYj0oKT0+IDApIHtcclxuICAgIGNvbnN0IG5vID0ge1xyXG4gICAgICBpZDogTWF0aFV0aWxzLmdldFVuaXF1ZSgpLFxyXG4gICAgICBtOiBtYXNzLFxyXG4gICAgICB2OiB2ZWxvY2l0eSxcclxuICAgICAgbDogYW5nbGUqdGhpcy5wLnIsXHJcbiAgICAgIGY6IGZvcmNlQ2xiLFxyXG4gICAgICBjZjogY29ybmVyRm9yY2VDbGIsXHJcbiAgICAgIGNoOiBjb3JuZXJIZWlnaHQsXHJcbiAgICAgIGZsYnQ6IGZsZXhpYmlsaXR5LFxyXG4gICAgICBzaW11bGF0ZUNsYixcclxuICAgICAgcmVtb3ZlQ2xiXHJcbiAgICB9O1xyXG4gICAgbGV0IGkgPSB0aGlzLm9zLmZpbmRJbmRleCgobyk9PiBuby5sPD1vLmwpO1xyXG4gICAgaSA9IH5pPyBpOiB0aGlzLm9zLmxlbmd0aDtcclxuICAgIHRoaXMub3Muc3BsaWNlKGksIDAsIG5vKTtcclxuICAgIHJldHVybiBuby5pZDtcclxuICB9XHJcblxyXG4gIGdldFBhcmFtZXRyTWFwKG5hbWUpIHtcclxuICAgIGNvbnN0IG1hcCA9IHtcclxuICAgICAgbWFzczogJ20nLFxyXG4gICAgICB2ZWxvY2l0eTogJ3YnLFxyXG4gICAgICBmbGV4aWJpbGl0eTogJ2ZsYnQnLFxyXG4gICAgICBjb3JuZXJIZWlnaHQ6ICdjaCcsXHJcbiAgICAgIHNpbXVsYXRlQ2xiOiAnc2ltdWxhdGVDbGInLFxyXG4gICAgICByZW1vdmVDbGI6ICdyZW1vdmVDbGInLFxyXG4gICAgICBmb3JjZUNsYjogJ2YnLFxyXG4gICAgICBjb3JuZXJGb3JjZUNsYjogJ2NmJ1xyXG4gICAgfTtcclxuICAgIHJldHVybiBtYXBbbmFtZV07XHJcbiAgfVxyXG5cclxuICBzZXRQYXJhbWV0cihpZCwgbmFtZSwgdmFsdWUpIHtcclxuICAgIGNvbnN0IG8gPSB0aGlzLm9zLmZpbmQoKG8pPT4gby5pZD09PWlkKTtcclxuICAgIGlmKG5hbWUgPT09ICdhbmdsZScpIHtcclxuICAgICAgby5sID0gdmFsdWUqdGhpcy5wLnI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgb1t0aGlzLmdldFBhcmFtZXRyTWFwKG5hbWUpXSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UGFyYW1ldHIoaWQsIG5hbWUpIHtcclxuICAgIGNvbnN0IG8gPSB0aGlzLm9zLmZpbmQoKG8pPT4gby5pZD09PWlkKTtcclxuICAgIGxldCB2YWx1ZTtcclxuICAgIGlmKG5hbWUgPT09ICdhbmdsZScpIHtcclxuICAgICAgdmFsdWUgPSBvLmwvdGhpcy5wLnI7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdmFsdWUgPSBvW3RoaXMuZ2V0UGFyYW1ldHJNYXAobmFtZSldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2ltdWxhdGUoVCkge1xyXG4gICAgbGV0IHQ9MCxcclxuICAgICAgICBkdD10aGlzLnAuc3RhcnREdCxcclxuICAgICAgICBhdHRlbXB0PTAsXHJcbiAgICAgICAgaXQ9MDtcclxuXHJcbiAgICB3aGlsZSh0PFQgJiYgaXQ8dGhpcy5wLm1heEl0ZXJhdGlvbnMpIHtcclxuICAgICAgaWYoZHQ+VC10KSB7XHJcbiAgICAgICAgZHQgPSBULXQ7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgbm9zID0gdGhpcy5pbnRlZ3JhdGUodGhpcy5vcywgZHQpLFxyXG4gICAgICAgICAgICBjaSA9IHRoaXMuZmluZENvbGxpc2lvbnMobm9zKTtcclxuICAgICAgaWYoY2kubnVtPjEgJiYgYXR0ZW1wdDx0aGlzLnAuYXR0ZW1wdHMpIHtcclxuICAgICAgICBkdC89MjtcclxuICAgICAgICArK2F0dGVtcHQ7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYoY2kubnVtPT09MSkge1xyXG4gICAgICAgICAgY29uc3Qgc2NvcyA9IHRoaXMuc29sdmVDb2xsaXNpb24obm9zW2NpLmxhc3QtMV0sIG5vc1tjaS5sYXN0XSk7XHJcbiAgICAgICAgICBub3NbY2kubGFzdC0xXSA9IHNjb3NbMF07XHJcbiAgICAgICAgICBub3NbY2kubGFzdF0gPSBzY29zWzFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKGNpLm51bT4xKSB7XHJcbiAgICAgICAgICBjb25zdCBncyA9IFtdO1xyXG4gICAgICAgICAgbGV0IGxhc3QgPSAtMjtcclxuICAgICAgICAgIGZvcihsZXQgaSBvZiBjaS5hbGwpIHtcclxuICAgICAgICAgICAgaWYoaS1sYXN0PjEpIHtcclxuICAgICAgICAgICAgICBncy5wdXNoKFtdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBnc1tncy5sZW5ndGgtMV0ucHVzaChpKTtcclxuICAgICAgICAgICAgbGFzdCA9IGk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb3IobGV0IGcgb2YgZ3MpIHtcclxuICAgICAgICAgICAgbGV0IHNnLCBpMDtcclxuICAgICAgICAgICAgaWYobm9zW2dbMF1dLmw+TWF0aC5QSS8yKnRoaXMucC5yKSB7XHJcbiAgICAgICAgICAgICAgc2cgPSAtMTtcclxuICAgICAgICAgICAgICBpMCA9IGdbZy5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgc2cgPSAxO1xyXG4gICAgICAgICAgICAgIGkwID0gZ1swXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IobGV0IGk9aTA7IGk8bm9zLmxlbmd0aCAmJiBpPi0xOyBpKz1zZykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG8gPSBub3NbaStzZ107XHJcbiAgICAgICAgICAgICAgaWYobyAmJiBzZyooby5sLW5vc1tpXS5sKTw9dGhpcy5wLm1hcmdpbikge1xyXG4gICAgICAgICAgICAgICAgby5sPW5vc1tpXS5sK3NnKjIqdGhpcy5wLm1hcmdpbjtcclxuICAgICAgICAgICAgICAgIGlmKG8ubD50aGlzLnAubCB8fCBvLmw8MCkge1xyXG4gICAgICAgICAgICAgICAgICBvLmwgPSBvLmw+dGhpcy5wLmw/IHRoaXMucC5sOiAwO1xyXG4gICAgICAgICAgICAgICAgICBvLmNoID0gMDtcclxuICAgICAgICAgICAgICAgICAgby52PTA7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0JhZCBjb2xsaXNpb24nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vcyA9IG5vcztcclxuICAgICAgICB0aGlzLmZpbmRBbmRTb2x2ZUNvcm5lckNvbGxpc2lvbnMoKTtcclxuICAgICAgICB0Kz1kdDtcclxuICAgICAgICBkdD10aGlzLnAuc3RhcnREdDtcclxuICAgICAgICBhdHRlbXB0PTA7XHJcbiAgICAgIH1cclxuICAgICAgKytpdDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbW92ZVN0YXRpY3MoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVN0YXRpY3MoKSB7XHJcbiAgICBjb25zdCBub3MgPSBbXSwgbm90aWZ5ID0gW1tdLFtdXTtcclxuICAgIGZvcihsZXQgbyBvZiB0aGlzLm9zKSB7XHJcbiAgICAgIGlmKG8uc2ltdWxhdGVDbGIpIHtcclxuICAgICAgICBvLnNpbXVsYXRlQ2xiKG8ubC90aGlzLnAuciwgby5jaCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoKG8ubD09PXRoaXMucC5sIHx8IG8ubD09PTApICYmIG8udj09PTApIHtcclxuICAgICAgICBpZihvLnJlbW92ZUNsYiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBub3RpZnlbKG8ubCE9PXRoaXMucC5sKSswXS5wdXNoKG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBub3MucHVzaChvKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5vcyA9IG5vcztcclxuICAgIGZvcihsZXQgbyBvZiBub3RpZnlbMF0ucmV2ZXJzZSgpKSB7XHJcbiAgICAgIG8ucmVtb3ZlQ2xiKE1hdGguUEksIG8uY2gpO1xyXG4gICAgfVxyXG4gICAgZm9yKGxldCBvIG9mIG5vdGlmeVsxXSkge1xyXG4gICAgICBvLnJlbW92ZUNsYigwLCBvLmNoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbmRBbmRTb2x2ZUNvcm5lckNvbGxpc2lvbnMoKSB7XHJcbiAgICBpZih0aGlzLm9zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBvcyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAuLi50aGlzLm9zWzBdLFxyXG4gICAgICAgICAgbDogMCxcclxuICAgICAgICAgIG06IHRoaXMucC5pbmZNLFxyXG4gICAgICAgICAgY2g6IDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIC4uLnRoaXMub3MsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgLi4udGhpcy5vc1swXSxcclxuICAgICAgICAgIGw6IDEuMDUqdGhpcy5wLmwsXHJcbiAgICAgICAgICBtOiB0aGlzLnAuaW5mTSxcclxuICAgICAgICAgIGNoOiAwXHJcbiAgICAgICAgfVxyXG4gICAgICBdO1xyXG5cclxuICAgICAgZm9yKGxldCBpPTE7IGk8b3MubGVuZ3RoOyArK2kpIHtcclxuICAgICAgICBjb25zdCBhPW9zW2ktMV0sIGI9b3NbaV0sXHJcbiAgICAgICAgICAgICAgYWw9YS5sK3RoaXMucC5jb3JuZXJEZXZpYXRpb24qYS5jaCp0aGlzLnAucixcclxuICAgICAgICAgICAgICBibD1iLmwrdGhpcy5wLmNvcm5lckRldmlhdGlvbipiLmNoKnRoaXMucC5yO1xyXG4gICAgICAgIGlmKDEuMDUqYWw+YmwgJiYgYS5jaD5iLmNoKSB7XHJcbiAgICAgICAgICBjb25zdCBkQ2ggPSBhLmNoLWIuY2gsIGR2PWEubS9hLmZsYnQrYi5tL2IuZmxidCwga2E9YS5tL2EuZmxidC9kdiwga2I9Yi5tL2IuZmxidC9kdjtcclxuICAgICAgICAgIGEuY2g9YS5jaC1rYipkQ2g7XHJcbiAgICAgICAgICBiLmNoPWIuY2gra2EqZENoO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc29sdmVDb2xsaXNpb24oYSwgYikge1xyXG4gICAgY29uc3QgbW09KGIubSthLm0pLFxyXG4gICAgICBhdiA9ICgtYS52KmIubSthLm0qYS52KzIqYi5tKmIudikvbW0sXHJcbiAgICAgIGJ2ID0gKGIubSpiLnYtYi52KmEubSsyKmEubSphLnYpL21tO1xyXG4gICAgcmV0dXJuIFt7Li4uYSwgdjogYXZ9LCB7Li4uYiwgdjogYnZ9XTtcclxuICB9XHJcblxyXG4gIGZpbmRDb2xsaXNpb25zKG9zKSB7XHJcbiAgICBjb25zdCBjaSA9IHtcclxuICAgICAgbnVtOiAwLFxyXG4gICAgICBsYXN0OiAwLFxyXG4gICAgICBhbGw6IFtdXHJcbiAgICB9O1xyXG4gICAgZm9yKGxldCBpID0gMTsgaTxvcy5sZW5ndGggJiYgY2kubnVtPDI7ICsraSkge1xyXG4gICAgICBpZihvc1tpLTFdLmw+b3NbaV0ubCB8fCB0aGlzLmlzQ29sbGlzaW9uKG9zW2ktMV0sIG9zW2ldKSkge1xyXG4gICAgICAgIGlmKG9zW2ktMV0ubD5vc1tpXS5sKSB7XHJcbiAgICAgICAgICArK2NpLm51bTtcclxuICAgICAgICB9XHJcbiAgICAgICAgKytjaS5udW07XHJcbiAgICAgICAgY2kubGFzdCA9IGk7XHJcbiAgICAgICAgaWYoY2kuYWxsLmluZGV4T2YoaS0xKT09PS0xKSB7XHJcbiAgICAgICAgICBjaS5hbGwucHVzaChpLTEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjaS5hbGwuaW5kZXhPZihpKT09PS0xKSB7XHJcbiAgICAgICAgICBjaS5hbGwucHVzaChpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjaTtcclxuICB9XHJcblxyXG4gIGlzQ29sbGlzaW9uKGEsIGIpIHtcclxuICAgIHJldHVybiBNYXRoLmFicyhhLmwtYi5sKTx0aGlzLnAubWFyZ2luICYmIGEudj5iLnY7XHJcbiAgfVxyXG5cclxuICBpbnRlZ3JhdGUob3MsIGR0KSB7XHJcbiAgICBjb25zdCBub3MgPSBbXTtcclxuICAgIGZvcihsZXQgbyBvZiBvcykge1xyXG4gICAgICBjb25zdCB2bCA9IE1hdGhVdGlscy5yazQoXHJcbiAgICAgICAgdGhpcy5keS5iaW5kKHtcclxuICAgICAgICAgIGc6IHRoaXMucC5ncmF2aXR5LFxyXG4gICAgICAgICAgcjogdGhpcy5wLnIsXHJcbiAgICAgICAgICBtOiBvLm0sXHJcbiAgICAgICAgICBmOiBvLmYsXHJcbiAgICAgICAgICBjZjogby5jZixcclxuICAgICAgICAgIGNoOiBvLmNoLFxyXG4gICAgICAgICAgZmxidDogby5mbGJ0XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgMCxcclxuICAgICAgICBkdCxcclxuICAgICAgICBbby52LCBvLmwsIG8uY2hdXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IG5vID0ge1xyXG4gICAgICAgIC4uLm8sXHJcbiAgICAgICAgdjogdmxbMF0sXHJcbiAgICAgICAgbDogdmxbMV0sXHJcbiAgICAgICAgY2g6IHZsWzJdXHJcbiAgICAgIH07XHJcbiAgICAgIGlmKG5vLmw8PTAgfHwgbm8ubD49dGhpcy5wLmwpIHtcclxuICAgICAgICBuby5sPW5vLmw8PTA/IDA6IHRoaXMucC5sO1xyXG4gICAgICAgIG5vLnY9MDtcclxuICAgICAgICBuby5jaD0wO1xyXG4gICAgICB9XHJcbiAgICAgIG5vcy5wdXNoKG5vKTtcclxuICAgIH1cclxuICAgIHJldHVybiBub3M7XHJcbiAgfVxyXG5cclxuICBkeSh0LHkpIHtcclxuICAgIGNvbnN0IHY9eVswXSwgbD15WzFdLCBjaD15WzJdLCBmPXRoaXMuZih0aGlzLGwvdGhpcy5yLHYsY2gpLCBjZj10aGlzLmNmKHRoaXMsbC90aGlzLnIsdixjaCk7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAoLXRoaXMuZypNYXRoLmNvcyhsL3RoaXMucikqdGhpcy5tK2YpL3RoaXMubSxcclxuICAgICAgdiswLjAxKihNYXRoLnJhbmRvbSgpLTAuNSksXHJcbiAgICAgIHRoaXMuZmxidCooKDIvKDErTWF0aC5leHAoLTAuMipjZikpLTEpKigxLTIvKDErTWF0aC5leHAoLTUqKE1hdGguYWJzKGNoKS0yKSkpKS1jaClcclxuICAgIF07XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL1NoZWV0UGh5c2ljcy5qcyIsIlxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU291bmRzRW52aXJvbWVudCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlPXt9KSB7XHJcbiAgICB0aGlzLnNvdW5kcyA9IHRlbXBsYXRlLnNvdW5kcyB8fCB7fTtcclxuICAgIHRoaXMuYXVkaW8gPSB7fTtcclxuICAgIGlmKHRoaXMuc291bmRzLnN0YXJ0RmxpcCkge1xyXG4gICAgICB0aGlzLmF1ZGlvLnN0YXJ0RmxpcCA9IG5ldyBBdWRpbyh0aGlzLnNvdW5kcy5zdGFydEZsaXApO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5zb3VuZHMuZW5kRmxpcCkge1xyXG4gICAgICB0aGlzLmF1ZGlvLmVuZEZsaXAgPSBuZXcgQXVkaW8odGhpcy5zb3VuZHMuZW5kRmxpcCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRFbmFibGVkKGVuYWJsZWQpIHtcclxuICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICB0b2dsZSgpIHtcclxuICAgIHRoaXMuZW5hYmxlZCA9ICF0aGlzLmVuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgZGVsZXRlIHRoaXMuYXVkaW8uc3RhcnRGbGlwO1xyXG4gICAgZGVsZXRlIHRoaXMuYXVkaW8uZW5kRmxpcDtcclxuICB9XHJcblxyXG4gIHN0YXJ0RmxpcCgpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCAmJiB0aGlzLmF1ZGlvLnN0YXJ0RmxpcCkge1xyXG4gICAgICB0aGlzLmF1ZGlvLnN0YXJ0RmxpcC5wbGF5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbmRGbGlwKCkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkICYmIHRoaXMuYXVkaW8uc3RhcnRGbGlwKSB7XHJcbiAgICAgIHRoaXMuYXVkaW8uc3RhcnRGbGlwLnBhdXNlKCk7XHJcbiAgICAgIHRoaXMuYXVkaW8uc3RhcnRGbGlwLmN1cnJlbnRUaW1lID0gMDtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuZW5hYmxlZCAmJiB0aGlzLmF1ZGlvLmVuZEZsaXApIHtcclxuICAgICAgdGhpcy5hdWRpby5lbmRGbGlwLnBsYXkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1YnNjcmliZUZsaXBzKGVtaXR0ZXIpIHtcclxuICAgIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcignc3RhcnRGbGlwJywgdGhpcy5zdGFydEZsaXAuYmluZCh0aGlzKSk7XHJcbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZEZsaXAnLCB0aGlzLmVuZEZsaXAuYmluZCh0aGlzKSk7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9jbGFzc2VzL1NvdW5kc0Vudmlyb21lbnQuanMiLCJpbXBvcnQgV2lkZ2V0Q29udHJvbGxlciBmcm9tICdXaWRnZXRDb250cm9sbGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvY0NvbnRyb2xsZXIgZXh0ZW5kcyBXaWRnZXRDb250cm9sbGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3IodmlldywgYm9va0N0cmwpIHtcclxuICAgIHN1cGVyKHZpZXcpO1xyXG4gICAgdGhpcy5ib29rQ3RybCA9IGJvb2tDdHJsO1xyXG4gICAgdGhpcy50YWIgPSAnbm9uZSc7XHJcbiAgfVxyXG5cclxuICBzZXRUaHVtYm5haWxzKHRodW1ibmFpbHMpIHtcclxuICAgIHRoaXMudGh1bWJuYWlscyA9IHRodW1ibmFpbHM7XHJcbiAgICB0aHVtYm5haWxzLm9uTmF2aWdhdGUgPSB0aGlzLm5hdmlnYXRlVGh1bWJuYWlscy5iaW5kKHRoaXMpO1xyXG4gICAgaWYodGhpcy50YWIgPT09ICdub25lJykge1xyXG4gICAgICB0aGlzLnRhYiA9ICd0aHVtYm5haWxzJztcclxuICAgIH1cclxuICAgIHRoaXMuZmlyZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VhcmNoKHNlYXJjaCkge1xyXG4gICAgdGhpcy5zZWFyY2ggPSBzZWFyY2g7XHJcbiAgICBzZWFyY2gub25OYXZpZ2F0ZSA9IHRoaXMubmF2aWdhdGVTZWFyY2guYmluZCh0aGlzKTtcclxuICAgIHRoaXMuZmlyZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0Qm9va21hcmtzKGJvb2ttYXJrcywgcGRmKSB7XHJcbiAgICB0aGlzLmJvb2ttYXJrcyA9IGJvb2ttYXJrcztcclxuICAgIHRoaXMucGRmID0gcGRmO1xyXG4gICAgYm9va21hcmtzLm9uTmF2aWdhdGUgPSB0aGlzLm5hdmlnYXRlQm9va21hcmtzLmJpbmQodGhpcyk7XHJcbiAgICBpZihib29rbWFya3MuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgIHRoaXMudGFiID0gJ2Jvb2ttYXJrcyc7XHJcbiAgICAgIHRoaXMuaXNCb29rbWFya3MgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBjbWRCb29rbWFya3MoKSB7XHJcbiAgICB0aGlzLnRhYiA9ICdib29rbWFya3MnO1xyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBjbWRUaHVtYm5haWxzKCkge1xyXG4gICAgdGhpcy50YWIgPSAndGh1bWJuYWlscyc7XHJcbiAgICB0aGlzLmZpcmVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGNtZFNlYXJjaCgpIHtcclxuICAgIHRoaXMudGFiID0gJ3NlYXJjaCc7XHJcbiAgICB0aGlzLmZpcmVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGNtZENsb3NlVG9jKCkge1xyXG4gICAgdGhpcy5oaWRlKCk7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZVRodW1ibmFpbHMobnVtYmVyKSB7XHJcbiAgICB0aGlzLmJvb2tDdHJsLmdvVG9QYWdlKG51bWJlcik7XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZVNlYXJjaChudW1iZXIpIHtcclxuICAgIHRoaXMuYm9va0N0cmwuZ29Ub1BhZ2UobnVtYmVyKTtcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlQm9va21hcmtzKGl0ZW0pIHtcclxuICAgIGlmKGl0ZW0udXJsKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGl0ZW0udXJsLCAnX2JsYW5rJyk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmKGl0ZW0uZGVzdCkge1xyXG4gICAgICBsZXQgZGVzdFByb21pc2U7XHJcbiAgICAgIGlmKHR5cGVvZiBpdGVtLmRlc3Q9PT0nc3RyaW5nJykge1xyXG4gICAgICAgIGRlc3RQcm9taXNlID0gdGhpcy5wZGYuaGFuZGxlci5nZXREZXN0aW5hdGlvbihpdGVtLmRlc3QpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGRlc3RQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGl0ZW0uZGVzdCk7XHJcbiAgICAgIH1cclxuICAgICAgZGVzdFByb21pc2UuXHJcbiAgICAgICAgdGhlbigoZGVzdCk9PiB0aGlzLnBkZi5oYW5kbGVyLmdldFBhZ2VJbmRleChkZXN0WzBdKSkuXHJcbiAgICAgICAgdGhlbigobnVtYmVyKT0+IHRoaXMuYm9va0N0cmwuZ29Ub1BhZ2UobnVtYmVyKSkuXHJcbiAgICAgICAgY2F0Y2goKCk9PiBjb25zb2xlLmVycm9yKCdCYWQgYm9va21hcmsnKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVWaWV3KCkge1xyXG4gICAgaWYodGhpcy52aWV3KSB7XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnd2lkVG9jTWVudScsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3dpZFRodW1ibmFpbHMnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRoaXMudGFiPT09J3RodW1ibmFpbHMnLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnd2lkU2VhcmNoJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLnRhYj09PSdzZWFyY2gnLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnd2lkQm9va21hcmtzJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLnRhYj09PSdib29rbWFya3MnLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnY21kQm9va21hcmtzJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogdGhpcy50YWI9PT0nYm9va21hcmtzJ1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCdjbWRDbG9zZVRvYycsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ2NtZFRodW1ibmFpbHMnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgYWN0aXZlOiB0aGlzLnRhYj09PSd0aHVtYm5haWxzJ1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCdjbWRTZWFyY2gnLCB7XHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgYWN0aXZlOiB0aGlzLnRhYj09PSdzZWFyY2gnXHJcbiAgICAgIH0pO1xyXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT4gdGhpcy50aHVtYm5haWxzLnNldEVuYWJsZSh0aGlzLnZpc2libGUgJiYgdGhpcy50YWI9PT0ndGh1bWJuYWlscycpKTtcclxuICAgICAgc3VwZXIudXBkYXRlVmlldygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vanMvY2xhc3Nlcy9Ub2NDb250cm9sbGVyLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBUaHJlZVV0aWxzIGZyb20gJ1RocmVlVXRpbHMnO1xyXG5cclxuY29uc3QgcmVzWCA9IDExLFxyXG4gICAgICByZXNZID0gMixcclxuICAgICAgcmVzWiA9IDE1LFxyXG4gICAgICBzY2FsZSA9IDEsXHJcbiAgICAgIGZhY2VzID0gW107XHJcblxyXG5jb25zdCBmcm9udEdlb21ldHJ5ID0gbmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoc2NhbGUsIHNjYWxlLCByZXNYLTEsIHJlc1ktMSk7XHJcbmZyb250R2VvbWV0cnkudHJhbnNsYXRlKDAuNSpzY2FsZSwwLjUqc2NhbGUsc2NhbGUpO1xyXG5jb25zdCBiYWNrR2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeShzY2FsZSwgc2NhbGUsIHJlc1gtMSwgcmVzWS0xKTtcclxuYmFja0dlb21ldHJ5LnJvdGF0ZVkoTWF0aC5QSSk7XHJcbmJhY2tHZW9tZXRyeS50cmFuc2xhdGUoMC41KnNjYWxlLDAuNSpzY2FsZSwwKTtcclxuY29uc3QgbGVmdEdlb21ldHJ5ID0gbmV3IFRIUkVFLlBsYW5lR2VvbWV0cnkoc2NhbGUsIHNjYWxlLCByZXNaLTEsIHJlc1ktMSk7XHJcbmxlZnRHZW9tZXRyeS5yb3RhdGVZKC1NYXRoLlBJLzIpO1xyXG5sZWZ0R2VvbWV0cnkudHJhbnNsYXRlKDAsMC41KnNjYWxlLDAuNSpzY2FsZSk7XHJcbmNvbnN0IHJpZ2h0R2VvbWV0cnkgPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeShzY2FsZSwgc2NhbGUsIHJlc1otMSwgcmVzWS0xKTtcclxucmlnaHRHZW9tZXRyeS5yb3RhdGVZKE1hdGguUEkvMik7XHJcbnJpZ2h0R2VvbWV0cnkudHJhbnNsYXRlKHNjYWxlLDAuNSpzY2FsZSwwLjUqc2NhbGUpO1xyXG5jb25zdCB0b3BHZW9tZXRyeSA9IG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KHNjYWxlLCBzY2FsZSwgcmVzWC0xLCByZXNaLTEpO1xyXG50b3BHZW9tZXRyeS5yb3RhdGVYKC1NYXRoLlBJLzIpO1xyXG50b3BHZW9tZXRyeS50cmFuc2xhdGUoMC41KnNjYWxlLHNjYWxlLDAuNSpzY2FsZSk7XHJcbmNvbnN0IGJvdHRvbUdlb21ldHJ5ID0gdG9wR2VvbWV0cnkuY2xvbmUoKTtcclxuYm90dG9tR2VvbWV0cnkudHJhbnNsYXRlKDAsLXNjYWxlLDApO1xyXG5mb3IobGV0IGYgb2YgYm90dG9tR2VvbWV0cnkuZmFjZXMpIHtcclxuICBbZi5hLCBmLmJdID0gW2YuYiwgZi5hXTtcclxufVxyXG5cclxuY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuR2VvbWV0cnkoKTtcclxuZ2VvbWV0cnkudmVydGljZXMgPSBbLi4uYm90dG9tR2VvbWV0cnkudmVydGljZXMsIC4uLnRvcEdlb21ldHJ5LnZlcnRpY2VzXTtcclxuXHJcbmNvbnN0IGFkZEZhY2VzID0gKGZzLCBtYXApPT4ge1xyXG4gIGZvcihsZXQgZiBvZiBmcykge1xyXG4gICAgZ2VvbWV0cnkuZmFjZXMucHVzaChuZXcgVEhSRUUuRmFjZTMobWFwKGYuYSksIG1hcChmLmIpLCBtYXAoZi5jKSkpO1xyXG4gIH1cclxuICBmYWNlcy5wdXNoKGdlb21ldHJ5LmZhY2VzLmxlbmd0aCk7XHJcbn07XHJcblxyXG5jb25zdCBtYXBWZXJ0aWNlcyA9IChzcmMsIGRzdCk9PiB7XHJcbiAgY29uc3QgbWFwID0gW107XHJcbiAgY29uc3QgZXEgPSAoYSwgYik9PiBNYXRoLmFicyhhLngtYi54KStNYXRoLmFicyhhLnktYi55KStNYXRoLmFicyhhLnotYi56KTwxZS00O1xyXG4gIGZvcihsZXQgaT0wOyBpPHNyYy5sZW5ndGg7ICsraSkge1xyXG4gICAgZm9yKGxldCBqPTA7IGo8ZHN0Lmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIGlmKGVxKHNyY1tpXSwgZHN0W2pdKSkge1xyXG4gICAgICAgIG1hcFtpXT1qO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBtYXA7XHJcbn07XHJcblxyXG5jb25zdCBmcm9udE1hcCA9IG1hcFZlcnRpY2VzKGZyb250R2VvbWV0cnkudmVydGljZXMsIGdlb21ldHJ5LnZlcnRpY2VzKTtcclxuY29uc3QgYmFja01hcCA9IG1hcFZlcnRpY2VzKGJhY2tHZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkudmVydGljZXMpO1xyXG5jb25zdCBsZWZ0TWFwID0gbWFwVmVydGljZXMobGVmdEdlb21ldHJ5LnZlcnRpY2VzLCBnZW9tZXRyeS52ZXJ0aWNlcyk7XHJcbmNvbnN0IHJpZ2h0TWFwID0gbWFwVmVydGljZXMocmlnaHRHZW9tZXRyeS52ZXJ0aWNlcywgZ2VvbWV0cnkudmVydGljZXMpO1xyXG5cclxuYWRkRmFjZXModG9wR2VvbWV0cnkuZmFjZXMsIChpKT0+IGkrYm90dG9tR2VvbWV0cnkudmVydGljZXMubGVuZ3RoKTtcclxuYWRkRmFjZXMoYm90dG9tR2VvbWV0cnkuZmFjZXMsIChpKT0+IGkpO1xyXG5hZGRGYWNlcyhmcm9udEdlb21ldHJ5LmZhY2VzLCAoaSk9PiBmcm9udE1hcFtpXSk7XHJcbmFkZEZhY2VzKGJhY2tHZW9tZXRyeS5mYWNlcywgKGkpPT4gYmFja01hcFtpXSk7XHJcbmFkZEZhY2VzKGxlZnRHZW9tZXRyeS5mYWNlcywgKGkpPT4gbGVmdE1hcFtpXSk7XHJcbmFkZEZhY2VzKHJpZ2h0R2VvbWV0cnkuZmFjZXMsIChpKT0+IHJpZ2h0TWFwW2ldKTtcclxuZmFjZXMucG9wKCk7XHJcblxyXG5UaHJlZVV0aWxzLmNvbXB1dGVGYWNlVmVydGV4VXZzKGdlb21ldHJ5LCBmYWNlcyk7XHJcblxyXG5nZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG4vL2dlb21ldHJ5LmNvbXB1dGVGYWNlTm9ybWFscygpO1xyXG5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcclxuLy9nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcclxuZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gdHJ1ZTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuXHRyZXNYLFxyXG5cdHJlc1ksXHJcblx0cmVzWixcclxuXHRmYWNlcyxcclxuXHRnZW9tZXRyeVxyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9tb2RlbHMvc2hlZXRCbG9jay5qcyIsImNvbnN0IG1vdXNlQnV0dG9ucyA9IHtcclxuICBMZWZ0OiAwLFxyXG4gIE1pZGRsZTogMSxcclxuICBSaWdodDogMlxyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3BzKCkge1xyXG4gIHJldHVybiB7XHJcbiAgICBlcHM6IDFlLTQsXHJcbiAgICBza2luOiB7XHJcbiAgICAgIGRlZmF1bHQ6ICdzaG9ydC13aGl0ZS1ib29rLXZpZXcnLFxyXG4gICAgfSxcclxuICAgIHNjYWxlOiB7XHJcbiAgICAgIGRlZmF1bHQ6IDAuOSxcclxuICAgICAgbWluOiAwLjksXHJcbiAgICAgIG1heDogMi41LFxyXG4gICAgICBsZXZlbHM6IDdcclxuICAgIH0sXHJcbiAgICBsaWdodGluZzoge1xyXG4gICAgICBkZWZhdWx0OiAwLjcsXHJcbiAgICAgIG1pbjogMCxcclxuICAgICAgbWF4OiAxLFxyXG4gICAgICBsZXZlbHM6IDdcclxuICAgIH0sXHJcbiAgICBwYW46IHtcclxuICAgICAgc3BlZWQ6IDUwXHJcbiAgICB9LFxyXG4gICAgbG9hZGluZ0FuaW1hdGlvbjoge1xyXG4gICAgICBza2luOiBmYWxzZSxcclxuICAgICAgYm9vazogdHJ1ZVxyXG4gICAgfSxcclxuICAgIGF1dG9SZXNvbHV0aW9uOiB7XHJcbiAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIGNvZWZmaWNpZW50OiAxLjVcclxuICAgIH0sXHJcbiAgICBhY3Rpb25zOiB7XHJcbiAgICAgIGNtZFpvb21Jbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFpvb21PdXQ6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZERlZmF1bHRab29tOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnZGJsY2xpY2snLFxyXG4gICAgICAgIGNvZGU6IDBcclxuICAgICAgfSxcclxuICAgICAgY21kVG9jOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRGYXN0QmFja3dhcmQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRCYWNrd2FyZDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kRm9yd2FyZDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kRmFzdEZvcndhcmQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRTYXZlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQcmludDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY21kRnVsbFNjcmVlbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgd2lkU2V0dGluZ3M6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFNtYXJ0UGFuOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IHRydWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFNpbmdsZVBhZ2U6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgYWN0aXZlRm9yTW9iaWxlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRTb3VuZHM6IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRTdGF0czoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRMaWdodGluZ1VwOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRMaWdodGluZ0Rvd246IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFBhbkxlZnQ6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9LFxyXG4gICAgICBjbWRQYW5SaWdodDoge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIGNtZFBhblVwOiB7XHJcbiAgICAgICAgZW5hYmxlZDogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgY21kUGFuRG93bjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1vdXNlQ21kUm90YXRlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAnbW91c2VkcmFnJyxcclxuICAgICAgICBjb2RlOiBtb3VzZUJ1dHRvbnMuUmlnaHRcclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWREcmFnWm9vbToge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ21vdXNlZHJhZycsXHJcbiAgICAgICAgY29kZTogbW91c2VCdXR0b25zLk1pZGRsZVxyXG4gICAgICB9LFxyXG4gICAgICBtb3VzZUNtZFBhbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ21vdXNlZHJhZycsXHJcbiAgICAgICAgY29kZTogbW91c2VCdXR0b25zLkxlZnRcclxuICAgICAgfSxcclxuICAgICAgbW91c2VDbWRXaGVlbFpvb206IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIHR5cGU6ICdtb3VzZXdoZWVsJyxcclxuICAgICAgICBjb2RlOiAwXHJcbiAgICAgIH0sXHJcbiAgICAgIHRvdWNoQ21kUm90YXRlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAndG91Y2hkcmFnJyxcclxuICAgICAgICBjb2RlOiAzXHJcbiAgICAgIH0sXHJcbiAgICAgIHRvdWNoQ21kWm9vbToge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ3RvdWNoZHJhZycsXHJcbiAgICAgICAgY29kZTogMlxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFBhbjoge1xyXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgdHlwZTogJ3RvdWNoZHJhZycsXHJcbiAgICAgICAgY29kZTogMVxyXG4gICAgICB9LFxyXG4gICAgICB0b3VjaENtZFN3aXBlOiB7XHJcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB0eXBlOiAndG91Y2hkcmFnJyxcclxuICAgICAgICBjb2RlOiAxXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG59O1xyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9qcy9wcm9wcy9ib29rQ29udHJvbGxlci5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBJbWFnZUJhc2UgZnJvbSAnLi9JbWFnZUJhc2UnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmxhbmtJbWFnZSBleHRlbmRzIEltYWdlQmFzZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yKSB7XHJcbiAgICBzdXBlcihjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcik7XHJcblxyXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkuXHJcbiAgICAgIHRoZW4oKCk9PiB7XHJcbiAgICAgICAgdGhpcy5zdGFydFJlbmRlciA9ICgpPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJCbGFua1BhZ2UoKTtcclxuICAgICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmZpbmlzaExvYWQoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0JsYW5rSW1hZ2UuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9va21hcmtzIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCBpdGVtcywgZ2V0VGl0bGU9KGkpPT4gaS50aXRsZSwgZ2V0SXRlbXM9KGkpPT5pLml0ZW1zKSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIHRoaXMubWFwID0gW107XHJcbiAgICB0aGlzLmdldFRpdGxlID0gZ2V0VGl0bGU7XHJcbiAgICB0aGlzLmdldEl0ZW1zID0gZ2V0SXRlbXM7XHJcbiAgICB0aGlzLm5vZGVzID0gdGhpcy5tYXBOb2RlcyhpdGVtcywgdGhpcy5tYXApO1xyXG5cclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIHRvZ2xlOiAoZSk9PiB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGxldCBsaSA9ICQoZS50YXJnZXQpO1xyXG4gICAgICAgIHdoaWxlKGxpWzBdICYmIGxpWzBdIT09Y29udGFpbmVyWzBdICYmICFsaS5oYXNDbGFzcygnaXRlbScpKSB7XHJcbiAgICAgICAgICBsaSA9ICQobGlbMF0ucGFyZW50Tm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGxpLmhhc0NsYXNzKCdpdGVtJykpIHtcclxuICAgICAgICAgIGxldCBjbWQgPSAkKGUudGFyZ2V0KTtcclxuICAgICAgICAgIHdoaWxlKGNtZFswXSAmJiBjbWRbMF0hPT1saVswXSAmJiAhY21kLmhhc0NsYXNzKCdjbWQnKSkge1xyXG4gICAgICAgICAgICBjbWQgPSAkKGNtZFswXS5wYXJlbnROb2RlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGNtZC5oYXNDbGFzcygnY21kJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMubWFwW2xpLmF0dHIoJ2RhdGEtaWQnKV07XHJcbiAgICAgICAgICAgIGlmKGNtZC5oYXNDbGFzcygndG9nbGUnKSkge1xyXG4gICAgICAgICAgICAgIG5vZGUubWluaW1pemVkID0gIW5vZGUubWluaW1pemVkO1xyXG4gICAgICAgICAgICAgIGlmKG5vZGUubWluaW1pemVkKSB7XHJcbiAgICAgICAgICAgICAgICBsaS5maW5kKCd1bCcpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgbGkuZmluZCgnLnRvZ2xlJykuYWRkQ2xhc3MoJ21pbmltaXplZCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxpLmZpbmQoJy50b2dsZScpLnJlbW92ZUNsYXNzKCdtaW5pbWl6ZWQnKTtcclxuICAgICAgICAgICAgICAgIGxpLmFwcGVuZCgodGhpcy5yZW5kZXJOb2RlKG5vZGUpLm1hdGNoKC88dWwuKjxcXC91bD4vKSB8fCBbJyddKVswXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmKHRoaXMub25OYXZpZ2F0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbk5hdmlnYXRlKG5vZGUuaXRlbSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29udGFpbmVyLm9uKCdjbGljaycsIHRoaXMuYmluZHMudG9nbGUpO1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIGdldFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXAubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuY29udGFpbmVyLm9mZignY2xpY2snLCB0aGlzLmJpbmRzLnRvZ2xlKTtcclxuICAgIHRoaXMuY29udGFpbmVyLmh0bWwoJycpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKCkge1xyXG4gICAgdGhpcy5jb250YWluZXIuaHRtbCh0aGlzLnJlbmRlck5vZGVzKHRoaXMubm9kZXMpKTtcclxuICB9XHJcblxyXG4gIGZvckVhY2goZiwgbm9kZXM9dGhpcy5ub2Rlcykge1xyXG4gICAgZm9yKGxldCBub2RlIG9mIChub2RlcyB8fCBbXSkpIHtcclxuICAgICAgZihub2RlKTtcclxuICAgICAgdGhpcy5mb3JFYWNoKGYsIG5vZGUuY2hpbGRyZW4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwYW5kKCkge1xyXG4gICAgdGhpcy5mb3JFYWNoKChuKT0+IG4ubWluaW1pemVkID0gZmFsc2UpO1xyXG4gICAgdGhpcy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIG1pbmltaXplKCkge1xyXG4gICAgdGhpcy5mb3JFYWNoKChuKT0+IG4ubWluaW1pemVkID0gdHJ1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcmVuZGVyTm9kZShub2RlKSB7XHJcbiAgICByZXR1cm4gWyc8ZGl2IGNsYXNzPVwiYXJlYVwiPicsXHJcbiAgICAgIG5vZGUuY2hpbGRyZW4/ICc8YSBocmVmPVwiI1wiIGNsYXNzPVwiY21kIHRvZ2xlJyArIChub2RlLm1pbmltaXplZD8gJyBtaW5pbWl6ZWQnOiAnJykgKyAnXCI+PGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1yaWdodFwiPjwvaT48L2E+ICc6ICc8aSBjbGFzcz1cIndoaXRlLXNwYWNlXCI+PC9pPiAnLFxyXG4gICAgICAnPGEgY2xhc3M9XCJjbWRcIiB0aXRsZT1cIicsIG5vZGUudGl0bGUsJ1wiIGhyZWY9XCIjXCI+Jywgbm9kZS50aXRsZSwgJzwvYT48L2Rpdj4nLFxyXG4gICAgICBub2RlLm1pbmltaXplZD8gJyc6IHRoaXMucmVuZGVyTm9kZXMobm9kZS5jaGlsZHJlbilcclxuICAgIF0uam9pbignJyk7XHJcbiAgfVxyXG5cclxuICByZW5kZXJOb2Rlcyhub2Rlcykge1xyXG4gICAgbGV0IHJlcyA9IFsnPGRpdiBjbGFzcz1cImJvb2ttYXJrc1wiPiddO1xyXG4gICAgaWYobm9kZXMgJiYgbm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgIHJlcy5wdXNoKCc8dWwgY2xhc3M9XCJsZXZlbC0nLCBub2Rlc1swXS5sZXZlbCwgJ1wiPicpO1xyXG4gICAgICBmb3IobGV0IG5vZGUgb2Ygbm9kZXMpIHtcclxuICAgICAgICByZXMucHVzaChbXHJcbiAgICAgICAgICAnPGxpIGNsYXNzPVwiaXRlbVwiIGRhdGEtaWQ9XCInLCBub2RlLmlkLCdcIj4nLFxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlck5vZGUobm9kZSksXHJcbiAgICAgICAgICAnPC9saT4nXS5qb2luKCcnKSk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzLnB1c2goJzwvdWw+Jyk7XHJcbiAgICB9XHJcbiAgICByZXMucHVzaCgnPC9kaXY+Jyk7XHJcbiAgICByZXR1cm4gcmVzLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcbiAgbWFwTm9kZXMoaXRlbXMsIG1hcD1bXSwgbGV2ZWw9MCkge1xyXG4gICAgbGV0IG5vZGVzID0gbnVsbDtcclxuICAgIGlmKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICBub2Rlcz1bXTtcclxuICAgICAgZm9yKGxldCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgY29uc3QgaWQgPSBtYXAubGVuZ3RoO1xyXG4gICAgICAgIG1hcC5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHtcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0VGl0bGUoaXRlbSksXHJcbiAgICAgICAgICBsZXZlbCxcclxuICAgICAgICAgIGl0ZW0sXHJcbiAgICAgICAgICBtaW5pbWl6ZWQ6IHRydWUsXHJcbiAgICAgICAgICBjaGlsZHJlbjogdGhpcy5tYXBOb2Rlcyh0aGlzLmdldEl0ZW1zKGl0ZW0pLCBtYXAsIGxldmVsKzEpXHJcbiAgICAgICAgfTtcclxuICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xyXG4gICAgICAgIG1hcFtpZF0gPSBub2RlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Cb29rbWFya3MuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV0ZWN0b3Ige1xyXG5cclxuXHRzdGF0aWMgY2FudmFzID0gISEgd2luZG93LkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuXHJcblx0c3RhdGljIHdlYmdsID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcblx0XHRcdHJldHVybiAhISAod2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCAmJiAoY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcpKSk7XHJcblx0XHR9XHJcblx0XHRjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0fSkoKTtcclxuXHJcblx0c3RhdGljIHdvcmtlcnMgPSAhISB3aW5kb3cuV29ya2VyO1xyXG5cclxuXHRzdGF0aWMgZmlsZWFwaSA9IHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuQmxvYjtcclxuXHJcblx0c3RhdGljIGdldFdlYkdMRXJyb3JNZXNzYWdlKCkge1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0ZWxlbWVudC5pZCA9ICd3ZWJnbC1lcnJvci1tZXNzYWdlJztcclxuXHRcdGVsZW1lbnQuc3R5bGUuZm9udEZhbWlseSA9ICdtb25vc3BhY2UnO1xyXG5cdFx0ZWxlbWVudC5zdHlsZS5mb250U2l6ZSA9ICcxM3B4JztcclxuXHRcdGVsZW1lbnQuc3R5bGUuZm9udFdlaWdodCA9ICdub3JtYWwnO1xyXG5cdFx0ZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuXHRcdGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZmJztcclxuXHRcdGVsZW1lbnQuc3R5bGUuY29sb3IgPSAnIzAwMCc7XHJcblx0XHRlbGVtZW50LnN0eWxlLnBhZGRpbmcgPSAnMS41ZW0nO1xyXG5cdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9ICc0MDBweCc7XHJcblx0XHRlbGVtZW50LnN0eWxlLm1hcmdpbiA9ICc1ZW0gYXV0byAwJztcclxuXHJcblx0XHRpZiAoIURldGVjdG9yLndlYmdsKSB7XHJcblx0XHRcdGVsZW1lbnQuaW5uZXJIVE1MID0gd2luZG93LldlYkdMUmVuZGVyaW5nQ29udGV4dCA/IFtcclxuXHRcdFx0XHQnWW91ciBncmFwaGljcyBjYXJkIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCA8YSBocmVmPVwiaHR0cDovL2tocm9ub3Mub3JnL3dlYmdsL3dpa2kvR2V0dGluZ19hX1dlYkdMX0ltcGxlbWVudGF0aW9uXCIgc3R5bGU9XCJjb2xvcjojMDAwXCI+V2ViR0w8L2E+LjxiciAvPicsXHJcblx0XHRcdFx0J0ZpbmQgb3V0IGhvdyB0byBnZXQgaXQgPGEgaHJlZj1cImh0dHA6Ly9nZXQud2ViZ2wub3JnL1wiIHN0eWxlPVwiY29sb3I6IzAwMFwiPmhlcmU8L2E+LidcclxuXHRcdFx0XS5qb2luKCdcXG4nKSA6IFtcclxuXHRcdFx0XHQnWW91ciBicm93c2VyIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCA8YSBocmVmPVwiaHR0cDovL2tocm9ub3Mub3JnL3dlYmdsL3dpa2kvR2V0dGluZ19hX1dlYkdMX0ltcGxlbWVudGF0aW9uXCIgc3R5bGU9XCJjb2xvcjojMDAwXCI+V2ViR0w8L2E+Ljxici8+JyxcclxuXHRcdFx0XHQnRmluZCBvdXQgaG93IHRvIGdldCBpdCA8YSBocmVmPVwiaHR0cDovL2dldC53ZWJnbC5vcmcvXCIgc3R5bGU9XCJjb2xvcjojMDAwXCI+aGVyZTwvYT4uJ1xyXG5cdFx0XHRdLmpvaW4oJ1xcbicpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGVsZW1lbnQ7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYWRkR2V0V2ViR0xNZXNzYWdlKHBhcmFtZXRlcnMpIHtcclxuXHRcdGxldCBwYXJlbnQsIGlkLCBlbGVtZW50O1xyXG5cdFx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XHJcblxyXG5cdFx0cGFyZW50ID0gcGFyYW1ldGVycy5wYXJlbnQgfHwgJChkb2N1bWVudC5ib2R5KTtcclxuXHRcdGlkID0gcGFyYW1ldGVycy5pZCB8fCAnb2xkaWUnO1xyXG5cclxuXHRcdGVsZW1lbnQgPSBEZXRlY3Rvci5nZXRXZWJHTEVycm9yTWVzc2FnZSgpO1xyXG5cdFx0Ly9lbGVtZW50LmlkID0gaWQ7XHJcblxyXG5cdFx0cGFyZW50LmFwcGVuZChlbGVtZW50KTtcclxuXHR9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0RldGVjdG9yLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9jTW91c2VTaW11bGF0b3Ige1xyXG5cclxuICBzdGF0aWMgSE9WRVIgPSAnU0lNVUxBVEVELUhPVkVSJztcclxuICBzdGF0aWMgQUNUSVZFID0gJ1NJTVVMQVRFRC1BQ1RJVkUnO1xyXG5cclxuICBjb25zdHJ1Y3RvcihqRnJhbWUsIGVsZW1lbnQsIGJFbGVtZW50PWRvY3VtZW50LmJvZHkpIHtcclxuICAgIHRoaXMuakZyYW1lID0gakZyYW1lO1xyXG4gICAgdGhpcy53bmQgPSBqRnJhbWVbMF0uY29udGVudFdpbmRvdztcclxuICAgIHRoaXMuZG9jID0gakZyYW1lWzBdLmNvbnRlbnREb2N1bWVudDtcclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQgfHwgZG9jLmJvZHk7XHJcbiAgICB0aGlzLmJFbGVtZW50ID0gYkVsZW1lbnQ7XHJcbiAgICB0aGlzLnJlc2VuZFByb3BlcnRpZXMgPSB0aGlzLmdldERlZmF1bHRSZXNlbmRQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnVuZGVmaW5lZFByb3BlcnRpZXMgPSB0aGlzLmdldERlZmF1bHRVbmRlZmluZWRQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLmN1cnNvcnMgPSBbXTtcclxuICAgIHRoaXMub25Eb2NDaGFuZ2VDbGJzID0gW107XHJcbiAgICBjb25zdCB0ZXJtcyA9IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmaW5kOiAnOmhvdmVyJyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U6ICcuJytEb2NNb3VzZVNpbXVsYXRvci5IT1ZFUlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmluZDogJzphY3RpdmUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZTogJy4nK0RvY01vdXNlU2ltdWxhdG9yLkFDVElWRVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgXTtcclxuICAgIGxldCBzdHlsZSA9IFsnPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPiddO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvYy5zdHlsZVNoZWV0cy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBsZXQgc3MgPSB0aGlzLmRvYy5zdHlsZVNoZWV0c1tpXTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzcy5jc3NSdWxlcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGxldCByID0gc3MuY3NzUnVsZXNbal0sIGNzc1RleHQ7XHJcbiAgICAgICAgZm9yKGxldCB0ZXJtIG9mIHRlcm1zKSB7XHJcbiAgICAgICAgICBpZiAofnIuc2VsZWN0b3JUZXh0LmluZGV4T2YodGVybS5maW5kKSkge1xyXG4gICAgICAgICAgICBjc3NUZXh0ID0gKGNzc1RleHQgfHwgci5jc3NUZXh0KS5yZXBsYWNlKG5ldyBSZWdFeHAodGVybS5maW5kLCAnZycpLCB0ZXJtLnJlcGxhY2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjc3NUZXh0KSB7XHJcbiAgICAgICAgICBzdHlsZS5wdXNoKGNzc1RleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgc3R5bGUucHVzaCgnPC9zdHlsZT4nKTtcclxuICAgICQodGhpcy5kb2MuaGVhZCkuYXBwZW5kKCQoc3R5bGUuam9pbignJykpKTtcclxuICB9XHJcblxyXG4gIGNvbnZlcnRDb29yZHMoeCwgeSkge1xyXG4gICAgY29uc3QgakVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudCk7XHJcbiAgICBjb25zdCBvZmZzZXQgPSBqRWxlbWVudC5vZmZzZXQoKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHg6IG9mZnNldC5sZWZ0K2pFbGVtZW50LndpZHRoKCkqeCxcclxuICAgICAgeTogb2Zmc2V0LnRvcCtqRWxlbWVudC5oZWlnaHQoKSooMS15KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHRyaWdnZXJFdmVudChlbGVtZW50LCBlLCBwLCB0eXBlLCBhZHZhbmNlZFByb3BzKSB7XHJcbiAgICBjb25zdCBwcm9wcyA9IHt9O1xyXG4gICAgZm9yKGxldCBuIG9mIHRoaXMucmVzZW5kUHJvcGVydGllcykge1xyXG4gICAgICBwcm9wc1tuXSA9IGVbbl07XHJcbiAgICB9XHJcbiAgICBmb3IobGV0IG4gb2YgdGhpcy51bmRlZmluZWRQcm9wZXJ0aWVzKSB7XHJcbiAgICAgIHByb3BzW25dID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgZm9yKGxldCBuIGluIGFkdmFuY2VkUHJvcHMpIHtcclxuICAgICAgaWYoYWR2YW5jZWRQcm9wcy5oYXNPd25Qcm9wZXJ0eShuKSkge1xyXG4gICAgICAgIHByb3BzW25dID0gYWR2YW5jZWRQcm9wc1tuXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvcHMudmlldyA9IHRoaXMud25kO1xyXG4gICAgcHJvcHMucGFnZVggPSBwLng7XHJcbiAgICBwcm9wcy5wYWdlWSA9IHAueTtcclxuICAgIGNvbnN0IGpFID0gJC5FdmVudCh0eXBlLCBwcm9wcyk7XHJcbiAgICBqRS50aW1lU3RhbXAgPSBlLnRpbWVTdGFtcDtcclxuICAgICQoZWxlbWVudCkudHJpZ2dlcihqRSk7XHJcbiAgfVxyXG5cclxuICBhZGRDbGFzcyhlbGVtZW50LCBuYW1lKSB7XHJcbiAgICAkKGVsZW1lbnQpLmFkZENsYXNzKG5hbWUpO1xyXG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLnduZC5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xyXG4gICAgdGhpcy5jdXJzb3JzLnB1c2goJCh0aGlzLmJFbGVtZW50KS5jc3MoJ2N1cnNvcicpKTtcclxuICAgICQodGhpcy5iRWxlbWVudCkuY3NzKCdjdXJzb3InLCBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdjdXJzb3InKSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVDbGFzcyhlbGVtZW50LCBuYW1lKSB7XHJcbiAgICAkKGVsZW1lbnQpLnJlbW92ZUNsYXNzKG5hbWUpO1xyXG4gICAgJCh0aGlzLmJFbGVtZW50KS5jc3MoJ2N1cnNvcicsIHRoaXMuY3Vyc29ycy5wb3AoKSk7XHJcbiAgfVxyXG5cclxuICBlbnRlckVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgdGhpcy5hZGRDbGFzcyhlbGVtZW50LCBEb2NNb3VzZVNpbXVsYXRvci5IT1ZFUik7XHJcbiAgfVxyXG5cclxuICBsZWF2ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgdGhpcy5yZW1vdmVDbGFzcyhlbGVtZW50LCBEb2NNb3VzZVNpbXVsYXRvci5IT1ZFUik7XHJcbiAgfVxyXG5cclxuICBhY3RpdmF0ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgdGhpcy5hZGRDbGFzcyhlbGVtZW50LCBEb2NNb3VzZVNpbXVsYXRvci5BQ1RJVkUpO1xyXG4gIH1cclxuXHJcbiAgZGVhY3RpdmF0ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgdGhpcy5yZW1vdmVDbGFzcyhlbGVtZW50LCBEb2NNb3VzZVNpbXVsYXRvci5BQ1RJVkUpO1xyXG4gIH1cclxuXHJcbiAgYWRkRG9jQ2hhbmdlQ2xiKGNsYikge1xyXG4gICAgdGhpcy5vbkRvY0NoYW5nZUNsYnMucHVzaChjbGIpO1xyXG4gIH1cclxuXHJcbiAgbm90aWZ5KCkge1xyXG4gICAgZm9yKGxldCBjbGIgb2YgdGhpcy5vbkRvY0NoYW5nZUNsYnMpIHtcclxuICAgICAgY2xiKHRoaXMud25kLCB0aGlzLmRvYyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbGVtZW50RnJvbVBvaW50KHApIHtcclxuICAgIGxldCBub2RlID0gdGhpcy5kb2MuYm9keSwgbmV4dCA9IHRydWU7XHJcbiAgICB3aGlsZShuZXh0KSB7XHJcbiAgICAgIG5leHQgPSBmYWxzZTtcclxuICAgICAgZm9yKGxldCBpPTA7IGk8bm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgaWYoY2hpbGQgaW5zdGFuY2VvZiB0aGlzLnduZC5FbGVtZW50KSB7XHJcbiAgICAgICAgICBjb25zdCBqQyA9ICQoY2hpbGQpLCBvZmZzZXQgPSBqQy5vZmZzZXQoKSwgaGVpZ2h0ID0gakMuaGVpZ2h0KCksIHdpZHRoID0gakMud2lkdGgoKTtcclxuICAgICAgICAgIGlmKHAueD5vZmZzZXQubGVmdCAmJiBwLng8b2Zmc2V0LmxlZnQrd2lkdGggJiYgcC55Pm9mZnNldC50b3AgJiYgcC55PG9mZnNldC50b3AraGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIG5vZGUgPSBjaGlsZDtcclxuICAgICAgICAgICAgbmV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5vZGU7XHJcbiAgfVxyXG5cclxuICBnZXRFbGVtZW50KHApIHtcclxuICAgIGNvbnN0IG9mZjAgPSB0aGlzLmpGcmFtZS5vZmZzZXQoKTtcclxuICAgIHRoaXMuakZyYW1lLm9mZnNldCh7bGVmdDogMC41KndpbmRvdy5pbm5lcldpZHRoLXAueCwgdG9wOiAwLjUqd2luZG93LmlubmVySGVpZ2h0LXAueX0pO1xyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLmRvYy5lbGVtZW50RnJvbVBvaW50KHAueCwgcC55KTtcclxuICAgIGlmKCFlbGVtZW50KSB7IC8vIGl0IGlzbid0IGEgam9rZSBpdCdzIElFXHJcbiAgICAgIGVsZW1lbnQgPSB0aGlzLmRvYy5lbGVtZW50RnJvbVBvaW50KHAueCwgcC55KTtcclxuICAgIH1cclxuICAgIHRoaXMuakZyYW1lLm9mZnNldChvZmYwKTtcclxuICAgIHJldHVybiBlbGVtZW50PyBlbGVtZW50OiB0aGlzLmVsZW1lbnRGcm9tUG9pbnQocCk7XHJcbiAgfVxyXG5cclxuICBzaW11bGF0ZShlLCBkb2MsIHgsIHkpIHtcclxuICAgIGNvbnN0IHAgPSB0aGlzLmNvbnZlcnRDb29yZHMoeCwgeSksXHJcbiAgICAgICAgICBlbGVtZW50ID0gZG9jPT09dGhpcy5kb2M/IHRoaXMuZ2V0RWxlbWVudChwKTogdW5kZWZpbmVkO1xyXG4gICAgbGV0IHRyaWdnZXIgPSBlbGVtZW50ICE9PSB1bmRlZmluZWQsIG5vdGlmeSA9IGZhbHNlO1xyXG5cclxuICAgIHN3aXRjaChlLnR5cGUpIHtcclxuICAgICAgY2FzZSAnbW91c2Vkb3duJzoge1xyXG4gICAgICAgIGlmKHRoaXMuY2FwRWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy5kZWFjdGl2YXRlRWxlbWVudCh0aGlzLmNhcEVsZW1lbnQpO1xyXG4gICAgICAgICAgbm90aWZ5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYXBFbGVtZW50ID0gZWxlbWVudDtcclxuICAgICAgICBpZih0aGlzLmNhcEVsZW1lbnQpIHtcclxuICAgICAgICAgIHRoaXMuYWN0aXZhdGVFbGVtZW50KHRoaXMuY2FwRWxlbWVudCk7XHJcbiAgICAgICAgICBub3RpZnkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdtb3VzZXVwJzoge1xyXG4gICAgICAgIGlmKHRoaXMuY2FwRWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy5kZWFjdGl2YXRlRWxlbWVudCh0aGlzLmNhcEVsZW1lbnQpO1xyXG4gICAgICAgICAgbm90aWZ5ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50aW1lU3RhbXAgPSBlLnRpbWVTdGFtcDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdjbGljayc6IHtcclxuICAgICAgICB0cmlnZ2VyID0gZWxlbWVudCAmJiB0aGlzLmNhcEVsZW1lbnQgPT09IGVsZW1lbnQgJiYgZS50aW1lU3RhbXAgPT09IHRoaXMudGltZVN0YW1wO1xyXG4gICAgICAgIHRoaXMuY2FwRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdtb3VzZWVudGVyJzpcclxuICAgICAgY2FzZSAnbW91c2VvdmVyJzpcclxuICAgICAgY2FzZSAnbW91c2Vtb3ZlJzoge1xyXG4gICAgICAgIGxldCBsZWF2ZWQgPSBudWxsO1xyXG4gICAgICAgIGlmKHRoaXMuaG92RWxlbWVudCAhPT0gZWxlbWVudCAmJiB0aGlzLmhvdkVsZW1lbnQpIHtcclxuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHRoaXMuaG92RWxlbWVudCwgZSwgcCwgJ21vdXNlb3V0Jywge3JlbGF0ZWRUYXJnZXQ6IGVsZW1lbnQ/IGVsZW1lbnQ6IG51bGx9KTtcclxuICAgICAgICAgIHRoaXMubGVhdmVFbGVtZW50KHRoaXMuaG92RWxlbWVudCk7XHJcbiAgICAgICAgICBsZWF2ZWQgPSB0aGlzLmhvdkVsZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLmhvdkVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBub3RpZnkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5ob3ZFbGVtZW50ICYmIGVsZW1lbnQpIHtcclxuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KGVsZW1lbnQsIGUsIHAsICdtb3VzZW92ZXInLCB7cmVsYXRlZFRhcmdldDogbGVhdmVkfSk7XHJcbiAgICAgICAgICB0aGlzLmVudGVyRWxlbWVudChlbGVtZW50KTtcclxuICAgICAgICAgIHRoaXMuaG92RWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICBub3RpZnkgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cmlnZ2VyID0gZWxlbWVudCAmJiBlLnR5cGUgPT09ICdtb3VzZW1vdmUnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ21vdXNlbGVhdmUnOlxyXG4gICAgICBjYXNlICdtb3VzZW91dCc6IHtcclxuICAgICAgICBpZih0aGlzLmhvdkVsZW1lbnQpIHtcclxuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHRoaXMuaG92RWxlbWVudCwgZSwgcCwgJ21vdXNlb3V0Jywge3JlbGF0ZWRUYXJnZXQ6IGUucmVsYXRlZFRhcmdldH0pO1xyXG4gICAgICAgICAgdGhpcy5sZWF2ZUVsZW1lbnQodGhpcy5ob3ZFbGVtZW50KTtcclxuICAgICAgICAgIHRoaXMuaG92RWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIG5vdGlmeSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyaWdnZXIgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYodHJpZ2dlcikge1xyXG4gICAgICB0aGlzLnRyaWdnZXJFdmVudChlbGVtZW50LCBlLCBwLCBlLnR5cGUpO1xyXG4gICAgfVxyXG4gICAgaWYobm90aWZ5KSB7XHJcbiAgICAgIHRoaXMubm90aWZ5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0VW5kZWZpbmVkUHJvcGVydGllcygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdjbGllbnRYJyxcclxuICAgICAgJ2NsaWVudFknLFxyXG4gICAgICAnb2Zmc2V0WCcsXHJcbiAgICAgICdvZmZzZXRZJyxcclxuICAgICAgJ3NjcmVlblgnLFxyXG4gICAgICAnc2NyZWVuWSdcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0UmVzZW5kUHJvcGVydGllcygpIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdhbHRLZXknLFxyXG4gICAgICAnYnViYmxlcycsXHJcbiAgICAgICdidXR0b24nLFxyXG4gICAgICAnYnV0dG9ucycsXHJcbiAgICAgICdjYW5jZWxhYmxlJyxcclxuICAgICAgJ2NoYW5nZWRUb3VjaGVzJyxcclxuICAgICAgJ2NoYXInLFxyXG4gICAgICAnY2hhckNvZGUnLFxyXG4gICAgICAnY3RybEtleScsXHJcbiAgICAgICdkYXRhJyxcclxuICAgICAgJ2RldGFpbCcsXHJcbiAgICAgICdldmVudFBoYXNlJyxcclxuICAgICAgJ2lzRGVmYXVsdFByZXZlbnRlZCcsXHJcbiAgICAgICdrZXknLFxyXG4gICAgICAna2V5Q29kZScsXHJcbiAgICAgICdtZXRhS2V5JyxcclxuICAgICAgJ3BvaW50ZXJJZCcsXHJcbiAgICAgICdwb2ludGVyVHlwZScsXHJcbiAgICAgICdzaGlmdEtleScsXHJcbiAgICAgICd0YXJnZXRUb3VjaGVzJyxcclxuICAgICAgJ3RvdWNoZXMnLFxyXG4gICAgICAnd2hpY2gnXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbi8qXHJcbmFsdEtleSxcclxuYnViYmxlcyxcclxuYnV0dG9uLFxyXG5idXR0b25zLFxyXG5jYW5jZWxhYmxlLFxyXG5jaGFuZ2VkVG91Y2hlcyxcclxuY2hhcixcclxuY2hhckNvZGUsXHJcbmNsaWVudFgsXHJcbmNsaWVudFksXHJcbmN0cmxLZXksXHJcbmN1cnJlbnRUYXJnZXQsXHJcbmRhdGEsXHJcbmRlbGVnYXRlVGFyZ2V0LFxyXG5kZXRhaWwsXHJcbmV2ZW50UGhhc2UsXHJcbmhhbmRsZU9iaixcclxuaXNEZWZhdWx0UHJldmVudGVkLFxyXG5rZXksXHJcbmtleUNvZGUsXHJcbm1ldGFLZXksXHJcbm9mZnNldFgsXHJcbm9mZnNldFksXHJcbm9yaWdpbmFsRXZlbnQsXHJcbnBhZ2VYLFxyXG5wYWdlWSxcclxucG9pbnRlcklkLFxyXG5wb2ludGVyVHlwZSxcclxucmVsYXRlZFRhcmdldCxcclxuc2NyZWVuWCxcclxuc2NyZWVuWSxcclxuc2hpZnRLZXksXHJcbnRhcmdldCxcclxudGFyZ2V0VG91Y2hlcyxcclxudGltZVN0YW1wLFxyXG50b0VsZW1lbnQsXHJcbnRvdWNoZXMsXHJcbnR5cGUsXHJcbnZpZXcsXHJcbndoaWNoXHJcbiovXHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0RvY01vdXNlU2ltdWxhdG9yLmpzIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9tMkltYWdlIHtcblxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYywgY2FjaGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLndpbmRvdyA9IHduZDtcbiAgICB0aGlzLmRvY3VtZW50ID0gZG9jO1xuICAgIHRoaXMuY2FjaGUgPSBjYWNoZTtcblxuICAgIGNvbnN0IHV0aWwgPSBuZXdVdGlsKCk7XG4gICAgY29uc3QgaW5saW5lciA9IG5ld0lubGluZXIoKTtcbiAgICBjb25zdCBmb250RmFjZXMgPSBuZXdGb250RmFjZXMoKTtcbiAgICBjb25zdCBpbWFnZXMgPSBuZXdJbWFnZXMoKTtcblxuICAgIHRoaXMudG9TdmcgPSB0b1N2ZztcbiAgICB0aGlzLnRvUG5nID0gdG9Qbmc7XG4gICAgdGhpcy50b0pwZWcgPSB0b0pwZWc7XG4gICAgdGhpcy50b0Jsb2IgPSB0b0Jsb2I7XG4gICAgdGhpcy50b1BpeGVsRGF0YSA9IHRvUGl4ZWxEYXRhO1xuICAgIHRoaXMuaW1wbCA9IHtcbiAgICAgICAgICAgICAgICAgIGZvbnRGYWNlczogZm9udEZhY2VzLFxuICAgICAgICAgICAgICAgICAgaW1hZ2VzOiBpbWFnZXMsXG4gICAgICAgICAgICAgICAgICB1dGlsOiB1dGlsLFxuICAgICAgICAgICAgICAgICAgaW5saW5lcjogaW5saW5lclxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgRE9NIE5vZGUgb2JqZWN0IHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcHRpb25zLmZpbHRlciAtIFNob3VsZCByZXR1cm4gdHJ1ZSBpZiBwYXNzZWQgbm9kZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dFxuICAgICAqICAgICAgICAgIChleGNsdWRpbmcgbm9kZSBtZWFucyBleGNsdWRpbmcgaXQncyBjaGlsZHJlbiBhcyB3ZWxsKS4gTm90IGNhbGxlZCBvbiB0aGUgcm9vdCBub2RlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmJnY29sb3IgLSBjb2xvciBmb3IgdGhlIGJhY2tncm91bmQsIGFueSB2YWxpZCBDU1MgY29sb3IgdmFsdWUuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMud2lkdGggLSB3aWR0aCB0byBiZSBhcHBsaWVkIHRvIG5vZGUgYmVmb3JlIHJlbmRlcmluZy5cbiAgICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5oZWlnaHQgLSBoZWlnaHQgdG8gYmUgYXBwbGllZCB0byBub2RlIGJlZm9yZSByZW5kZXJpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuc3R5bGUgLSBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyB0byBiZSBjb3BpZWQgdG8gbm9kZSdzIHN0eWxlIGJlZm9yZSByZW5kZXJpbmcuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMucXVhbGl0eSAtIGEgTnVtYmVyIGJldHdlZW4gMCBhbmQgMSBpbmRpY2F0aW5nIGltYWdlIHF1YWxpdHkgKGFwcGxpY2FibGUgdG8gSlBFRyBvbmx5KSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0cyB0byAxLjAuXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gLSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIFNWRyBpbWFnZSBkYXRhIFVSTFxuICAgICAqICovXG5cbiAgICBmdW5jdGlvbiB0b1N2Zyhub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZU5vZGUobm9kZSwgb3B0aW9ucy5maWx0ZXIsIHRydWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGVtYmVkRm9udHMpXG4gICAgICAgICAgICAudGhlbihpbmxpbmVJbWFnZXMpXG4gICAgICAgICAgICAudGhlbihhcHBseU9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVN2Z0RhdGFVcmkoY2xvbmUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMud2lkdGggfHwgdXRpbC53aWR0aChub2RlKSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5oZWlnaHQgfHwgdXRpbC5oZWlnaHQobm9kZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlPcHRpb25zKGNsb25lKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5iZ2NvbG9yKSBjbG9uZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBvcHRpb25zLmJnY29sb3I7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLndpZHRoKSBjbG9uZS5zdHlsZS53aWR0aCA9IG9wdGlvbnMud2lkdGggKyAncHgnO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVpZ2h0KSBjbG9uZS5zdHlsZS5oZWlnaHQgPSBvcHRpb25zLmhlaWdodCArICdweCc7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnN0eWxlKVxuICAgICAgICAgICAgICAgIHNlbGYud2luZG93Lk9iamVjdC5rZXlzKG9wdGlvbnMuc3R5bGUpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lLnN0eWxlW3Byb3BlcnR5XSA9IG9wdGlvbnMuc3R5bGVbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgRE9NIE5vZGUgb2JqZWN0IHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMsIEBzZWUge0BsaW5rIHRvU3ZnfVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBVaW50OEFycmF5IGNvbnRhaW5pbmcgUkdCQSBwaXhlbCBkYXRhLlxuICAgICAqICovXG4gICAgZnVuY3Rpb24gdG9QaXhlbERhdGEobm9kZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZHJhdyhub2RlLCBvcHRpb25zIHx8IHt9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5nZXRJbWFnZURhdGEoXG4gICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgIHV0aWwud2lkdGgobm9kZSksXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuaGVpZ2h0KG5vZGUpXG4gICAgICAgICAgICAgICAgKS5kYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIG9iamVjdCB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFJlbmRlcmluZyBvcHRpb25zLCBAc2VlIHtAbGluayB0b1N2Z31cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIEEgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGEgUE5HIGltYWdlIGRhdGEgVVJMXG4gICAgICogKi9cbiAgICBmdW5jdGlvbiB0b1BuZyhub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBkcmF3KG5vZGUsIG9wdGlvbnMgfHwge30pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSAtIFRoZSBET00gTm9kZSBvYmplY3QgdG8gcmVuZGVyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBSZW5kZXJpbmcgb3B0aW9ucywgQHNlZSB7QGxpbmsgdG9Tdmd9XG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gLSBBIHByb21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2l0aCBhIEpQRUcgaW1hZ2UgZGF0YSBVUkxcbiAgICAgKiAqL1xuICAgIGZ1bmN0aW9uIHRvSnBlZyhub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4gZHJhdyhub2RlLCBvcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgb3B0aW9ucy5xdWFsaXR5IHx8IDEuMCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgRE9NIE5vZGUgb2JqZWN0IHRvIHJlbmRlclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gUmVuZGVyaW5nIG9wdGlvbnMsIEBzZWUge0BsaW5rIHRvU3ZnfVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gQSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdpdGggYSBQTkcgaW1hZ2UgYmxvYlxuICAgICAqICovXG4gICAgZnVuY3Rpb24gdG9CbG9iKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRyYXcobm9kZSwgb3B0aW9ucyB8fCB7fSlcbiAgICAgICAgICAgIC50aGVuKHV0aWwuY2FudmFzVG9CbG9iKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkcmF3KGRvbU5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRvU3ZnKGRvbU5vZGUsIG9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbih1dGlsLm1ha2VJbWFnZSlcbiAgICAgICAgICAgIC50aGVuKHV0aWwuZGVsYXkoMTAwKSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChpbWFnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IG5ld0NhbnZhcyhkb21Ob2RlKTtcbiAgICAgICAgICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYW52YXM7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBuZXdDYW52YXMoZG9tTm9kZSkge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzID0gc2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgdXRpbC53aWR0aChkb21Ob2RlKTtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCB1dGlsLmhlaWdodChkb21Ob2RlKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmdjb2xvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBvcHRpb25zLmJnY29sb3I7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjYW52YXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9uZU5vZGUobm9kZSwgZmlsdGVyLCByb290KSB7XG4gICAgICAgIGlmICghcm9vdCAmJiBmaWx0ZXIgJiYgIWZpbHRlcihub2RlKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9kZSlcbiAgICAgICAgICAgIC50aGVuKG1ha2VOb2RlQ29weSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZUNoaWxkcmVuKG5vZGUsIGNsb25lLCBmaWx0ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzQ2xvbmUobm9kZSwgY2xvbmUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gbWFrZU5vZGVDb3B5KG5vZGUpIHtcbiAgICAgICAgICAgIGlmICh1dGlsLmlzQ2FudmFzKG5vZGUpKSByZXR1cm4gdXRpbC5tYWtlSW1hZ2Uobm9kZS50b0RhdGFVUkwoKSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2xvbmVDaGlsZHJlbihvcmlnaW5hbCwgY2xvbmUsIGZpbHRlcikge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBvcmlnaW5hbC5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjbG9uZUNoaWxkcmVuSW5PcmRlcihjbG9uZSwgdXRpbC5hc0FycmF5KGNoaWxkcmVuKSwgZmlsdGVyKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9uZUNoaWxkcmVuSW5PcmRlcihwYXJlbnQsIGNoaWxkcmVuLCBmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSBkb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb25lTm9kZShjaGlsZCwgZmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY2hpbGRDbG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZENsb25lKSBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGRDbG9uZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NDbG9uZShvcmlnaW5hbCwgY2xvbmUpIHtcbiAgICAgICAgICAgIGlmICghdXRpbC5pc0VsZW1lbnQoY2xvbmUpKSByZXR1cm4gY2xvbmU7XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgIC50aGVuKGNsb25lU3R5bGUpXG4gICAgICAgICAgICAgICAgLnRoZW4oY2xvbmVQc2V1ZG9FbGVtZW50cylcbiAgICAgICAgICAgICAgICAudGhlbihjb3B5VXNlcklucHV0KVxuICAgICAgICAgICAgICAgIC50aGVuKGZpeFN2ZylcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbG9uZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gY2xvbmVTdHlsZSgpIHtcbiAgICAgICAgICAgICAgICBjb3B5U3R5bGUoc2VsZi53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvcmlnaW5hbCksIGNsb25lLnN0eWxlKTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvcHlTdHlsZShzb3VyY2UsIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmNzc1RleHQpIHRhcmdldC5jc3NUZXh0ID0gc291cmNlLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvcHlQcm9wZXJ0aWVzKHNvdXJjZSwgdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmFzQXJyYXkoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmdldFByb3BlcnR5UHJpb3JpdHkobmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNsb25lUHNldWRvRWxlbWVudHMoKSB7XG4gICAgICAgICAgICAgICAgWyc6YmVmb3JlJywgJzphZnRlciddLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVQc2V1ZG9FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY2xvbmVQc2V1ZG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzZWxmLndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG9yaWdpbmFsLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2NvbnRlbnQnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCA9PT0gJycgfHwgY29udGVudCA9PT0gJ25vbmUnKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gdXRpbC51aWQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvbmUuY2xhc3NOYW1lID0gY2xvbmUuY2xhc3NOYW1lICsgJyAnICsgY2xhc3NOYW1lO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChmb3JtYXRQc2V1ZG9FbGVtZW50U3R5bGUoY2xhc3NOYW1lLCBlbGVtZW50LCBzdHlsZSkpO1xuICAgICAgICAgICAgICAgICAgICBjbG9uZS5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFBzZXVkb0VsZW1lbnRTdHlsZShjbGFzc05hbWUsIGVsZW1lbnQsIHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9ICcuJyArIGNsYXNzTmFtZSArICc6JyArIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjc3NUZXh0ID0gc3R5bGUuY3NzVGV4dCA/IGZvcm1hdENzc1RleHQoc3R5bGUpIDogZm9ybWF0Q3NzUHJvcGVydGllcyhzdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzZWxlY3RvciArICd7JyArIGNzc1RleHQgKyAnfScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRDc3NUZXh0KHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2NvbnRlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGUuY3NzVGV4dCArICcgY29udGVudDogJyArIGNvbnRlbnQgKyAnOyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdENzc1Byb3BlcnRpZXMoc3R5bGUpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlsLmFzQXJyYXkoc3R5bGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZm9ybWF0UHJvcGVydHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCc7ICcpICsgJzsnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSArICc6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShuYW1lKSA/ICcgIWltcG9ydGFudCcgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBjb3B5VXNlcklucHV0KCkge1xuICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzVGV4dEFyZWEob3JpZ2luYWwpKSBjbG9uZS5pbm5lckhUTUwgPSBvcmlnaW5hbC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0lucHV0KG9yaWdpbmFsKSkgY2xvbmUuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgb3JpZ2luYWwudmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBmaXhTdmcoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGlsLmlzU1ZHKGNsb25lKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnKTtcblxuICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc1NWR1JlY3QoY2xvbmUpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgWyd3aWR0aCcsICdoZWlnaHQnXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbG9uZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGNsb25lLnN0eWxlLnNldFByb3BlcnR5KGF0dHJpYnV0ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW1iZWRGb250cyhub2RlKSB7XG4gICAgICAgIHJldHVybiBmb250RmFjZXMucmVzb2x2ZUFsbCgpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoY3NzVGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlTm9kZSA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHN0eWxlTm9kZSk7XG4gICAgICAgICAgICAgICAgc3R5bGVOb2RlLmFwcGVuZENoaWxkKHNlbGYuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzVGV4dCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5saW5lSW1hZ2VzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGltYWdlcy5pbmxpbmVBbGwobm9kZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VTdmdEYXRhVXJpKG5vZGUsIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShub2RlKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgneG1sbnMnLCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc2VsZi53aW5kb3cuWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKG5vZGUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKHV0aWwuZXNjYXBlWGh0bWwpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoeGh0bWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwnLFxuICAgICAgICAgICAgICAgICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIicsIHdpZHRoLCAnXCIgaGVpZ2h0PVwiJywgaGVpZ2h0LCAnXCI+JyxcbiAgICAgICAgICAgICAgICAgICc8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiPicsIHhodG1sLCAnPC9mb3JlaWduT2JqZWN0PicsXG4gICAgICAgICAgICAgICAgJzwvc3ZnPiddLmpvaW4oJycpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbmV3VXRpbCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVzY2FwZTogZXNjYXBlLFxuICAgICAgICAgICAgcGFyc2VFeHRlbnNpb246IHBhcnNlRXh0ZW5zaW9uLFxuICAgICAgICAgICAgbWltZVR5cGU6IG1pbWVUeXBlLFxuICAgICAgICAgICAgZGF0YUFzVXJsOiBkYXRhQXNVcmwsXG4gICAgICAgICAgICBpc0RhdGFVcmw6IGlzRGF0YVVybCxcbiAgICAgICAgICAgIGNhbnZhc1RvQmxvYjogY2FudmFzVG9CbG9iLFxuICAgICAgICAgICAgcmVzb2x2ZVVybDogcmVzb2x2ZVVybCxcbiAgICAgICAgICAgIGdldEFuZEVuY29kZTogZ2V0QW5kRW5jb2RlLFxuICAgICAgICAgICAgdWlkOiB1aWQoKSxcbiAgICAgICAgICAgIGRlbGF5OiBkZWxheSxcbiAgICAgICAgICAgIGFzQXJyYXk6IGFzQXJyYXksXG4gICAgICAgICAgICBlc2NhcGVYaHRtbDogZXNjYXBlWGh0bWwsXG4gICAgICAgICAgICBtYWtlSW1hZ2U6IG1ha2VJbWFnZSxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuXG4gICAgICAgICAgICBpc0VsZW1lbnQsXG4gICAgICAgICAgICBpc0NhbnZhcyxcbiAgICAgICAgICAgIGlzVGV4dEFyZWEsXG4gICAgICAgICAgICBpc0lucHV0LFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBpc1NWR1JlY3QsXG4gICAgICAgICAgICBpc0ltYWdlXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gbWltZXMoKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogT25seSBXT0ZGIGFuZCBFT1QgbWltZSB0eXBlcyBmb3IgZm9udHMgYXJlICdyZWFsJ1xuICAgICAgICAgICAgICogc2VlIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWxcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgV09GRiA9ICdhcHBsaWNhdGlvbi9mb250LXdvZmYnO1xuICAgICAgICAgICAgY29uc3QgSlBFRyA9ICdpbWFnZS9qcGVnJztcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnd29mZic6IFdPRkYsXG4gICAgICAgICAgICAgICAgJ3dvZmYyJzogV09GRixcbiAgICAgICAgICAgICAgICAndHRmJzogJ2FwcGxpY2F0aW9uL2ZvbnQtdHJ1ZXR5cGUnLFxuICAgICAgICAgICAgICAgICdlb3QnOiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLFxuICAgICAgICAgICAgICAgICdwbmcnOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgICAgICAnanBnJzogSlBFRyxcbiAgICAgICAgICAgICAgICAnanBlZyc6IEpQRUcsXG4gICAgICAgICAgICAgICAgJ2dpZic6ICdpbWFnZS9naWYnLFxuICAgICAgICAgICAgICAgICd0aWZmJzogJ2ltYWdlL3RpZmYnLFxuICAgICAgICAgICAgICAgICdzdmcnOiAnaW1hZ2Uvc3ZnK3htbCdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwYXJzZUV4dGVuc2lvbih1cmwpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL1xcLihbXlxcLlxcL10qPykkL2cuZXhlYyh1cmwpO1xuICAgICAgICAgICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV07XG4gICAgICAgICAgICBlbHNlIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG1pbWVUeXBlKHVybCkge1xuICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGFyc2VFeHRlbnNpb24odXJsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG1pbWVzKClbZXh0ZW5zaW9uXSB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlzRGF0YVVybCh1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmwuc2VhcmNoKC9eKGRhdGE6KS8pICE9PSAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHRvQmxvYihjYW52YXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IHNlbGYud2luZG93LmF0b2IoY2FudmFzLnRvRGF0YVVSTCgpLnNwbGl0KCcsJylbMV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGJpbmFyeVN0cmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYmluYXJ5QXJyYXkgPSBuZXcgc2VsZi53aW5kb3cuVWludDhBcnJheShsZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgYmluYXJ5QXJyYXlbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcblxuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IHNlbGYud2luZG93LkJsb2IoW2JpbmFyeUFycmF5XSwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UvcG5nJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2FudmFzVG9CbG9iKGNhbnZhcykge1xuICAgICAgICAgICAgaWYgKGNhbnZhcy50b0Jsb2IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbnZhcy50b0Jsb2IocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0b0Jsb2IoY2FudmFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVXJsKSB7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBzZWxmLmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgpO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGRvYy5jcmVhdGVFbGVtZW50KCdiYXNlJyk7XG4gICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChiYXNlKTtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2MuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgZG9jLmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICBiYXNlLmhyZWYgPSBiYXNlVXJsO1xuICAgICAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICAgICAgcmV0dXJuIGEuaHJlZjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHVpZCgpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd1JyArIGZvdXJSYW5kb21DaGFycygpICsgaW5kZXgrKztcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZvdXJSYW5kb21DaGFycygpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYyNDg3MjIvMjUxOTM3MyAqL1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCcwMDAwJyArIChzZWxmLndpbmRvdy5NYXRoLnJhbmRvbSgpICogc2VsZi53aW5kb3cuTWF0aC5wb3coMzYsIDQpIDw8IDApLnRvU3RyaW5nKDM2KSkuc2xpY2UoLTQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtYWtlSW1hZ2UodXJpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IHNlbGYud2luZG93LkltYWdlKCk7XG4gICAgICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltYWdlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdXJpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBnZXRBbmRFbmNvZGUodXJsKSB7XG4gICAgICAgICAgbGV0IGRhdGEgPSBzZWxmLmNhY2hlLmdldCh1cmwpO1xuICAgICAgICAgIGlmKGRhdGEpIHtcbiAgICAgICAgICAgIGlmKGRhdGEuY29udGVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZGF0YS5jb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XG4gICAgICAgICAgICAgICAgaWYoZGF0YS5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEuY29udGVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGF0YS5wZW5kaW5ncy5wdXNoKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IHNlbGYuY2FjaGUucHV0KHVybCwge3BlbmRpbmdzOiBbXX0pO1xuXG4gICAgICAgICAgICBjb25zdCBUSU1FT1VUID0gMzAwMDA7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgc2VsZi53aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZG9uZTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9udGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSAnYmxvYic7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC50aW1lb3V0ID0gVElNRU9VVDtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoJ2Nhbm5vdCBmZXRjaCByZXNvdXJjZTogJyArIHVybCArICcsIHN0YXR1czogJyArIHJlcXVlc3Quc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgc2VsZi53aW5kb3cuRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGVudCA9IGVuY29kZXIucmVzdWx0LnNwbGl0KC8sLylbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHJlc29sdmUgb2YgZGF0YS5wZW5kaW5ncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBlbmRpbmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGVuY29kZXIucmVhZEFzRGF0YVVSTChyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0aW1lb3V0KCkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKCd0aW1lb3V0IG9mICcgKyBUSU1FT1VUICsgJ21zIG9jY3VyZWQgd2hpbGUgZmV0Y2hpbmcgcmVzb3VyY2U6ICcgKyB1cmwpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZhaWwobWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkYXRhQXNVcmwoY29udGVudCwgdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIFsnZGF0YTonLHR5cGUsJztiYXNlNjQsJyxjb250ZW50XS5qb2luKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvKFsuKis/XiR7fSgpfFxcW1xcXVxcL1xcXFxdKS9nLCAnXFxcXCQxJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkZWxheShtcykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFyZyk7XG4gICAgICAgICAgICAgICAgICAgIH0sIG1zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhc0FycmF5KGFycmF5TGlrZSkge1xuICAgICAgICAgICAgY29uc3QgYXJyYXkgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5TGlrZS5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSBhcnJheS5wdXNoKGFycmF5TGlrZVtpXSk7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBlc2NhcGVYaHRtbChzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvKCN8XFxuKS9nLCAoYyk9PiBjPT09JyMnPyAnJTIzJzogJyUwQScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gd2lkdGgobm9kZSkge1xuICAgICAgICAgICAgY29uc3QgbGVmdEJvcmRlciA9IHB4KG5vZGUsICdib3JkZXItbGVmdC13aWR0aCcpO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRCb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJyk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5zY3JvbGxXaWR0aCArIGxlZnRCb3JkZXIgKyByaWdodEJvcmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGhlaWdodChub2RlKSB7XG4gICAgICAgICAgICBjb25zdCB0b3BCb3JkZXIgPSBweChub2RlLCAnYm9yZGVyLXRvcC13aWR0aCcpO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tQm9yZGVyID0gcHgobm9kZSwgJ2JvcmRlci1ib3R0b20td2lkdGgnKTtcbiAgICAgICAgICAgIHJldHVybiBub2RlLnNjcm9sbEhlaWdodCArIHRvcEJvcmRlciArIGJvdHRvbUJvcmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHB4KG5vZGUsIHN0eWxlUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc2VsZi53aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUucmVwbGFjZSgncHgnLCAnJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LkVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc0NhbnZhcyhub2RlKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBzZWxmLndpbmRvdy5IVE1MQ2FudmFzRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlzVGV4dEFyZWEobm9kZSkge1xuICAgICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2Ygc2VsZi53aW5kb3cuSFRNTFRleHRBcmVhRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlzSW5wdXQobm9kZSkge1xuICAgICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2Ygc2VsZi53aW5kb3cuSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlzU1ZHKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LlNWR0VsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc1NWR1JlY3Qobm9kZSkge1xuICAgICAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2Ygc2VsZi53aW5kb3cuU1ZHUmVjdEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpc0ltYWdlKG5vZGUpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIHNlbGYud2luZG93LkhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXdJbmxpbmVyKCkge1xuICAgICAgICBjb25zdCBVUkxfUkVHRVggPSAvdXJsXFwoWydcIl0/KFteJ1wiXSs/KVsnXCJdP1xcKS9nO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmxpbmVBbGw6IGlubGluZUFsbCxcbiAgICAgICAgICAgIHNob3VsZFByb2Nlc3M6IHNob3VsZFByb2Nlc3MsXG4gICAgICAgICAgICBpbXBsOiB7XG4gICAgICAgICAgICAgICAgcmVhZFVybHM6IHJlYWRVcmxzLFxuICAgICAgICAgICAgICAgIGlubGluZTogaW5saW5lXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gc2hvdWxkUHJvY2VzcyhzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuc2VhcmNoKFVSTF9SRUdFWCkgIT09IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZFVybHMoc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGxldCBtYXRjaDtcbiAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBVUkxfUkVHRVguZXhlYyhzdHJpbmcpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIXV0aWwuaXNEYXRhVXJsKHVybCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlubGluZShzdHJpbmcsIHVybCwgYmFzZVVybCwgZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVybClcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlVXJsID8gdXRpbC5yZXNvbHZlVXJsKHVybCwgYmFzZVVybCkgOiB1cmw7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbihnZXQgfHwgdXRpbC5nZXRBbmRFbmNvZGUpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwuZGF0YUFzVXJsKGRhdGEsIHV0aWwubWltZVR5cGUodXJsKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YVVybCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodXJsQXNSZWdleCh1cmwpLCBbJyQxJywgZGF0YVVybCwgJyQzJ10uam9pbignJykpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiB1cmxBc1JlZ2V4KHVybCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc2VsZi53aW5kb3cuUmVnRXhwKFsnKHVybFxcXFwoW1xcJ1wiXT8pKCcsIHV0aWwuZXNjYXBlKHVybCksICcpKFtcXCdcIl0/XFxcXCkpJ10uam9pbignJyksICdnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbmxpbmVBbGwoc3RyaW5nLCBiYXNlVXJsLCBnZXQpIHtcbiAgICAgICAgICAgIGlmIChub3RoaW5nVG9JbmxpbmUoKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdHJpbmcpO1xuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0cmluZylcbiAgICAgICAgICAgICAgICAudGhlbihyZWFkVXJscylcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodXJscykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG9uZSA9IFByb21pc2UucmVzb2x2ZShzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICB1cmxzLmZvckVhY2goZnVuY3Rpb24gKHVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IGRvbmUudGhlbihmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZShzdHJpbmcsIHVybCwgYmFzZVVybCwgZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG5vdGhpbmdUb0lubGluZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIXNob3VsZFByb2Nlc3Moc3RyaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5ld0ZvbnRGYWNlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc29sdmVBbGw6IHJlc29sdmVBbGwsXG4gICAgICAgICAgICBpbXBsOiB7XG4gICAgICAgICAgICAgICAgcmVhZEFsbDogcmVhZEFsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlc29sdmVBbGwoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZEFsbChzZWxmLmRvY3VtZW50KVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICh3ZWJGb250cykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWJGb250cy5tYXAoZnVuY3Rpb24gKHdlYkZvbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2ViRm9udC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGNzc1N0cmluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNzc1N0cmluZ3Muam9pbignXFxuJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZWFkQWxsKCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1dGlsLmFzQXJyYXkoc2VsZi5kb2N1bWVudC5zdHlsZVNoZWV0cykpXG4gICAgICAgICAgICAgICAgLnRoZW4oZ2V0Q3NzUnVsZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oc2VsZWN0V2ViRm9udFJ1bGVzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVsZXMubWFwKG5ld1dlYkZvbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBzZWxlY3RXZWJGb250UnVsZXMoY3NzUnVsZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3NzUnVsZXNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGUudHlwZSA9PT0gQ1NTUnVsZS5GT05UX0ZBQ0VfUlVMRTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZXIuc2hvdWxkUHJvY2VzcyhydWxlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3NyYycpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldENzc1J1bGVzKHN0eWxlU2hlZXRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3NzUnVsZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBzdHlsZVNoZWV0cy5mb3JFYWNoKGZ1bmN0aW9uIChzaGVldCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5hc0FycmF5KHNoZWV0LmNzc1J1bGVzIHx8IFtdKS5mb3JFYWNoKGNzc1J1bGVzLnB1c2guYmluZChjc3NSdWxlcykpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3Igd2hpbGUgcmVhZGluZyBDU1MgcnVsZXMgZnJvbSAnICsgc2hlZXQuaHJlZiwgZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBjc3NSdWxlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gbmV3V2ViRm9udCh3ZWJGb250UnVsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gKHdlYkZvbnRSdWxlLnBhcmVudFN0eWxlU2hlZXQgfHwge30pLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lci5pbmxpbmVBbGwod2ViRm9udFJ1bGUuY3NzVGV4dCwgYmFzZVVybCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlYkZvbnRSdWxlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3NyYycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5ld0ltYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlubGluZUFsbDogaW5saW5lQWxsLFxuICAgICAgICAgICAgaW1wbDoge1xuICAgICAgICAgICAgICAgIG5ld0ltYWdlOiBuZXdJbWFnZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIG5ld0ltYWdlKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5saW5lOiBpbmxpbmVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlubGluZShnZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0RhdGFVcmwoZWxlbWVudC5zcmMpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVsZW1lbnQuc3JjKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihnZXQgfHwgdXRpbC5nZXRBbmRFbmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5kYXRhQXNVcmwoZGF0YSwgdXRpbC5taW1lVHlwZShlbGVtZW50LnNyYykpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YVVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm9ubG9hZCA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc3JjID0gZGF0YVVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGlubGluZUFsbChub2RlKSB7XG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNFbGVtZW50KG5vZGUpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5vZGUpO1xuXG4gICAgICAgICAgICByZXR1cm4gaW5saW5lQmFja2dyb3VuZChub2RlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNJbWFnZShub2RlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdJbWFnZShub2RlKS5pbmxpbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuYXNBcnJheShub2RlLmNoaWxkTm9kZXMpLm1hcChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlubGluZUFsbChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlubGluZUJhY2tncm91bmQobm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmQgPSBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQnKTtcblxuICAgICAgICAgICAgICAgIGlmICghYmFja2dyb3VuZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShub2RlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBpbmxpbmVyLmlubGluZUFsbChiYWNrZ3JvdW5kKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoaW5saW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoJ2JhY2tncm91bmQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Eb20ySW1hZ2UuanMiLCJpbXBvcnQgeyQsIFRIUkVFfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYWcge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYywgdmlzdWFsV29ybGQpIHtcclxuICAgIHRoaXMud25kID0gd25kO1xyXG4gICAgdGhpcy5kb2MgPSBkb2M7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbFdvcmxkO1xyXG4gICAgdGhpcy5jb29yZHMgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gICAgdGhpcy5pbnRlcnNlY3Rpb24gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIgPSB0aGlzLnZpc3VhbC5yYXljYXN0ZXI7XHJcbiAgICB0aGlzLmNhbWVyYSA9IHRoaXMudmlzdWFsLmNhbWVyYTtcclxuICAgIHRoaXMucGxhbmUgPSBuZXcgVEhSRUUuUGxhbmUoKTtcclxuICAgIHRoaXMudGhyZWVzID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcclxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLmNvbnRyb2xzU3RhdGUgPSB0aGlzLnZpc3VhbC5nZXRDb250cm9sc1N0YXRlKCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy52aXN1YWwuZWxlbWVudDtcclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIG9uTW91c2VNb3ZlOiB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyksXHJcbiAgICAgIG9uTW91c2VEb3duOiB0aGlzLm9uTW91c2VEb3duLmJpbmQodGhpcyksXHJcbiAgICAgIG9uTW91c2VVcDogdGhpcy5vbk1vdXNlVXAuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgICQodGhpcy5lbGVtZW50KS5vbignbW91c2Vtb3ZlJywgdGhpcy5iaW5kcy5vbk1vdXNlTW92ZSk7XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub24oJ21vdXNlZG93bicsIHRoaXMuYmluZHMub25Nb3VzZURvd24pO1xyXG4gICAgJCh0aGlzLmRvYykub24oJ21vdXNldXAnLCB0aGlzLmJpbmRzLm9uTW91c2VVcCk7XHJcbiAgfVxyXG5cclxuICBhZGRUaHJlZSh0aHJlZSkge1xyXG4gICAgdGhpcy50aHJlZXMucHVzaCh0aHJlZSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVUaHJlZSh0aHJlZSkge1xyXG4gICAgY29uc3QgaSA9IHRoaXMudGhyZWVzLmluZGV4T2YodGhyZWUpO1xyXG4gICAgaWYofmkpIHtcclxuICAgICAgdGhpcy50aHJlZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QaWNrQ2FsbGJhY2soKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uRHJhZ0NhbGxiYWNrKCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBvblJlbGVhc2VDYWxsYmFjaygpIHtcclxuXHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgJCh0aGlzLmVsZW1lbnQpLm9mZignbW91c2Vtb3ZlJywgdGhpcy5iaW5kcy5vbk1vdXNlTW92ZSk7XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub2ZmKCdtb3VzZWRvd24nLCB0aGlzLmJpbmRzLm9uTW91c2VEb3duKTtcclxuICAgICQodGhpcy5kb2MpLm9mZignbW91c2V1cCcsIHRoaXMuYmluZHMub25Nb3VzZVVwKTtcclxuICB9XHJcblxyXG4gIHNldENvb3Jkc0Zyb21FdmVudChlKSB7XHJcbiAgICBjb25zdCBqRWxlbWVudCA9ICQodGhpcy5lbGVtZW50KTtcclxuICAgIGNvbnN0IG9mZnNldCA9IGpFbGVtZW50Lm9mZnNldCgpO1xyXG4gICAgdGhpcy5jb29yZHMueCA9ICgoZS5wYWdlWC1vZmZzZXQubGVmdCkvakVsZW1lbnQud2lkdGgoKSkqMi0xO1xyXG4gICAgdGhpcy5jb29yZHMueSA9IC0oKGUucGFnZVktb2Zmc2V0LnRvcCkvakVsZW1lbnQuaGVpZ2h0KCkpKjIrMTtcclxuICAgIHJldHVybiB0aGlzLmNvb3JkcztcclxuICB9XHJcblxyXG4gIG9uTW91c2VEb3duKGUpIHtcclxuICAgIGlmKCF0aGlzLmVuYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBpZih0aGlzLnNlbGVjdGVkKSB0aGlzLm9uTW91c2VVcChlKTtcclxuXHJcbiAgICB0aGlzLnNldENvb3Jkc0Zyb21FdmVudChlKTtcclxuICBcdHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5jb29yZHMsIHRoaXMuY2FtZXJhKTtcclxuXHJcbiAgXHRjb25zdCBpbnRlcnNlY3RzID0gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyh0aGlzLnRocmVlcyk7XHJcbiAgXHRpZihpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBpbnRlcnNlY3RzWzBdLm9iamVjdDtcclxuICAgICAgaWYoIXRoaXMub25QaWNrQ2FsbGJhY2soaW50ZXJzZWN0c1swXSkpIHJldHVybjtcclxuICAgICAgY29uc3QgdiA9IGludGVyc2VjdHNbMF0ucG9pbnQuY2xvbmUoKTtcclxuICAgICAgdGhpcy5kaXN0YW5jZSA9IHYuc3ViKHRoaXMucmF5Y2FzdGVyLnJheS5vcmlnaW4pLmxlbmd0aCgpOztcclxuICAgICAgdGhpcy5jb250cm9sc1N0YXRlID0gdGhpcy52aXN1YWwuZ2V0Q29udHJvbHNTdGF0ZSgpO1xyXG4gICAgICB0aGlzLnZpc3VhbC5zZXRDb250cm9sc1N0YXRlKGZhbHNlKTtcclxuICAgICAgdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCh0aGlzLnZpc3VhbC5jYW1lcmEuZ2V0V29ybGREaXJlY3Rpb24odGhpcy5wbGFuZS5ub3JtYWwpLCBpbnRlcnNlY3RzWzBdLnBvaW50KTtcclxuICAgICAgLy90aGlzLnBsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHRoaXMucGxhbmUubm9ybWFsLnNldCgwLDAsMSksIG5ldyBUSFJFRS5WZWN0b3IzKDAsMCwwKSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcclxuICBcdH1cclxuXHJcbiAgfVxyXG5cclxuICBvbk1vdXNlTW92ZShlKSB7XHJcbiAgICBpZighdGhpcy5lbmFibGVkKSByZXR1cm47XHJcbiAgXHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gIFx0aWYodGhpcy5zZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLnNldENvb3Jkc0Zyb21FdmVudChlKTtcclxuICAgIFx0dGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLmNvb3JkcywgdGhpcy5jYW1lcmEpO1xyXG5cdCAgICBpZih0aGlzLnJheWNhc3Rlci5yYXkuaW50ZXJzZWN0UGxhbmUodGhpcy5wbGFuZSwgdGhpcy5pbnRlcnNlY3Rpb24pKSB7XHJcbiAgICAgICAgaWYoIXRoaXMub25EcmFnQ2FsbGJhY2sodGhpcy5pbnRlcnNlY3Rpb24pKSB0aGlzLm9uTW91c2VVcChlKTtcclxuICAgICAgfS8qKi9cclxuICAgICAgLy90aGlzLmludGVyc2VjdGlvbi5jb3B5KHRoaXMucmF5Y2FzdGVyLnJheS5kaXJlY3Rpb24pLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuZGlzdGFuY2UpLmFkZCh0aGlzLnJheWNhc3Rlci5yYXkub3JpZ2luKTsvKiovXHJcbiAgICAgIC8vaWYoIXRoaXMub25EcmFnQ2FsbGJhY2sodGhpcy5zZWxlY3RlZCwgdGhpcy5pbnRlcnNlY3Rpb24pKSB0aGlzLm9uTW91c2VVcChlKTtcclxuICBcdH1cclxuICB9XHJcblxyXG4gIG9uTW91c2VVcChlKSB7XHJcbiAgICBpZih0aGlzLnNlbGVjdGVkKSB7XHJcbiAgICAgIHRoaXMub25SZWxlYXNlQ2FsbGJhY2soKTtcclxuICBcdFx0dGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgIHRoaXMudmlzdWFsLnNldENvbnRyb2xzU3RhdGUodGhpcy5jb250cm9sc1N0YXRlKTtcclxuICBcdH1cclxuICAgIGlmKCF0aGlzLmVuYWJsZWQpIHJldHVybjtcclxuICBcdGUucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0RyYWcuanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5yZXF1aXJlKCdpbXBvcnRzLWxvYWRlcj9kZWZpbmU9PmZhbHNlIWpxdWVyeS1tb3VzZXdoZWVsJykoJCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFdmVudHNUb0FjdGlvbnMge1xyXG5cclxuICBzdGF0aWMgbW9kS2V5cyA9IHtcclxuICAgIEN0cmw6IDEsXHJcbiAgICBTaGlmdDogMixcclxuICAgIEFsdDogNFxyXG4gIH07XHJcblxyXG4gIHN0YXRpYyBtb3VzZUJ1dHRvbnMgPSB7XHJcbiAgICBMZWZ0OiAwLFxyXG4gICAgTWlkZGxlOiAxLFxyXG4gICAgUmlnaHQ6IDJcclxuICB9O1xyXG5cclxuICBzdGF0aWMgZ2V0RXZlbnRGbGFncyhlKSB7XHJcbiAgICByZXR1cm4gZS5jdHJsS2V5PDwwIHwgZS5zaGlmdEtleTw8MSB8IGUuYWx0S2V5PDwyO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFBvc2l0aW9uKHRvdWNoZXMpIHtcclxuICAgIGxldCB4LCB5O1xyXG4gICAgaWYodG91Y2hlcy5sZW5ndGg9PT0yKSB7XHJcbiAgICAgIHggPSB0b3VjaGVzWzFdLnBhZ2VYLXRvdWNoZXNbMF0ucGFnZVg7XHJcbiAgICAgIHkgPSB0b3VjaGVzWzFdLnBhZ2VZLXRvdWNoZXNbMF0ucGFnZVk7XHJcbiAgICAgIHkgPSAtTWF0aC5zcXJ0KHgqeCt5KnkpO1xyXG4gICAgICB4ID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB4ID0gdG91Y2hlc1swXS5wYWdlWDtcclxuICAgICAgeSA9IHRvdWNoZXNbMF0ucGFnZVk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4LFxyXG4gICAgICB5XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgYWN0aW9ucykge1xyXG4gICAgdGhpcy5hY3Rpb25zID0gYWN0aW9ucyB8fCB7fTtcclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB0aGlzLmRvYyA9IGVsZW1lbnRbMF0ub3duZXJEb2N1bWVudDtcclxuICAgIHRoaXMud25kID0gdGhpcy5kb2MuZGVmYXVsdFZpZXc7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuYmluZHMgPSB7XHJcbiAgICAgIGNvbnRleHRNZW51OiB0aGlzLmNvbnRleHRNZW51LmJpbmQodGhpcyksXHJcblxyXG4gICAgICBtb3VzZURvd246IHRoaXMubW91c2VEb3duLmJpbmQodGhpcyksXHJcbiAgICAgIG1vdXNlTW92ZTogdGhpcy5tb3VzZU1vdmUuYmluZCh0aGlzKSxcclxuICAgICAgbW91c2VVcDogdGhpcy5tb3VzZVVwLmJpbmQodGhpcyksXHJcbiAgICAgIG1vdXNlV2hlZWw6IHRoaXMubW91c2VXaGVlbC5iaW5kKHRoaXMpLFxyXG5cclxuICAgICAgbW91c2VNb3ZlRG9jOiB0aGlzLm1vdXNlTW92ZURvYy5iaW5kKHRoaXMpLFxyXG4gICAgICBtb3VzZVVwRG9jOiB0aGlzLm1vdXNlVXBEb2MuYmluZCh0aGlzKSxcclxuXHJcbiAgICAgIGNsaWNrOiB0aGlzLmNsaWNrLmJpbmQodGhpcyksXHJcbiAgICAgIGRibGNsaWNrOiB0aGlzLmRibGNsaWNrLmJpbmQodGhpcyksXHJcblxyXG4gICAgICB0b3VjaFN0YXJ0OiB0aGlzLnRvdWNoU3RhcnQuYmluZCh0aGlzKSxcclxuICAgICAgdG91Y2hNb3ZlOiB0aGlzLnRvdWNoTW92ZS5iaW5kKHRoaXMpLFxyXG4gICAgICB0b3VjaEVuZDogdGhpcy50b3VjaEVuZC5iaW5kKHRoaXMpLFxyXG5cclxuICAgICAga2V5RG93bjogdGhpcy5rZXlEb3duLmJpbmQodGhpcyksXHJcbiAgICAgIGtleVByZXNzOiB0aGlzLmtleVByZXNzLmJpbmQodGhpcyksXHJcbiAgICAgIGtleVVwOiB0aGlzLmtleVVwLmJpbmQodGhpcylcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCdjb250ZXh0bWVudScsIHRoaXMuYmluZHMuY29udGV4dE1lbnUpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudC5vbignbW91c2Vkb3duJywgdGhpcy5iaW5kcy5tb3VzZURvd24pO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRzLm1vdXNlTW92ZSk7XHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ21vdXNldXAnLCB0aGlzLmJpbmRzLm1vdXNlVXApO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCdtb3VzZXdoZWVsJywgdGhpcy5iaW5kcy5tb3VzZVdoZWVsKTtcclxuXHJcbiAgICAkKHRoaXMuZG9jKS5vbignbW91c2Vtb3ZlJywgdGhpcy5iaW5kcy5tb3VzZU1vdmVEb2MpO1xyXG4gICAgJCh0aGlzLmRvYykub24oJ21vdXNldXAnLCB0aGlzLmJpbmRzLm1vdXNlVXBEb2MpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudC5vbignY2xpY2snLCB0aGlzLmJpbmRzLmNsaWNrKTtcclxuICAgIHRoaXMuZWxlbWVudC5vbignZGJsY2xpY2snLCB0aGlzLmJpbmRzLmRibGNsaWNrKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ3RvdWNoc3RhcnQnLCB0aGlzLmJpbmRzLnRvdWNoU3RhcnQpO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9uKCd0b3VjaG1vdmUnLCB0aGlzLmJpbmRzLnRvdWNoTW92ZSk7XHJcbiAgICB0aGlzLmVsZW1lbnQub24oJ3RvdWNoZW5kJywgdGhpcy5iaW5kcy50b3VjaEVuZCk7XHJcblxyXG4gICAgJCh0aGlzLnduZCkub24oJ2tleWRvd24nLCB0aGlzLmJpbmRzLmtleURvd24pO1xyXG4gICAgJCh0aGlzLnduZCkub24oJ2tleXByZXNzJywgdGhpcy5iaW5kcy5rZXlQcmVzcyk7XHJcbiAgICAkKHRoaXMud25kKS5vbigna2V5dXAnLCB0aGlzLmJpbmRzLmtleVVwKTtcclxuICB9XHJcblxyXG4gIGFkZEFjdGlvbihhY3Rpb24sIHR5cGUsIGNvZGUsIGZsYWdzKSB7XHJcbiAgICB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYoIXRoaXMuYWN0aW9uc1t0eXBlXSkge1xyXG4gICAgICB0aGlzLmFjdGlvbnNbdHlwZV0gPSB7fTtcclxuICAgIH1cclxuICAgIGlmKCF0aGlzLmFjdGlvbnNbdHlwZV1bY29kZV0pIHtcclxuICAgICAgdGhpcy5hY3Rpb25zW3R5cGVdW2NvZGVdID0ge31cclxuICAgIH1cclxuICAgIGlmKCF0aGlzLmFjdGlvbnNbdHlwZV1bY29kZV1bZmxhZ3NdKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uc1t0eXBlXVtjb2RlXVtmbGFnc10gPSBbXTtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aW9uc1t0eXBlXVtjb2RlXVtmbGFnc10ucHVzaChhY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWN0aW9ucyh0eXBlLCBjb2RlLCBmbGFncykge1xyXG4gICAgcmV0dXJuICgodGhpcy5hY3Rpb25zW3R5cGVdIHx8IHt9KVtjb2RlXSB8fCB7fSlbZmxhZ3NdIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgZmlyZUFjdGlvbnMoYWN0aW9ucywgZSwgZGF0YSkge1xyXG4gICAgZm9yKGxldCBhY3Rpb24gb2YgYWN0aW9ucykge1xyXG4gICAgICBhY3Rpb24oZSwgZGF0YSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb250ZXh0TWVudShlKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKTtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnMoJ2NvbnRleHRtZW51JywgZS5idXR0b24sIGZsYWdzKSwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZURvd24oZSkge1xyXG4gICAgaWYodGhpcy5waWNrZWQpIHtcclxuICAgICAgdGhpcy5tb3VzZVVwRG9jKCk7XHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKTtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnMoJ21vdXNlZG93bicsIGUuYnV0dG9uLCBmbGFncyksIGUpO1xyXG4gICAgICB0aGlzLnBpY2tlZCA9IHtcclxuICAgICAgICB4OiBlLnBhZ2VYLFxyXG4gICAgICAgIHk6IGUucGFnZVksXHJcbiAgICAgICAgYWN0aW9uczogdGhpcy5nZXRBY3Rpb25zKCdtb3VzZWRyYWcnLCBlLmJ1dHRvbiwgZmxhZ3MpXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5waWNrZWQuYWN0aW9ucywgZSwge1xyXG4gICAgICAgIHN0YXRlOiAnc3RhcnQnXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VNb3ZlKGUpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpO1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucygnbW91c2Vtb3ZlJywgZS5idXR0b24sIGZsYWdzKSwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZU1vdmVEb2MoZSkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkICYmIHRoaXMucGlja2VkKSB7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5waWNrZWQuYWN0aW9ucywgZSwge1xyXG4gICAgICAgIHN0YXRlOiAnbW92ZScsXHJcbiAgICAgICAgZHg6IGUucGFnZVgtdGhpcy5waWNrZWQueCxcclxuICAgICAgICBkeTogZS5wYWdlWS10aGlzLnBpY2tlZC55XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnBpY2tlZCA9IHtcclxuICAgICAgICB4OiBlLnBhZ2VYLFxyXG4gICAgICAgIHk6IGUucGFnZVksXHJcbiAgICAgICAgYWN0aW9uczogdGhpcy5waWNrZWQuYWN0aW9uc1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbW91c2VVcChlKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKTtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnMoJ21vdXNldXAnLCBlLmJ1dHRvbiwgZmxhZ3MpLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1vdXNlVXBEb2MoZSkge1xyXG4gICAgaWYodGhpcy5waWNrZWQpIHtcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLnBpY2tlZC5hY3Rpb25zLCBlLCB7XHJcbiAgICAgICAgc3RhdGU6ICdlbmQnXHJcbiAgICAgIH0pO1xyXG4gICAgICBkZWxldGUgdGhpcy5waWNrZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZVdoZWVsKGUpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCkge1xyXG4gICAgICBjb25zdCBmbGFncyA9IEV2ZW50c1RvQWN0aW9ucy5nZXRFdmVudEZsYWdzKGUpO1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMuZ2V0QWN0aW9ucygnbW91c2V3aGVlbCcsIDAsIGZsYWdzKSwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGlja3MoZSwgdHlwZSkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSk7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKHR5cGUsIGUuYnV0dG9uLCBmbGFncyksIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xpY2soZSkge1xyXG4gICAgdGhpcy5jbGlja3MoZSwgJ2NsaWNrJyk7XHJcbiAgfVxyXG5cclxuICBkYmxjbGljayhlKSB7XHJcbiAgICB0aGlzLmNsaWNrcyhlLCAnZGJsY2xpY2snKTtcclxuICB9XHJcblxyXG4gIHRvdWNoUGljayhlLCBmbGFncywgdG91Y2hlcykge1xyXG4gICAgdGhpcy50b3VjaFBpY2tlZCA9IHtcclxuICAgICAgLi4uRXZlbnRzVG9BY3Rpb25zLmdldFBvc2l0aW9uKHRvdWNoZXMpLFxyXG4gICAgICBhY3Rpb25zOiB0aGlzLmdldEFjdGlvbnMoJ3RvdWNoZHJhZycsIHRvdWNoZXMubGVuZ3RoLCBmbGFncyksXHJcbiAgICAgIGNvZGU6IHRvdWNoZXMubGVuZ3RoLFxyXG4gICAgICBmbGFnc1xyXG4gICAgfTtcclxuICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy50b3VjaFBpY2tlZC5hY3Rpb25zLCBlLCB7XHJcbiAgICAgIHN0YXRlOiAnc3RhcnQnXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvdWNoU3RhcnQoZSkge1xyXG4gICAgaWYodGhpcy50b3VjaFBpY2tlZCkge1xyXG4gICAgICB0aGlzLnRvdWNoRW5kKGUpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSksIHRvdWNoZXMgPSBlLnRvdWNoZXMgfHwgZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKCd0b3VjaHN0YXJ0JywgdG91Y2hlcy5sZW5ndGgsIGZsYWdzKSwgZSk7XHJcbiAgICAgIHRoaXMudG91Y2hQaWNrKGUsIGZsYWdzLCB0b3VjaGVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvdWNoTW92ZShlKSB7XHJcbiAgICBpZih0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgY29uc3QgZmxhZ3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0RXZlbnRGbGFncyhlKSwgdG91Y2hlcyA9IGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcztcclxuICAgICAgdGhpcy5maXJlQWN0aW9ucyh0aGlzLmdldEFjdGlvbnMoJ3RvdWNobW92ZScsIHRvdWNoZXMubGVuZ3RoLCBmbGFncyksIGUpO1xyXG4gICAgICBpZih0aGlzLnRvdWNoUGlja2VkKSB7XHJcbiAgICAgICAgaWYodGhpcy50b3VjaFBpY2tlZC5jb2RlPT09dG91Y2hlcy5sZW5ndGggJiYgdGhpcy50b3VjaFBpY2tlZC5mbGFncz09PWZsYWdzKSB7XHJcbiAgICAgICAgICBjb25zdCBwb3MgPSBFdmVudHNUb0FjdGlvbnMuZ2V0UG9zaXRpb24odG91Y2hlcyk7XHJcbiAgICAgICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMudG91Y2hQaWNrZWQuYWN0aW9ucywgZSwge1xyXG4gICAgICAgICAgICBzdGF0ZTogJ21vdmUnLFxyXG4gICAgICAgICAgICBkeDogcG9zLngtdGhpcy50b3VjaFBpY2tlZC54LFxyXG4gICAgICAgICAgICBkeTogcG9zLnktdGhpcy50b3VjaFBpY2tlZC55XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMudG91Y2hQaWNrZWQgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMudG91Y2hQaWNrZWQsXHJcbiAgICAgICAgICAgIC4uLnBvc1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRvdWNoRW5kKGUpO1xyXG4gICAgICAgICAgdGhpcy50b3VjaFBpY2soZSwgZmxhZ3MsIHRvdWNoZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG91Y2hFbmQoZSkge1xyXG4gICAgaWYodGhpcy50b3VjaFBpY2tlZCkge1xyXG4gICAgICB0aGlzLmZpcmVBY3Rpb25zKHRoaXMudG91Y2hQaWNrZWQuYWN0aW9ucywgZSwge1xyXG4gICAgICAgIHN0YXRlOiAnZW5kJ1xyXG4gICAgICB9KTtcclxuICAgICAgZGVsZXRlIHRoaXMudG91Y2hQaWNrZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBrZXkoZSwgdHlwZSkge1xyXG4gICAgaWYodGhpcy5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IGZsYWdzID0gRXZlbnRzVG9BY3Rpb25zLmdldEV2ZW50RmxhZ3MoZSk7XHJcbiAgICAgIHRoaXMuZmlyZUFjdGlvbnModGhpcy5nZXRBY3Rpb25zKHR5cGUsIGUua2V5Q29kZSwgZmxhZ3MpLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGtleURvd24oZSkge1xyXG4gICAgdGhpcy5rZXkoZSwgJ2tleWRvd24nKTtcclxuICB9XHJcblxyXG4gIGtleVByZXNzKGUpIHtcclxuICAgIHRoaXMua2V5KGUsICdrZXlwcmVzcycpO1xyXG4gIH1cclxuXHJcbiAga2V5VXAoZSkge1xyXG4gICAgdGhpcy5rZXkoZSwgJ2tleXVwJyk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5lbGVtZW50Lm9mZignY29udGV4dG1lbnUnLCB0aGlzLmJpbmRzLmNvbnRleHRNZW51KTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCdtb3VzZWRvd24nLCB0aGlzLmJpbmRzLm1vdXNlRG93bik7XHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLmJpbmRzLm1vdXNlTW92ZSk7XHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5tb3VzZVVwKTtcclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ21vdXNld2hlZWwnLCB0aGlzLmJpbmRzLm1vdXNlV2hlZWwpO1xyXG5cclxuICAgICQodGhpcy5kb2MpLm9mZignbW91c2Vtb3ZlJywgdGhpcy5iaW5kcy5tb3VzZU1vdmVEb2MpO1xyXG4gICAgJCh0aGlzLmRvYykub2ZmKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5tb3VzZVVwRG9jKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCdjbGljaycsIHRoaXMuYmluZHMuY2xpY2spO1xyXG4gICAgdGhpcy5lbGVtZW50Lm9mZignZGJsY2xpY2snLCB0aGlzLmJpbmRzLmRibGNsaWNrKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnQub2ZmKCd0b3VjaHN0YXJ0JywgdGhpcy5iaW5kcy50b3VjaFN0YXJ0KTtcclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuYmluZHMudG91Y2hNb3ZlKTtcclxuICAgIHRoaXMuZWxlbWVudC5vZmYoJ3RvdWNoZW5kJywgdGhpcy5iaW5kcy50b3VjaEVuZCk7XHJcblxyXG4gICAgJCh0aGlzLnduZCkub2ZmKCdrZXlkb3duJywgdGhpcy5iaW5kcy5rZXlEb3duKTtcclxuICAgICQodGhpcy53bmQpLm9mZigna2V5cHJlc3MnLCB0aGlzLmJpbmRzLmtleVByZXNzKTtcclxuICAgICQodGhpcy53bmQpLm9mZigna2V5dXAnLCB0aGlzLmJpbmRzLmtleVVwKTtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0V2ZW50c1RvQWN0aW9ucy5qcyIsIlxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGdWxsU2NyZWVuIHtcclxuXHJcblx0c3RhdGljIF9oYXNXZWJraXRGdWxsU2NyZWVuXHQ9ICEhZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbjtcclxuXHRzdGF0aWMgX2hhc01vekZ1bGxTY3JlZW5cdD0gISFkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuO1xyXG5cdHN0YXRpYyBfaGFzTXNGdWxsc2NyZWVuID0gISFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbjtcclxuXHJcblx0c3RhdGljIGF2YWlsYWJsZSgpIHtcclxuXHRcdHJldHVybiBGdWxsU2NyZWVuLl9oYXNXZWJraXRGdWxsU2NyZWVuIHx8IEZ1bGxTY3JlZW4uX2hhc01vekZ1bGxTY3JlZW4gfHwgRnVsbFNjcmVlbi5faGFzTXNGdWxsc2NyZWVuO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGFjdGl2YXRlZCgpIHtcclxuXHRcdGlmKEZ1bGxTY3JlZW4uX2hhc1dlYmtpdEZ1bGxTY3JlZW4pIHtcclxuXHRcdFx0cmV0dXJuIGRvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbjtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYoRnVsbFNjcmVlbi5faGFzTW96RnVsbFNjcmVlbikge1xyXG5cdFx0XHRyZXR1cm4gZG9jdW1lbnQubW96RnVsbFNjcmVlbjtcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYoRnVsbFNjcmVlbi5faGFzTXNGdWxsc2NyZWVuKSB7XHJcblx0XHRcdHJldHVybiAhIWRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQ7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5hc3NlcnQoZmFsc2UpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c3RhdGljIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgaGFuZGxlcikge1xyXG5cdFx0aWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikge1xyXG5cdFx0ICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcclxuXHRcdCAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblx0XHQgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgaGFuZGxlciwgZmFsc2UpO1xyXG5cdFx0ICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignTVNGdWxsc2NyZWVuQ2hhbmdlJywgaGFuZGxlciwgZmFsc2UpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c3RhdGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgaGFuZGxlcikge1xyXG5cdFx0aWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xyXG5cdFx0ICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsIGhhbmRsZXIsIGZhbHNlKTtcclxuXHRcdCAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XHJcblx0XHQgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgaGFuZGxlciwgZmFsc2UpO1xyXG5cdFx0ICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignTVNGdWxsc2NyZWVuQ2hhbmdlJywgaGFuZGxlciwgZmFsc2UpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c3RhdGljIHJlcXVlc3QoZWxlbWVudCkge1xyXG5cdFx0ZWxlbWVudFx0PSBlbGVtZW50XHR8fCBkb2N1bWVudC5ib2R5O1xyXG5cdFx0aWYoRnVsbFNjcmVlbi5faGFzV2Via2l0RnVsbFNjcmVlbikge1xyXG5cdFx0XHRlbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKEZ1bGxTY3JlZW4uX2hhc01vekZ1bGxTY3JlZW4pIHtcclxuXHRcdFx0ZWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZihGdWxsU2NyZWVuLl9oYXNNc0Z1bGxzY3JlZW4pIHtcclxuXHRcdFx0ZWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5hc3NlcnQoZmFsc2UpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0c3RhdGljIGNhbmNlbCgpIHtcclxuXHRcdGlmKEZ1bGxTY3JlZW4uX2hhc1dlYmtpdEZ1bGxTY3JlZW4pIHtcclxuXHRcdFx0ZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbigpO1xyXG5cdFx0fWVsc2UgaWYoRnVsbFNjcmVlbi5faGFzTW96RnVsbFNjcmVlbikge1xyXG5cdFx0XHRkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmKEZ1bGxTY3JlZW4uX2hhc01zRnVsbHNjcmVlbikge1xyXG5cdFx0XHRkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5hc3NlcnQoZmFsc2UpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvRnVsbFNjcmVlbi5qcyIsImltcG9ydCB7JCwgaHRtbDJjYW52YXN9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgSW1hZ2VCYXNlIGZyb20gJy4vSW1hZ2VCYXNlJztcclxuaW1wb3J0IEJhc2VNYXRoVXRpbHMgZnJvbSAnLi9CYXNlTWF0aFV0aWxzJztcclxuaW1wb3J0IERvbTJJbWFnZSBmcm9tICcuL0RvbTJJbWFnZSc7XHJcbmltcG9ydCBEb2NNb3VzZVNpbXVsYXRvciBmcm9tICcuL0RvY01vdXNlU2ltdWxhdG9yJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEludGVyYWN0aXZlSW1hZ2UgZXh0ZW5kcyBJbWFnZUJhc2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCBjb2xvciwgc3JjLCBjYWNoZSwgaW5qZWN0b3IpIHtcclxuICAgIHN1cGVyKGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGNvbG9yKTtcclxuXHJcbiAgICB0aGlzLmlJZCA9ICdpJytCYXNlTWF0aFV0aWxzLmdldFVuaXF1ZSgpO1xyXG4gICAgY29uc3QgakZyYW1lID0gJCgnPGlmcmFtZSBpZD1cIicrdGhpcy5pSWQrJ1wiIHNyYz1cIicgKyBzcmMgKyAnXCIgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwcHg7XCI+PC9pZnJhbWU+Jyk7XHJcbiAgICAkKHRoaXMuZG9jLmJvZHkpLmFwcGVuZChqRnJhbWUpO1xyXG4gICAgdGhpcy5mcmFtZSA9IGpGcmFtZVswXTtcclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge307XHJcblxyXG4gICAgaWYoaW5qZWN0b3IpIHtcclxuICAgICAgaW5qZWN0b3IodGhpcy5mcmFtZS5jb250ZW50V2luZG93KTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmRvYy5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCd3d3cuaHR0cDovL3czLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0V4dGVuc2liaWxpdHknLCAnMS4xJykpIHsgLy8gc3ZnIGZvcmVpZ25PYmplY3QgcmVuZGVyZXJcclxuICAgICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICB0aGlzLmJpbmRzLmltYWdlTG9hZCA9ICgpPT4ge1xyXG4gICAgICAgIHRoaXMucmVuZGVySW1hZ2UodGhpcy5pbWFnZSk7XHJcbiAgICAgICAgdGhpcy5maW5pc2hSZW5kZXIoKTtcclxuICAgICAgfTtcclxuICAgICAgJCh0aGlzLmltYWdlKS5vbignbG9hZCcsIHRoaXMuYmluZHMuaW1hZ2VMb2FkKTtcclxuICAgICAgdGhpcy5zdmdSZW5kZXIgPSBuZXcgRG9tMkltYWdlKHRoaXMuZnJhbWUuY29udGVudFdpbmRvdywgdGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQsIGNhY2hlKTtcclxuICAgIH0gLy8gb3RoZXJ3aXNlIC0gaHRtbDJjYW52YXNcclxuXHJcbiAgICB0aGlzLmJpbmRzLmZyYW1lTG9hZCA9ICgpPT4ge1xyXG4gICAgICBpZih+dGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQudGl0bGUuaW5kZXhPZignNDA0JykpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0UmVuZGVyID0gKCk9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlck5vdEZvdW5kUGFnZSgpO1xyXG4gICAgICAgICAgdGhpcy5maW5pc2hSZW5kZXIoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgICBpZih0aGlzLmZyYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSAkKHRoaXMuZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkpLndpZHRoKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gJCh0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5KS5oZWlnaHQoKTtcclxuICAgICAgICAgICAgakZyYW1lLmNzcygnd2lkdGgnLCB0aGlzLndpZHRoKydweCcpLmNzcygnaGVpZ2h0JywgdGhpcy5oZWlnaHQrJ3B4Jyk7XHJcbiAgICAgICAgICAgIGpGcmFtZS5vZmZzZXQoe2xlZnQ6IC10aGlzLndpZHRoLTEwMCwgdG9wOiAwfSk7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuc3ZnUmVuZGVyKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaW11bGF0b3IgPSBuZXcgRG9jTW91c2VTaW11bGF0b3IoakZyYW1lLCB0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudC5ib2R5LCB0aGlzLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2ltdWxhdG9yLmFkZERvY0NoYW5nZUNsYih0aGlzLmZpbmlzaExvYWQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zdGFydFJlbmRlciA9ICgpPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICAkKHRoaXMuZnJhbWUuY29udGVudFdpbmRvdykub24oJ2xvYWQnLCB0aGlzLmJpbmRzLmZyYW1lTG9hZCk7XHJcbiAgfVxyXG5cclxuICBnZXRTaW11bGF0ZWREb2MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQ7XHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICBpZih0aGlzLnN2Z1JlbmRlcikge1xyXG4gICAgICB0aGlzLnN2Z1JlbmRlci50b1N2Zyh0aGlzLnNpbXVsYXRvci5lbGVtZW50LCB7aGVpZ2h0OiB0aGlzLmhlaWdodCsncHgnLCB3aWR0aDogdGhpcy53aWR0aCsncHgnfSlcclxuICAgICAgICAudGhlbigoZGF0YVVybCk9PiB7XHJcbiAgICAgICAgICB0aGlzLmltYWdlLnNyYyA9IGRhdGFVcmw7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yKT0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RvbTJJbWFnZTogJywgZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJCbGFua1BhZ2UoKTtcclxuICAgICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaHRtbDJjYW52YXModGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQuYm9keSwge3RpbWVvdXQ6IDMwMDAwfSkuXHJcbiAgICAgICAgdGhlbigoY2FudmFzKT0+IHtcclxuICAgICAgICAgIHRoaXMucmVuZGVySW1hZ2UoY2FudmFzKTtcclxuICAgICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgJCh0aGlzLmltYWdlKS5vZmYoJ2xvYWQnLCB0aGlzLmJpbmRzLmltYWdlTG9hZCk7XHJcbiAgICAkKHRoaXMuZnJhbWUuY29udGVudFdpbmRvdykub2ZmKCdsb2FkJywgdGhpcy5iaW5kcy5mcmFtZUxvYWQpO1xyXG4gICAgJCh0aGlzLmRvYy5ib2R5KS5maW5kKCcjJyt0aGlzLmlJZCkucmVtb3ZlKCk7XHJcbiAgICBpZih0aGlzLmltYWdlKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2Uuc3JjID0gJyc7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmltYWdlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mcmFtZS5zcmMgPSAnJztcclxuICAgIGRlbGV0ZSB0aGlzLmZyYW1lO1xyXG4gICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgc2ltdWxhdGUoZSwgZG9jLCB4LCB5KSB7XHJcbiAgICBpZih0aGlzLnNpbXVsYXRvcikge1xyXG4gICAgICB0aGlzLnNpbXVsYXRvci5zaW11bGF0ZShlLCBkb2MsIHgsIHkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvSW50ZXJhY3RpdmVJbWFnZS5qcyIsImltcG9ydCB7JCwgdHJ9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgR3JhcGhVdGlscyBmcm9tICcuL0dyYXBoVXRpbHMnO1xyXG5pbXBvcnQgTWF0aFV0aWxzIGZyb20gJy4vTWF0aFV0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvYWRpbmdBbmltYXRpb24ge1xyXG5cclxuICBkeSh0LHkpIHtcclxuICAgIGNvbnN0IHc9eVswXSwgYT15WzFdO1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgLXRoaXMuZypNYXRoLmNvcyhhKSxcclxuICAgICAgd1xyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGludGVncmF0ZShUKSB7XHJcbiAgICBsZXQgdD0wLCBkdD10aGlzLnAuZHQsIG9zID0gdGhpcy5vcztcclxuICAgIHdoaWxlKHQ8VCkge1xyXG4gICAgICBpZih0K2R0PlQpIHtcclxuICAgICAgICBkdD1ULXQ7XHJcbiAgICAgIH1cclxuICAgICAgb3M9TWF0aFV0aWxzLnJrNCh0aGlzLmR5LmJpbmQoe2c6IHRoaXMucC5nfSksIDAsIGR0LCBvcyk7XHJcbiAgICAgIHQrPWR0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9zO1xyXG4gIH1cclxuXHJcbiAgY2FsY1RpbWVUbyh0YXJnZXQpIHtcclxuICAgIGxldCB0PTAsIGR0PXRoaXMucC5kdCwgb3MgPSB0aGlzLm9zO1xyXG4gICAgd2hpbGUoTWF0aC5hYnMob3NbMV0tdGFyZ2V0KT4xZS00KSB7XHJcbiAgICAgIGNvbnN0IG5vcz1NYXRoVXRpbHMucms0KHRoaXMuZHkuYmluZCh7ZzogdGhpcy5wLmd9KSwgMCwgZHQsIG9zKTtcclxuICAgICAgaWYobm9zWzBdPDAgJiYgbm9zWzFdPHRhcmdldCB8fCBub3NbMF0+MCAmJiBub3NbMV0+dGFyZ2V0KSB7XHJcbiAgICAgICAgZHQvPTI7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgb3MgPSBub3M7XHJcbiAgICAgICAgdCs9ZHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0O1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKFQpIHtcclxuICAgIHRoaXMub3MgPSB0aGlzLmludGVncmF0ZShUKTtcclxuXHJcbiAgICB0aGlzLnQrPVRcclxuICAgIGlmKHRoaXMudD49dGhpcy5wLnVwZGF0ZUludGVydmFsKSB7XHJcbiAgICAgIHRoaXMudCA9IDA7XHJcbiAgICAgIGNvbnN0IHIgPSAwLjA2Kk1hdGgubWluKHRoaXMuYy53aWR0aCwgdGhpcy5jLmhlaWdodCksXHJcbiAgICAgICAgICAgIGEgPSB0aGlzLm9zWzFdLFxyXG4gICAgICAgICAgICB4MCA9IDAuNSp0aGlzLmMud2lkdGgsXHJcbiAgICAgICAgICAgIHkwID0gMC41KnRoaXMuYy5oZWlnaHQsXHJcbiAgICAgICAgICAgIGN0eCA9IHRoaXMuY3R4O1xyXG5cclxuICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmMud2lkdGgsIHRoaXMuYy5oZWlnaHQpO1xyXG4gICAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBHcmFwaFV0aWxzLmNvbG9yMlJnYmEodGhpcy5wLmNvbG9yLDEpO1xyXG4gICAgICBjdHgucmVjdCgwLCAwLCB0aGlzLmMud2lkdGgsIHRoaXMuYy5oZWlnaHQpO1xyXG4gICAgICBjdHguZmlsbCgpO1xyXG5cclxuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICBjdHguc2hhZG93Qmx1ciA9IDUwO1xyXG4gICAgICBjdHguZmlsbFN0eWxlID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKEdyYXBoVXRpbHMuaW52ZXJzZUNvbG9yKHRoaXMucC5jb2xvciwwLjkpLE1hdGguYWJzKHRoaXMub3NbMF0vNi4zNikpO1xyXG4gICAgICBjdHguc2hhZG93Q29sb3IgPSBHcmFwaFV0aWxzLmNvbG9yMlJnYmEoR3JhcGhVdGlscy5pbnZlcnNlQ29sb3IodGhpcy5wLmNvbG9yLDEpLDAuOSk7XHJcbiAgICAgIGN0eC5zaGFkb3dPZmZzZXRYID0gMDtcclxuICAgICAgY3R4LnNoYWRvd09mZnNldFkgPSAwO1xyXG4gICAgICBjdHguZm9udD0nYm9sZCAnK01hdGgucm91bmQoMC4yNSpyKSsncHggQXJpYWwnO1xyXG4gICAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcclxuICAgICAgY3R4LmZpbGxUZXh0KHRyKCdMb2FkaW5nLi4uJykseDAseTApO1xyXG5cclxuICAgICAgY29uc3QgcHMgPSAxMCwgZGE9MipNYXRoLlBJL3BzOy8vMi41Kl9yL3JcclxuICAgICAgY3R4LnNoYWRvd0NvbG9yID0gR3JhcGhVdGlscy5jb2xvcjJSZ2JhKEdyYXBoVXRpbHMuaW52ZXJzZUNvbG9yKHRoaXMucC5jb2xvciwxKSwwLjcpO1xyXG4gICAgICBmb3IobGV0IGk9MCwgX2E9YSwgX3I9MC4yKnI7IGk8cHM7ICsraSwgX3IqPTAuOSwgX2ErPWRhKSB7XHJcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBHcmFwaFV0aWxzLmNvbG9yMlJnYmEoR3JhcGhVdGlscy5pbnZlcnNlQ29sb3IodGhpcy5wLmNvbG9yLChwcy1pKS9wcyksMC43Kihwcy1pKS9wcyk7XHJcbiAgICAgICAgY29uc3QgY3g9eDArcipNYXRoLmNvcyhfYSksIGN5PXkwLXIqTWF0aC5zaW4oX2EpLCBueD14MCtyKk1hdGguY29zKF9hK2RhKSwgbnk9eTAtcipNYXRoLnNpbihfYStkYSk7XHJcbiAgICAgICAgY3R4LnNoYWRvd09mZnNldFggPSAwLjIqKG54LWN4KTtcclxuICAgICAgICBjdHguc2hhZG93T2Zmc2V0WSA9IDAuMioobnktY3kpO1xyXG4gICAgICAgIGN0eC5hcmMoY3gsIGN5LCBfciwgMCwgTWF0aC5QSSoyLCAxKTtcclxuICAgICAgICBjdHguZmlsbCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHRoaXMub25DaGFuZ2UpIHtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuYywgdGhpcy5wLmNvbG9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SW1hZ2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuYy53aWR0aCA9IDA7XHJcbiAgICB0aGlzLmMuaGVpZ2h0ID0gMDtcclxuICAgIGRlbGV0ZSB0aGlzLmN0eDtcclxuICAgIGRlbGV0ZSB0aGlzLmM7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTcHJpdGUobikge1xyXG4gICAgY29uc3QgYyA9ICQoJzxjYW52YXMgd2lkdGg9XCInK3RoaXMuYy53aWR0aCpuKydcIiBoZWlnaHQ9XCInK3RoaXMuYy5oZWlnaHQrJ1wiPjwvY2FudmFzPicpWzBdLCBjdHggPSBjLmdldENvbnRleHQoJzJkJyksXHJcbiAgICB0ID0gdGhpcy5jYWxjVGltZVRvKHRoaXMub3NbMV0rTWF0aC5zaWduKHRoaXMub3NbMF0pKjIqTWF0aC5QSSksIGR0PXQvKG4rMSk7XHJcbiAgICBjb25zdCB7dXBkYXRlSW50ZXJ2YWx9ID0gdGhpcy5wO1xyXG4gICAgdGhpcy5wLnVwZGF0ZUludGVydmFsID0gMDtcclxuICAgIGZvcihsZXQgaT0wOyBpPG47ICsraSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZShkdCk7XHJcbiAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcy5jLCBpKnRoaXMuYy53aWR0aCwgMCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnAudXBkYXRlSW50ZXJ2YWwgPSB1cGRhdGVJbnRlcnZhbDtcclxuICAgIHJldHVybiBjO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCwgY29sb3IpIHtcclxuICAgIGNvbnN0IGpDID0gJCgnPGNhbnZhcyB3aWR0aD1cIicrd2lkdGgrJ1wiIGhlaWdodD1cIicraGVpZ2h0KydcIj48L2NhbnZhcz4nKTtcclxuICAgIHRoaXMuYyA9IGpDWzBdO1xyXG4gICAgdGhpcy5wID0ge1xyXG4gICAgICBnOiA5LjgsXHJcbiAgICAgIGR0OiAxLzYwLFxyXG4gICAgICBjb2xvcixcclxuICAgICAgdXBkYXRlSW50ZXJ2YWw6IDAuMjVcclxuICAgIH07XHJcbiAgICB0aGlzLmN0eCA9IHRoaXMuYy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgdGhpcy5vcyA9IFstMiwgTWF0aC5QSS8yXTtcclxuICAgIHRoaXMudCA9IHRoaXMucC51cGRhdGVJbnRlcnZhbDtcclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0xvYWRpbmdBbmltYXRpb24uanMiLCJpbXBvcnQgeyR9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9hZGluZ0NvbnRyb2xsZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aWV3LCBzaG93UHJvZ3Jlc3M9dHJ1ZSwgbG9hZGluZ01zZz11bmRlZmluZWQpIHtcclxuICAgIHRoaXMudmlldyA9IHZpZXc7XHJcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcclxuICAgIHRoaXMuc2hvd1Byb2dyZXNzID0gc2hvd1Byb2dyZXNzO1xyXG4gICAgdGhpcy5nZXRMb2FkaW5nTXNnID0gbG9hZGluZ01zZyB8fCBMb2FkaW5nQ29udHJvbGxlci5kZWZhdWx0TG9hZGluZ01zZztcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRlZmF1bHRMb2FkaW5nTXNnKHByb2dyZXNzKSB7XHJcbiAgICByZXR1cm4gWydQbGVhc2Ugd2FpdC4uLiB0aGUgQXBwbGljYXRpb24gaXMgTG9hZGluZzogJywgcHJvZ3Jlc3MsICclJ10uam9pbignJyk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgdGhpcy5zaG93UHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgZGVsZXRlIHRoaXMudmlldztcclxuICB9XHJcblxyXG4gIHNldFByb2dyZXNzKHYpIHtcclxuICAgIHRoaXMucHJvZ3Jlc3MgPSB2O1xyXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVWaWV3KCkge1xyXG4gICAgaWYodGhpcy52aWV3KSB7XHJcblxyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3dpZExvYWRpbmdQcm9ncmVzcycsIHtcclxuICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgdmlzaWJsZTogdGhpcy5zaG93UHJvZ3Jlc3MsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgndHh0TG9hZGluZ1Byb2dyZXNzJywge1xyXG4gICAgICAgIHZhbHVlOiB0aGlzLmdldExvYWRpbmdNc2codGhpcy5wcm9ncmVzcyksXHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGZvcihsZXQgbmFtZSBvZiB0aGlzLnZpZXcuZ2V0TGlua3MoKSkge1xyXG4gICAgICAgIHRoaXMudmlldy5zZXRTdGF0ZShuYW1lLCB7XHJcbiAgICAgICAgICBlbmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGFjdGl2ZTogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy52aWV3LnNldFN0YXRlKCdpbnBQYWdlcycsIHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudmlldy5zZXRTdGF0ZSgnaW5wUGFnZScsIHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGVuYWJsZTogZmFsc2UsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL0xvYWRpbmdDb250cm9sbGVyLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEV2ZW50Q29udmVydGVyIGZyb20gJy4vRXZlbnRDb252ZXJ0ZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW91c2VFdmVudENvbnZlcnRlciBleHRlbmRzIEV2ZW50Q29udmVydGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIGVsZW1lbnQpIHtcclxuICAgIHN1cGVyKHduZCwgZG9jKTtcclxuXHJcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgY29udmVydDogdGhpcy5jb252ZXJ0LmJpbmQodGhpcylcclxuICAgIH07XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub24oJ21vdXNlbW92ZSBtb3VzZWRvd24gbW91c2VvdmVyIG1vdXNlb3V0IGNsaWNrJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICAgICQodGhpcy5kb2MpLm9uKCdtb3VzZXVwJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub2ZmKCdtb3VzZW1vdmUgbW91c2Vkb3duIG1vdXNlb3ZlciBtb3VzZW91dCBjbGljaycsIHRoaXMuYmluZHMuY29udmVydCk7XHJcbiAgICAkKHRoaXMuZG9jKS5vZmYoJ21vdXNldXAnLCB0aGlzLmJpbmRzLmNvbnZlcnQpO1xyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9Nb3VzZUV2ZW50Q29udmVydGVyLmpzIiwiaW1wb3J0IHtUSFJFRX0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBNYXRoVXRpbHMgZnJvbSAnLi9NYXRoVXRpbHMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0M0RXYXRjaGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3IodmlzdWFsLCBib3VuZEJveENsYiwgdGVzdFNjYWxlPXRoaXMudGVzdFNjYWxlKSB7XHJcbiAgICB0aGlzLnZpc3VhbCA9IHZpc3VhbDtcclxuICAgIHRoaXMuYm91bmRCb3hDbGIgPSBib3VuZEJveENsYjtcclxuICAgIHRoaXMudGVzdFNjYWxlID0gdGVzdFNjYWxlO1xyXG4gICAgdGhpcy5jYW1lcmEgPSB2aXN1YWwuY2FtZXJhO1xyXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy52aXN1YWwuZWxlbWVudDtcclxuICAgIHRoaXMuZWxlbWVudFNpemUgPSB7dzogMSwgaDogMX07XHJcbiAgICB0aGlzLmRldmljZVBpeGVsUmF0aW8gPSB0aGlzLnZpc3VhbC53bmQuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xyXG4gICAgdGhpcy5vcmJpdCA9IHZpc3VhbC5nZXRPcmJpdCgpO1xyXG4gICAgdGhpcy5zY2FsZSA9IDE7XHJcblxyXG4gICAgdGhpcy5lcHMgPSAxZS00O1xyXG4gICAgdGhpcy52ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIHRoaXMuZHYgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG5cclxuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIHZpc3VhbC5hZGRSZW5kZXJDYWxsYmFjayh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICB0aGlzLm9zID0ge1xyXG4gICAgICB2eDogMCxcclxuICAgICAgdnk6IDAsXHJcbiAgICAgIHg6IDAsXHJcbiAgICAgIHk6IDBcclxuICAgIH07XHJcbiAgICB0aGlzLm9yYml0LnVwZGF0ZSgpO1xyXG4gICAgdGhpcy5jYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcclxuICAgIGxldCBib3ggPSB0aGlzLmNvbXB1dGVDbGllbnRCb3VuZEJveCgpLCBrPTEuMTE7XHJcbiAgICB0aGlzLm1vdmVQYW4oe3g6IC1rKmJveC5taWQueCwgeTogLWsqYm94Lm1pZC55fSk7XHJcbiAgfVxyXG5cclxuICBtb3ZlUGFuKGR2KSB7XHJcbiAgICB0aGlzLm9yYml0LnBhbihkdi54KnRoaXMudmlzdWFsLndpZHRoKCksIC1kdi55KnRoaXMudmlzdWFsLmhlaWdodCgpKTtcclxuICB9XHJcblxyXG4gIHZUb0NhbWVyYSh2KSB7XHJcbiAgICB2LnByb2plY3QodGhpcy5jYW1lcmEpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgeDogMC41KnYueCxcclxuICAgICAgeTogMC41KnYueVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbXB1dGVDbGllbnRCb3VuZEJveCgpIHtcclxuICAgIGNvbnN0IGJveCA9IHRoaXMuYm91bmRCb3hDbGIoKSxcclxuICAgICAgeHMgPSBbYm94Lm1pbi54LCBib3gubWF4LnhdLFxyXG4gICAgICB5cyA9IFswLCAwXSxcclxuICAgICAgenMgPSBbYm94Lm1pbi56LCBib3gubWF4LnpdO1xyXG5cclxuICAgIGNvbnN0IHBzID0gW10sIHJlcyA9IHttYXg6IHt9LCBtaW46IHt9fTtcclxuICAgIGZvcihsZXQgeCBvZiB4cykge1xyXG4gICAgICBmb3IobGV0IHkgb2YgeXMpIHtcclxuICAgICAgICBmb3IobGV0IHogb2YgenMpIHtcclxuICAgICAgICAgIHBzLnB1c2godGhpcy52VG9DYW1lcmEodGhpcy52LnNldCh4LHkseikpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcy5zb3J0KChwMSwgcDIpPT4gcDEueC1wMi54KTtcclxuICAgIHJlcy5taW4ueCA9IHBzWzBdLng7XHJcbiAgICByZXMubWF4LnggPSBwc1twcy5sZW5ndGgtMV0ueDtcclxuICAgIHBzLnNvcnQoKHAxLCBwMik9PiBwMS55LXAyLnkpO1xyXG4gICAgcmVzLm1pbi55ID0gcHNbMF0ueTtcclxuICAgIHJlcy5tYXgueSA9IHBzW3BzLmxlbmd0aC0xXS55O1xyXG5cclxuICAgIHJlcy53aWR0aCA9IHJlcy5tYXgueC1yZXMubWluLng7XHJcbiAgICByZXMuaGVpZ2h0ID0gcmVzLm1heC55LXJlcy5taW4ueTtcclxuXHJcbiAgICByZXMubWlkID0ge1xyXG4gICAgICB4OiAwLjUqKHJlcy5tYXgueCtyZXMubWluLngpLFxyXG4gICAgICB5OiAwLjUqKHJlcy5tYXgueStyZXMubWluLnkpXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBzZXRPYmplY3QoYm91bmRCb3hDbGIpIHtcclxuICAgIHRoaXMuYm91bmRCb3hDbGIgPSBib3VuZEJveENsYjtcclxuICB9XHJcblxyXG4gIHRlc3RTY2FsZSgpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY29tcHV0ZUNvcnIoSywgbWluLCBtYXgpIHtcclxuICAgIGxldCBjb3JyID0gMDtcclxuICAgIGlmKEs8MSkge1xyXG4gICAgICBpZihtaW4+LTAuNSkge1xyXG4gICAgICAgIGNvcnIgPSAtMC41LW1pbjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmKG1heDwwLjUpIHtcclxuICAgICAgICBjb3JyID0gMC41LW1heDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmKG1pbjwtMC41KSB7XHJcbiAgICAgICAgY29yciA9IC0wLjUtbWluO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYobWF4PjAuNSkge1xyXG4gICAgICAgIGNvcnIgPSAwLjUtbWF4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29ycjtcclxuICB9XHJcblxyXG4gIGdldFNjYWxlKCkge1xyXG4gICAgY29uc3QgYm94ID0gdGhpcy5jb21wdXRlQ2xpZW50Qm91bmRCb3goKSxcclxuICAgICAgS3ggPSB0aGlzLmVsZW1lbnRTaXplLncvYm94LndpZHRoLFxyXG4gICAgICBLeSA9IHRoaXMuZWxlbWVudFNpemUuaC9ib3guaGVpZ2h0O1xyXG4gICAgcmV0dXJuIDEvTWF0aC5taW4oS3gsIEt5KTtcclxuICB9XHJcblxyXG4gIGNlbnRlclZpZXcoVCkge1xyXG4gICAgbGV0IGJveCA9IHRoaXMuY29tcHV0ZUNsaWVudEJvdW5kQm94KCksXHJcbiAgICAgIEt4ID0gdGhpcy5lbGVtZW50U2l6ZS53L2JveC53aWR0aCxcclxuICAgICAgS3kgPSB0aGlzLmVsZW1lbnRTaXplLmgvYm94LmhlaWdodCxcclxuICAgICAgSyA9IE1hdGgubWluKEt4LCBLeSk7XHJcblxyXG4gICAgaWYodGhpcy50ZXN0U2NhbGUoKSAmJiBNYXRoLmFicygxL0stdGhpcy5zY2FsZSk+dGhpcy5lcHMpIHtcclxuICAgICAgY29uc3Qgc2NhbGUgPSAxL0srMC4yKih0aGlzLnNjYWxlLTEvSyk7XHJcbiAgICAgIHRoaXMub3JiaXQuc2V0U2NhbGUodGhpcy5vcmJpdC5nZXRTY2FsZSgpLyhLKnNjYWxlKSk7XHJcbiAgICAgIHRoaXMub3JiaXQudXBkYXRlKCk7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XHJcbiAgICAgIGJveCA9IHRoaXMuY29tcHV0ZUNsaWVudEJvdW5kQm94KCk7XHJcbiAgICAgICAgS3ggPSB0aGlzLmVsZW1lbnRTaXplLncvYm94LndpZHRoO1xyXG4gICAgICAgIEt5ID0gdGhpcy5lbGVtZW50U2l6ZS5oL2JveC5oZWlnaHQ7XHJcbiAgICAgICAgSyA9IE1hdGgubWluKEt4LCBLeSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZHYgPSB0aGlzLmR2O1xyXG4gICAgaWYoSz4xLXRoaXMuZXBzKSB7XHJcbiAgICAgIGR2LnNldCgtYm94Lm1pZC54LCAtYm94Lm1pZC55KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkdi5zZXQodGhpcy5jb21wdXRlQ29ycihLeCwgYm94Lm1pbi54LCBib3gubWF4LngpLFxyXG4gICAgICAgICAgICAgdGhpcy5jb21wdXRlQ29ycihLeSwgYm94Lm1pbi55LCBib3gubWF4LnkpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZihNYXRoLnNxcnQodGhpcy5vcy52eCp0aGlzLm9zLnZ4K3RoaXMub3MudnkqdGhpcy5vcy52eSk+MC4wMDMgfHwgZHYubGVuZ3RoKCk+MC4wMDMpIHtcclxuICAgICAgbGV0IGR0ID0gMS82MCwgdD0wLCBvcyA9IHtcclxuICAgICAgICAuLi50aGlzLm9zLFxyXG4gICAgICAgIHg6IDAsXHJcbiAgICAgICAgeTogMFxyXG4gICAgICB9O1xyXG4gICAgICBvcy50ZiA9ICh2eCwgdnksIHgsIHkpPT4gKHtcclxuICAgICAgICB4OiA3NSooZHYueC14KS9NYXRoLnBvdyh0aGlzLmRldmljZVBpeGVsUmF0aW8sIDEuMCksXHJcbiAgICAgICAgeTogNzUqKGR2LnkteSkvTWF0aC5wb3codGhpcy5kZXZpY2VQaXhlbFJhdGlvLCAxLjApXHJcbiAgICAgIH0pO1xyXG4gICAgICB3aGlsZSh0PFQpIHtcclxuICAgICAgICBpZih0K2R0PlQpIHtcclxuICAgICAgICAgIGR0ID0gVC10O1xyXG4gICAgICAgIH1cclxuICAgICAgICBvcyA9IHRoaXMuaW50ZWdyYXRlKG9zLCBkdCk7XHJcbiAgICAgICAgdCArPSBkdDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm1vdmVQYW4ob3MpO1xyXG4gICAgICB0aGlzLm9zID0gb3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnRlZ3JhdGUob3MsIGR0KSB7XHJcbiAgICBjb25zdCBbdngsIHZ5LCB4LCB5XSA9IE1hdGhVdGlscy5yazQoXHJcbiAgICAgIHRoaXMuZHkuYmluZChvcyksXHJcbiAgICAgIDAsXHJcbiAgICAgIGR0LFxyXG4gICAgICBbb3MudngsIG9zLnZ5LCBvcy54LCBvcy55XVxyXG4gICAgKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLm9zLFxyXG4gICAgICB2eCwgdnksIHgsIHlcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBkeSh0LFkpIHtcclxuICAgIGNvbnN0IFt2eCwgdnksIHgsIHldID0gWSwgdmQgPSAxNSwgdGYgPSB0aGlzLnRmKHZ4LCB2eSwgeCwgeSk7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB0Zi54LXZkKnZ4LFxyXG4gICAgICB0Zi55LXZkKnZ5LFxyXG4gICAgICB2eCxcclxuICAgICAgdnlcclxuICAgIF07XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoZHQpIHtcclxuICAgIGlmKHRoaXMuZW5hYmxlZCAmJiB0aGlzLmJvdW5kQm94Q2xiKSB7XHJcbiAgICAgIHRoaXMuY2VudGVyVmlldyhkdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9PYmplY3QzRFdhdGNoZXIuanMiLCJpbXBvcnQge1RIUkVFfSBmcm9tICcuLi9saWJzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9yYml0IGV4dGVuZHMgVEhSRUUuRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iob2JqZWN0LCBkb21FbGVtZW50KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIFx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XHJcbiAgXHR0aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50IHx8IGRvY3VtZW50LmJvZHk7XHJcblxyXG4gIFx0Ly8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdGhpcyBjb250cm9sXHJcbiAgXHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG5cclxuICBcdC8vIFwidGFyZ2V0XCIgc2V0cyB0aGUgbG9jYXRpb24gb2YgZm9jdXMsIHdoZXJlIHRoZSBvYmplY3Qgb3JiaXRzIGFyb3VuZFxyXG4gIFx0dGhpcy50YXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG5cclxuICBcdC8vIEhvdyBmYXIgeW91IGNhbiBkb2xseSBpbiBhbmQgb3V0KFBlcnNwZWN0aXZlQ2FtZXJhIG9ubHkpXHJcbiAgXHR0aGlzLm1pbkRpc3RhbmNlID0gMDtcclxuICBcdHRoaXMubWF4RGlzdGFuY2UgPSBJbmZpbml0eTtcclxuXHJcbiAgXHQvLyBIb3cgZmFyIHlvdSBjYW4gem9vbSBpbiBhbmQgb3V0KE9ydGhvZ3JhcGhpY0NhbWVyYSBvbmx5KVxyXG4gIFx0dGhpcy5taW5ab29tID0gMDtcclxuICBcdHRoaXMubWF4Wm9vbSA9IEluZmluaXR5O1xyXG5cclxuICBcdC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxyXG4gIFx0Ly8gUmFuZ2UgaXMgMCB0byBNYXRoLlBJIHJhZGlhbnMuXHJcbiAgXHR0aGlzLm1pblBvbGFyQW5nbGUgPSAwOyAvLyByYWRpYW5zXHJcbiAgXHR0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOyAvLyByYWRpYW5zXHJcblxyXG4gIFx0Ly8gSG93IGZhciB5b3UgY2FuIG9yYml0IGhvcml6b250YWxseSwgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy5cclxuICBcdC8vIElmIHNldCwgbXVzdCBiZSBhIHN1Yi1pbnRlcnZhbCBvZiB0aGUgaW50ZXJ2YWwgWy1NYXRoLlBJLCBNYXRoLlBJIF0uXHJcbiAgXHR0aGlzLm1pbkF6aW11dGhBbmdsZSA9IC1JbmZpbml0eTsgLy8gcmFkaWFuc1xyXG4gIFx0dGhpcy5tYXhBemltdXRoQW5nbGUgPSBJbmZpbml0eTsgLy8gcmFkaWFuc1xyXG5cclxuICBcdC8vIFNldCB0byB0cnVlIHRvIGVuYWJsZSBkYW1waW5nIChpbmVydGlhKVxyXG4gIFx0Ly8gSWYgZGFtcGluZyBpcyBlbmFibGVkLCB5b3UgbXVzdCBjYWxsIGNvbnRyb2xzLnVwZGF0ZSgpIGluIHlvdXIgYW5pbWF0aW9uIGxvb3BcclxuICBcdHRoaXMuZW5hYmxlRGFtcGluZyA9IGZhbHNlO1xyXG4gIFx0dGhpcy5kYW1waW5nRmFjdG9yID0gMC4yNTtcclxuXHJcbiAgXHQvLyBUaGlzIG9wdGlvbiBhY3R1YWxseSBlbmFibGVzIGRvbGx5aW5nIGluIGFuZCBvdXQ7IGxlZnQgYXMgXCJ6b29tXCIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxyXG4gIFx0Ly8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgem9vbWluZ1xyXG4gIFx0dGhpcy5lbmFibGVab29tID0gdHJ1ZTtcclxuICBcdHRoaXMuem9vbVNwZWVkID0gMS4wO1xyXG5cclxuICBcdC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHJvdGF0aW5nXHJcbiAgXHR0aGlzLmVuYWJsZVJvdGF0ZSA9IHRydWU7XHJcbiAgXHR0aGlzLnJvdGF0ZVNwZWVkID0gMS4wO1xyXG5cclxuICBcdC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHBhbm5pbmdcclxuICBcdHRoaXMuZW5hYmxlUGFuID0gdHJ1ZTtcclxuXHJcbiAgXHQvLyBTZXQgdG8gdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IHJvdGF0ZSBhcm91bmQgdGhlIHRhcmdldFxyXG4gIFx0Ly8gSWYgYXV0by1yb3RhdGUgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wXHJcbiAgXHR0aGlzLmF1dG9Sb3RhdGUgPSBmYWxzZTtcclxuICBcdHRoaXMuYXV0b1JvdGF0ZVNwZWVkID0gMi4wOyAvLyAzMCBzZWNvbmRzIHBlciByb3VuZCB3aGVuIGZwcyBpcyA2MFxyXG5cclxuICBcdC8vIGZvciByZXNldFxyXG4gIFx0dGhpcy50YXJnZXQwID0gdGhpcy50YXJnZXQuY2xvbmUoKTtcclxuICBcdHRoaXMucG9zaXRpb24wID0gdGhpcy5vYmplY3QucG9zaXRpb24uY2xvbmUoKTtcclxuICBcdHRoaXMuem9vbTAgPSB0aGlzLm9iamVjdC56b29tO1xyXG5cclxuICBcdC8vXHJcbiAgXHQvLyBwdWJsaWMgbWV0aG9kc1xyXG4gIFx0Ly9cclxuICBcdHRoaXMuZ2V0UG9sYXJBbmdsZSA9IGZ1bmN0aW9uICgpIHtcclxuICBcdFx0cmV0dXJuIHNwaGVyaWNhbC5waGk7XHJcbiAgXHR9O1xyXG5cclxuICBcdHRoaXMuZ2V0QXppbXV0aGFsQW5nbGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgXHRcdHJldHVybiBzcGhlcmljYWwudGhldGE7XHJcbiAgXHR9O1xyXG5cclxuICBcdHRoaXMucmVzZXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgXHRcdHNjb3BlLnRhcmdldC5jb3B5KHNjb3BlLnRhcmdldDApO1xyXG4gIFx0XHRzY29wZS5vYmplY3QucG9zaXRpb24uY29weShzY29wZS5wb3NpdGlvbjApO1xyXG4gIFx0XHRzY29wZS5vYmplY3Quem9vbSA9IHNjb3BlLnpvb20wO1xyXG5cclxuICBcdFx0c2NvcGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICBcdFx0c2NvcGUuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XHJcblxyXG4gIFx0XHRzY29wZS51cGRhdGUoKTtcclxuICBcdH07XHJcblxyXG4gICAgdGhpcy56b29tT3V0ID0gZnVuY3Rpb24oc3BlZWQ9dGhpcy56b29tU3BlZWQpIHtcclxuICAgICAgY29uc3QgX3NwZWVkID0gdGhpcy56b29tU3BlZWQ7XHJcbiAgICAgIHRoaXMuem9vbVNwZWVkID0gc3BlZWQ7XHJcbiAgICAgIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO1xyXG4gICAgICB0aGlzLnpvb21TcGVlZCA9IF9zcGVlZDtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy56b29tSW4gPSBmdW5jdGlvbihzcGVlZD10aGlzLnpvb21TcGVlZCkge1xyXG4gICAgICBjb25zdCBfc3BlZWQgPSB0aGlzLnpvb21TcGVlZDtcclxuICAgICAgdGhpcy56b29tU3BlZWQgPSBzcGVlZDtcclxuICAgICAgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO1xyXG4gICAgICB0aGlzLnpvb21TcGVlZCA9IF9zcGVlZDtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5nZXRTY2FsZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICByZXR1cm4gc2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRTY2FsZSA9IGZ1bmN0aW9uKG5ld1NjYWxlKSB7XHJcbiAgICAgIHNjYWxlID0gbmV3U2NhbGU7XHJcbiAgICB9XHJcblxyXG4gIFx0Ly8gdGhpcyBtZXRob2QgaXMgZXhwb3NlZCwgYnV0IHBlcmhhcHMgaXQgd291bGQgYmUgYmV0dGVyIGlmIHdlIGNhbiBtYWtlIGl0IHByaXZhdGUuLi5cclxuICBcdHRoaXMudXBkYXRlID0gZnVuY3Rpb24oKSB7XHJcbiAgXHRcdHZhciBvZmZzZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIFx0XHQvLyBzbyBjYW1lcmEudXAgaXMgdGhlIG9yYml0IGF4aXNcclxuICBcdFx0dmFyIHF1YXQgPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhvYmplY3QudXAsIG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApKTtcclxuICBcdFx0dmFyIHF1YXRJbnZlcnNlID0gcXVhdC5jbG9uZSgpLmludmVyc2UoKTtcclxuICBcdFx0dmFyIGxhc3RQb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgXHRcdHZhciBsYXN0UXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcblxyXG4gIFx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlICgpIHtcclxuICBcdFx0XHR2YXIgcG9zaXRpb24gPSBzY29wZS5vYmplY3QucG9zaXRpb247XHJcbiAgXHRcdFx0b2Zmc2V0LmNvcHkocG9zaXRpb24pLnN1YihzY29wZS50YXJnZXQpO1xyXG4gIFx0XHRcdC8vIHJvdGF0ZSBvZmZzZXQgdG8gXCJ5LWF4aXMtaXMtdXBcIiBzcGFjZVxyXG4gIFx0XHRcdG9mZnNldC5hcHBseVF1YXRlcm5pb24ocXVhdCk7XHJcbiAgXHRcdFx0Ly8gYW5nbGUgZnJvbSB6LWF4aXMgYXJvdW5kIHktYXhpc1xyXG4gIFx0XHRcdHNwaGVyaWNhbC5zZXRGcm9tVmVjdG9yMyhvZmZzZXQpO1xyXG4gIFx0XHRcdGlmKHNjb3BlLmF1dG9Sb3RhdGUpIHtcclxuICBcdFx0XHRcdHJvdGF0ZUxlZnQoZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSk7XHJcbiAgXHRcdFx0fVxyXG4gIFx0XHRcdHNwaGVyaWNhbC50aGV0YSArPSBzcGhlcmljYWxEZWx0YS50aGV0YTtcclxuICBcdFx0XHRzcGhlcmljYWwucGhpICs9IHNwaGVyaWNhbERlbHRhLnBoaTtcclxuICBcdFx0XHQvLyByZXN0cmljdCB0aGV0YSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXHJcbiAgXHRcdFx0c3BoZXJpY2FsLnRoZXRhID0gTWF0aC5tYXgoc2NvcGUubWluQXppbXV0aEFuZ2xlLCBNYXRoLm1pbihzY29wZS5tYXhBemltdXRoQW5nbGUsIHNwaGVyaWNhbC50aGV0YSkpO1xyXG4gIFx0XHRcdC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXHJcbiAgXHRcdFx0c3BoZXJpY2FsLnBoaSA9IE1hdGgubWF4KHNjb3BlLm1pblBvbGFyQW5nbGUsIE1hdGgubWluKHNjb3BlLm1heFBvbGFyQW5nbGUsIHNwaGVyaWNhbC5waGkpKTtcclxuICBcdFx0XHRzcGhlcmljYWwubWFrZVNhZmUoKTtcclxuICBcdFx0XHRzcGhlcmljYWwucmFkaXVzICo9IHNjYWxlO1xyXG4gIFx0XHRcdC8vIHJlc3RyaWN0IHJhZGl1cyB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXHJcbiAgXHRcdFx0c3BoZXJpY2FsLnJhZGl1cyA9IE1hdGgubWF4KHNjb3BlLm1pbkRpc3RhbmNlLCBNYXRoLm1pbihzY29wZS5tYXhEaXN0YW5jZSwgc3BoZXJpY2FsLnJhZGl1cykpO1xyXG4gIFx0XHRcdC8vIG1vdmUgdGFyZ2V0IHRvIHBhbm5lZCBsb2NhdGlvblxyXG4gIFx0XHRcdHNjb3BlLnRhcmdldC5hZGQocGFuT2Zmc2V0KTtcclxuICBcdFx0XHRvZmZzZXQuc2V0RnJvbVNwaGVyaWNhbChzcGhlcmljYWwpO1xyXG4gIFx0XHRcdC8vIHJvdGF0ZSBvZmZzZXQgYmFjayB0byBcImNhbWVyYS11cC12ZWN0b3ItaXMtdXBcIiBzcGFjZVxyXG4gIFx0XHRcdG9mZnNldC5hcHBseVF1YXRlcm5pb24ocXVhdEludmVyc2UpO1xyXG4gIFx0XHRcdHBvc2l0aW9uLmNvcHkoc2NvcGUudGFyZ2V0KS5hZGQob2Zmc2V0KTtcclxuICBcdFx0XHRzY29wZS5vYmplY3QubG9va0F0KHNjb3BlLnRhcmdldCk7XHJcblxyXG4gIFx0XHRcdGlmKHNjb3BlLmVuYWJsZURhbXBpbmc9PT10cnVlKSB7XHJcbiAgXHRcdFx0XHRzcGhlcmljYWxEZWx0YS50aGV0YSAqPSgxLXNjb3BlLmRhbXBpbmdGYWN0b3IpO1xyXG4gIFx0XHRcdFx0c3BoZXJpY2FsRGVsdGEucGhpICo9KDEtc2NvcGUuZGFtcGluZ0ZhY3Rvcik7XHJcbiAgXHRcdFx0fSBlbHNlIHtcclxuICBcdFx0XHRcdHNwaGVyaWNhbERlbHRhLnNldCgwLCAwLCAwKTtcclxuICBcdFx0XHR9XHJcblxyXG4gIFx0XHRcdHNjYWxlID0gMTtcclxuICBcdFx0XHRwYW5PZmZzZXQuc2V0KDAsIDAsIDApO1xyXG5cclxuICBcdFx0XHQvLyB1cGRhdGUgY29uZGl0aW9uIGlzOlxyXG4gIFx0XHRcdC8vIG1pbihjYW1lcmEgZGlzcGxhY2VtZW50LCBjYW1lcmEgcm90YXRpb24gaW4gcmFkaWFucyleMiA+IEVQU1xyXG4gIFx0XHRcdC8vIHVzaW5nIHNtYWxsLWFuZ2xlIGFwcHJveGltYXRpb24gY29zKHgvMikgPSAxLXheMiAvIDhcclxuXHJcbiAgXHRcdFx0aWYoem9vbUNoYW5nZWQgfHxcclxuICBcdFx0XHRcdGxhc3RQb3NpdGlvbi5kaXN0YW5jZVRvU3F1YXJlZChzY29wZS5vYmplY3QucG9zaXRpb24pID4gRVBTIHx8XHJcbiAgXHRcdFx0XHQ4ICooMS1sYXN0UXVhdGVybmlvbi5kb3Qoc2NvcGUub2JqZWN0LnF1YXRlcm5pb24pKSA+IEVQUykge1xyXG5cclxuICBcdFx0XHRcdHNjb3BlLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG5cclxuICBcdFx0XHRcdGxhc3RQb3NpdGlvbi5jb3B5KHNjb3BlLm9iamVjdC5wb3NpdGlvbik7XHJcbiAgXHRcdFx0XHRsYXN0UXVhdGVybmlvbi5jb3B5KHNjb3BlLm9iamVjdC5xdWF0ZXJuaW9uKTtcclxuICBcdFx0XHRcdHpvb21DaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gIFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcbiAgXHRcdFx0fVxyXG4gIFx0XHRcdHJldHVybiBmYWxzZTtcclxuICBcdFx0fTtcclxuICBcdH0oKTtcclxuXHJcbiAgICB0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICB9O1xyXG5cclxuICBcdC8vXHJcbiAgXHQvLyBpbnRlcm5hbHNcclxuICBcdC8vXHJcbiAgXHR2YXIgc2NvcGUgPSB0aGlzO1xyXG4gIFx0dmFyIGNoYW5nZUV2ZW50ID0geyB0eXBlOiAnY2hhbmdlJyB9O1xyXG4gIFx0dmFyIEVQUyA9IDFlLTY7XHJcbiAgXHQvLyBjdXJyZW50IHBvc2l0aW9uIGluIHNwaGVyaWNhbCBjb29yZGluYXRlc1xyXG4gIFx0dmFyIHNwaGVyaWNhbCA9IG5ldyBUSFJFRS5TcGhlcmljYWwoKTtcclxuICBcdHZhciBzcGhlcmljYWxEZWx0YSA9IG5ldyBUSFJFRS5TcGhlcmljYWwoKTtcclxuXHJcbiAgXHR2YXIgc2NhbGUgPSAxO1xyXG4gIFx0dmFyIHBhbk9mZnNldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgXHR2YXIgem9vbUNoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgXHRmdW5jdGlvbiBnZXRBdXRvUm90YXRpb25BbmdsZSgpIHtcclxuICBcdFx0cmV0dXJuIDIgKiBNYXRoLlBJIC8gNjAgLyA2MCAqIHNjb3BlLmF1dG9Sb3RhdGVTcGVlZDtcclxuICBcdH1cclxuXHJcbiAgXHRmdW5jdGlvbiBnZXRab29tU2NhbGUoKSB7XHJcbiAgXHRcdHJldHVybiBNYXRoLnBvdygwLjk1LCBzY29wZS56b29tU3BlZWQpO1xyXG4gIFx0fVxyXG5cclxuICBcdGZ1bmN0aW9uIHJvdGF0ZUxlZnQoYW5nbGUpIHtcclxuICBcdFx0c3BoZXJpY2FsRGVsdGEudGhldGEgLT0gYW5nbGU7XHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gcm90YXRlVXAoYW5nbGUpIHtcclxuICBcdFx0c3BoZXJpY2FsRGVsdGEucGhpIC09IGFuZ2xlO1xyXG4gIFx0fVxyXG5cclxuICBcdHZhciBwYW5MZWZ0ID0gZnVuY3Rpb24oKSB7XHJcbiAgXHRcdHZhciB2ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICBcdFx0cmV0dXJuIGZ1bmN0aW9uIHBhbkxlZnQoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkge1xyXG4gIFx0XHRcdHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDApOyAvLyBnZXQgWCBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4XHJcbiAgXHRcdFx0di5tdWx0aXBseVNjYWxhcigtIGRpc3RhbmNlKTtcclxuICBcdFx0XHRwYW5PZmZzZXQuYWRkKHYpO1xyXG4gIFx0XHR9O1xyXG4gIFx0fSgpO1xyXG5cclxuICBcdHZhciBwYW5VcCA9IGZ1bmN0aW9uKCkge1xyXG4gIFx0XHR2YXIgdiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgXHRcdHJldHVybiBmdW5jdGlvbiBwYW5VcChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSB7XHJcbiAgXHRcdFx0di5zZXRGcm9tTWF0cml4Q29sdW1uKG9iamVjdE1hdHJpeCwgMSk7IC8vIGdldCBZIGNvbHVtbiBvZiBvYmplY3RNYXRyaXhcclxuICBcdFx0XHR2Lm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcclxuICBcdFx0XHRwYW5PZmZzZXQuYWRkKHYpO1xyXG4gIFx0XHR9O1xyXG4gIFx0fSgpO1xyXG5cclxuICBcdC8vIGRlbHRhWCBhbmQgZGVsdGFZIGFyZSBpbiBwaXhlbHM7IHJpZ2h0IGFuZCBkb3duIGFyZSBwb3NpdGl2ZVxyXG4gIFx0c2NvcGUucGFuID0gZnVuY3Rpb24oKSB7XHJcbiAgXHRcdHZhciBvZmZzZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIFx0XHRyZXR1cm4gZnVuY3Rpb24gcGFuKGRlbHRhWCwgZGVsdGFZKSB7XHJcbiAgXHRcdFx0dmFyIGVsZW1lbnQgPSBzY29wZS5kb21FbGVtZW50O1xyXG4gIFx0XHRcdGlmKHNjb3BlLm9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKSB7XHJcbiAgXHRcdFx0XHQvLyBwZXJzcGVjdGl2ZVxyXG4gIFx0XHRcdFx0dmFyIHBvc2l0aW9uID0gc2NvcGUub2JqZWN0LnBvc2l0aW9uO1xyXG4gIFx0XHRcdFx0b2Zmc2V0LmNvcHkocG9zaXRpb24pLnN1YihzY29wZS50YXJnZXQpO1xyXG4gIFx0XHRcdFx0dmFyIHRhcmdldERpc3RhbmNlID0gb2Zmc2V0Lmxlbmd0aCgpO1xyXG4gIFx0XHRcdFx0Ly8gaGFsZiBvZiB0aGUgZm92IGlzIGNlbnRlciB0byB0b3Agb2Ygc2NyZWVuXHJcbiAgXHRcdFx0XHR0YXJnZXREaXN0YW5jZSAqPSBNYXRoLnRhbigoc2NvcGUub2JqZWN0LmZvdiAvIDIpICogTWF0aC5QSSAvIDE4MC4wKTtcclxuICBcdFx0XHRcdC8vIHdlIGFjdHVhbGx5IGRvbid0IHVzZSBzY3JlZW5XaWR0aCwgc2luY2UgcGVyc3BlY3RpdmUgY2FtZXJhIGlzIGZpeGVkIHRvIHNjcmVlbiBoZWlnaHRcclxuICBcdFx0XHRcdHBhbkxlZnQoMiAqIGRlbHRhWCAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHNjb3BlLm9iamVjdC5tYXRyaXgpO1xyXG4gIFx0XHRcdFx0cGFuVXAoMiAqIGRlbHRhWSAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIHNjb3BlLm9iamVjdC5tYXRyaXgpO1xyXG4gIFx0XHRcdH0gZWxzZSBpZihzY29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEpIHtcclxuICBcdFx0XHRcdC8vIG9ydGhvZ3JhcGhpY1xyXG4gIFx0XHRcdFx0cGFuTGVmdChkZWx0YVggKihzY29wZS5vYmplY3QucmlnaHQtc2NvcGUub2JqZWN0LmxlZnQpIC8gc2NvcGUub2JqZWN0Lnpvb20gLyBlbGVtZW50LmNsaWVudFdpZHRoLCBzY29wZS5vYmplY3QubWF0cml4KTtcclxuICBcdFx0XHRcdHBhblVwKGRlbHRhWSAqKHNjb3BlLm9iamVjdC50b3Atc2NvcGUub2JqZWN0LmJvdHRvbSkgLyBzY29wZS5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4KTtcclxuICBcdFx0XHR9IGVsc2Uge1xyXG4gIFx0XHRcdFx0Ly8gY2FtZXJhIG5laXRoZXIgb3J0aG9ncmFwaGljIG5vciBwZXJzcGVjdGl2ZVxyXG4gIFx0XHRcdFx0Y29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUtcGFuIGRpc2FibGVkLicpO1xyXG4gIFx0XHRcdFx0c2NvcGUuZW5hYmxlUGFuID0gZmFsc2U7XHJcbiAgXHRcdFx0fVxyXG4gIFx0XHR9O1xyXG4gIFx0fSgpO1xyXG5cclxuICBcdGZ1bmN0aW9uIGRvbGx5SW4oZG9sbHlTY2FsZSkge1xyXG4gICAgICBpZihzY29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG4gIFx0XHRcdHNjYWxlIC89IGRvbGx5U2NhbGU7XHJcbiAgXHRcdH0gZWxzZSBpZihzY29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEpIHtcclxuICBcdFx0XHRzY29wZS5vYmplY3Quem9vbSA9IE1hdGgubWF4KHNjb3BlLm1pblpvb20sIE1hdGgubWluKHNjb3BlLm1heFpvb20sIHNjb3BlLm9iamVjdC56b29tICogZG9sbHlTY2FsZSkpO1xyXG4gIFx0XHRcdHNjb3BlLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcbiAgXHRcdFx0em9vbUNoYW5nZWQgPSB0cnVlO1xyXG4gIFx0XHR9IGVsc2Uge1xyXG4gIFx0XHRcdGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlLWRvbGx5L3pvb20gZGlzYWJsZWQuJyk7XHJcbiAgXHRcdFx0c2NvcGUuZW5hYmxlWm9vbSA9IGZhbHNlO1xyXG4gIFx0XHR9XHJcbiAgXHR9XHJcblxyXG4gIFx0ZnVuY3Rpb24gZG9sbHlPdXQoZG9sbHlTY2FsZSkge1xyXG4gICAgICBpZihzY29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG4gIFx0XHRcdHNjYWxlICo9IGRvbGx5U2NhbGU7XHJcbiAgXHRcdH0gZWxzZSBpZihzY29wZS5vYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEpIHtcclxuICBcdFx0XHRzY29wZS5vYmplY3Quem9vbSA9IE1hdGgubWF4KHNjb3BlLm1pblpvb20sIE1hdGgubWluKHNjb3BlLm1heFpvb20sIHNjb3BlLm9iamVjdC56b29tIC8gZG9sbHlTY2FsZSkpO1xyXG4gIFx0XHRcdHNjb3BlLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XHJcbiAgXHRcdFx0em9vbUNoYW5nZWQgPSB0cnVlO1xyXG4gIFx0XHR9IGVsc2Uge1xyXG4gIFx0XHRcdGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlLWRvbGx5L3pvb20gZGlzYWJsZWQuJyk7XHJcbiAgXHRcdFx0c2NvcGUuZW5hYmxlWm9vbSA9IGZhbHNlO1xyXG4gIFx0XHR9XHJcbiAgXHR9XHJcblxyXG4gICAgLyogQWN0aW9ucyAqL1xyXG5cclxuICAgIGZ1bmN0aW9uIHJvdGF0ZShldmVudCwgZGF0YSkge1xyXG4gICAgICBpZihzY29wZS5lbmFibGVkICYmIHNjb3BlLmVuYWJsZVJvdGF0ZSAmJiBkYXRhLnN0YXRlPT09J21vdmUnKSB7XHJcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBzY29wZS5kb21FbGVtZW50O1xyXG4gICAgICAgIC8vIHJvdGF0aW5nIGFjcm9zcyB3aG9sZSBzY3JlZW4gZ29lcyAzNjAgZGVncmVlcyBhcm91bmRcclxuICAgICAgICByb3RhdGVMZWZ0KDIgKiBNYXRoLlBJICogZGF0YS5keCAvIGVsZW1lbnQuY2xpZW50V2lkdGggKiBzY29wZS5yb3RhdGVTcGVlZCk7XHJcbiAgICAgICAgLy8gcm90YXRpbmcgdXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVtcHRzIHRvIGdvIDM2MCwgYnV0IGxpbWl0ZWQgdG8gMTgwXHJcbiAgICAgICAgcm90YXRlVXAoMiAqIE1hdGguUEkgKiBkYXRhLmR5IC8gZWxlbWVudC5jbGllbnRIZWlnaHQgKiBzY29wZS5yb3RhdGVTcGVlZCk7XHJcbiAgICAgICAgc2NvcGUudXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBwYW4oZXZlbnQsIGRhdGEpIHtcclxuICAgICAgaWYoc2NvcGUuZW5hYmxlZCAmJiBzY29wZS5lbmFibGVQYW4gJiYgZGF0YS5zdGF0ZT09PSdtb3ZlJykge1xyXG4gICAgICAgIHNjb3BlLnBhbihkYXRhLmR4LCBkYXRhLmR5KTtcclxuICAgICAgICBzY29wZS51cGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG9mZnNldERvbGx5KGV2ZW50LCBkYXRhKSB7XHJcbiAgICAgIGlmKHNjb3BlLmVuYWJsZWQgJiYgc2NvcGUuZW5hYmxlWm9vbSAmJiBkYXRhLnN0YXRlPT09J21vdmUnKSB7XHJcbiAgICAgICAgaWYoZGF0YS5keT4wKSB7XHJcbiAgICAgICAgICBkb2xseUluKGdldFpvb21TY2FsZSgpKTtcclxuICAgICAgICB9IGVsc2UgaWYoZGF0YS5keTwwKSB7XHJcbiAgICAgICAgICBkb2xseU91dChnZXRab29tU2NhbGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gd2hlZWxEb2xseShldmVudCkge1xyXG4gICAgICBpZihzY29wZS5lbmFibGVkICYmIHNjb3BlLmVuYWJsZVpvb20pIHtcclxuICAgICAgICBpZihldmVudC5kZWx0YVk+MCkge1xyXG4gICAgICAgICAgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZihldmVudC5kZWx0YVk8MCkge1xyXG4gICAgICAgICAgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY3Rpb25zID0ge1xyXG4gICAgICByb3RhdGUsXHJcbiAgICAgIHBhbixcclxuICAgICAgb2Zmc2V0RG9sbHksXHJcbiAgICAgIHdoZWVsRG9sbHlcclxuICAgIH1cclxuXHJcbiAgXHQvLyBmb3JjZSBhbiB1cGRhdGUgYXQgc3RhcnRcclxuICBcdHRoaXMudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9PcmJpdC5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBJbWFnZUJhc2UgZnJvbSAnLi9JbWFnZUJhc2UnO1xyXG5pbXBvcnQgUGRmIGZyb20gJy4vUGRmJztcclxuaW1wb3J0IEJhc2VNYXRoVXRpbHMgZnJvbSAnLi9CYXNlTWF0aFV0aWxzJztcclxuaW1wb3J0IEN1c3RvbUV2ZW50Q29udmVydGVyIGZyb20gJy4vQ3VzdG9tRXZlbnRDb252ZXJ0ZXInO1xyXG5pbXBvcnQgUG9seVRhcmdldCBmcm9tICcuL3RhcmdldHMvUG9seVRhcmdldCc7XHJcblxyXG5pbXBvcnQgRmluZGVyIGZyb20gJy4vRmluZGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBkZkltYWdlIGV4dGVuZHMgSW1hZ2VCYXNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IsIHBkZiwgbikge1xyXG4gICAgc3VwZXIoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IpO1xyXG5cclxuICAgIHRoaXMucXVlcnkgPSAnJztcclxuICAgIHRoaXMubiA9IG47XHJcbiAgICB0aGlzLnBkZiA9IHBkZjtcclxuICAgIHRoaXMudiA9IHt4OiAwLCB5OiAwLCB6OiAwLCBzZXQ6IGZ1bmN0aW9uKHgseSx6KSB7XHJcbiAgICAgIHRoaXMueD14OyB0aGlzLnk9eTsgdGhpcy56PXo7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSwgdHJhbnNmb3JtOiBmdW5jdGlvbihtKSB7XHJcbiAgICAgIGNvbnN0IHg9bS5tWzBdWzBdKnRoaXMueCttLm1bMV1bMF0qdGhpcy55K20ubVsyXVswXSp0aGlzLnosXHJcbiAgICAgICAgICAgIHk9bS5tWzBdWzFdKnRoaXMueCttLm1bMV1bMV0qdGhpcy55K20ubVsyXVsxXSp0aGlzLnosXHJcbiAgICAgICAgICAgIHo9bS5tWzBdWzJdKnRoaXMueCttLm1bMF1bMl0qdGhpcy55K20ubVsyXVswXSp0aGlzLno7XHJcbiAgICAgIHRoaXMueD14O1xyXG4gICAgICB0aGlzLnk9eTtcclxuICAgICAgdGhpcy56PXo7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfX07XHJcbiAgICB0aGlzLm0gPSB7bTogW1sxLDAsMF0sWzAsMSwwXSxbMCwwLDFdXSwgc2V0OiBmdW5jdGlvbihtMDAsbTAxLG0wMixtMTAsbTExLG0xMixtMjAsbTIxLG0yMikge1xyXG4gICAgICB0aGlzLm09W1ttMDAsbTAxLG0wMl0sW20xMCxtMTEsbTEyXSxbbTIwLG0yMSxtMjJdXTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9fTtcclxuXHJcbiAgICB0aGlzLnN0YXJ0UmVuZGVyID0gKCk9PiB7XHJcbiAgICAgIHRoaXMucGRmLmdldEhhbmRsZXIodGhpcy5yZW5kZXIuYmluZCh0aGlzKSk7XHJcbiAgICB9O1xyXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkuXHJcbiAgICAgIHRoZW4oKCk9PiB0aGlzLnBkZi5nZXRIYW5kbGVyKHRoaXMuaW5pdC5iaW5kKHRoaXMpKSk7XHJcbiAgfVxyXG5cclxuICBzZXRRdWVyeShxdWVyeSkge1xyXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5LnRyaW0oKTtcclxuICAgIGlmKHRoaXMudGV4dENvbnRlbnQpIHtcclxuICAgICAgdGhpcy5zZXRIaXRzKHRoaXMudGV4dENvbnRlbnQpO1xyXG4gICAgICAvLyB0aGlzLmZpbmlzaExvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlY3RTaXplKHIpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZHRoOiByWzJdLXJbMF0sXHJcbiAgICAgIGhlaWdodDogclszXS1yWzFdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlUG9seShtLCBwLCBzKSB7XHJcbiAgICBjb25zdCBwb2x5ID0gW10sIHYgPSB0aGlzLnY7XHJcbiAgICB2LnNldChwLngsIHAueSwgMSkudHJhbnNmb3JtKG0pO1xyXG4gICAgcG9seS5wdXNoKHt4OiB2LngsIHk6IHYueX0pO1xyXG4gICAgdi5zZXQocC54LCBwLnkrcy5oZWlnaHQsIDEpLnRyYW5zZm9ybShtKTtcclxuICAgIHBvbHkucHVzaCh7eDogdi54LCB5OiB2Lnl9KTtcclxuICAgIHYuc2V0KHAueCtzLndpZHRoLCBwLnkrcy5oZWlnaHQsIDEpLnRyYW5zZm9ybShtKTtcclxuICAgIHBvbHkucHVzaCh7eDogdi54LCB5OiB2Lnl9KTtcclxuICAgIHYuc2V0KHAueCtzLndpZHRoLCBwLnksIDEpLnRyYW5zZm9ybShtKTtcclxuICAgIHBvbHkucHVzaCh7eDogdi54LCB5OiB2Lnl9KTtcclxuICAgIHJldHVybiBwb2x5O1xyXG4gIH1cclxuXHJcbiAgZ2V0U2ltdWxhdGVkRG9jKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZTtcclxuICB9XHJcblxyXG4gIHNpbXVsYXRlKGUsIGRvYywgeCwgeSkge1xyXG4gICAgaWYodGhpcy5ldmVudENvbnZlcnRlcikge1xyXG4gICAgICB0aGlzLmV2ZW50Q29udmVydGVyLmNvbnZlcnQoZSwge2RvYywgeCwgeX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0QW5ub3RhdGlvbnMoYW5ub3MpIHtcclxuICAgIGNvbnN0IHQgPSB0aGlzLnZpZXdwb3J0LnRyYW5zZm9ybSxcclxuICAgICAgdGFyZ2V0cyA9IFtdO1xyXG4gICAgdGhpcy5tLnNldChcclxuICAgICAgdFswXSx0WzFdLDAsXHJcbiAgICAgIHRbMl0sdFszXSwwLFxyXG4gICAgICB0WzRdLHRbNV0sMSk7XHJcblxyXG4gICAgZm9yKGxldCBhbm5vIG9mIGFubm9zKSB7XHJcbiAgICAgIGlmIChhbm5vLnN1YnR5cGU9PT0nTGluaycpIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gYW5uby5yZWN0LFxyXG4gICAgICAgICAgYVBvcyA9IHtcclxuICAgICAgICAgICAgeDogcmVjdFswXSxcclxuICAgICAgICAgICAgeTogcmVjdFsxXVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGFTeiA9IHRoaXMucmVjdFNpemUocmVjdCk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbmV3IFBvbHlUYXJnZXQodGhpcy5jcmVhdGVQb2x5KHRoaXMubSwgYVBvcywgYVN6KS5tYXAoKHApPT4gKHt4OiBwLngvdGhpcy52aWV3cG9ydC53aWR0aCwgeTogMS1wLnkvdGhpcy52aWV3cG9ydC5oZWlnaHR9KSkpO1xyXG4gICAgICAgIHRhcmdldC5hbm5vID0gYW5ubztcclxuICAgICAgICB0YXJnZXQuY2FsbGJhY2sgPSB0aGlzLmFubm9DbGIuYmluZCh0aGlzKTtcclxuICAgICAgICB0YXJnZXRzLnB1c2godGFyZ2V0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYodGFyZ2V0cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5ldmVudENvbnZlcnRlciA9IG5ldyBDdXN0b21FdmVudENvbnZlcnRlcih0aGlzLnduZCwgdGhpcy5kb2MsIFBvbHlUYXJnZXQudGVzdCwgdGhpcy5wYWdlKTtcclxuICAgICAgZm9yKGxldCB0YXJnZXQgb2YgdGFyZ2V0cykge1xyXG4gICAgICAgIHRoaXMuZXZlbnRDb252ZXJ0ZXIuYWRkQ3VzdG9tKHRhcmdldCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEhpdHModGV4dENvbnRlbnQpIHtcclxuICAgIHRoaXMudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcclxuICAgIGlmKHRoaXMucXVlcnkhPT0nJykge1xyXG4gICAgICB0aGlzLmZpbmRlciA9IG5ldyBGaW5kZXIodGV4dENvbnRlbnQuaXRlbXMubWFwKChpdGVtKT0+IGl0ZW0uc3RyKSwgdGhpcy5xdWVyeSwge2NvbnRleHRzOiBmYWxzZX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZGVySGl0cygpIHtcclxuICAgIGlmKHRoaXMuZmluZGVyKSB7XHJcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnBhZ2UudmlldyxcclxuICAgICAgICB0ZXN0U3ogPSAkKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB2aXNpYmlsaXR5OiBoaWRkZW47XCI+PC9kaXY+JykuYXBwZW5kVG8oJ2JvZHknKSwgdGV4dERpdiA9IHRlc3RTelswXSxcclxuICAgICAgICBiYXNlT2Zmc2V0ID0gdGVzdFN6Lm9mZnNldCgpLmxlZnQ7XHJcbiAgICAgIGZvcihsZXQgaGl0IG9mIHRoaXMuZmluZGVyLmdldEhpdHMoKSkge1xyXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMudGV4dENvbnRlbnQuaXRlbXNbaGl0LmluZGV4XSxcclxuICAgICAgICAgICAgICAgIHQgPSBQREZKUy5VdGlsLnRyYW5zZm9ybSh0aGlzLnZpZXdwb3J0LnRyYW5zZm9ybSwgaXRlbS50cmFuc2Zvcm0pLFxyXG4gICAgICAgICAgICAgICAgc3R5bGUgPSB0aGlzLnRleHRDb250ZW50LnN0eWxlc1tpdGVtLmZvbnROYW1lXSxcclxuICAgICAgICAgICAgICAgIGFuZ2xlID0gTWF0aC5hdGFuMih0WzFdLCB0WzBdKSsoc3R5bGUudmVydGljYWw/IE1hdGguUEkgLyAyOiAwKSxcclxuICAgICAgICAgICAgICAgIGZvbnRIZWlnaHQgPSBNYXRoLnNxcnQoKHRbMl0gKiB0WzJdKSArICh0WzNdICogdFszXSkpLFxyXG4gICAgICAgICAgICAgICAgZm9udEFzY2VudCA9IHN0eWxlLmFzY2VudD9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYXNjZW50ICogZm9udEhlaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0eWxlLmRlc2NlbnQ/ICgxICsgc3R5bGUuZGVzY2VudCkgKiBmb250SGVpZ2h0OiBmb250SGVpZ2h0KTtcclxuICAgICAgICAgIHRlc3RTei5odG1sKGl0ZW0uc3RyLnN1YnN0cigwLCBoaXQub2Zmc2V0KSsnPHNwYW4+JytpdGVtLnN0ci5zdWJzdHIoaGl0Lm9mZnNldCwgaGl0Lmxlbmd0aCkrJzwvc3Bhbj4nK2l0ZW0uc3RyLnN1YnN0cihoaXQub2Zmc2V0K2hpdC5sZW5ndGgpKTtcclxuXHJcbiAgICAgICAgICB0ZXh0RGl2LnN0eWxlLmZvbnRTaXplID0gZm9udEhlaWdodCsncHgnO1xyXG4gICAgICAgICAgdGV4dERpdi5zdHlsZS5mb250RmFtaWx5ID0gc3R5bGUuZm9udEZhbWlseTtcclxuXHJcbiAgICAgICAgICBjb25zdCB0ZXN0U3BhbiA9IHRlc3RTei5maW5kKCdzcGFuJyksXHJcbiAgICAgICAgICAgICAgaXdpZHRoID0gc3R5bGUudmVydGljYWw/IGl0ZW0uaGVpZ2h0KnRoaXMudmlld3BvcnQuc2NhbGU6IGl0ZW0ud2lkdGgqdGhpcy52aWV3cG9ydC5zY2FsZSxcclxuICAgICAgICAgICAgICB3aWR0aCA9IHRlc3RTei53aWR0aCgpLFxyXG4gICAgICAgICAgICAgIHJlbGF0aXZlT2Zmc2V0ID0gKHRlc3RTcGFuLm9mZnNldCgpLmxlZnQtYmFzZU9mZnNldCkvd2lkdGg7XHJcbiAgICAgICAgICB0aGlzLm0uc2V0KFxyXG4gICAgICAgICAgICAxLDAsMCxcclxuICAgICAgICAgICAgMCwxLDAsXHJcbiAgICAgICAgICAgIHRbNF0rZm9udEFzY2VudCpNYXRoLnNpbihhbmdsZSksdFs1XS1mb250QXNjZW50Kk1hdGguY29zKGFuZ2xlKSwxKTtcclxuICAgICAgICAgIGxldCBwb2x5ID0gdGhpcy5jcmVhdGVQb2x5KHRoaXMubSwge3g6IHJlbGF0aXZlT2Zmc2V0Kml3aWR0aCwgeTogMH0sIHt3aWR0aDogaXdpZHRoKnRlc3RTcGFuLndpZHRoKCkvd2lkdGgsIGhlaWdodDogdGVzdFNwYW4uaGVpZ2h0KCl9KTtcclxuICAgICAgICAgIHBvbHkgPSBwb2x5Lm1hcCgocCk9PiAoe3g6IHAueC90aGlzLnZpZXdwb3J0LndpZHRoLCB5OiAxLXAueS90aGlzLnZpZXdwb3J0LmhlaWdodH0pKTtcclxuICAgICAgICAgIHRoaXMucmVuZGVySGl0KHBvbHkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRlc3RTei5yZW1vdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFubm9DbGIoZSwgZGF0YSkge1xyXG4gICAgaWYodGhpcy5jb250ZXh0LmRpc3BhdGNoRXZlbnQpIHtcclxuICAgICAgdGhpcy5jb250ZXh0LmRpc3BhdGNoRXZlbnQoe1xyXG4gICAgICAgIHR5cGU6ICdwZGZBbm5vdGF0aW9uJyxcclxuICAgICAgICBldmVudDogZSxcclxuICAgICAgICBhbm5vdGF0aW9uOiBkYXRhLnRhcmdldC5hbm5vXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY1ZpZXdwb3J0KCkge1xyXG4gICAgY29uc3Qgc2NhbGUgPSBCYXNlTWF0aFV0aWxzLmNhbGNTY2FsZSh0aGlzLnNpemUud2lkdGgsIHRoaXMuc2l6ZS5oZWlnaHQsIHRoaXMucmVzVywgdGhpcy5yZXNIKTtcclxuICAgIGlmKCF0aGlzLnZpZXdwb3J0IHx8IE1hdGguYWJzKHRoaXMudmlld3BvcnQuc2NhbGUtc2NhbGUpPjFlLTQpIHtcclxuICAgICAgdGhpcy52aWV3cG9ydCA9IHRoaXMucGFnZS5nZXRWaWV3cG9ydChzY2FsZSk7XHJcbiAgICAgIGlmKHRoaXMudHlwZSE9PSdmdWxsJykge1xyXG4gICAgICAgIGlmKHRoaXMudHlwZT09PSdyaWdodCcpIHtcclxuICAgICAgICAgIHRoaXMudmlld3BvcnQub2Zmc2V0WCArPSAwLjUqdGhpcy52aWV3cG9ydC53aWR0aDtcclxuICAgICAgICAgIHRoaXMudmlld3BvcnQudHJhbnNmb3JtWzRdIC09IDAuNSp0aGlzLnZpZXdwb3J0LndpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZpZXdwb3J0LndpZHRoIC89IDI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXNXID0gdGhpcy53aWR0aCA9IHRoaXMudmlld3BvcnQud2lkdGg7XHJcbiAgICAgIHRoaXMucmVzSCA9IHRoaXMuaGVpZ2h0ID0gdGhpcy52aWV3cG9ydC5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0KCkge1xyXG4gICAgdGhpcy50eXBlID0gdGhpcy5wZGYuZ2V0UGFnZVR5cGUodGhpcy5uKTtcclxuICAgIHRoaXMucGRmLmdldFBhZ2UodGhpcy5uKS5cclxuICAgICAgdGhlbigocGFnZSk9PiB7XHJcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcclxuICAgICAgICB0aGlzLnNpemUgPSBQZGYuZ2V0UGFnZVNpemUocGFnZSk7XHJcbiAgICAgICAgaWYodGhpcy50eXBlIT09J2Z1bGwnKSB7XHJcbiAgICAgICAgICB0aGlzLnNpemUud2lkdGggLz0gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGFnZS5nZXRBbm5vdGF0aW9ucygpLlxyXG4gICAgICAgICAgdGhlbih0aGlzLnNldEFubm90YXRpb25zLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHBhZ2UuZ2V0VGV4dENvbnRlbnQoKS5cclxuICAgICAgICAgIHRoZW4odGhpcy5zZXRIaXRzLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuY2FsY1ZpZXdwb3J0KCk7XHJcbiAgICAgICAgdGhpcy5maW5pc2hMb2FkKCk7XHJcbiAgICAgIH0pLlxyXG4gICAgICBjYXRjaCgoZSk9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGxvYWQgUERGIHBhZ2U6ICcrKHRoaXMubisxKSk7XHJcbiAgICAgICAgdGhpcy5maW5pc2hMb2FkKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVzb2x1dGlvbihyZXMpIHtcclxuICAgIHN1cGVyLnNldFJlc29sdXRpb24ocmVzKTtcclxuICAgIGlmKHRoaXMucGFnZSkge1xyXG4gICAgICB0aGlzLmNhbGNWaWV3cG9ydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVuZGVyKGhhbmRsZXIpIHtcclxuICAgIGlmKHRoaXMucGFnZSkge1xyXG4gICAgICB0aGlzLnBhZ2UucmVuZGVyKHtcclxuICAgICAgICBjYW52YXNDb250ZXh0OiB0aGlzLnB1c2hDdHgoKSxcclxuICAgICAgICB2aWV3cG9ydDogdGhpcy52aWV3cG9ydFxyXG4gICAgICB9KS5cclxuICAgICAgdGhlbigoKT0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlckhpdHMoKTtcclxuICAgICAgICB0aGlzLnBvcEN0eCgpO1xyXG4gICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyQmxhbmtQYWdlKCk7XHJcbiAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy9QZGZJbWFnZS5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2gge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIHBhZ2VzKSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcclxuICAgIHRoaXMucGFnZXMgPSBwYWdlcztcclxuICAgIHRoaXMucHJldlJlc3VsdHMgPSBbXTtcclxuICAgIGNvbnRhaW5lci5odG1sKGBcclxuICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWVyeVwiPlxyXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wUXVlcnlcIiB0eXBlPVwidGV4dFwiIG1heGxlbmd0aD1cIjMwXCIgdmFsdWU9XCJcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICBgKTtcclxuICAgIHRoaXMucXVlcnkgPSBjb250YWluZXIuZmluZCgnLnF1ZXJ5IGlucHV0Jyk7XHJcbiAgICB0aGlzLnJlc3VsdHMgPSBjb250YWluZXIuZmluZCgnLnJlc3VsdHMnKTtcclxuICAgIHRoaXMuc3RhdHVzID0gY29udGFpbmVyLmZpbmQoJy5zdGF0dXMnKTtcclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBuYXZpZ2F0ZTogdGhpcy5uYXZpZ2F0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICBkb1F1ZXJ5OiB0aGlzLmRvUXVlcnkuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnF1ZXJ5Lm9uKCdrZXlkb3duJywgdGhpcy5iaW5kcy5kb1F1ZXJ5KTtcclxuICAgIHRoaXMucmVzdWx0cy5vbignY2xpY2snLCB0aGlzLmJpbmRzLm5hdmlnYXRlKTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICB0aGlzLnJlc3VsdHMub2ZmKCdjbGljaycsIHRoaXMuYmluZHMubmF2aWdhdGUpO1xyXG4gICAgdGhpcy5xdWVyeS5vZmYoJ2tleWRvd24nLCB0aGlzLmJpbmRzLmRvUXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGUoZSkge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYodGhpcy5vbk5hdmlnYXRlIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCB0YXJnZXQgPSAkKGUudGFyZ2V0KTtcclxuICAgICAgaWYoIXRhcmdldC5oYXNDbGFzcygncmVzdWx0JykpIHtcclxuICAgICAgICBjb25zdCB0ID0gdGFyZ2V0LmZpbmQoJy5yZXN1bHQnKTtcclxuICAgICAgICBpZih0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGFyZ2V0ID0gdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB3aGlsZSh0YXJnZXQubGVuZ3RoICYmICF0YXJnZXQuaGFzQ2xhc3MoJ3Jlc3VsdCcpKSB7XHJcbiAgICAgICAgICAgIHRhcmdldCA9ICQodGFyZ2V0WzBdLnBhcmVudE5vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwYWdlID0gdGFyZ2V0LmF0dHIoJ2RhdGEnKTtcclxuICAgICAgaWYocGFnZSE9PXVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMub25OYXZpZ2F0ZShwYXJzZUludChwYWdlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRvUXVlcnkoKSB7XHJcbiAgICBpZih0aGlzLm9uUXVlcnkpIHtcclxuICAgICAgY29uc3QgcXVlcnlTdGFtcCA9IHRoaXMucXVlcnlTdGFtcCA9IERhdGUubm93KCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgICAgaWYocXVlcnlTdGFtcCA9PT0gdGhpcy5xdWVyeVN0YW1wKSB7XHJcbiAgICAgICAgICB0aGlzLm9uUXVlcnkodGhpcy5xdWVyeVswXS52YWx1ZS50cmltKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRSZXN1bHRzKHJlc3VsdHMsIGxhc3RQYWdlKSB7XHJcbiAgICBpZih0aGlzLnByZXZSZXN1bHRzLmxlbmd0aCAmJiByZXN1bHRzWzBdIT09dGhpcy5wcmV2UmVzdWx0c1swXSkge1xyXG4gICAgICB0aGlzLnByZXZSZXN1bHRzID0gW107XHJcbiAgICAgIHRoaXMucmVzdWx0cy5odG1sKCcnKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGh0bWxzID0gW107XHJcbiAgICBmb3IobGV0IGk9dGhpcy5wcmV2UmVzdWx0cy5sZW5ndGg7IGk8cmVzdWx0cy5sZW5ndGg7ICsraSkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzW2ldO1xyXG4gICAgICBodG1scy5wdXNoKCc8ZGl2IGNsYXNzPVwicmVzdWx0XCIgZGF0YT1cIicrcmVzdWx0LnBhZ2UrJ1wiPicpO1xyXG4gICAgICAgIGh0bWxzLnB1c2goJzxhIGhyZWY9XCIjXCI+Jyk7XHJcbiAgICAgICAgICBodG1scy5wdXNoKCc8ZGl2PicrcmVzdWx0LmNvbnRleHRzLmpvaW4oJzwvZGl2PjxkaXY+JykrJzwvZGl2PicpO1xyXG4gICAgICAgIGh0bWxzLnB1c2goJzwvYT4nKTtcclxuICAgICAgaHRtbHMucHVzaCgnPC9kaXY+Jyk7XHJcbiAgICB9XHJcbiAgICAkKGh0bWxzLmpvaW4oJycpKS5hcHBlbmRUbyh0aGlzLnJlc3VsdHMpO1xyXG4gICAgdGhpcy5wcmV2UmVzdWx0cyA9IFsuLi5yZXN1bHRzXTtcclxuICAgIGlmKGxhc3RQYWdlPT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLmh0bWwoJycpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhdHVzLmh0bWwobGFzdFBhZ2UrJyBvZiAnK3RoaXMucGFnZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvU2VhcmNoLmpzIiwiaW1wb3J0IHskfSBmcm9tICcuLi9saWJzJztcclxuaW1wb3J0IEltYWdlQmFzZSBmcm9tICcuL0ltYWdlQmFzZSc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY0ltYWdlIGV4dGVuZHMgSW1hZ2VCYXNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IsIHNyYykge1xyXG4gICAgc3VwZXIoY29udGV4dCwgd2lkdGgsIGhlaWdodCwgY29sb3IpO1xyXG5cclxuICAgIHRoaXMuYmluZHMgPSB7fVxyXG4gICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgdGhpcy5pbWFnZS5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xyXG4gICAgdGhpcy5iaW5kcy5pbWFnZUxvYWQgPSAoKT0+IHtcclxuICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaW1hZ2Uud2lkdGg7XHJcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5pbWFnZS5oZWlnaHQ7XHJcbiAgICAgIHRoaXMuc3RhcnRSZW5kZXIgPSAoKT0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlckltYWdlKHRoaXMuaW1hZ2UpO1xyXG4gICAgICAgIHRoaXMuZmluaXNoUmVuZGVyKCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuZmluaXNoTG9hZCgpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuYmluZHMuaW1hZ2VFcnJvciA9ICgpPT4ge1xyXG4gICAgICB0aGlzLnN0YXJ0UmVuZGVyID0gKCk9PiB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJOb3RGb3VuZFBhZ2UoKTtcclxuICAgICAgICB0aGlzLmZpbmlzaFJlbmRlcigpO1xyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLmZpbmlzaExvYWQoKTtcclxuICAgIH07XHJcbiAgICAkKHRoaXMuaW1hZ2UpLm9uKCdsb2FkJywgdGhpcy5iaW5kcy5pbWFnZUxvYWQpLm9uKCdlcnJvcicsIHRoaXMuYmluZHMuaW1hZ2VFcnJvcik7XHJcbiAgICB0aGlzLmltYWdlLnNyYyA9IFV0aWxzLm5vcm1hbGl6ZVVybChzcmMpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgICQodGhpcy5pbWFnZSkub2ZmKCdsb2FkJywgdGhpcy5iaW5kcy5pbWFnZUxvYWQpLm9mZignZXJyb3InLCB0aGlzLmJpbmRzLmltYWdlRXJyb3IpO1xyXG4gICAgdGhpcy5pbWFnZS5zcmMgPSAnJztcclxuICAgIGRlbGV0ZSB0aGlzLmltYWdlO1xyXG4gICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvU3RhdGljSW1hZ2UuanMiLCJpbXBvcnQge1RIUkVFfSBmcm9tICcuLi9saWJzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dHVyZUFuaW1hdG9yIHtcclxuICBjb25zdHJ1Y3RvcihpbWcsIHRpbGVzSG9yaXosIHRpbGVzVmVydCwgbnVtVGlsZXMsIHRpbGVEaXNwRHVyYXRpb24pIHtcclxuXHJcbiAgICBjb25zdCB0ZXh0dXJlID0gbmV3IFRIUkVFLlRleHR1cmUoKTtcclxuICAgIHRleHR1cmUubWluRmlsdGVyID0gVEhSRUUuTGluZWFyRmlsdGVyO1xyXG4gICAgdGV4dHVyZS5pbWFnZSA9IGltZztcclxuICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG5cclxuICBcdC8vIG5vdGU6IHRleHR1cmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSwgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSB1cGRhdGUgZnVuY3Rpb24uXHJcbiAgICB0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xyXG4gIFx0dGhpcy50aWxlc0hvcml6b250YWwgPSB0aWxlc0hvcml6O1xyXG4gIFx0dGhpcy50aWxlc1ZlcnRpY2FsID0gdGlsZXNWZXJ0O1xyXG4gIFx0Ly8gaG93IG1hbnkgaW1hZ2VzIGRvZXMgdGhpcyBzcHJpdGVzaGVldCBjb250YWluP1xyXG4gIFx0Ly8gIHVzdWFsbHkgZXF1YWxzIHRpbGVzSG9yaXogKiB0aWxlc1ZlcnQsIGJ1dCBub3QgbmVjZXNzYXJpbHksXHJcbiAgXHQvLyAgaWYgdGhlcmUgYXQgYmxhbmsgdGlsZXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3ByaXRlc2hlZXQuXHJcbiAgXHR0aGlzLm51bWJlck9mVGlsZXMgPSBudW1UaWxlcztcclxuICBcdHRleHR1cmUucmVwZWF0LnNldCgxL3RoaXMudGlsZXNIb3Jpem9udGFsLCAxL3RoaXMudGlsZXNWZXJ0aWNhbCk7XHJcblxyXG4gIFx0Ly8gaG93IGxvbmcgc2hvdWxkIGVhY2ggaW1hZ2UgYmUgZGlzcGxheWVkP1xyXG4gIFx0dGhpcy50aWxlRGlzcGxheUR1cmF0aW9uID0gdGlsZURpc3BEdXJhdGlvbjtcclxuXHJcbiAgXHQvLyBob3cgbG9uZyBoYXMgdGhlIGN1cnJlbnQgaW1hZ2UgYmVlbiBkaXNwbGF5ZWQ/XHJcbiAgXHR0aGlzLmN1cnJlbnREaXNwbGF5VGltZSA9IDA7XHJcblxyXG4gIFx0Ly8gd2hpY2ggaW1hZ2UgaXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZD9cclxuICBcdHRoaXMuY3VycmVudFRpbGUgPSAwO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlKG1pbGxpU2VjKSB7XHJcbiAgICB0aGlzLmN1cnJlbnREaXNwbGF5VGltZSArPSBtaWxsaVNlYztcclxuICAgIHdoaWxlKHRoaXMuY3VycmVudERpc3BsYXlUaW1lID4gdGhpcy50aWxlRGlzcGxheUR1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudERpc3BsYXlUaW1lIC09IHRoaXMudGlsZURpc3BsYXlEdXJhdGlvbjtcclxuICAgICAgKyt0aGlzLmN1cnJlbnRUaWxlO1xyXG4gICAgICBpZih0aGlzLmN1cnJlbnRUaWxlID09IHRoaXMubnVtYmVyT2ZUaWxlcylcclxuICAgICAgICB0aGlzLmN1cnJlbnRUaWxlID0gMDtcclxuICAgICAgdmFyIGN1cnJlbnRDb2x1bW4gPSB0aGlzLmN1cnJlbnRUaWxlJXRoaXMudGlsZXNIb3Jpem9udGFsO1xyXG4gICAgICB0aGlzLnRleHR1cmUub2Zmc2V0LnggPSBjdXJyZW50Q29sdW1uL3RoaXMudGlsZXNIb3Jpem9udGFsO1xyXG4gICAgICB2YXIgY3VycmVudFJvdyA9IE1hdGguZmxvb3IodGhpcy5jdXJyZW50VGlsZS90aGlzLnRpbGVzSG9yaXpvbnRhbCk7XHJcbiAgICAgIHRoaXMudGV4dHVyZS5vZmZzZXQueSA9IGN1cnJlbnRSb3cvdGhpcy50aWxlc1ZlcnRpY2FsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIGNvbnN0IGltZyA9IHRoaXMudGV4dHVyZS5pbWFnZTtcclxuICAgIGltZy5oZWlnaHQgPSBpbWcud2lkdGggPSAwO1xyXG4gICAgdGhpcy50ZXh0dXJlLmRpc3Bvc2UoKTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGV4dHVyZUFuaW1hdG9yLmpzIiwiaW1wb3J0IHtUSFJFRSwgJH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBVdGlscyBmcm9tICcuL1V0aWxzJztcclxuaW1wb3J0IE1vdXNlRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9Nb3VzZUV2ZW50Q29udmVydGVyJztcclxuaW1wb3J0IFRocmVlRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9UaHJlZUV2ZW50Q29udmVydGVyJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaHJlZU1vdXNlRXZlbnRDb252ZXJ0ZXIgZXh0ZW5kcyBNb3VzZUV2ZW50Q29udmVydGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIHZpc3VhbFdvcmxkLCB0ZXN0KSB7XHJcbiAgICBzdXBlcih3bmQsIGRvYywgdmlzdWFsV29ybGQuZWxlbWVudCk7XHJcbiAgICBVdGlscy5leHRlbmRzKHRoaXMsIG5ldyBUaHJlZUV2ZW50Q29udmVydGVyKHZpc3VhbFdvcmxkLCB0ZXN0KSk7XHJcbiAgfVxyXG5cclxuICBnZXRDYWxsYmFjayhvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3Qub2JqZWN0LnVzZXJEYXRhLm1vdXNlQ2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBzZXRDb29yZHNGcm9tRXZlbnQoZSkge1xyXG4gICAgY29uc3QgakVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudCk7XHJcbiAgICBjb25zdCBvZmZzZXQgPSBqRWxlbWVudC5vZmZzZXQoKTtcclxuICAgIHRoaXMuY29vcmRzLnggPSAoKGUucGFnZVgtb2Zmc2V0LmxlZnQpL2pFbGVtZW50LndpZHRoKCkpKjItMTtcclxuICAgIHRoaXMuY29vcmRzLnkgPSAtKChlLnBhZ2VZLW9mZnNldC50b3ApL2pFbGVtZW50LmhlaWdodCgpKSoyKzE7XHJcbiAgICByZXR1cm4gdGhpcy5jb29yZHM7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlTW91c2VFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCB7VEhSRUUsICR9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSAnLi9VdGlscyc7XHJcbmltcG9ydCBUb3VjaEV2ZW50Q29udmVydGVyIGZyb20gJy4vVG91Y2hFdmVudENvbnZlcnRlcic7XHJcbmltcG9ydCBUaHJlZUV2ZW50Q29udmVydGVyIGZyb20gJy4vVGhyZWVFdmVudENvbnZlcnRlcic7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyIGV4dGVuZHMgVG91Y2hFdmVudENvbnZlcnRlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHduZCwgZG9jLCB2aXN1YWxXb3JsZCwgdGVzdCkge1xyXG4gICAgc3VwZXIod25kLCBkb2MsIHZpc3VhbFdvcmxkLmVsZW1lbnQpO1xyXG4gICAgVXRpbHMuZXh0ZW5kcyh0aGlzLCBuZXcgVGhyZWVFdmVudENvbnZlcnRlcih2aXN1YWxXb3JsZCwgdGVzdCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2FsbGJhY2sob2JqZWN0KSB7XHJcbiAgICByZXR1cm4gb2JqZWN0Lm9iamVjdC51c2VyRGF0YS50b3VjaENhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgc2V0Q29vcmRzRnJvbUV2ZW50KGUpIHtcclxuICAgIGNvbnN0IGpFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnQpLCBvZmZzZXQgPSBqRWxlbWVudC5vZmZzZXQoKSxcclxuICAgICAgdG91Y2hlcyA9IGUudG91Y2hlcyB8fCBlLm9yaWdpbmFsRXZlbnQudG91Y2hlcywgdG91Y2ggPSB0b3VjaGVzLmxlbmd0aD8gdG91Y2hlc1swXTogKHRoaXMubGFzdFRvdWNoZXMgfHwgW3twYWdlWDogMCwgcGFnZVk6IDB9XSlbMF0sXHJcbiAgICAgIHBhZ2VYID0gdG91Y2gucGFnZVgsIHBhZ2VZID0gdG91Y2gucGFnZVk7XHJcbiAgICB0aGlzLmxhc3RUb3VjaGVzID0gdG91Y2hlcy5sZW5ndGg/IHRvdWNoZXM6IHRoaXMubGFzdFRvdWNoZXM7XHJcbiAgICB0aGlzLmNvb3Jkcy54ID0gKChwYWdlWC1vZmZzZXQubGVmdCkvakVsZW1lbnQud2lkdGgoKSkqMi0xO1xyXG4gICAgdGhpcy5jb29yZHMueSA9IC0oKHBhZ2VZLW9mZnNldC50b3ApL2pFbGVtZW50LmhlaWdodCgpKSoyKzE7XHJcbiAgICByZXR1cm4gdGhpcy5jb29yZHM7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1RocmVlVG91Y2hFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBJbWFnZUZhY3RvcnkgZnJvbSAnLi9JbWFnZUZhY3RvcnknO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGh1bWJuYWlscyB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIGNvbnRhaW5lciwgdGh1bWJuYWlsc0NsYiwgc2l6ZSwgcHJvcHM9e2tXdG9IOiAyMTAvMjk3fSkge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICB0aGlzLnAgPSBwcm9wcztcclxuICAgIHRoaXMudGh1bWJuYWlsc0NsYiA9IHRodW1ibmFpbHNDbGI7XHJcbiAgICB0aGlzLnNpemUgPSBzaXplO1xyXG4gICAgdGhpcy5jYW52YXMgPSAkKCc8Y2FudmFzPicpWzBdO1xyXG4gICAgdGhpcy5pbWFnZUZhY3RvcnkgPSBuZXcgSW1hZ2VGYWN0b3J5KHtcclxuICAgICAgLi4uY29udGV4dCxcclxuICAgICAgcmVuZGVyQ2FudmFzOiB0aGlzLmNhbnZhcyxcclxuICAgICAgcmVuZGVyQ2FudmFzQ3R4OiB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXHJcbiAgICB9KTtcclxuICAgIHRoaXMudGh1bWJuYWlscyA9IFtdO1xyXG4gICAgZm9yKGxldCBpPTA7IGk8c2l6ZTsgKytpKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnRodW1ibmFpbHNDbGIoaSk7XHJcbiAgICAgIHRoaXMudGh1bWJuYWlscy5wdXNoKHtcclxuICAgICAgICAuLi5pbmZvLFxyXG4gICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgIGxvYWRlZDogaW5mby50eXBlPT09J3RodW1ibmFpbC1pbWFnZScsXHJcbiAgICAgICAgaGVhZGluZzogbnVsbCxcclxuICAgICAgICB0aHVtYm5haWw6IG51bGwsXHJcbiAgICAgICAgdGl0bGU6IGluZm8udGl0bGUgfHwgaVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICB1cGRhdGU6IHRoaXMudXBkYXRlLmJpbmQodGhpcyksXHJcbiAgICAgIG5hdmlnYXRlOiAoZSk9PiB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGlmKHRoaXMub25OYXZpZ2F0ZSkge1xyXG4gICAgICAgICAgbGV0IG5vZGUgPSBlLnRhcmdldDtcclxuICAgICAgICAgIHdoaWxlKG5vZGUgJiYgIW5vZGUuZGF0YVRodW1ibmFpbCkge1xyXG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5vbk5hdmlnYXRlKG5vZGUuZGF0YVRodW1ibmFpbC5pbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy5jb250YWluZXIub24oJ3Njcm9sbCcsIHRoaXMuYmluZHMudXBkYXRlKTtcclxuICB9XHJcblxyXG4gIGdldFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplO1xyXG4gIH1cclxuXHJcbiAgc2V0RW5hYmxlKGVuYWJsZSkge1xyXG4gICAgdGhpcy5lbmFibGUgPSBlbmFibGU7XHJcbiAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ2EnKS5vZmYoJ2NsaWNrJywgdGhpcy5iaW5kcy5uYXZpZ2F0ZSk7XHJcbiAgICB0aGlzLmNvbnRhaW5lci5vZmYoJ3Njcm9sbCcsIHRoaXMuYmluZHMudXBkYXRlKTtcclxuICAgIHRoaXMuY29udGFpbmVyLmh0bWwoJycpO1xyXG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMud2lkdGggPSAwO1xyXG4gICAgZGVsZXRlIHRoaXMuY2FudmFzO1xyXG4gIH1cclxuXHJcbiAgbG9hZCh0aHVtYm5haWwpIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5pbWFnZUZhY3RvcnkuYnVpbGQodGh1bWJuYWlsLCB0aHVtYm5haWwubnVtYmVyPT09dW5kZWZpbmVkPyB0aHVtYm5haWwuaW5kZXg6IHRodW1ibmFpbC5udW1iZXIsIHRoaXMucC5rV3RvSCozMDAsIDMwMCk7XHJcbiAgICB3cmFwcGVyLm9uQ2hhbmdlID0gKGNhbnZhcyk9PiB7XHJcbiAgICAgIHRoaXMuc2V0SW1hZ2UodGh1bWJuYWlsLCBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSk7XHJcbiAgICAgIHRodW1ibmFpbC5sb2FkZWQgPSB0cnVlO1xyXG4gICAgICB3cmFwcGVyLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PiB0aGlzLnVwZGF0ZSgpKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXRBY3RpdmUoKSB7XHJcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCgpLCBsYXN0ID0gZmlyc3QgKyB0aGlzLmNvbnRhaW5lci5oZWlnaHQoKSwgcmVzID0gW107XHJcbiAgICBmb3IobGV0IHRodW1ibmFpbCBvZiB0aGlzLnRodW1ibmFpbHMpIHtcclxuICAgICAgaWYoTWF0aC5tYXgodGh1bWJuYWlsLmZpcnN0LCBmaXJzdCk8TWF0aC5taW4odGh1bWJuYWlsLmxhc3QsIGxhc3QpKSB7XHJcbiAgICAgICAgcmVzLnB1c2godGh1bWJuYWlsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHVwZGF0ZSgpIHtcclxuICAgIGlmKCF0aGlzLmxvYWRpbmcgJiYgdGhpcy5jYW52YXMgJiYgdGhpcy5lbmFibGUpIHtcclxuICAgICAgaWYoIXRoaXMuYnVpbHQpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuZ2V0QWN0aXZlKCk7XHJcbiAgICAgIGZvcihsZXQgdGh1bWJuYWlsIG9mIGFjdGl2ZSkge1xyXG4gICAgICAgIGlmKCF0aHVtYm5haWwubG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWQodGh1bWJuYWlsKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0SW1hZ2UodGh1bWJuYWlsLCBpbWcpIHtcclxuICAgIHRodW1ibmFpbC5pbWcgPSBpbWc7XHJcbiAgICB0aHVtYm5haWwudGh1bWJuYWlsLmNzcygnYmFja2dyb3VuZC1pbWFnZScsIFsndXJsKFxcJycsIGltZywnXFwnKSddLmpvaW4oJycpKTtcclxuICAgIHRodW1ibmFpbC50aHVtYm5haWwucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTtcclxuICB9XHJcblxyXG4gIHJlbmRlcigpIHtcclxuICAgIGNvbnN0IGVsZW1lbnRzID0gWyc8ZGl2IGNsYXNzPVwidGh1bWJuYWlsc1wiPiddXHJcbiAgICBmb3IobGV0IGk9MDsgaTx0aGlzLnNpemU7ICsraSkge1xyXG4gICAgICBlbGVtZW50cy5wdXNoKFsnPGRpdiBjbGFzcz1cIml0ZW1cIj48YSBocmVmPVwiI1wiPjxkaXYgY2xhc3M9XCJ0aHVtYm5haWwgbG9hZGluZ1wiPjwvZGl2PjwvYT48ZGl2IGNsYXNzPVwiaGVhZGluZ1wiPjxhIGhyZWY9XCIjXCIgdGl0bGU9XCInLCBpKzEsJ1wiPicsIGkrMSwgJzwvYT48L2Rpdj48L2Rpdj4nXS5qb2luKCcnKSk7XHJcbiAgICB9XHJcbiAgICBlbGVtZW50cy5wdXNoKCc8L2Rpdj4nKTtcclxuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChlbGVtZW50cy5qb2luKCcnKSk7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy5pdGVtJyksIGJhc2UgPSB0aGlzLmNvbnRhaW5lci5maW5kKCcudGh1bWJuYWlscycpLm9mZnNldCgpLnRvcDtcclxuICAgIGZvcihsZXQgaT0wOyBpPGl0ZW1zLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSAkKGl0ZW1zW2ldKTtcclxuICAgICAgdGhpcy50aHVtYm5haWxzW2ldLmhlYWRpbmcgPSBpdGVtLmZpbmQoJy5oZWFkaW5nJyk7XHJcbiAgICAgIHRoaXMudGh1bWJuYWlsc1tpXS50aHVtYm5haWwgPSBpdGVtLmZpbmQoJy50aHVtYm5haWwnKTtcclxuICAgICAgdGhpcy50aHVtYm5haWxzW2ldLmZpcnN0ID0gaXRlbS5vZmZzZXQoKS50b3AtYmFzZTtcclxuICAgICAgdGhpcy50aHVtYm5haWxzW2ldLmxhc3QgPSB0aGlzLnRodW1ibmFpbHNbaV0uZmlyc3QraXRlbS5oZWlnaHQoKTtcclxuICAgICAgaWYodGhpcy50aHVtYm5haWxzW2ldLmxvYWRlZCkge1xyXG4gICAgICAgIHRoaXMuc2V0SW1hZ2UodGhpcy50aHVtYm5haWxzW2ldLCB0aGlzLnRodW1ibmFpbHNbaV0uc3JjKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhcyA9IGl0ZW0uZmluZCgnYScpO1xyXG4gICAgICBmb3IobGV0IGo9MDsgajxhcy5sZW5ndGg7ICsraikge1xyXG4gICAgICAgIGNvbnN0IGEgPSBhc1tqXTtcclxuICAgICAgICBhLmRhdGFUaHVtYm5haWwgPSB0aGlzLnRodW1ibmFpbHNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY29udGFpbmVyLmZpbmQoJ2EnKS5vbignY2xpY2snLCB0aGlzLmJpbmRzLm5hdmlnYXRlKTtcclxuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVGh1bWJuYWlscy5qcyIsImltcG9ydCB7JH0gZnJvbSAnLi4vbGlicyc7XHJcbmltcG9ydCBFdmVudENvbnZlcnRlciBmcm9tICcuL0V2ZW50Q29udmVydGVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvdWNoQ29udmVydGVyIGV4dGVuZHMgRXZlbnRDb252ZXJ0ZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih3bmQsIGRvYywgZWxlbWVudCkge1xyXG4gICAgc3VwZXIod25kLCBkb2MpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB0aGlzLmJpbmRzID0ge1xyXG4gICAgICBjb252ZXJ0OiB0aGlzLmNvbnZlcnQuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgICQodGhpcy5lbGVtZW50KS5vbigndG91Y2hzdGFydCB0b3VjaG1vdmUnLCB0aGlzLmJpbmRzLmNvbnZlcnQpO1xyXG4gICAgJCh0aGlzLmRvYykub24oJ3RvdWNoZW5kJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcblxyXG4gIGRpc3Bvc2UoKSB7XHJcbiAgICAkKHRoaXMuZWxlbWVudCkub2ZmKCd0b3VjaHN0YXJ0IHRvdWNobW92ZScsIHRoaXMuYmluZHMuY29udmVydCk7XHJcbiAgICAkKHRoaXMuZG9jKS5vZmYoJ3RvdWNoZW5kJywgdGhpcy5iaW5kcy5jb252ZXJ0KTtcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVG91Y2hFdmVudENvbnZlcnRlci5qcyIsImltcG9ydCB7JCwgdHJ9IGZyb20gJy4uL2xpYnMnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyB7XHJcblxyXG4gIHN0YXRpYyBsaW5rU3RhdGVIYW5kbGVycyA9IHtcclxuICAgIHZpc2libGU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmNsYXNzUHJvcGVydHkoY3RybCwgJ2hpZGRlbicsICF2YWx1ZSksXHJcbiAgICBhY3RpdmU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmNsYXNzUHJvcGVydHkoY3RybCwgJ2FjdGl2ZScsIHZhbHVlKSxcclxuICAgIGVuYWJsZTogKGN0cmwsIHZhbHVlKT0+IFZpZXcuY2xhc3NQcm9wZXJ0eShjdHJsLCAnZGlzYWJsZWQnLCAhdmFsdWUpXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIHdpZGdldFN0YXRlSGFuZGxlcnMgPSB7XHJcbiAgICB2aXNpYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdoaWRkZW4nLCAhdmFsdWUpLFxyXG4gICAgYWN0aXZlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdhY3RpdmUnLCB2YWx1ZSksXHJcbiAgICBlbmFibGU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmNsYXNzUHJvcGVydHkoY3RybCwgJ2Rpc2FibGVkJywgIXZhbHVlKVxyXG4gIH07XHJcblxyXG4gIHN0YXRpYyBpbnB1dFN0YXRlSGFuZGxlcnMgPSB7XHJcbiAgICB2aXNpYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdoaWRkZW4nLCAhdmFsdWUpLFxyXG4gICAgdmFsdWU6IChjdHJsLCB2YWx1ZSk9PiBjdHJsWzBdLnZhbHVlID0gdmFsdWUsXHJcbiAgICBlbmFibGU6IChjdHJsLCB2YWx1ZSk9PiBWaWV3LmF0dHJpYnV0ZVByb3BlcnR5KGN0cmwsICdkaXNhYmxlZCcsICF2YWx1ZSlcclxuICB9O1xyXG5cclxuICBzdGF0aWMgdGV4dFN0YXRlSGFuZGxlcnMgPSB7XHJcbiAgICB2aXNpYmxlOiAoY3RybCwgdmFsdWUpPT4gVmlldy5jbGFzc1Byb3BlcnR5KGN0cmwsICdoaWRkZW4nLCAhdmFsdWUpLFxyXG4gICAgdmFsdWU6IChjdHJsLCB2YWx1ZSk9PiBjdHJsLnRleHQodmFsdWUpXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIGNsYXNzUHJvcGVydHkoY3RybCwgY2xhc3NOYW1lLCB2YWx1ZSkge1xyXG4gICAgaWYodmFsdWUpIHtcclxuICAgICAgY3RybC5hZGRDbGFzcyhjbGFzc05hbWUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGN0cmwucmVtb3ZlQ2xhc3MoY2xhc3NOYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBhdHRyaWJ1dGVQcm9wZXJ0eShjdHJsLCBhdHRyaWJ1dGVOYW1lLCB2YWx1ZSkge1xyXG4gICAgaWYodmFsdWUpIHtcclxuICAgICAgY3RybC5hdHRyKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjdHJsLnJlbW92ZUF0dHIoYXR0cmlidXRlTmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY2FsbEhhbmRsZXJzKGhhbmRsZXJzLCBpZCwgZSwgZGF0YSkge1xyXG4gICAgZm9yKGxldCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XHJcbiAgICAgIGlmKGhhbmRsZXJbaWRdKSB7XHJcbiAgICAgICAgaGFuZGxlcltpZF0oZSwgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZihoYW5kbGVyLmhhbmRsZURlZmF1bHQpIHtcclxuICAgICAgICBoYW5kbGVyLmhhbmRsZURlZmF1bHQoaWQsIGUsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaGFuZGxlRXZlbnQoaWQsIGdldEhhbmRsZXJzLCBlLCBkYXRhKSB7XHJcbiAgICBWaWV3LmNhbGxIYW5kbGVycyhnZXRIYW5kbGVycyhpZCksIGlkLCBlLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBoYW5kbGVMaW5rRXZlbnQoZSkge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYoIXRoaXMuY3RybC5oYXNDbGFzcygnZGlzYWJsZWQnKSkge1xyXG4gICAgICBWaWV3LmhhbmRsZUV2ZW50KHRoaXMuaWQsIHRoaXMuZ2V0SGFuZGxlcnMsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGhhbmRsZUlucHV0RXZlbnQoZSkge1xyXG4gICAgVmlldy5oYW5kbGVFdmVudCh0aGlzLmlkLCB0aGlzLmdldEhhbmRsZXJzLCBlLCBlLnRhcmdldC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaGFuZGxlRm9ybUV2ZW50KGUpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIFZpZXcuaGFuZGxlRXZlbnQodGhpcy5pZCwgdGhpcy5nZXRIYW5kbGVycywgZSk7XHJcbiAgfVxyXG5cclxuICAvLyB2aXJ0dWFsIGZ1bmN0aW9ucyB7XHJcbiAgZ2V0TGlua3MoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFdpZGdldHMoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldElucHV0cygpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGV4dHMoKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFRlbXBsYXRlKCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuXHJcbiAgZ2V0SGFuZGxlcnMoaWQpIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzO1xyXG4gIH1cclxuICAvLyB9XHJcblxyXG4gIGNhbGxMYXRlcihoYW5kbGVycywgaWQsIGUsIGRhdGEsIG1zKSB7XHJcbiAgICB0aGlzLnBlbmRpbmdzW2lkXSA9IHtcclxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxyXG4gICAgfTtcclxuICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nc1tpZF07XHJcbiAgICAgIGlmKHBlbmRpbmcgJiYgdGltZXN0YW1wLXBlbmRpbmcudGltZXN0YW1wPj1tcykge1xyXG4gICAgICAgIFZpZXcuY2FsbEhhbmRsZXJzKGhhbmRsZXJzLCBpZCwgZSwgZGF0YSk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ3NbaWRdO1xyXG4gICAgICB9XHJcbiAgICB9LCBtcyk7XHJcbiAgfVxyXG5cclxuICAvLyBsb2FkRmlsZXModXJscywgcmVhZHksIGZhaWx1cmUpIHtcclxuICAvLyAgIGxldCBkb25lID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgLy8gICBmb3IobGV0IHVybCBvZiB1cmxzKSB7XHJcbiAgLy8gICAgIGRvbmUgPSBkb25lLnRoZW4oKCk9PiB7XHJcbiAgLy8gICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpPT4ge1xyXG4gIC8vICAgICAgICAgJC5nZXQodXJsLCAocmVzKT0+IHtcclxuICAvLyAgICAgICAgICAgcmVhZHkocmVzLCB1cmwpO1xyXG4gIC8vICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgLy8gICAgICAgICB9KS5mYWlsKChyZXMpPT4ge1xyXG4gIC8vICAgICAgICAgICBpZihmYWlsdXJlICYmIGZhaWx1cmUocmVzLCB1cmwpKSB7XHJcbiAgLy8gICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIHJlamVjdChyZXMpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9KTtcclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZG9uZTtcclxuICAvLyB9XHJcblxyXG4gIGxvYWRGaWxlcyh1cmxzLCBmaWxlcykge1xyXG4gICAgY29uc3QgdGFza3MgPSBbXTtcclxuICAgIGZvcihsZXQgbmFtZSBvZiBPYmplY3Qua2V5cyh1cmxzKSkge1xyXG4gICAgICBmaWxlc1tuYW1lXSA9IFtdO1xyXG4gICAgICBmb3IobGV0IHVybCBvZiB1cmxzW25hbWVdKSB7XHJcbiAgICAgICAgdGFza3MucHVzaChcclxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpPT4ge1xyXG4gICAgICAgICAgICAkLmdldCh1cmwsIChkYXRhKT0+IHtcclxuICAgICAgICAgICAgICBmaWxlc1tuYW1lXS5wdXNoKHt1cmwsIGRhdGF9KTtcclxuICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH0pLmZhaWwoKHJlcyk9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KHJlcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGFza3MpO1xyXG4gIH1cclxuXHJcbiAgdXJsUmVzb2x2ZXIoYmFzZVVybCwgdXJsKSB7XHJcbiAgICB1cmwgPSB1cmwucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xyXG4gICAgaWYodXJsLmNoYXJBdCgwKSE9PScvJykge1xyXG4gICAgICBiYXNlVXJsID0gYmFzZVVybC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbiAgICAgIGNvbnN0IHAgPSBiYXNlVXJsLmxhc3RJbmRleE9mKCcvJyk7XHJcbiAgICAgIHVybCA9ICh+cD8gYmFzZVVybC5zdWJzdHIoMCwgcCsxKTogJycpK3VybDtcclxuXHJcbiAgICAgIGNvbnN0IHBhcnRzID0gdXJsLnNwbGl0KCcvJyk7XHJcbiAgICAgIHVybCA9IFtdO1xyXG4gICAgICBmb3IobGV0IHBhcnQgb2YgcGFydHMpIHtcclxuICAgICAgICBpZihwYXJ0PT09Jy4nKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYocGFydD09PScuLicpIHtcclxuICAgICAgICAgIGlmKHVybC5sZW5ndGggJiYgISh1cmwubGVuZ3RoPT09MSAmJiB1cmxbMF09PT0nJykpIHtcclxuICAgICAgICAgICAgdXJsLnBvcCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHVybC5wdXNoKHBhcnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB1cmwgPSB1cmwuam9pbignLycpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1cmw7XHJcbiAgfVxyXG5cclxuICBvYmpUb0F0dHJzU3RyKG8pIHtcclxuICAgIGNvbnN0IHJlcyA9IFtdO1xyXG4gICAgZm9yKGxldCBuYW1lIG9mIE9iamVjdC5rZXlzKG8pKSB7XHJcbiAgICAgIHJlcy5wdXNoKFtuYW1lLCAnPVwiJywgb1tuYW1lXSwgJ1wiJ10uam9pbignJykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmcmFtZVNpemUoKSB7XHJcbiAgICBpZih0aGlzLmZyYW1lKSB7XHJcbiAgICAgIGlmKE1hdGguYWJzKHRoaXMuZnJhbWUud2lkdGgtdGhpcy5wYXJlbnRDb250YWluZXIud2lkdGgoKSk+MSB8fCBNYXRoLmFicyh0aGlzLmZyYW1lLmhlaWdodC10aGlzLnBhcmVudENvbnRhaW5lci5oZWlnaHQoKSk+MSkge1xyXG4gICAgICAgIHRoaXMub25SZXNpemUoKTtcclxuICAgICAgfVxyXG4gICAgICBzZXRUaW1lb3V0KHRoaXMuY2hlY2tJZnJhbWVTaXplLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZSgpIHtcclxuICAgIHRoaXMuZnJhbWUud2lkdGggPSB0aGlzLnBhcmVudENvbnRhaW5lci53aWR0aCgpO1xyXG4gICAgdGhpcy5mcmFtZS5oZWlnaHQgPSB0aGlzLnBhcmVudENvbnRhaW5lci5oZWlnaHQoKTtcclxuICB9XHJcblxyXG4gIHRyYW5zbGF0ZShodG1sKSB7XHJcbiAgICByZXR1cm4gaHRtbC5yZXBsYWNlKC88XFwkdHI+KC4qKTxcXC9cXCR0cj4vZ2ksIChzMCxzMSk9PiB0cihzMSkpO1xyXG4gIH1cclxuXHJcbiAgZmlyZUxpbmtzT25Mb2FkRXZlbnQoKSB7XHJcbiAgICBpZih0aGlzLnRlbXBsYXRlT2JqZWN0ICYmIHRoaXMudGVtcGxhdGVPYmplY3QubGlua0xvYWRlZCkge1xyXG4gICAgICBsZXQgbG9hZGVkID0gdHJ1ZTtcclxuICAgICAgZm9yKGxldCBqTGluayBvZiB0aGlzLmpMaW5rcykge1xyXG4gICAgICAgIGNvbnN0IGxpbmsgPSBqTGlua1swXTtcclxuICAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgICBpbWcub25lcnJvciA9ICgpPT4gdGhpcy50ZW1wbGF0ZU9iamVjdC5saW5rTG9hZGVkKGxpbmspO1xyXG4gICAgICAgIGltZy5zcmMgPSBsaW5rLmhyZWY7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBhcmVudENvbnRhaW5lciwgb25Mb2FkLCB0ZW1wbGF0ZT17fSkge1xyXG4gICAgdGhpcy5wZW5kaW5ncyA9IHt9O1xyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgb25SZXNpemU6IHRoaXMub25SZXNpemUuYmluZCh0aGlzKVxyXG4gICAgfTtcclxuICAgIHRoaXMucGFyZW50Q29udGFpbmVyID0gJChwYXJlbnRDb250YWluZXIpO1xyXG4gICAgdGhpcy5pc0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICF3aW5kb3cuTVNTdHJlYW07XHJcbiAgICB0aGlzLnBhcmVudENvbnRhaW5lci5odG1sKCc8aWZyYW1lIHN0eWxlPVwiYm9yZGVyOiAwOycrKHRoaXMuaXNJT1M/ICcnOiAnIHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCUnKSsnXCIgc2Nyb2xsaW5nPVwibm9cIj48L2lmcmFtZT4nKTtcclxuXHJcbiAgICB0aGlzLmZyYW1lID0gdGhpcy5wYXJlbnRDb250YWluZXIuZmluZCgnaWZyYW1lJylbMF07XHJcbiAgICBpZih0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cuc3RvcCkge1xyXG4gICAgICB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cuc3RvcCgpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5pc0lPUykge1xyXG4gICAgICAkKHRoaXMucGFyZW50Q29udGFpbmVyWzBdLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpLm9uKCdyZXNpemUnLCB0aGlzLmJpbmRzLm9uUmVzaXplKTtcclxuICAgICAgdGhpcy5vblJlc2l6ZSgpO1xyXG4gICAgICBzZXRUaW1lb3V0KHRoaXMuY2hlY2tJZnJhbWVTaXplLmJpbmQodGhpcyksIDI1MCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb250YWluZXIgPSAkKHRoaXMuZnJhbWUuY29udGVudERvY3VtZW50LmJvZHkpO1xyXG4gICAgdGhpcy5jb250YWluZXIuY3NzKCdtYXJnaW4nLCAnMCcpO1xyXG4gICAgdGhpcy5oZWFkID0gJCh0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudC5oZWFkKTtcclxuICAgIHRoaXMub25Mb2FkID0gb25Mb2FkO1xyXG4gICAgdGhpcy5oYW5kbGVycyA9IFtdO1xyXG5cclxuICAgIGNvbnN0IHNjcmlwdCA9IHRlbXBsYXRlLmh0bWw/IHRlbXBsYXRlLnNjcmlwdDogdGhpcy5nZXRUZW1wbGF0ZSgpLnNjcmlwdDtcclxuICAgIGNvbnN0IHVybHMgPSB7XHJcbiAgICAgIHN0eWxlczogdGVtcGxhdGUuc3R5bGVzIHx8IHRoaXMuZ2V0VGVtcGxhdGUoKS5zdHlsZXMsXHJcbiAgICAgIGh0bWw6IFt0ZW1wbGF0ZS5odG1sIHx8IHRoaXMuZ2V0VGVtcGxhdGUoKS5odG1sXSxcclxuICAgICAgc2NyaXB0OiBzY3JpcHQ/IFtzY3JpcHRdOiBbXVxyXG4gICAgfSwgZmlsZXMgPSB7fSwgbGlua3MgPSB0ZW1wbGF0ZS5saW5rcyB8fCB0aGlzLmdldFRlbXBsYXRlKCkubGlua3M7XHJcblxyXG4gICAgdGhpcy5sb2FkRmlsZXModXJscywgZmlsZXMpLnRoZW4oKCk9PiB7XHJcbiAgICAgIGZvcihsZXQgc3R5bGUgb2YgZmlsZXMuc3R5bGVzKSB7XHJcbiAgICAgICAgbGV0IHRleHRDc3MgPSBzdHlsZS5kYXRhLCB1cmwgPSBzdHlsZS51cmw7XHJcbiAgICAgICAgdGV4dENzcyA9IHRleHRDc3MucmVwbGFjZSgvdXJsXFwoWydcIl0oLio/KVtcIiddXFwpL2csIChyLCByMSk9PiB7XHJcbiAgICAgICAgICByZXR1cm4gWyd1cmwoJywgdGhpcy51cmxSZXNvbHZlcih1cmwsIHIxKSwgJyknXS5qb2luKCcnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKGA8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+JHt0ZXh0Q3NzfTwvc3R5bGU+YCkuYXBwZW5kVG8odGhpcy5oZWFkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jb250YWluZXIuaHRtbCh0aGlzLnRyYW5zbGF0ZShmaWxlcy5odG1sWzBdLmRhdGEpKTtcclxuXHJcbiAgICAgIHRoaXMuakxpbmtzID0gW107XHJcbiAgICAgIGZvcihsZXQgbGluayBvZiBsaW5rcykge1xyXG4gICAgICAgIHRoaXMuakxpbmtzLnB1c2goJChbJzxsaW5rICcsIHRoaXMub2JqVG9BdHRyc1N0cihsaW5rKSwgJz4nXS5qb2luKCcnKSkuYXBwZW5kVG8odGhpcy5oZWFkKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKGZpbGVzLnNjcmlwdFswXSkge1xyXG4gICAgICAgIGNvbnN0IGluaXQgPSBldmFsKGZpbGVzLnNjcmlwdFswXS5kYXRhKTtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlT2JqZWN0ID0gaW5pdCh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU9iamVjdCA9IHt9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxpbmtDb250cm9scyA9IHt9O1xyXG4gICAgICBmb3IobGV0IGlkIG9mIHRoaXMuZ2V0TGlua3MoKSkge1xyXG4gICAgICAgIHRoaXMubGlua0NvbnRyb2xzW2lkXSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy4nK2lkKTtcclxuICAgICAgICB0aGlzLmJpbmRzW2lkXSA9IFZpZXcuaGFuZGxlTGlua0V2ZW50LmJpbmQoe2dldEhhbmRsZXJzOiB0aGlzLmdldEhhbmRsZXJzLmJpbmQodGhpcyksIGlkLCBjdHJsOiB0aGlzLmxpbmtDb250cm9sc1tpZF19KTtcclxuICAgICAgICB0aGlzLmxpbmtDb250cm9sc1tpZF0ub24oJ2NsaWNrJywgdGhpcy5iaW5kc1tpZF0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLndpZGdldENvbnRyb2xzID0ge307XHJcbiAgICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRXaWRnZXRzKCkpIHtcclxuICAgICAgICB0aGlzLndpZGdldENvbnRyb2xzW2lkXSA9IHRoaXMuY29udGFpbmVyLmZpbmQoJy4nK2lkKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pbnB1dENvbnRyb2xzID0ge307XHJcbiAgICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRJbnB1dHMoKSkge1xyXG4gICAgICAgIHRoaXMuaW5wdXRDb250cm9sc1tpZF0gPSB0aGlzLmNvbnRhaW5lci5maW5kKCcuJytpZCk7XHJcbiAgICAgICAgdGhpcy5iaW5kc1tpZF0gPSBWaWV3LmhhbmRsZUlucHV0RXZlbnQuYmluZCh7Z2V0SGFuZGxlcnM6IHRoaXMuZ2V0SGFuZGxlcnMuYmluZCh0aGlzKSwgaWQsIGN0cmw6IHRoaXMuaW5wdXRDb250cm9sc1tpZF19KTtcclxuICAgICAgICB0aGlzLmlucHV0Q29udHJvbHNbaWRdLm9uKCdrZXl1cCcsIHRoaXMuYmluZHNbaWRdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSB7fTtcclxuICAgICAgZm9yKGxldCBpZCBvZiB0aGlzLmdldEZvcm1zKCkpIHtcclxuICAgICAgICB0aGlzLmZvcm1Db250cm9sc1tpZF0gPSB0aGlzLmNvbnRhaW5lci5maW5kKCcuJytpZCk7XHJcbiAgICAgICAgdGhpcy5iaW5kc1tpZF0gPSBWaWV3LmhhbmRsZUZvcm1FdmVudC5iaW5kKHtnZXRIYW5kbGVyczogdGhpcy5nZXRIYW5kbGVycy5iaW5kKHRoaXMpLCBpZCwgY3RybDogdGhpcy5mb3JtQ29udHJvbHNbaWRdfSk7XHJcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHNbaWRdLm9uKCdzdWJtaXQnLCB0aGlzLmJpbmRzW2lkXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudGV4dENvbnRyb2xzID0ge307XHJcbiAgICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRUZXh0cygpKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0Q29udHJvbHNbaWRdID0gdGhpcy5jb250YWluZXIuZmluZCgnLicraWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnN0YXRlU2V0dGVycyA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtYXA6IHRoaXMubGlua0NvbnRyb2xzLFxyXG4gICAgICAgICAgc2V0dGVyOiB0aGlzLnNldExpbmtDb250cm9sU3RhdGUuYmluZCh0aGlzKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbWFwOiB0aGlzLndpZGdldENvbnRyb2xzLFxyXG4gICAgICAgICAgc2V0dGVyOiB0aGlzLnNldFdpZGdldENvbnRyb2xTdGF0ZS5iaW5kKHRoaXMpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtYXA6IHRoaXMuaW5wdXRDb250cm9scyxcclxuICAgICAgICAgIHNldHRlcjogdGhpcy5zZXRJbnB1dENvbnRyb2xTdGF0ZS5iaW5kKHRoaXMpXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBtYXA6IHRoaXMudGV4dENvbnRyb2xzLFxyXG4gICAgICAgICAgc2V0dGVyOiB0aGlzLnNldFRleHRDb250cm9sU3RhdGUuYmluZCh0aGlzKVxyXG4gICAgICAgIH1cclxuICAgICAgXTtcclxuXHJcbiAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuXHJcbiAgICAgIGlmKHRoaXMub25Mb2FkKSB7XHJcbiAgICAgICAgdGhpcy5vbkxvYWQoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5maXJlTGlua3NPbkxvYWRFdmVudCgpO1xyXG4gICAgfSkuXHJcbiAgICBjYXRjaCgocmVzKT0+IGNvbnNvbGUuZXJyb3IocmVzKSk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgZGVsZXRlIHRoaXMudGV4dENvbnRyb2xzO1xyXG4gICAgZm9yKGxldCBpZCBvZiB0aGlzLmdldExpbmtzKCkpIHtcclxuICAgICAgdGhpcy5saW5rQ29udHJvbHNbaWRdLm9mZignY2xpY2snLCB0aGlzLmJpbmRzW2lkXSk7XHJcbiAgICB9XHJcbiAgICBkZWxldGUgdGhpcy5saW5rQ29udHJvbHM7XHJcbiAgICBkZWxldGUgdGhpcy53aWRnZXRDb250cm9scztcclxuICAgIGZvcihsZXQgaWQgb2YgdGhpcy5nZXRJbnB1dHMoKSkge1xyXG4gICAgICB0aGlzLmlucHV0Q29udHJvbHNbaWRdLm9mZigna2V5dXAnLCB0aGlzLmJpbmRzW2lkXSk7XHJcbiAgICB9XHJcbiAgICBkZWxldGUgdGhpcy5pbnB1dENvbnRyb2xzO1xyXG4gICAgZm9yKGxldCBpZCBvZiB0aGlzLmdldEZvcm1zKCkpIHtcclxuICAgICAgdGhpcy5mb3JtQ29udHJvbHNbaWRdLm9mZignc3VibWl0JywgdGhpcy5iaW5kc1tpZF0pO1xyXG4gICAgfVxyXG4gICAgZGVsZXRlIHRoaXMuZm9ybUNvbnRyb2xzO1xyXG5cclxuICAgICF0aGlzLnRlbXBsYXRlT2JqZWN0LmRpc3Bvc2UgfHwgdGhpcy50ZW1wbGF0ZU9iamVjdC5kaXNwb3NlKCk7XHJcbiAgICBkZWxldGUgdGhpcy50ZW1wbGF0ZU9iamVjdDtcclxuXHJcbiAgICBpZih0aGlzLmlzSU9TKSB7XHJcbiAgICAgICQodGhpcy5wYXJlbnRDb250YWluZXJbMF0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykub2ZmKCdyZXNpemUnLCB0aGlzLmJpbmRzLm9uUmVzaXplKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFyZW50Q29udGFpbmVyLmh0bWwoJycpO1xyXG4gICAgZGVsZXRlIHRoaXMuZnJhbWU7XHJcbiAgfVxyXG5cclxuICBnZXRDb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXJbMF07XHJcbiAgfVxyXG5cclxuICBnZXRQYXJlbnRDb250YWluZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb250YWluZXJbMF07XHJcbiAgfVxyXG5cclxuICBhZGRIYW5kbGVyKGhhbmRsZXIpIHtcclxuICAgIHRoaXMuaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIGluaXRWaWV3KCkge1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBzZXRDb250cm9sU3RhdGUoY3RybCwgZGVmYXVsdHMsIHN0YXRlLCBzdGF0ZUhhbmRsZXJzKSB7XHJcbiAgICBpZihjdHJsKSB7XHJcbiAgICAgIGNvbnN0IHN0ID0ge1xyXG4gICAgICAgIC4uLmRlZmF1bHRzLFxyXG4gICAgICAgIC4uLnN0YXRlXHJcbiAgICAgIH07XHJcbiAgICAgIGZvcihsZXQgbmFtZSBpbiBzdCkge1xyXG4gICAgICAgIGlmKHN0Lmhhc093blByb3BlcnR5KG5hbWUpICYmIHN0YXRlSGFuZGxlcnNbbmFtZV0pIHtcclxuICAgICAgICAgIHN0YXRlSGFuZGxlcnNbbmFtZV0oY3RybCwgc3RbbmFtZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0TGlua0NvbnRyb2xTdGF0ZShpZCwgc3RhdGUpIHtcclxuICAgIFZpZXcuc2V0Q29udHJvbFN0YXRlKFxyXG4gICAgICB0aGlzLmxpbmtDb250cm9sc1tpZF0sXHJcbiAgICAgIHtcclxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZTogZmFsc2UsXHJcbiAgICAgICAgZW5hYmxlOiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXRlLFxyXG4gICAgICBWaWV3LmxpbmtTdGF0ZUhhbmRsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0V2lkZ2V0Q29udHJvbFN0YXRlKGlkLCBzdGF0ZSkge1xyXG4gICAgVmlldy5zZXRDb250cm9sU3RhdGUoXHJcbiAgICAgIHRoaXMud2lkZ2V0Q29udHJvbHNbaWRdLFxyXG4gICAgICB7XHJcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZTogdHJ1ZVxyXG4gICAgICB9LFxyXG4gICAgICBzdGF0ZSxcclxuICAgICAgVmlldy53aWRnZXRTdGF0ZUhhbmRsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0SW5wdXRDb250cm9sU3RhdGUoaWQsIHN0YXRlKSB7XHJcbiAgICBWaWV3LnNldENvbnRyb2xTdGF0ZShcclxuICAgICAgdGhpcy5pbnB1dENvbnRyb2xzW2lkXSxcclxuICAgICAge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9LFxyXG4gICAgICBzdGF0ZSxcclxuICAgICAgVmlldy5pbnB1dFN0YXRlSGFuZGxlcnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRUZXh0Q29udHJvbFN0YXRlKGlkLCBzdGF0ZSkge1xyXG4gICAgVmlldy5zZXRDb250cm9sU3RhdGUoXHJcbiAgICAgIHRoaXMudGV4dENvbnRyb2xzW2lkXSxcclxuICAgICAge1xyXG4gICAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0YXRlLFxyXG4gICAgICBWaWV3LnRleHRTdGF0ZUhhbmRsZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25JdGVtU3RhdGVDaGFuZ2VkKCkge1xyXG5cclxuICB9XHJcblxyXG4gIHNldFN0YXRlKGlkLCBzdGF0ZSkge1xyXG4gICAgZm9yKGxldCBpdGVtIG9mIHRoaXMuc3RhdGVTZXR0ZXJzKSB7XHJcbiAgICAgIGlmKGl0ZW0ubWFwW2lkXSkge1xyXG4gICAgICAgIGl0ZW0uc2V0dGVyKGlkLCBzdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5vbkl0ZW1TdGF0ZUNoYW5nZWQoaWQsIHN0YXRlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVmlldy5qcyIsImltcG9ydCB7JCwgVEhSRUV9IGZyb20gJy4uL2xpYnMnO1xyXG5pbXBvcnQgT3JiaXQgZnJvbSAnLi9PcmJpdCc7XHJcbmltcG9ydCBUaHJlZU1vdXNlRXZlbnRDb252ZXJ0ZXIgZnJvbSAnLi9UaHJlZU1vdXNlRXZlbnRDb252ZXJ0ZXInO1xyXG5pbXBvcnQgVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyIGZyb20gJy4vVGhyZWVUb3VjaEV2ZW50Q29udmVydGVyJztcclxuaW1wb3J0IERyYWcgZnJvbSAnLi9EcmFnJztcclxuaW1wb3J0IENTUzNEUmVuZGVyZXIgZnJvbSAnLi9DU1MzRFJlbmRlcmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpc3VhbFdvcmxkIGV4dGVuZHMgVEhSRUUuRXZlbnREaXNwYXRjaGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3Iod25kLCBkb2MsIGNvbnRhaW5lciwgdXNlSGVscGVycz1mYWxzZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMud25kID0gd25kO1xyXG4gICAgdGhpcy5kb2MgPSBkb2M7XHJcbiAgICB0aGlzLmpDb250YWluZXIgPSBjb250YWluZXI7XHJcbiAgICB0aGlzLnJlbmRlckNhbGxiYWNrcyA9IFtdO1xyXG5cclxuICAgIHRoaXMuY2xvY2sgPSBuZXcgVEhSRUUuQ2xvY2soKTtcclxuXHJcbiAgICB0aGlzLnJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcclxuXHJcbiAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcbiAgICB0aGlzLmNzc1NjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcblxyXG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoMzAsIHRoaXMud2lkdGgoKS90aGlzLmhlaWdodCgpLCAwLjIsIDIwMDApO1xyXG4gICAgY29uc3Qgc2NhbGUgPSAxO1xyXG5cclxuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnggPSAwO1xyXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24ueSA9IDUuNSpzY2FsZTtcclxuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnogPSAwO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7YWxwaGE6IHRydWUsIGFudGlhbGlhczogdHJ1ZX0pO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRDbGVhckNvbG9yKDB4MDAwMDAwLCAwKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh0aGlzLnduZC5kZXZpY2VQaXhlbFJhdGlvKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSh0aGlzLndpZHRoKCksIHRoaXMuaGVpZ2h0KCkpO1xyXG5cclxuICAgIHRoaXMuakNvbnRhaW5lci5hcHBlbmQodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcclxuXHJcbiAgICB0aGlzLmNzc1JlbmRlcmVyXHQ9IG5ldyBDU1MzRFJlbmRlcmVyKCk7XHJcbiAgICB0aGlzLmNzc1JlbmRlcmVyLnNldFNpemUodGhpcy53aWR0aCgpLCB0aGlzLmhlaWdodCgpKTtcclxuICAgICQodGhpcy5jc3NSZW5kZXJlci5kb21FbGVtZW50KS5jc3Moe1xyXG4gIFx0XHRwb3NpdGlvbjogJ2Fic29sdXRlJyxcclxuICBcdFx0dG9wOiAwLFxyXG4gIFx0XHRtYXJnaW46IDAsXHJcbiAgXHRcdHBhZGRpbmc6IDBcclxuXHQgIH0pO1xyXG4gICAgdGhpcy5qQ29udGFpbmVyLmFwcGVuZCh0aGlzLmNzc1JlbmRlcmVyLmRvbUVsZW1lbnQpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuY3NzUmVuZGVyZXIuZG9tRWxlbWVudDtcclxuXHJcblxyXG5cclxuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgT3JiaXQodGhpcy5jYW1lcmEsIHRoaXMuZWxlbWVudCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC55ID0gMC41O1xyXG5cclxuICAgIGNvbnN0IGNzc1NjZW5lID0gJCh0aGlzLmNzc1JlbmRlcmVyLmRvbUVsZW1lbnQpLmZpbmQoJ2RpdicpLCB0bXBWZWN0b3IgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgdGhpcy5jb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKT0+IHtcclxuICAgICAgdGhpcy5jYW1lcmEuZ2V0V29ybGREaXJlY3Rpb24odG1wVmVjdG9yKTtcclxuICAgICAgY3NzU2NlbmUuY3NzKCdkaXNwbGF5JywgdG1wVmVjdG9yLnktdGhpcy5jYW1lcmEucG9zaXRpb24ueT4wPyAnbm9uZSc6ICdibG9jaycpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy50ZXh0dXJlTG9hZGVyID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKTtcclxuXHJcbiAgICB0aGlzLnNjZW5lLmFkZChuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4RDBEMEQwKSk7Ly8weEMwQzBDMFxyXG5cclxuICAgIHRoaXMubGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweDQwNDA0MCwgMSk7XHJcbiAgICB0aGlzLmxpZ2h0LnBvc2l0aW9uLnNldCgwLCA2KnNjYWxlLCAwKTtcclxuICAgIHRoaXMubGlnaHQuY2FzdFNoYWRvdyA9IGZhbHNlO1xyXG4gICAgLy8gY29uc3QgZCA9IDIwKnNjYWxlO1xyXG4gICAgLy8gdGhpcy5saWdodC5zaGFkb3cuY2FtZXJhLmxlZnQgPSAtZDtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS5yaWdodCA9IGQ7XHJcbiAgICAvLyB0aGlzLmxpZ2h0LnNoYWRvdy5jYW1lcmEudG9wID0gZDtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS5ib3R0b20gPSAtZDtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS5uZWFyID0gMSpzY2FsZTtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93LmNhbWVyYS5mYXIgPSAyNSpzY2FsZTtcclxuICAgIC8vIHRoaXMubGlnaHQuc2hhZG93Lm1hcFNpemUueCA9IDEwMjQ7XHJcbiAgICAvLyB0aGlzLmxpZ2h0LnNoYWRvdy5tYXBTaXplLnkgPSAxMDI0O1xyXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5saWdodCk7XHJcblxyXG4gICAgaWYodXNlSGVscGVycykge1xyXG4gICAgICB0aGlzLnNjZW5lLmFkZChuZXcgVEhSRUUuQXhpc0hlbHBlcig1KSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5iaW5kcyA9IHtcclxuICAgICAgb25XaW5kb3dSZXNpemU6IHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKSxcclxuICAgICAgYW5pbWF0ZTogdGhpcy5hbmltYXRlLmJpbmQodGhpcylcclxuICAgIH07XHJcblxyXG4gICAgJCh0aGlzLnduZCkub24oJ3Jlc2l6ZScsIHRoaXMuYmluZHMub25XaW5kb3dSZXNpemUpO1xyXG5cclxuICAgIHRoaXMubW91c2VFdmVudHMgPSBuZXcgVGhyZWVNb3VzZUV2ZW50Q29udmVydGVyKHRoaXMud25kLCB0aGlzLmRvYywgdGhpcyk7XHJcbiAgICB0aGlzLnRvdWNoRXZlbnRzID0gbmV3IFRocmVlVG91Y2hFdmVudENvbnZlcnRlcih0aGlzLnduZCwgdGhpcy5kb2MsIHRoaXMpO1xyXG4gICAgY29uc3QgZmlsdGVyRGF0YSA9IHt0eXBlOiAnbW91c2Vtb3ZlJ307XHJcbiAgICB0aGlzLm1vdXNlRXZlbnRzLmZpbHRlciA9IChlbGVtZW50LCBlKT0+IHtcclxuICAgICAgY29uc3QgdHlwZXMgPSBbJ21vdXNlZW50ZXInLCAnbW91c2VvdmVyJywgJ21vdXNlbGVhdmUnLCAnbW91c2VvdXQnXSwgY29udGFpbnMgPSAocCwgYyk9PiBwPT09YyB8fCAkLmNvbnRhaW5zKHAsIGMpO1xyXG4gICAgICBpZihlLnR5cGU9PT0nbW91c2Vtb3ZlJykge1xyXG4gICAgICAgIGZpbHRlckRhdGEucGFnZVggPSBlLnBhZ2VYO1xyXG4gICAgICAgIGZpbHRlckRhdGEucGFnZVkgPSBlLnBhZ2VZO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBlLnJlbGF0ZWRUYXJnZXQgJiYgfnR5cGVzLmluZGV4T2YoZS50eXBlKSAmJiBjb250YWlucyhlbGVtZW50LCBlLnRhcmdldCkgJiYgY29udGFpbnMoZWxlbWVudCwgZS5yZWxhdGVkVGFyZ2V0KT8gey4uLmUsIC4uLmZpbHRlckRhdGF9OiBlO1xyXG4gICAgfTtcclxuICAgIHRoaXMuZHJhZyA9IG5ldyBEcmFnKHRoaXMud25kLCB0aGlzLmRvYywgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5hbmltYXRlKCk7XHJcbiAgfVxyXG5cclxuICBkaXNwb3NlKCkge1xyXG4gICAgZGVsZXRlIHRoaXMuYmluZHMuYW5pbWF0ZTtcclxuICAgICQodGhpcy53bmQpLm9mZigncmVzaXplJywgdGhpcy5iaW5kcy5vbldpbmRvd1Jlc2l6ZSk7XHJcbiAgICB0aGlzLm1vdXNlRXZlbnRzLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMudG91Y2hFdmVudHMuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5kcmFnLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMuY29udHJvbHMuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgd2lkdGgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5qQ29udGFpbmVyLndpZHRoKCk7XHJcbiAgfVxyXG5cclxuICBoZWlnaHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5qQ29udGFpbmVyLmhlaWdodCgpO1xyXG4gIH1cclxuXHJcbiAgc2V0RXh0cmFMaWdodGluZyh2KSB7XHJcbiAgICB0aGlzLmxpZ2h0LmludGVuc2l0eSA9IHY7XHJcbiAgfVxyXG5cclxuICBnZXRPcmJpdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzO1xyXG4gIH1cclxuXHJcbiAgc2V0Q29udHJvbHNTdGF0ZShzdGF0ZSkge1xyXG4gICAgdGhpcy5jb250cm9scy5lbmFibGVkID0gc3RhdGU7XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sc1N0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbHMuZW5hYmxlZDtcclxuICB9XHJcblxyXG4gIG9uV2luZG93UmVzaXplKCkge1xyXG4gICAgY29uc3QgdXBkYXRlQ2FtZXJhID0gKGNhbWVyYSk9PiB7XHJcbiAgICAgIGNhbWVyYS5hc3BlY3QgPSB0aGlzLndpZHRoKCkvdGhpcy5oZWlnaHQoKTtcclxuICAgICAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgIH0sXHJcbiAgICB1cGRhdGVSZW5kZXJlciA9IChyZW5kZXJlcik9PiB7XHJcbiAgICAgIHJlbmRlcmVyLnNldFNpemUodGhpcy53aWR0aCgpLCB0aGlzLmhlaWdodCgpKTtcclxuICAgIH07XHJcblxyXG4gICAgdXBkYXRlQ2FtZXJhKHRoaXMuY2FtZXJhKTtcclxuICAgIHVwZGF0ZVJlbmRlcmVyKHRoaXMucmVuZGVyZXIpO1xyXG4gICAgdXBkYXRlUmVuZGVyZXIodGhpcy5jc3NSZW5kZXJlcik7XHJcblxyXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiAncmVzaXplJ30pO1xyXG4gIH1cclxuXHJcbiAgYWRkT2JqZWN0KG9iamVjdCkge1xyXG4gICAgdGhpcy5zY2VuZS5hZGQob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIGFkZENzc09iamVjdChvYmplY3QpIHtcclxuICAgIHRoaXMuY3NzU2NlbmUuYWRkKG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVDc3NPYmplY3Qob2JqZWN0KSB7XHJcbiAgICB0aGlzLmNzc1NjZW5lLnJlbW92ZShvYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlT2JqZWN0KG9iamVjdCkge1xyXG4gICAgdGhpcy5zY2VuZS5yZW1vdmUob2JqZWN0KTtcclxuICB9XHJcblxyXG4gIGFuaW1hdGUoKSB7XHJcbiAgICBpZih0aGlzLmJpbmRzLmFuaW1hdGUpIHtcclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYmluZHMuYW5pbWF0ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgYWRkUmVuZGVyQ2FsbGJhY2soY2xiKSB7XHJcbiAgICB0aGlzLnJlbmRlckNhbGxiYWNrcy5wdXNoKGNsYik7XHJcbiAgfVxyXG5cclxuICByZW1vdmVSZW5kZXJDYWxsYmFjayhjbGIpIHtcclxuICAgIGNvbnN0IGkgPSB0aGlzLnJlbmRlckNhbGxiYWNrcy5pbmRleE9mKGNsYik7XHJcbiAgICBpZih+aSkge1xyXG4gICAgICB0aGlzLnJlbmRlckNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW5kZXIoKSB7XHJcbiAgICBjb25zdCBkZWx0YVRpbWUgPSB0aGlzLmNsb2NrLmdldERlbHRhKCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZShkZWx0YVRpbWUpO1xyXG4gICAgZm9yKGxldCBjbGIgb2YgdGhpcy5yZW5kZXJDYWxsYmFja3MpIHtcclxuICAgICAgY2xiKGRlbHRhVGltZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNzc1JlbmRlcmVyLnJlbmRlcih0aGlzLmNzc1NjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzR2VvbWV0cnkoYnVmR2VvbWV0cnksIG1lc2gpIHtcclxuICAgIG1lc2guZ2VvbWV0cnkgPSBidWZHZW9tZXRyeTtcclxuICAgIC8vIE9idGFpbiBhIEdlb21ldHJ5XHJcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5HZW9tZXRyeSgpLmZyb21CdWZmZXJHZW9tZXRyeShidWZHZW9tZXRyeSk7XHJcbiAgICAvLyBNZXJnZSB0aGUgdmVydGljZXMgc28gdGhlIHRyaWFuZ2xlIHNvdXAgaXMgY29udmVydGVkIHRvIGluZGV4ZWQgdHJpYW5nbGVzXHJcbiAgICBnZW9tZXRyeS5tZXJnZVZlcnRpY2VzKCk7XHJcbiAgICAvLyBDb252ZXJ0IGFnYWluIHRvIEJ1ZmZlckdlb21ldHJ5LCBpbmRleGVkXHJcbiAgICBjb25zdCBpbmRleGVkQnVmZmVyR2VvbSA9IHRoaXMuY3JlYXRlSW5kZXhlZEJ1ZmZlckdlb21ldHJ5RnJvbUdlb21ldHJ5KGdlb21ldHJ5KTtcclxuICAgIC8vIENyZWF0ZSBpbmRleCBhcnJheXMgbWFwcGluZyB0aGUgaW5kZXhlZCB2ZXJ0aWNlcyB0byBidWZHZW9tZXRyeSB2ZXJ0aWNlc1xyXG4gICAgcmV0dXJuIHRoaXMubWFwSW5kaWNlcyhidWZHZW9tZXRyeSwgaW5kZXhlZEJ1ZmZlckdlb20pO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlSW5kZXhlZEJ1ZmZlckdlb21ldHJ5RnJvbUdlb21ldHJ5KGdlb21ldHJ5KSB7XHJcbiAgICBjb25zdCBudW1WZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bUZhY2VzID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xyXG5cclxuICAgIGNvbnN0IGJ1ZmZlckdlb20gPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcclxuICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheShudW1WZXJ0aWNlcyAqIDMpO1xyXG4gICAgY29uc3QgaW5kaWNlcyA9IG5ldyAobnVtRmFjZXMgKiAzID4gNjU1MzUgPyBVaW50MzJBcnJheSA6IFVpbnQxNkFycmF5KShudW1GYWNlcyAqIDMpO1xyXG5cclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBudW1WZXJ0aWNlczsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHAgPSBnZW9tZXRyeS52ZXJ0aWNlc1tpXTtcclxuICAgICAgY29uc3QgaTMgPSBpICogMztcclxuICAgICAgdmVydGljZXNbaTNdID0gcC54O1xyXG4gICAgICB2ZXJ0aWNlc1tpMyArIDFdID0gcC55O1xyXG4gICAgICB2ZXJ0aWNlc1tpMyArIDJdID0gcC56O1xyXG4gICAgfVxyXG5cclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBudW1GYWNlczsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGYgPSBnZW9tZXRyeS5mYWNlc1tpXTtcclxuICAgICAgY29uc3QgaTMgPSBpICogMztcclxuICAgICAgaW5kaWNlc1tpM10gPSBmLmE7XHJcbiAgICAgIGluZGljZXNbaTMgKyAxXSA9IGYuYjtcclxuICAgICAgaW5kaWNlc1tpMyArIDJdID0gZi5jO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1ZmZlckdlb20uc2V0SW5kZXgobmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShpbmRpY2VzLCAxKSk7XHJcbiAgICBidWZmZXJHZW9tLmFkZEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHZlcnRpY2VzLCAzKSk7XHJcblxyXG4gICAgcmV0dXJuIGJ1ZmZlckdlb207XHJcbiAgfVxyXG5cclxuICBpc0VxdWFsKHgxLCB5MSwgejEsIHgyLCB5MiwgejIpIHtcclxuICAgIGNvbnN0IGRlbHRhID0gMC4wMDAwMDE7XHJcbiAgICByZXR1cm4gTWF0aC5hYnMoeDIgLSB4MSkgPCBkZWx0YSAmJlxyXG4gICAgTWF0aC5hYnMoeTIgLSB5MSkgPCBkZWx0YSAmJlxyXG4gICAgTWF0aC5hYnMoejIgLSB6MSkgPCBkZWx0YTtcclxuICB9XHJcblxyXG4gIG1hcEluZGljZXMoYnVmR2VvbWV0cnksIGluZGV4ZWRCdWZmZXJHZW9tKSB7XHJcbiAgICAvLyBDcmVhdGVzIG1hcHBlZFZlcnRpY2VzLCBtYXBwZWRJbmRpY2VzIGFuZCBtYXBwZWRBc3NvY2lhdGlvbiBpbiBidWZHZW9tZXRyeVxyXG4gICAgY29uc3QgdmVydGljZXMgPSBidWZHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xyXG4gICAgY29uc3QgaWR4VmVydGljZXMgPSBpbmRleGVkQnVmZmVyR2VvbS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xyXG4gICAgY29uc3QgaW5kaWNlcyA9IGluZGV4ZWRCdWZmZXJHZW9tLmluZGV4LmFycmF5O1xyXG5cclxuICAgIGNvbnN0IG51bUlkeFZlcnRpY2VzID0gaWR4VmVydGljZXMubGVuZ3RoIC8gMztcclxuICAgIGNvbnN0IG51bVZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoIC8gMztcclxuXHJcbiAgICBidWZHZW9tZXRyeS5tYXBwZWRWZXJ0aWNlcyA9IGlkeFZlcnRpY2VzO1xyXG4gICAgYnVmR2VvbWV0cnkubWFwcGVkSW5kaWNlcyA9IGluZGljZXM7XHJcbiAgICBidWZHZW9tZXRyeS5tYXBwZWRBc3NvY2lhdGlvbiA9IFtdO1xyXG5cclxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBudW1JZHhWZXJ0aWNlczsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGFzc29jaWF0aW9uID0gW107XHJcbiAgICAgIGJ1Zkdlb21ldHJ5Lm1hcHBlZEFzc29jaWF0aW9uLnB1c2goYXNzb2NpYXRpb24pO1xyXG4gICAgICBjb25zdCBpMyA9IGkgKiAzO1xyXG4gICAgICBmb3IobGV0IGogPSAwOyBqIDwgbnVtVmVydGljZXM7IGorKykge1xyXG4gICAgICAgIGNvbnN0IGozID0gaiAqIDM7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNFcXVhbChpZHhWZXJ0aWNlc1tpM10sIGlkeFZlcnRpY2VzW2kzICsgMV0sIGlkeFZlcnRpY2VzW2kzICsgMl0sXHJcbiAgICAgICAgdmVydGljZXNbajNdLCB2ZXJ0aWNlc1tqMyArIDFdLCB2ZXJ0aWNlc1tqMyArIDJdKSkge1xyXG4gICAgICAgICAgYXNzb2NpYXRpb24ucHVzaChqMyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge3ZlcnRpY2VzOiBidWZHZW9tZXRyeS5tYXBwZWRWZXJ0aWNlcywgaW5kaWNlczogYnVmR2VvbWV0cnkubWFwcGVkSW5kaWNlc307XHJcbiAgfVxyXG5cclxuICBvbmVOb2RlUG9zaXRpb25DYWxsYmFjayhwLCBxKSB7XHJcbiAgICB0aGlzLnBvc2l0aW9uLnNldChwLngsIHAueSwgcC56KTtcclxuICAgIHRoaXMucXVhdGVybmlvbi5zZXQocS54LCBxLnksIHEueiwgcS53KTtcclxuICB9XHJcblxyXG4gIG11bHR5Tm9kZVBvc2l0aW9uQ2FsbGJhY2sobm9kZSwgcCwgbikge1xyXG4gICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG4gICAgY29uc3Qgdm9sdW1lUG9zaXRpb25zID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcclxuICAgIGNvbnN0IHZvbHVtZU5vcm1hbHMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcclxuICAgIGNvbnN0IGFzc29jVmVydGV4ID0gZ2VvbWV0cnkubWFwcGVkQXNzb2NpYXRpb25bbm9kZV07XHJcblxyXG4gICAgZm9yKGxldCBrID0gMDsgayA8IGFzc29jVmVydGV4Lmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgbGV0IGluZGV4VmVydGV4ID0gYXNzb2NWZXJ0ZXhba107XHJcbiAgICAgICAgdm9sdW1lUG9zaXRpb25zW2luZGV4VmVydGV4XSA9IHAueDtcclxuICAgICAgICB2b2x1bWVOb3JtYWxzW2luZGV4VmVydGV4XSA9IG4ueDtcclxuICAgICAgICArK2luZGV4VmVydGV4O1xyXG4gICAgICAgIHZvbHVtZVBvc2l0aW9uc1tpbmRleFZlcnRleF0gPSBwLnk7XHJcbiAgICAgICAgdm9sdW1lTm9ybWFsc1tpbmRleFZlcnRleF0gPSBuLnk7XHJcbiAgICAgICAgKytpbmRleFZlcnRleDtcclxuICAgICAgICB2b2x1bWVQb3NpdGlvbnNbaW5kZXhWZXJ0ZXhdID0gcC56O1xyXG4gICAgICAgIHZvbHVtZU5vcm1hbHNbaW5kZXhWZXJ0ZXhdID0gbi56O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbXVsdHlOb2RlUG9zaXRpb25Qb3N0Q2FsbGJhY2soKSB7XHJcbiAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcbiAgICBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHBhdGhQb3NpdGlvbkNhbGxiYWNrKG5vZGUsIHApIHtcclxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcclxuXHRcdGxldCBpID0gMyAqIG5vZGU7XHJcblx0XHRwb3NpdGlvbnNbaSsrXSA9IHAueDtcclxuXHRcdHBvc2l0aW9uc1tpKytdID0gcC55O1xyXG5cdFx0cG9zaXRpb25zW2ldID0gcC56O1xyXG4gIH1cclxuXHJcbiAgcGF0aFBvc2l0aW9uUG9zdENhbGxiYWNrKCkge1xyXG4gICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xyXG4gICAgZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuICAgIGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vLi4vY29tbW9uL2NsYXNzZXMvVmlzdWFsV29ybGQuanMiLCJpbXBvcnQgQ29udHJvbGxlciBmcm9tICcuL0NvbnRyb2xsZXInO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2lkZ2V0Q29udHJvbGxlciBleHRlbmRzIENvbnRyb2xsZXIge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2aWV3KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy52aWV3ID0gdmlldztcclxuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nbGUoKSB7XHJcbiAgICB0aGlzLnZpc2libGUgPSAhdGhpcy52aXNpYmxlO1xyXG4gICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmZpcmVDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGZpcmVDaGFuZ2UoKSB7XHJcbiAgICBpZih0aGlzLm9uQ2hhbmdlKSB7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVmlldygpIHtcclxuICAgIGlmKHRoaXMudmlldykge1xyXG4gICAgICB0aGlzLnZpZXcuc2V0U3RhdGUoJ3dpZEZsb2F0V25kJywge1xyXG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aXNpYmxlOiB0aGlzLnZpc2libGUsXHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuLy4uL2NvbW1vbi9jbGFzc2VzL1dpZGdldENvbnRyb2xsZXIuanMiLCJpbXBvcnQgVGFyZ2V0IGZyb20gJy4vVGFyZ2V0JztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENpcmNsZVRhcmdldCBleHRlbmRzIFRhcmdldCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHgsIHksIHIpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnAgPSB7XHJcbiAgICAgIHgsXHJcbiAgICAgIHksXHJcbiAgICAgIHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0ZXN0SW50ZXJzZWN0aW9uKGUsIGRhdGEpIHtcclxuICAgIGxldCByZXM7XHJcbiAgICBjb25zdCB7eCwgeX0gPSBkYXRhLCBwID0gdGhpcy5wO1xyXG4gICAgaWYoKHgtcC54KSooeC1wLngpKyh5LXAueSkqKHktcC55KTw9cC5yKnAucikge1xyXG4gICAgICByZXMgPSB7XHJcbiAgICAgICAgdGFyZ2V0OiB0aGlzLFxyXG4gICAgICAgIGRhdGFcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy90YXJnZXRzL0NpcmNsZVRhcmdldC5qcyIsImltcG9ydCBUYXJnZXQgZnJvbSAnLi9UYXJnZXQnO1xyXG5pbXBvcnQgQmFzZU1hdGhVdGlscyBmcm9tICcuLi9CYXNlTWF0aFV0aWxzJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvbHlUYXJnZXQgZXh0ZW5kcyBUYXJnZXQge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwb2x5KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5wb2x5ID0gcG9seTtcclxuICB9XHJcblxyXG4gIHRlc3RJbnRlcnNlY3Rpb24oZSwgcCkge1xyXG4gICAgcmV0dXJuIEJhc2VNYXRoVXRpbHMuaXNJbnNpZGVQb2x5KHRoaXMucG9seSwgcCk/IHtcclxuICAgICAgdGFyZ2V0OiB0aGlzLFxyXG4gICAgICBkYXRhOiBwXHJcbiAgICB9OiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi8uLi9jb21tb24vY2xhc3Nlcy90YXJnZXRzL1BvbHlUYXJnZXQuanMiLCIvLyBzdGF0cy5qcyAtIGh0dHA6Ly9naXRodWIuY29tL21yZG9vYi9zdGF0cy5qc1xuKGZ1bmN0aW9uKGYsZSl7XCJvYmplY3RcIj09PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6Zi5TdGF0cz1lKCl9KSh0aGlzLGZ1bmN0aW9uKCl7dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGEpe2MuYXBwZW5kQ2hpbGQoYS5kb20pO3JldHVybiBhfWZ1bmN0aW9uIHUoYSl7Zm9yKHZhciBkPTA7ZDxjLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PWQ9PT1hP1wiYmxvY2tcIjpcIm5vbmVcIjtsPWF9dmFyIGw9MCxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Yy5zdHlsZS5jc3NUZXh0PVwicG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO2N1cnNvcjpwb2ludGVyO29wYWNpdHk6MC45O3otaW5kZXg6MTAwMDBcIjtjLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtcbnUoKytsJWMuY2hpbGRyZW4ubGVuZ3RoKX0sITEpO3ZhciBrPShwZXJmb3JtYW5jZXx8RGF0ZSkubm93KCksZz1rLGE9MCxyPWUobmV3IGYuUGFuZWwoXCJGUFNcIixcIiMwZmZcIixcIiMwMDJcIikpLGg9ZShuZXcgZi5QYW5lbChcIk1TXCIsXCIjMGYwXCIsXCIjMDIwXCIpKTtpZihzZWxmLnBlcmZvcm1hbmNlJiZzZWxmLnBlcmZvcm1hbmNlLm1lbW9yeSl2YXIgdD1lKG5ldyBmLlBhbmVsKFwiTUJcIixcIiNmMDhcIixcIiMyMDFcIikpO3UoMCk7cmV0dXJue1JFVklTSU9OOjE2LGRvbTpjLGFkZFBhbmVsOmUsc2hvd1BhbmVsOnUsYmVnaW46ZnVuY3Rpb24oKXtrPShwZXJmb3JtYW5jZXx8RGF0ZSkubm93KCl9LGVuZDpmdW5jdGlvbigpe2ErKzt2YXIgYz0ocGVyZm9ybWFuY2V8fERhdGUpLm5vdygpO2gudXBkYXRlKGMtaywyMDApO2lmKGM+ZysxRTMmJihyLnVwZGF0ZSgxRTMqYS8oYy1nKSwxMDApLGc9YyxhPTAsdCkpe3ZhciBkPXBlcmZvcm1hbmNlLm1lbW9yeTt0LnVwZGF0ZShkLnVzZWRKU0hlYXBTaXplL1xuMTA0ODU3NixkLmpzSGVhcFNpemVMaW1pdC8xMDQ4NTc2KX1yZXR1cm4gY30sdXBkYXRlOmZ1bmN0aW9uKCl7az10aGlzLmVuZCgpfSxkb21FbGVtZW50OmMsc2V0TW9kZTp1fX07Zi5QYW5lbD1mdW5jdGlvbihlLGYsbCl7dmFyIGM9SW5maW5pdHksaz0wLGc9TWF0aC5yb3VuZCxhPWcod2luZG93LmRldmljZVBpeGVsUmF0aW98fDEpLHI9ODAqYSxoPTQ4KmEsdD0zKmEsdj0yKmEsZD0zKmEsbT0xNSphLG49NzQqYSxwPTMwKmEscT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3Eud2lkdGg9cjtxLmhlaWdodD1oO3Euc3R5bGUuY3NzVGV4dD1cIndpZHRoOjgwcHg7aGVpZ2h0OjQ4cHhcIjt2YXIgYj1xLmdldENvbnRleHQoXCIyZFwiKTtiLmZvbnQ9XCJib2xkIFwiKzkqYStcInB4IEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmXCI7Yi50ZXh0QmFzZWxpbmU9XCJ0b3BcIjtiLmZpbGxTdHlsZT1sO2IuZmlsbFJlY3QoMCwwLHIsaCk7Yi5maWxsU3R5bGU9ZjtiLmZpbGxUZXh0KGUsdCx2KTtcbmIuZmlsbFJlY3QoZCxtLG4scCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPS45O2IuZmlsbFJlY3QoZCxtLG4scCk7cmV0dXJue2RvbTpxLHVwZGF0ZTpmdW5jdGlvbihoLHcpe2M9TWF0aC5taW4oYyxoKTtrPU1hdGgubWF4KGssaCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPTE7Yi5maWxsUmVjdCgwLDAscixtKTtiLmZpbGxTdHlsZT1mO2IuZmlsbFRleHQoZyhoKStcIiBcIitlK1wiIChcIitnKGMpK1wiLVwiK2coaykrXCIpXCIsdCx2KTtiLmRyYXdJbWFnZShxLGQrYSxtLG4tYSxwLGQsbSxuLWEscCk7Yi5maWxsUmVjdChkK24tYSxtLGEscCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPS45O2IuZmlsbFJlY3QoZCtuLWEsbSxhLGcoKDEtaC93KSpwKSl9fX07cmV0dXJuIGZ9KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zdGF0cy5qcy9idWlsZC9zdGF0cy5taW4uanNcbi8vIG1vZHVsZSBpZCA9IDcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKiogSU1QT1JUUyBGUk9NIGltcG9ydHMtbG9hZGVyICoqKi9cbnZhciBkZWZpbmUgPSBmYWxzZTtcblxuLyohXG4gKiBqUXVlcnkgTW91c2V3aGVlbCAzLjEuMTNcbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKi9cblxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgaWYgKCB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIE5vZGUvQ29tbW9uSlMgc3R5bGUgZm9yIEJyb3dzZXJpZnlcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xuICAgICAgICBmYWN0b3J5KGpRdWVyeSk7XG4gICAgfVxufShmdW5jdGlvbiAoJCkge1xuXG4gICAgdmFyIHRvRml4ICA9IFsnd2hlZWwnLCAnbW91c2V3aGVlbCcsICdET01Nb3VzZVNjcm9sbCcsICdNb3pNb3VzZVBpeGVsU2Nyb2xsJ10sXG4gICAgICAgIHRvQmluZCA9ICggJ29ud2hlZWwnIGluIGRvY3VtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSA5ICkgP1xuICAgICAgICAgICAgICAgICAgICBbJ3doZWVsJ10gOiBbJ21vdXNld2hlZWwnLCAnRG9tTW91c2VTY3JvbGwnLCAnTW96TW91c2VQaXhlbFNjcm9sbCddLFxuICAgICAgICBzbGljZSAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsXG4gICAgICAgIG51bGxMb3dlc3REZWx0YVRpbWVvdXQsIGxvd2VzdERlbHRhO1xuXG4gICAgaWYgKCAkLmV2ZW50LmZpeEhvb2tzICkge1xuICAgICAgICBmb3IgKCB2YXIgaSA9IHRvRml4Lmxlbmd0aDsgaTsgKSB7XG4gICAgICAgICAgICAkLmV2ZW50LmZpeEhvb2tzWyB0b0ZpeFstLWldIF0gPSAkLmV2ZW50Lm1vdXNlSG9va3M7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3BlY2lhbCA9ICQuZXZlbnQuc3BlY2lhbC5tb3VzZXdoZWVsID0ge1xuICAgICAgICB2ZXJzaW9uOiAnMy4xLjEyJyxcblxuICAgICAgICBzZXR1cDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIHRoaXMuYWRkRXZlbnRMaXN0ZW5lciApIHtcbiAgICAgICAgICAgICAgICBmb3IgKCB2YXIgaSA9IHRvQmluZC5sZW5ndGg7IGk7ICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIHRvQmluZFstLWldLCBoYW5kbGVyLCBmYWxzZSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbm1vdXNld2hlZWwgPSBoYW5kbGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGxpbmUgaGVpZ2h0IGFuZCBwYWdlIGhlaWdodCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGVsZW1lbnRcbiAgICAgICAgICAgICQuZGF0YSh0aGlzLCAnbW91c2V3aGVlbC1saW5lLWhlaWdodCcsIHNwZWNpYWwuZ2V0TGluZUhlaWdodCh0aGlzKSk7XG4gICAgICAgICAgICAkLmRhdGEodGhpcywgJ21vdXNld2hlZWwtcGFnZS1oZWlnaHQnLCBzcGVjaWFsLmdldFBhZ2VIZWlnaHQodGhpcykpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRlYXJkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICggdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuICAgICAgICAgICAgICAgIGZvciAoIHZhciBpID0gdG9CaW5kLmxlbmd0aDsgaTsgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggdG9CaW5kWy0taV0sIGhhbmRsZXIsIGZhbHNlICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ubW91c2V3aGVlbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgZGF0YSB3ZSBhZGRlZCB0byB0aGUgZWxlbWVudFxuICAgICAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICdtb3VzZXdoZWVsLWxpbmUtaGVpZ2h0Jyk7XG4gICAgICAgICAgICAkLnJlbW92ZURhdGEodGhpcywgJ21vdXNld2hlZWwtcGFnZS1oZWlnaHQnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRMaW5lSGVpZ2h0OiBmdW5jdGlvbihlbGVtKSB7XG4gICAgICAgICAgICB2YXIgJGVsZW0gPSAkKGVsZW0pLFxuICAgICAgICAgICAgICAgICRwYXJlbnQgPSAkZWxlbVsnb2Zmc2V0UGFyZW50JyBpbiAkLmZuID8gJ29mZnNldFBhcmVudCcgOiAncGFyZW50J10oKTtcbiAgICAgICAgICAgIGlmICghJHBhcmVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkcGFyZW50ID0gJCgnYm9keScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KCRwYXJlbnQuY3NzKCdmb250U2l6ZScpLCAxMCkgfHwgcGFyc2VJbnQoJGVsZW0uY3NzKCdmb250U2l6ZScpLCAxMCkgfHwgMTY7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0UGFnZUhlaWdodDogZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgcmV0dXJuICQoZWxlbSkuaGVpZ2h0KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgIGFkanVzdE9sZERlbHRhczogdHJ1ZSwgLy8gc2VlIHNob3VsZEFkanVzdE9sZERlbHRhcygpIGJlbG93XG4gICAgICAgICAgICBub3JtYWxpemVPZmZzZXQ6IHRydWUgIC8vIGNhbGxzIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmb3IgZWFjaCBldmVudFxuICAgICAgICB9XG4gICAgfTtcblxuICAgICQuZm4uZXh0ZW5kKHtcbiAgICAgICAgbW91c2V3aGVlbDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIHJldHVybiBmbiA/IHRoaXMuYmluZCgnbW91c2V3aGVlbCcsIGZuKSA6IHRoaXMudHJpZ2dlcignbW91c2V3aGVlbCcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVubW91c2V3aGVlbDogZnVuY3Rpb24oZm4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVuYmluZCgnbW91c2V3aGVlbCcsIGZuKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG5cbiAgICBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHZhciBvcmdFdmVudCAgID0gZXZlbnQgfHwgd2luZG93LmV2ZW50LFxuICAgICAgICAgICAgYXJncyAgICAgICA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgICAgIGRlbHRhICAgICAgPSAwLFxuICAgICAgICAgICAgZGVsdGFYICAgICA9IDAsXG4gICAgICAgICAgICBkZWx0YVkgICAgID0gMCxcbiAgICAgICAgICAgIGFic0RlbHRhICAgPSAwLFxuICAgICAgICAgICAgb2Zmc2V0WCAgICA9IDAsXG4gICAgICAgICAgICBvZmZzZXRZICAgID0gMDtcbiAgICAgICAgZXZlbnQgPSAkLmV2ZW50LmZpeChvcmdFdmVudCk7XG4gICAgICAgIGV2ZW50LnR5cGUgPSAnbW91c2V3aGVlbCc7XG5cbiAgICAgICAgLy8gT2xkIHNjaG9vbCBzY3JvbGx3aGVlbCBkZWx0YVxuICAgICAgICBpZiAoICdkZXRhaWwnICAgICAgaW4gb3JnRXZlbnQgKSB7IGRlbHRhWSA9IG9yZ0V2ZW50LmRldGFpbCAqIC0xOyAgICAgIH1cbiAgICAgICAgaWYgKCAnd2hlZWxEZWx0YScgIGluIG9yZ0V2ZW50ICkgeyBkZWx0YVkgPSBvcmdFdmVudC53aGVlbERlbHRhOyAgICAgICB9XG4gICAgICAgIGlmICggJ3doZWVsRGVsdGFZJyBpbiBvcmdFdmVudCApIHsgZGVsdGFZID0gb3JnRXZlbnQud2hlZWxEZWx0YVk7ICAgICAgfVxuICAgICAgICBpZiAoICd3aGVlbERlbHRhWCcgaW4gb3JnRXZlbnQgKSB7IGRlbHRhWCA9IG9yZ0V2ZW50LndoZWVsRGVsdGFYICogLTE7IH1cblxuICAgICAgICAvLyBGaXJlZm94IDwgMTcgaG9yaXpvbnRhbCBzY3JvbGxpbmcgcmVsYXRlZCB0byBET01Nb3VzZVNjcm9sbCBldmVudFxuICAgICAgICBpZiAoICdheGlzJyBpbiBvcmdFdmVudCAmJiBvcmdFdmVudC5heGlzID09PSBvcmdFdmVudC5IT1JJWk9OVEFMX0FYSVMgKSB7XG4gICAgICAgICAgICBkZWx0YVggPSBkZWx0YVkgKiAtMTtcbiAgICAgICAgICAgIGRlbHRhWSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgZGVsdGEgdG8gYmUgZGVsdGFZIG9yIGRlbHRhWCBpZiBkZWx0YVkgaXMgMCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdGl5XG4gICAgICAgIGRlbHRhID0gZGVsdGFZID09PSAwID8gZGVsdGFYIDogZGVsdGFZO1xuXG4gICAgICAgIC8vIE5ldyBzY2hvb2wgd2hlZWwgZGVsdGEgKHdoZWVsIGV2ZW50KVxuICAgICAgICBpZiAoICdkZWx0YVknIGluIG9yZ0V2ZW50ICkge1xuICAgICAgICAgICAgZGVsdGFZID0gb3JnRXZlbnQuZGVsdGFZICogLTE7XG4gICAgICAgICAgICBkZWx0YSAgPSBkZWx0YVk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCAnZGVsdGFYJyBpbiBvcmdFdmVudCApIHtcbiAgICAgICAgICAgIGRlbHRhWCA9IG9yZ0V2ZW50LmRlbHRhWDtcbiAgICAgICAgICAgIGlmICggZGVsdGFZID09PSAwICkgeyBkZWx0YSAgPSBkZWx0YVggKiAtMTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY2hhbmdlIGFjdHVhbGx5IGhhcHBlbmVkLCBubyByZWFzb24gdG8gZ28gYW55IGZ1cnRoZXJcbiAgICAgICAgaWYgKCBkZWx0YVkgPT09IDAgJiYgZGVsdGFYID09PSAwICkgeyByZXR1cm47IH1cblxuICAgICAgICAvLyBOZWVkIHRvIGNvbnZlcnQgbGluZXMgYW5kIHBhZ2VzIHRvIHBpeGVscyBpZiB3ZSBhcmVuJ3QgYWxyZWFkeSBpbiBwaXhlbHNcbiAgICAgICAgLy8gVGhlcmUgYXJlIHRocmVlIGRlbHRhIG1vZGVzOlxuICAgICAgICAvLyAgICogZGVsdGFNb2RlIDAgaXMgYnkgcGl4ZWxzLCBub3RoaW5nIHRvIGRvXG4gICAgICAgIC8vICAgKiBkZWx0YU1vZGUgMSBpcyBieSBsaW5lc1xuICAgICAgICAvLyAgICogZGVsdGFNb2RlIDIgaXMgYnkgcGFnZXNcbiAgICAgICAgaWYgKCBvcmdFdmVudC5kZWx0YU1vZGUgPT09IDEgKSB7XG4gICAgICAgICAgICB2YXIgbGluZUhlaWdodCA9ICQuZGF0YSh0aGlzLCAnbW91c2V3aGVlbC1saW5lLWhlaWdodCcpO1xuICAgICAgICAgICAgZGVsdGEgICo9IGxpbmVIZWlnaHQ7XG4gICAgICAgICAgICBkZWx0YVkgKj0gbGluZUhlaWdodDtcbiAgICAgICAgICAgIGRlbHRhWCAqPSBsaW5lSGVpZ2h0O1xuICAgICAgICB9IGVsc2UgaWYgKCBvcmdFdmVudC5kZWx0YU1vZGUgPT09IDIgKSB7XG4gICAgICAgICAgICB2YXIgcGFnZUhlaWdodCA9ICQuZGF0YSh0aGlzLCAnbW91c2V3aGVlbC1wYWdlLWhlaWdodCcpO1xuICAgICAgICAgICAgZGVsdGEgICo9IHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgICBkZWx0YVkgKj0gcGFnZUhlaWdodDtcbiAgICAgICAgICAgIGRlbHRhWCAqPSBwYWdlSGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgbG93ZXN0IGFic29sdXRlIGRlbHRhIHRvIG5vcm1hbGl6ZSB0aGUgZGVsdGEgdmFsdWVzXG4gICAgICAgIGFic0RlbHRhID0gTWF0aC5tYXgoIE1hdGguYWJzKGRlbHRhWSksIE1hdGguYWJzKGRlbHRhWCkgKTtcblxuICAgICAgICBpZiAoICFsb3dlc3REZWx0YSB8fCBhYnNEZWx0YSA8IGxvd2VzdERlbHRhICkge1xuICAgICAgICAgICAgbG93ZXN0RGVsdGEgPSBhYnNEZWx0YTtcblxuICAgICAgICAgICAgLy8gQWRqdXN0IG9sZGVyIGRlbHRhcyBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgIGlmICggc2hvdWxkQWRqdXN0T2xkRGVsdGFzKG9yZ0V2ZW50LCBhYnNEZWx0YSkgKSB7XG4gICAgICAgICAgICAgICAgbG93ZXN0RGVsdGEgLz0gNDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGp1c3Qgb2xkZXIgZGVsdGFzIGlmIG5lY2Vzc2FyeVxuICAgICAgICBpZiAoIHNob3VsZEFkanVzdE9sZERlbHRhcyhvcmdFdmVudCwgYWJzRGVsdGEpICkge1xuICAgICAgICAgICAgLy8gRGl2aWRlIGFsbCB0aGUgdGhpbmdzIGJ5IDQwIVxuICAgICAgICAgICAgZGVsdGEgIC89IDQwO1xuICAgICAgICAgICAgZGVsdGFYIC89IDQwO1xuICAgICAgICAgICAgZGVsdGFZIC89IDQwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGEgd2hvbGUsIG5vcm1hbGl6ZWQgdmFsdWUgZm9yIHRoZSBkZWx0YXNcbiAgICAgICAgZGVsdGEgID0gTWF0aFsgZGVsdGEgID49IDEgPyAnZmxvb3InIDogJ2NlaWwnIF0oZGVsdGEgIC8gbG93ZXN0RGVsdGEpO1xuICAgICAgICBkZWx0YVggPSBNYXRoWyBkZWx0YVggPj0gMSA/ICdmbG9vcicgOiAnY2VpbCcgXShkZWx0YVggLyBsb3dlc3REZWx0YSk7XG4gICAgICAgIGRlbHRhWSA9IE1hdGhbIGRlbHRhWSA+PSAxID8gJ2Zsb29yJyA6ICdjZWlsJyBdKGRlbHRhWSAvIGxvd2VzdERlbHRhKTtcblxuICAgICAgICAvLyBOb3JtYWxpc2Ugb2Zmc2V0WCBhbmQgb2Zmc2V0WSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICggc3BlY2lhbC5zZXR0aW5ncy5ub3JtYWxpemVPZmZzZXQgJiYgdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QgKSB7XG4gICAgICAgICAgICB2YXIgYm91bmRpbmdSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIG9mZnNldFggPSBldmVudC5jbGllbnRYIC0gYm91bmRpbmdSZWN0LmxlZnQ7XG4gICAgICAgICAgICBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIGJvdW5kaW5nUmVjdC50b3A7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgaW5mb3JtYXRpb24gdG8gdGhlIGV2ZW50IG9iamVjdFxuICAgICAgICBldmVudC5kZWx0YVggPSBkZWx0YVg7XG4gICAgICAgIGV2ZW50LmRlbHRhWSA9IGRlbHRhWTtcbiAgICAgICAgZXZlbnQuZGVsdGFGYWN0b3IgPSBsb3dlc3REZWx0YTtcbiAgICAgICAgZXZlbnQub2Zmc2V0WCA9IG9mZnNldFg7XG4gICAgICAgIGV2ZW50Lm9mZnNldFkgPSBvZmZzZXRZO1xuICAgICAgICAvLyBHbyBhaGVhZCBhbmQgc2V0IGRlbHRhTW9kZSB0byAwIHNpbmNlIHdlIGNvbnZlcnRlZCB0byBwaXhlbHNcbiAgICAgICAgLy8gQWx0aG91Z2ggdGhpcyBpcyBhIGxpdHRsZSBvZGQgc2luY2Ugd2Ugb3ZlcndyaXRlIHRoZSBkZWx0YVgvWVxuICAgICAgICAvLyBwcm9wZXJ0aWVzIHdpdGggbm9ybWFsaXplZCBkZWx0YXMuXG4gICAgICAgIGV2ZW50LmRlbHRhTW9kZSA9IDA7XG5cbiAgICAgICAgLy8gQWRkIGV2ZW50IGFuZCBkZWx0YSB0byB0aGUgZnJvbnQgb2YgdGhlIGFyZ3VtZW50c1xuICAgICAgICBhcmdzLnVuc2hpZnQoZXZlbnQsIGRlbHRhLCBkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICAgICAgLy8gQ2xlYXJvdXQgbG93ZXN0RGVsdGEgYWZ0ZXIgc29tZXRpbWUgdG8gYmV0dGVyXG4gICAgICAgIC8vIGhhbmRsZSBtdWx0aXBsZSBkZXZpY2UgdHlwZXMgdGhhdCBnaXZlIGRpZmZlcmVudFxuICAgICAgICAvLyBhIGRpZmZlcmVudCBsb3dlc3REZWx0YVxuICAgICAgICAvLyBFeDogdHJhY2twYWQgPSAzIGFuZCBtb3VzZSB3aGVlbCA9IDEyMFxuICAgICAgICBpZiAobnVsbExvd2VzdERlbHRhVGltZW91dCkgeyBjbGVhclRpbWVvdXQobnVsbExvd2VzdERlbHRhVGltZW91dCk7IH1cbiAgICAgICAgbnVsbExvd2VzdERlbHRhVGltZW91dCA9IHNldFRpbWVvdXQobnVsbExvd2VzdERlbHRhLCAyMDApO1xuXG4gICAgICAgIHJldHVybiAoJC5ldmVudC5kaXNwYXRjaCB8fCAkLmV2ZW50LmhhbmRsZSkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbnVsbExvd2VzdERlbHRhKCkge1xuICAgICAgICBsb3dlc3REZWx0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2hvdWxkQWRqdXN0T2xkRGVsdGFzKG9yZ0V2ZW50LCBhYnNEZWx0YSkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIG9sZGVyIGV2ZW50IGFuZCB0aGUgZGVsdGEgaXMgZGl2aXNhYmxlIGJ5IDEyMCxcbiAgICAgICAgLy8gdGhlbiB3ZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgYnJvd3NlciBpcyB0cmVhdGluZyB0aGlzIGFzIGFuXG4gICAgICAgIC8vIG9sZGVyIG1vdXNlIHdoZWVsIGV2ZW50IGFuZCB0aGF0IHdlIHNob3VsZCBkaXZpZGUgdGhlIGRlbHRhc1xuICAgICAgICAvLyBieSA0MCB0byB0cnkgYW5kIGdldCBhIG1vcmUgdXNhYmxlIGRlbHRhRmFjdG9yLlxuICAgICAgICAvLyBTaWRlIG5vdGUsIHRoaXMgYWN0dWFsbHkgaW1wYWN0cyB0aGUgcmVwb3J0ZWQgc2Nyb2xsIGRpc3RhbmNlXG4gICAgICAgIC8vIGluIG9sZGVyIGJyb3dzZXJzIGFuZCBjYW4gY2F1c2Ugc2Nyb2xsaW5nIHRvIGJlIHNsb3dlciB0aGFuIG5hdGl2ZS5cbiAgICAgICAgLy8gVHVybiB0aGlzIG9mZiBieSBzZXR0aW5nICQuZXZlbnQuc3BlY2lhbC5tb3VzZXdoZWVsLnNldHRpbmdzLmFkanVzdE9sZERlbHRhcyB0byBmYWxzZS5cbiAgICAgICAgcmV0dXJuIHNwZWNpYWwuc2V0dGluZ3MuYWRqdXN0T2xkRGVsdGFzICYmIG9yZ0V2ZW50LnR5cGUgPT09ICdtb3VzZXdoZWVsJyAmJiBhYnNEZWx0YSAlIDEyMCA9PT0gMDtcbiAgICB9XG5cbn0pKTtcblxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vY29tbW9uL34vaW1wb3J0cy1sb2FkZXI/ZGVmaW5lPT5mYWxzZSEuL34vanF1ZXJ5LW1vdXNld2hlZWwvanF1ZXJ5Lm1vdXNld2hlZWwuanNcbi8vIG1vZHVsZSBpZCA9IDcxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0= ================================================ FILE: src/libs.js ================================================ const _$ = GLOBAL_LIBS.jQuery? window.jQuery: require('jquery'), _html2canvas = GLOBAL_LIBS.html2canvas? window.html2canvas: require('html2canvas'), _THREE = GLOBAL_LIBS.THREE? window.THREE: require('three'), _PDFJS = GLOBAL_LIBS.PDFJS? window.PDFJS: require('pdfjs'); export { _$ as $, _html2canvas as html2canvas, _THREE as THREE, _PDFJS as PDFJS }; ================================================ FILE: templates/default-book-view.html ================================================ ================================================ FILE: webpack.config.js ================================================ var webpack = require('webpack'); var path = require('path'); module.exports = function(env) { var debug = false; if(env) { debug = !!env.debug; } var commonPlugins = [ new webpack.DefinePlugin({ GLOBAL_LIBS: { jQuery: JSON.stringify(true), html2canvas: JSON.stringify(true), THREE: JSON.stringify(true), PDFJS: JSON.stringify(true),// don't set false. It isn't implemented }, GLOBAL_PATHS: { pdfJsWorker: JSON.stringify('js/pdf.worker.js') }, ENVIROMENT: { debug: JSON.stringify(debug) } }) ]; if(!debug) { commonPlugins.push(new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify('production') } })); } return { context: __dirname, devtool: debug ? 'inline-sourcemap' : '', entry: ['./index.js'], output: { path: __dirname, filename: './dist/'+(debug ? 'flip-book.js': 'flip-book.min.js') }, module: { loaders: [ { test: /\.html$/, loader: 'raw-loader' }, { test: /\.js$/, exclude: /(node_modules|bower_components)/, loader: 'babel-loader', query: { presets: [['es2015', {'loose': true}], 'stage-0'], plugins: ['transform-class-properties'] } } ] }, plugins: debug ? commonPlugins : [ ...commonPlugins, new webpack.optimize.OccurrenceOrderPlugin(), new webpack.optimize.UglifyJsPlugin({ mangle: false, sourcemap: false }), ], }; }