author | Giulio Cesare Solaroli <giulio.cesare@clipperz.com> | 2013-08-30 15:56:53 (UTC) |
---|---|---|
committer | Giulio Cesare Solaroli <giulio.cesare@clipperz.com> | 2013-08-30 21:23:42 (UTC) |
commit | 20bea94ab6b91c85b171dcf86baba0a64169d508 (patch) (side-by-side diff) | |
tree | 6e38e91498dcdb861620eba1e237d1026fe79cc5 | |
parent | bde3c7b98523112ade9c5bbf7390c4ecb494cd2e (diff) | |
download | clipperz-20bea94ab6b91c85b171dcf86baba0a64169d508.zip clipperz-20bea94ab6b91c85b171dcf86baba0a64169d508.tar.gz clipperz-20bea94ab6b91c85b171dcf86baba0a64169d508.tar.bz2 |
First release of /delta version
131 files changed, 59629 insertions, 76 deletions
@@ -1,120 +1,118 @@ # ![Clipperz icon][icon] CLIPPERZ - Online Password Manager [icon]: ./Icon.png ##What does Clipperz do? Clipperz is an online vault where you can store confidential data without worrying about security. It can be used to save and manage passwords, private notes, burglar alarm codes, credit and debit card details, PINs, software keys, … Since passwords are the most common type of private information that you need to protect, we have added a great deal of functionality to make Clipperz a great [online password manager][home] thus solving the “password fatigue” problem. **Clipperz makes the Internet the most convenient and safe place to keep you most precious and sensitive data.** Read more on the [Clipperz website][home]. [home]: http://www.clipperz.com ## Why an open source version Because we want to enable as many people as possible to play with our code. So that you can start trusting it, the code not the developers. In order to allow you to inspect the code and analyze the traffic it generates between client and server, we had to provide an easy way to locally deploy the whole service. Feel free to host on your machine a web service identical to [Clipperz online password manager][home]. You can choose among **multiple backends** (PHP/MySQL, Python/AppEngine, …) or you can [contribute][CA] your own. Whatever is your motivation, we would love to hear from you: [get in contact!][contact] [CA]: http://www.clipperz.com/open_source/contributor_agreement [contact]: http://www.clipperz.com/about/contacts ## Donations If you like what Clipperz is building, its openness and its view of cryptography as a powerful tool for liberty, then you may consider making a donation. Our favorite payment method is clearly Bitcoin ([learn why here][why]), but you can also send your donation via credit card, Paypal or bank transfer. In all cases there will be no link between your real identity and your encrypted data stored on Clipperz. **To make your donation visit [this page][donations]. Thanks!** [why]: http://www.clipperz.com/pricing/why_bitcoin [donations]: http://www.clipperz.com/donations ## License ALL the code included in this project, if not otherwise stated, is released with the [AGPL v3][agpl] license (see `LICENSE.txt`), and all rights are reserved to Clipperz Srl. For any use not allowed by the AGPL license, please [contact us][contact] to inquire about licensing options for commercial applications. [agpl]: http://www.gnu.org/licenses/agpl.html ## Warnings Please note that the open source version of Clipperz Password Manager may not be suitable for mass deployments, depending on how robust is the backend you select. As an example, the current PHP backend lacks several critical capabilities such as bot protection and concurrent sessions management. ## Contributions Your contributions to Clipperz are very welcome! In order to avoid jeopardizing the ownership of the code base, we will require every developer to sign the Clipperz [Contributor Agreement][CA] This enables a single entity to represent the aggregated code base and gives the community flexibility to act as a whole to changing situations. The CA establishes a joint copyright assignment in which the contributor retains copyright ownership while also granting those rights to Clipperz Srl. With the CA in place, the aggregated code base within any Clipperz open source project is protected by both the distribution license and copyright law. Please [download][CA] and review the Contributor Agreement for a complete understanding of its terms and conditions. You may send your signed and completed CA to Clipperz by scanning your completed form and emailing the image or by fax. Please retain a copy for your records. **Thanks!** ## Building In order to build the deployable version, you need to invoke the following command: git clone git@github.com:clipperz/password-manager.git cd password-manager ./scripts/build install --backends php python --frontends beta gamma The output will be available in the `target` folder, with a separate folder for each backend (currently the available options are `php` and `python`). The script, invoked with these parameters, will build both the full version (`install` -> index.html) and the debug version (index_debug.html) of the specified frontends. Besides PHP and Python, more backends are in the works, most notably a node.js version. ### Developing To support the development of the application, a few extra tools have been built, the most useful one being `dev-proxy`. This script, located in `scripts/dev-proxy`, is invoked without any parameters (to simplify daily usage) and all its configurations are hard coded into the actual code it executes: `scripts/proxy/main.py`. The aim of this proxy is to mask the actual location of frontend JS files from the actual backend handling requests. When executed, this script will start listening on localhost:8888. All 'backend' requests (whose path starts with either `/json` or `/dump`) will be forwarded to the actual backend, that is configured as a `ReverseProxyResource` (in the current code: `proxy.ReverseProxyResource('localhost', 8084, '/java-backend')`). All other requests (html files, Javascript code, CSS stylesheets and other resources) will be handled by reading the resource from the filesystem; the proxy is aware of the layout of the project, so it will be able to locate the right resource in the right place. The only file that needs to be `build`, and not read directly from the file system, is the `index.html` file. In order to build this file, the following command should be executed: ./scripts/build --frontends beta gamma gamma.mobile --backends dev Once the index.html files have been built (one for each frontend) and a backend is running and has been correctly configured in the proxy script, it is possible to access the different versions of the application at the following URLs: - `http://localhost:8888/beta/index.html` - `http://localhost:8888/gamma/index.html` - `http://localhost:8888/gamma/index.mobile.html` ## Installing ### PHP + MySQL backend * **PHP** Once the project has been successfully build, the application needs to be moved in a location where the web server can run it. Everything that is needed is located into `target/php`. * **MySQL** The application needs a simple MySQL database; to configure all the credentials to access the previously allocated DB, edit the file found in `php/configuration.php`. You need to edit the file actually used by the web server; this will usually be the one moved into the right place in the previous step. Once the application is in place, and the DB credentials have been configured, you should initialize the DB itself; in order to do so, just point your browser at the following url: `http://<host>/<path>/php/setup/index.php`. Here you will find the standard [POG][pog] setup page: it should be enough to click the "POG me up!" button at the bottom of the page, and then the "Process" button on the next page. The POG interface will allow also a very basic access to the DB data that may be useful to check that the application is actually writing something on the DB (even if you will not be able to make much sense out of the data you will see, as they are all encrypted!) More information about building the PHP backend may be found in the `doc/install.php.txt` file. - But if you have setup a $configuration['setup_password'] in target/php/configuration.php then a page with a textfield and a "Submit" link will appear. - Just input your $configuration['setup_password'] value and click on "Submit" so [POG][pog] setup page will appear. ## Disclaimer This application has not been fully tested, so there may be still problems due to the new build script or to the new repository structure. So, for the moment, **use it at your own risk!** [pog]: http://www.phpobjectgenerator.com/ diff --git a/backend/checksum/properties/checksum.properties.json b/backend/checksum/properties/checksum.properties.json index 1c2dae5..9a70ce7 100644 --- a/backend/checksum/properties/checksum.properties.json +++ b/backend/checksum/properties/checksum.properties.json @@ -1,4 +1,5 @@ { - "request.path": "json", + "request.path": "../json", + "dump.path": "/../dump", "should.pay.toll": "true" }
\ No newline at end of file diff --git a/backend/dev/properties/dev.properties.json b/backend/dev/properties/dev.properties.json index 1c2dae5..9a70ce7 100644 --- a/backend/dev/properties/dev.properties.json +++ b/backend/dev/properties/dev.properties.json @@ -1,4 +1,5 @@ { - "request.path": "json", + "request.path": "../json", + "dump.path": "/../dump", "should.pay.toll": "true" }
\ No newline at end of file diff --git a/backend/php/properties/php.properties.json b/backend/php/properties/php.properties.json index 09196c9..8c2ff05 100644 --- a/backend/php/properties/php.properties.json +++ b/backend/php/properties/php.properties.json @@ -1,4 +1,5 @@ { - "request.path": "index.php", + "request.path": "../index.php", + "dump.path": "/../dump.php", "should.pay.toll": "false" } diff --git a/backend/python/properties/python.properties.json b/backend/python/properties/python.properties.json index 322f174..b98364e 100644 --- a/backend/python/properties/python.properties.json +++ b/backend/python/properties/python.properties.json @@ -1,4 +1,5 @@ { - "request.path": "clipperz.py", + "request.path": "../clipperz.py", + "dump.path": "/../clipperz.py", "should.pay.toll": "false" } diff --git a/frontend/beta/html/index_template.html b/frontend/beta/html/index_template.html index c3fd727..25f6a87 100644 --- a/frontend/beta/html/index_template.html +++ b/frontend/beta/html/index_template.html @@ -1,100 +1,110 @@ <html> <head> <title>@page.title@</title> <META http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!-- @copyright@ --> @css@ <link rel="shortcut icon" href="./clipperz.ico" /> <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> <script> Clipperz_IEisBroken = false; Clipperz_normalizedNewLine = '\n'; - Clipperz_dumpUrl = "/../dump/"; + Clipperz_dumpUrl = "@dump.path@"; </script> <!--[if IE]><script> Clipperz_IEisBroken = true; Clipperz_normalizedNewLine = '\x0d\x0a'; </script><![endif]--> @js_LINKED@ </head> <body> <div id="mainDiv"> <div id="header"> <div id="miscLinks"> <a id="donateHeaderIconLink" href="http://www.clipperz.com/donations" target="_blank"><img id='donateHeaderIcon' src=""></a> <ul> <li><a href="http://www.clipperz.com/donations" id='donateHeaderLink' class='highlightedHeader' target="_blank">donate</a></li> <!-- li><a href="http://www.clipperz.com/credits" id='creditsHeaderLink' target="_blank">credits</a></li --> <li><a href="http://www.clipperz.com/contact" id='feedbackHeaderLink' target="_blank">feedback</a></li> <li><a href="http://www.clipperz.com/support/user_guide" target="_blank" id='helpHeaderLink'>help</a></li> <li><a href="http://www.clipperz.com/forum" target="_blank" id='forumHeaderLink'>forum</a></li> </ul> </div> <div id="logoFrame"> <a href="http://www.clipperz.com" target="_blank"><img id="logo" src="" /></a> <h5 class="clipperzPayoff">keep it to yourself</h5> </div> <div id="mainTabs"> <ul id="exitLinks"> <li id="logoutLI"><!--<a href="#">logout</a>--></li> <li id="lockLI"><!--<a href="#">lock</a>--></li> </ul> <div id="menus"> <table cellpadding="0" cellspacing="0" border="0"> <tbody> <tr id="menusTR"> <!-- <td class="selected"><div><a href="#">records</a></div></td> <td><div><a href="./Account.html">account</a></div></td> <td><div><a href="#">data</a></div></td> <td><div><a href="#">bookmarklet</a></div></td> --> </tr> </tbody> </table> </div> </div> </div> <div id="main"> <h3 class="loading">loading ...</h3> +<!-- script> + _clipperz_pm_test_user = 'joe' + _clipperz_pm_test_passphrase = 'clipperz' +</script --> @js_EMBEDDED@ <script> Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@}); /*offline_data_placeholder*/ + + /* * / + MochiKit.DOM.addLoadEvent(function () { + Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + }); + / * */ </script> <div id="javaScriptAlert"> <h1>Attention!</h1> <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p> <h3>Javascript is required to access Clipperz.</h3> <h5>Please enable scripting or upgrade your browser.</h5> </div> </div> <div id="footer"> Copyright © 2008-2013 Clipperz Srl - - <a href="http://www.clipperz.com/terms_of_service" target="black">Terms of service</a> - - <a href="http://www.clipperz.com/privacy_policy" target="black">Privacy policy</a> + <a href="https://www.clipperz.com/terms_service/" target="black">Terms of service</a> - + <a href="https://www.clipperz.com/privacy_policy/" target="black">Privacy policy</a> - Application version: <a href="https://github.com/clipperz/password-manager/tree/@application.version@" target="github">@application.version@</a> </div> <div id="recordDetailEditModeHeaderMask"></div> <div id="recordDetailEditModeVerticalMask"></div> </div> <div id="applicationVersionType" class="@application.version.type@" /> </body> </html> diff --git a/frontend/delta/css/web.css b/frontend/delta/css/web.css new file mode 100644 index 0000000..eb2f102 --- a/dev/null +++ b/frontend/delta/css/web.css @@ -0,0 +1,1353 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 200; + src: local('Source Code Pro ExtraLight'), local('SourceCodePro-ExtraLight'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAASvIAAAAOkNGRiC57zEmAABJNAAAxfVEU0lHN9HpJQABLAQAACBYR0RFRi8sL9AAARa0AAAA1EdQT1MeKxk7AAEivAAACQxHU1VC3Z7yFQABF4gAAAsyT1MvMnIMzrUAAAFQAAAAYGNtYXDp1MYJAAA/BAAAChBoZWFk++6HegAAAOwAAAA2aGhlYQaHAN8AAAEkAAAAJGhtdHjIHsvPAAEPLAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZYg91ZIAAAGwAAA9VHBvc3T/uAAzAABJFAAAACAAAQAAAAEEWtZRnFVfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/6v5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/q/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWADIAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwMJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAGgBFAAEAAAAAAAIABwBfAAEAAAAAAAMAKQBmAAEAAAAAAAQAGgBFAAEAAAAAAAUAOQCPAAEAAAAAAAYAGADIAAEAAAAAAAcAYADgAAEAAAAAAAgAGgFAAAEAAAAAAAkADAFaAAEAAAAAAAsAGQFmAAEAAAAAAA0R2QF/AAEAAAAAAA4AJBNYAAEAAAAAABAADxN8AAEAAAAAABEAChOLAAEAAAAAAQAAFhOVAAEAAAAAAQEACxOrAAEAAAAAAQIACxO2AAEAAAAAAQMAFRPBAAMAAQQJAAAAihPWAAMAAQQJAAEANBRgAAMAAQQJAAIADhSUAAMAAQQJAAMAUhSiAAMAAQQJAAQANBRgAAMAAQQJAAUAchT0AAMAAQQJAAYAMBVmAAMAAQQJAAcAwBWWAAMAAQQJAAgANBZWAAMAAQQJAAkAGBaKAAMAAQQJAAsAMhaiAAMAAQQJAA0jthbUAAMAAQQJAA4ASDqKAAMAAQQJABAAHjrSAAMAAQQJABEAFDrwAAMAAQQJAQAALDsEAAMAAQQJAQEAFjswAAMAAQQJAQIAFjtGAAMAAQQJAQMAKjtcQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIEV4dHJhTGlnaHRSZWd1bGFyMS4wMTc7QURCRTtTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHQ7QURPQkVWZXJzaW9uIDEuMDE3O1BTIDEuMDAwO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU5MDBTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9FeHRyYUxpZ2h0VHlwb2dyYXBoaWMgYWx0ZXJuYXRlc0FsdGVybmF0ZSBhQWx0ZXJuYXRlIGdBbHRlcm5hdGUgZG9sbGFyIHNpZ24AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AIABFAHgAdAByAGEATABpAGcAaAB0AFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBFAHgAdAByAGEATABpAGcAaAB0ADsAQQBEAE8AQgBFAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAxADcAOwBQAFMAIAAxAC4AMAAwADAAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADkAMAAwAFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBFAHgAdAByAGEATABpAGcAaAB0AFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZABQAGEAdQBsACAARAAuACAASAB1AG4AdABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgACgAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AKQAsACAAdwBpAHQAaAAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACAAJwBTAG8AdQByAGMAZQAnAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AIABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgANAAoADQAKAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4ADQAKAA0ACgBUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGMAbwBwAGkAZQBkACAAYgBlAGwAbwB3ACwAIABhAG4AZAAgAGkAcwAgAGEAbABzAG8AIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAgAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATAANAAoADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoAUwBJAEwAIABPAFAARQBOACAARgBPAE4AVAAgAEwASQBDAEUATgBTAEUAIABWAGUAcgBzAGkAbwBuACAAMQAuADEAIAAtACAAMgA2ACAARgBlAGIAcgB1AGEAcgB5ACAAMgAwADAANwANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgANAAoAUABSAEUAQQBNAEIATABFAA0ACgBUAGgAZQAgAGcAbwBhAGwAcwAgAG8AZgAgAHQAaABlACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACAAKABPAEYATAApACAAYQByAGUAIAB0AG8AIABzAHQAaQBtAHUAbABhAHQAZQAgAHcAbwByAGwAZAB3AGkAZABlACAAZABlAHYAZQBsAG8AcABtAGUAbgB0ACAAbwBmACAAYwBvAGwAbABhAGIAbwByAGEAdABpAHYAZQAgAGYAbwBuAHQAIABwAHIAbwBqAGUAYwB0AHMALAAgAHQAbwAgAHMAdQBwAHAAbwByAHQAIAB0AGgAZQAgAGYAbwBuAHQAIABjAHIAZQBhAHQAaQBvAG4AIABlAGYAZgBvAHIAdABzACAAbwBmACAAYQBjAGEAZABlAG0AaQBjACAAYQBuAGQAIABsAGkAbgBnAHUAaQBzAHQAaQBjACAAYwBvAG0AbQB1AG4AaQB0AGkAZQBzACwAIABhAG4AZAAgAHQAbwAgAHAAcgBvAHYAaQBkAGUAIABhACAAZgByAGUAZQAgAGEAbgBkACAAbwBwAGUAbgAgAGYAcgBhAG0AZQB3AG8AcgBrACAAaQBuACAAdwBoAGkAYwBoACAAZgBvAG4AdABzACAAbQBhAHkAIABiAGUAIABzAGgAYQByAGUAZAAgAGEAbgBkACAAaQBtAHAAcgBvAHYAZQBkACAAaQBuACAAcABhAHIAdABuAGUAcgBzAGgAaQBwACAAdwBpAHQAaAAgAG8AdABoAGUAcgBzAC4ADQAKAA0ACgBUAGgAZQAgAE8ARgBMACAAYQBsAGwAbwB3AHMAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAZAAgAGYAbwBuAHQAcwAgAHQAbwAgAGIAZQAgAHUAcwBlAGQALAAgAHMAdAB1AGQAaQBlAGQALAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGYAcgBlAGUAbAB5ACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABlAHkAIABhAHIAZQAgAG4AbwB0ACAAcwBvAGwAZAAgAGIAeQAgAHQAaABlAG0AcwBlAGwAdgBlAHMALgAgAFQAaABlACAAZgBvAG4AdABzACwAIABpAG4AYwBsAHUAZABpAG4AZwAgAGEAbgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAsACAAYwBhAG4AIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIABlAG0AYgBlAGQAZABlAGQALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABhAG4AZAAvAG8AcgAgAHMAbwBsAGQAIAB3AGkAdABoACAAYQBuAHkAIABzAG8AZgB0AHcAYQByAGUAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAYQBuAHkAIAByAGUAcwBlAHIAdgBlAGQAIABuAGEAbQBlAHMAIABhAHIAZQAgAG4AbwB0ACAAdQBzAGUAZAAgAGIAeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALgAgAFQAaABlACAAZgBvAG4AdABzACAAYQBuAGQAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALAAgAGgAbwB3AGUAdgBlAHIALAAgAGMAYQBuAG4AbwB0ACAAYgBlACAAcgBlAGwAZQBhAHMAZQBkACAAdQBuAGQAZQByACAAYQBuAHkAIABvAHQAaABlAHIAIAB0AHkAcABlACAAbwBmACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAGYAbwBuAHQAcwAgAG8AcgAgAHQAaABlAGkAcgAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAuAA0ACgANAAoARABFAEYASQBOAEkAVABJAE8ATgBTAA0ACgAiAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABzAGUAdAAgAG8AZgAgAGYAaQBsAGUAcwAgAHIAZQBsAGUAYQBzAGUAZAAgAGIAeQAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYQBuAGQAIABjAGwAZQBhAHIAbAB5ACAAbQBhAHIAawBlAGQAIABhAHMAIABzAHUAYwBoAC4AIABUAGgAaQBzACAAbQBhAHkAIABpAG4AYwBsAHUAZABlACAAcwBvAHUAcgBjAGUAIABmAGkAbABlAHMALAAgAGIAdQBpAGwAZAAgAHMAYwByAGkAcAB0AHMAIABhAG4AZAAgAGQAbwBjAHUAbQBlAG4AdABhAHQAaQBvAG4ALgANAAoADQAKACIAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABuAGEAbQBlAHMAIABzAHAAZQBjAGkAZgBpAGUAZAAgAGEAcwAgAHMAdQBjAGgAIABhAGYAdABlAHIAIAB0AGgAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAcwB0AGEAdABlAG0AZQBuAHQAKABzACkALgANAAoADQAKACIATwByAGkAZwBpAG4AYQBsACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAGMAbwBsAGwAZQBjAHQAaQBvAG4AIABvAGYAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAGEAcwAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGIAeQAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAuAA0ACgANAAoAIgBNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAG0AYQBkAGUAIABiAHkAIABhAGQAZABpAG4AZwAgAHQAbwAsACAAZABlAGwAZQB0AGkAbgBnACwAIABvAHIAIABzAHUAYgBzAHQAaQB0AHUAdABpAG4AZwAgAC0ALQAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUAIAAtAC0AIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAG8AZgAgAHQAaABlACAATwByAGkAZwBpAG4AYQBsACAAVgBlAHIAcwBpAG8AbgAsACAAYgB5ACAAYwBoAGEAbgBnAGkAbgBnACAAZgBvAHIAbQBhAHQAcwAgAG8AcgAgAGIAeQAgAHAAbwByAHQAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIAB0AG8AIABhACAAbgBlAHcAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQALgANAAoADQAKACIAQQB1AHQAaABvAHIAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcwBpAGcAbgBlAHIALAAgAGUAbgBnAGkAbgBlAGUAcgAsACAAcAByAG8AZwByAGEAbQBtAGUAcgAsACAAdABlAGMAaABuAGkAYwBhAGwAIAB3AHIAaQB0AGUAcgAgAG8AcgAgAG8AdABoAGUAcgAgAHAAZQByAHMAbwBuACAAdwBoAG8AIABjAG8AbgB0AHIAaQBiAHUAdABlAGQAIAB0AG8AIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFAARQBSAE0ASQBTAFMASQBPAE4AIAAmACAAQwBPAE4ARABJAFQASQBPAE4AUwANAAoAUABlAHIAbQBpAHMAcwBpAG8AbgAgAGkAcwAgAGgAZQByAGUAYgB5ACAAZwByAGEAbgB0AGUAZAAsACAAZgByAGUAZQAgAG8AZgAgAGMAaABhAHIAZwBlACwAIAB0AG8AIABhAG4AeQAgAHAAZQByAHMAbwBuACAAbwBiAHQAYQBpAG4AaQBuAGcAIABhACAAYwBvAHAAeQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAdABvACAAdQBzAGUALAAgAHMAdAB1AGQAeQAsACAAYwBvAHAAeQAsACAAbQBlAHIAZwBlACwAIABlAG0AYgBlAGQALAAgAG0AbwBkAGkAZgB5ACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAYQBuAGQAIABzAGUAbABsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAB1AG4AbQBvAGQAaQBmAGkAZQBkACAAYwBvAHAAaQBlAHMAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAAYwBvAG4AZABpAHQAaQBvAG4AcwA6AA0ACgANAAoAMQApACAATgBlAGkAdABoAGUAcgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG4AbwByACAAYQBuAHkAIABvAGYAIABpAHQAcwAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAIABjAG8AbQBwAG8AbgBlAG4AdABzACwAIABpAG4AIABPAHIAaQBnAGkAbgBhAGwAIABvAHIAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuAHMALAAgAG0AYQB5ACAAYgBlACAAcwBvAGwAZAAgAGIAeQAgAGkAdABzAGUAbABmAC4ADQAKAA0ACgAyACkAIABPAHIAaQBnAGkAbgBhAGwAIABvAHIAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABhAG4AZAAvAG8AcgAgAHMAbwBsAGQAIAB3AGkAdABoACAAYQBuAHkAIABzAG8AZgB0AHcAYQByAGUALAAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABlAGEAYwBoACAAYwBvAHAAeQAgAGMAbwBuAHQAYQBpAG4AcwAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAHAAeQByAGkAZwBoAHQAIABuAG8AdABpAGMAZQAgAGEAbgBkACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlAHMAZQAgAGMAYQBuACAAYgBlACAAaQBuAGMAbAB1AGQAZQBkACAAZQBpAHQAaABlAHIAIABhAHMAIABzAHQAYQBuAGQALQBhAGwAbwBuAGUAIAB0AGUAeAB0ACAAZgBpAGwAZQBzACwAIABoAHUAbQBhAG4ALQByAGUAYQBkAGEAYgBsAGUAIABoAGUAYQBkAGUAcgBzACAAbwByACAAaQBuACAAdABoAGUAIABhAHAAcAByAG8AcAByAGkAYQB0AGUAIABtAGEAYwBoAGkAbgBlAC0AcgBlAGEAZABhAGIAbABlACAAbQBlAHQAYQBkAGEAdABhACAAZgBpAGUAbABkAHMAIAB3AGkAdABoAGkAbgAgAHQAZQB4AHQAIABvAHIAIABiAGkAbgBhAHIAeQAgAGYAaQBsAGUAcwAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAbwBzAGUAIABmAGkAZQBsAGQAcwAgAGMAYQBuACAAYgBlACAAZQBhAHMAaQBsAHkAIAB2AGkAZQB3AGUAZAAgAGIAeQAgAHQAaABlACAAdQBzAGUAcgAuAA0ACgANAAoAMwApACAATgBvACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAdQBzAGUAIAB0AGgAZQAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACgAcwApACAAdQBuAGwAZQBzAHMAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuACAAcABlAHIAbQBpAHMAcwBpAG8AbgAgAGkAcwAgAGcAcgBhAG4AdABlAGQAIABiAHkAIAB0AGgAZQAgAGMAbwByAHIAZQBzAHAAbwBuAGQAaQBuAGcAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByAC4AIABUAGgAaQBzACAAcgBlAHMAdAByAGkAYwB0AGkAbwBuACAAbwBuAGwAeQAgAGEAcABwAGwAaQBlAHMAIAB0AG8AIAB0AGgAZQAgAHAAcgBpAG0AYQByAHkAIABmAG8AbgB0ACAAbgBhAG0AZQAgAGEAcwAgAHAAcgBlAHMAZQBuAHQAZQBkACAAdABvACAAdABoAGUAIAB1AHMAZQByAHMALgANAAoADQAKADQAKQAgAFQAaABlACAAbgBhAG0AZQAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAG8AcgAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABzAGgAYQBsAGwAIABuAG8AdAAgAGIAZQAgAHUAcwBlAGQAIAB0AG8AIABwAHIAbwBtAG8AdABlACwAIABlAG4AZABvAHIAcwBlACAAbwByACAAYQBkAHYAZQByAHQAaQBzAGUAIABhAG4AeQAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4ALAAgAGUAeABjAGUAcAB0ACAAdABvACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlACAAdABoAGUAIABjAG8AbgB0AHIAaQBiAHUAdABpAG8AbgAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAGEAbgBkACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AcgAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuACAAcABlAHIAbQBpAHMAcwBpAG8AbgAuAA0ACgANAAoANQApACAAVABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABtAG8AZABpAGYAaQBlAGQAIABvAHIAIAB1AG4AbQBvAGQAaQBmAGkAZQBkACwAIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACwAIABtAHUAcwB0ACAAYgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZQBuAHQAaQByAGUAbAB5ACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUALAAgAGEAbgBkACAAbQB1AHMAdAAgAG4AbwB0ACAAYgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAdQBuAGQAZQByACAAYQBuAHkAIABvAHQAaABlAHIAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAVABFAFIATQBJAE4AQQBUAEkATwBOAA0ACgBUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGIAZQBjAG8AbQBlAHMAIABuAHUAbABsACAAYQBuAGQAIAB2AG8AaQBkACAAaQBmACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAIABhAHIAZQAgAG4AbwB0ACAAbQBlAHQALgANAAoADQAKAEQASQBTAEMATABBAEkATQBFAFIADQAKAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAEkAUwAgAFAAUgBPAFYASQBEAEUARAAgACIAQQBTACAASQBTACIALAAgAFcASQBUAEgATwBVAFQAIABXAEEAUgBSAEEATgBUAFkAIABPAEYAIABBAE4AWQAgAEsASQBOAEQALAAgAEUAWABQAFIARQBTAFMAIABPAFIAIABJAE0AUABMAEkARQBEACwAIABJAE4AQwBMAFUARABJAE4ARwAgAEIAVQBUACAATgBPAFQAIABMAEkATQBJAFQARQBEACAAVABPACAAQQBOAFkAIABXAEEAUgBSAEEATgBUAEkARQBTACAATwBGACAATQBFAFIAQwBIAEEATgBUAEEAQgBJAEwASQBUAFkALAAgAEYASQBUAE4ARQBTAFMAIABGAE8AUgAgAEEAIABQAEEAUgBUAEkAQwBVAEwAQQBSACAAUABVAFIAUABPAFMARQAgAEEATgBEACAATgBPAE4ASQBOAEYAUgBJAE4ARwBFAE0ARQBOAFQAIABPAEYAIABDAE8AUABZAFIASQBHAEgAVAAsACAAUABBAFQARQBOAFQALAAgAFQAUgBBAEQARQBNAEEAUgBLACwAIABPAFIAIABPAFQASABFAFIAIABSAEkARwBIAFQALgAgAEkATgAgAE4ATwAgAEUAVgBFAE4AVAAgAFMASABBAEwATAAgAFQASABFACAAQwBPAFAAWQBSAEkARwBIAFQAIABIAE8ATABEAEUAUgAgAEIARQAgAEwASQBBAEIATABFACAARgBPAFIAIABBAE4AWQAgAEMATABBAEkATQAsACAARABBAE0AQQBHAEUAUwAgAE8AUgAgAE8AVABIAEUAUgAgAEwASQBBAEIASQBMAEkAVABZACwAIABJAE4AQwBMAFUARABJAE4ARwAgAEEATgBZACAARwBFAE4ARQBSAEEATAAsACAAUwBQAEUAQwBJAEEATAAsACAASQBOAEQASQBSAEUAQwBUACwAIABJAE4AQwBJAEQARQBOAFQAQQBMACwAIABPAFIAIABDAE8ATgBTAEUAUQBVAEUATgBUAEkAQQBMACAARABBAE0AQQBHAEUAUwAsACAAVwBIAEUAVABIAEUAUgAgAEkATgAgAEEATgAgAEEAQwBUAEkATwBOACAATwBGACAAQwBPAE4AVABSAEEAQwBUACwAIABUAE8AUgBUACAATwBSACAATwBUAEgARQBSAFcASQBTAEUALAAgAEEAUgBJAFMASQBOAEcAIABGAFIATwBNACwAIABPAFUAVAAgAE8ARgAgAFQASABFACAAVQBTAEUAIABPAFIAIABJAE4AQQBCAEkATABJAFQAWQAgAFQATwAgAFUAUwBFACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAATwBSACAARgBSAE8ATQAgAE8AVABIAEUAUgAgAEQARQBBAEwASQBOAEcAUwAgAEkATgAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAuAA0ACgBoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAC8AbABlAGcAYQBsAC4AaAB0AG0AbABTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBFAHgAdAByAGEATABpAGcAaAB0AFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARlTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHQAAQEBLvr2APr3Afr4DAD6+QL6+gP6+wSMDAF1/CT5Vvp8BRwvFQ8cMY8Rxx0AALOjEgLhAgABAAgADgAVABwAIwAqADEAOAA/AEYATQBUAFsAYgBpAHAAdwB9AIgAjgCYAJ4ApQCsALIAuAC/AMUAzwDWAN0A5ADrAPIA+QEAAQcBDgEZAR8BKQEwATYBPQFIAVMBWgFhAWUBawFyAXkBgwGKAZEBmAGfAaoBsQG3Ab0BxAHIAc8B1gHdAeQB6gHwAfcB/gIFAgwCEwIaAicCLgI1AjwCQwJKAlECWAJfAmQCawJyAnkCgAKHAo4ClAKaAqECqAKvArYCvALHAs4C1QLcAuMC6gLwAvcC/gMFAwwDEgMZAx8DJAMxAzgDPwNGA00DVANbA2IDaQNuA3UDfAODA4oDkQOXA50DqAOxA7cDwgPJA9AD1wPeA+QD7gP1A/wEAwQJBBAEFwQeBCUELAQzBDoEQQRIBE8EVgRdBGQEawRyBHgEgwSJBJMEmQSgBKcErQSzBLoEwATKBNEE2ATfBOYE7QT0BPsFAgUJBRQFGgUkBSsFMQU4BUMFTgVVBVwFYAVmBW0FdAV7BYIFiQWQBZkFpAWrBbcFvQXDBccFzgXVBdwF4wXqBfAF9gX9BgQGCwYSBh0GJAYrBjgGPwZGBk0GVAZbBmIGaQZwBnUGfAaDBooGkQaYBp8GpQasBrIGuQbABscGzQbYBt8G5gbtBvQG+gcBBwgHDwcWBx0HIwcqBzAHNQdCB0kHUAdXB14HZQdsB3MHegd/B4YHjQeUB5sHogeoB64HuQfCB8gH0wfaB+EH6AfvB/UH/wgGCA0IFAgbCCIIKQgwCDcIPghFCEwIUwhaCGEIaAhrCHMIewiICJAImwikCKwIswi8CMUIzgjXCOAI6QjyCPsJBAkNCRYJHwkoCTEJNAlBCUkJVQleCWYJbwl8CYUJjQmVCZ8JqAmxCbkJwwnNCdYJ3QnkCesJ8gn5CgMKCwoUChwKJQotCjUKPwpIClEKWQpjCm0KdgqECpMKngqoCrEKuQrBCssK1ArdCuUK7wr5CwILEAsfCyoLNAs9C0ULTQtXC2ALaQtxC3sLhQuOC5wLqwu2C8ALyQvRC9kL4wvsC/UL/QwHDBEMGgwoDDcMQgxMDFkMXwxlDGsMcQx3DH0MgwyJDI8MlQybDKEMpwytDLMMuQy/DMUMywzRDNcM3QzjDOkM7wz1DQANCw0XDR0NIw0nDS4NMg05DT8NQw1KDVENWA1fDWYNbQ13DX4Nhw2TDZsNpg2oDbANtw3CDcoN0Q3YDd8N6A3vDfYN/w4GDg0OFA4dDiQOKw4yDjkOQA5HDk4OVQ5cDmMOag5xDngOfw6GDo0OlA6bDqIOqQ6wDrcOvg7FDswO0w7aDuEO6A7zDvoPBQ8MDxcPHg8pDzAPOw9CD00PVA9fD2YPcQ94D4MPig+VD5wPpw+uD7kPwA/LD9IP2Q/gD+cP7g/1D/wQBxAOEBkQIBAnEDIQQRBMEFsQZhB1EIAQjxCaEKkQtBDDEM4Q3RDoEPcRAhERERwRKxE2EUURUBFfEWoReRGCEYsRkhGZEaMRrxG2Eb0RxBHLEdIR2RHgEecR7hH1EfwSAxIKEhESGBIfEiYSLRI0EjsSQhJJElASVxJeEmUSbBJzEnoSgRKIEo8SlhKdEqQSqxKyErkSwBLHEs4S1RLcEuMS6hLxEvgS/xMGEw0TFBMbEyITKRMwEzcTPhNFE0wTUxNaE2ETaBNvE3YTfROEE4sTkhOZE6ATpxOuE7UTvBPDE8oT0RPYE98T5hPtE/QT+xQCFAkUEBQXFB4UJRQsFDMUOhRBFEgUTxRWFF0UZBRrFHIUeRSAFIcUjhSVFJwUoxSqFLEUuBS/FMYUzRTUFNsU4hTpFPAU9xT+FQUVDBUTFRoVIRUoFS8VNhU9FUQVSxVSFVkVYBVnFW4VdRV8FYMVihWRFZgVnxWmFa0VtBW7FcIVyRXQFdcV3hXlFewV8xX6FgEWCBYPFhYWHRYiFoIWxxbhFvAW+kFtYWNyb25BYnJldmV1bmkwMUNEdW5pMUVBMHVuaTFFQTJ1bmkxRUE0dW5pMUVBNnVuaTFFQTh1bmkxRUFBdW5pMUVBQ3VuaTFFQUV1bmkxRUIwdW5pMUVCMnVuaTFFQjR1bmkxRUI2QW9nb25la3VuaTAyNDNDYWN1dGVDY2lyY3VtZmxleENjYXJvbkNkb3RhY2NlbnREY2Fyb251bmkxRTBDdW5pMUUwRURjcm9hdEVjYXJvbkVtYWNyb25FYnJldmVFZG90YWNjZW50dW5pMUVCOHVuaTFFQkF1bmkxRUJDdW5pMUVCRXVuaTFFQzB1bmkxRUMydW5pMUVDNHVuaTFFQzZFb2dvbmVrR2NpcmN1bWZsZXhHYnJldmVHZG90YWNjZW50dW5pMDEyMkdjYXJvbnVuaTFFMjB1bmkwMDQ3MDMwM0hjaXJjdW1mbGV4dW5pMUUyNHVuaTFFMkFIYmFySXRpbGRlSW1hY3JvbnVuaTAxMkNJZG90YWNjZW50dW5pMDFDRnVuaTFFQzh1bmkxRUNBSW9nb25la0pjaXJjdW1mbGV4dW5pMDEzNkxhY3V0ZUxjYXJvbnVuaTAxM0JMZG90dW5pMUUzNnVuaTFFMzh1bmkxRTNBdW5pMUU0Mk5hY3V0ZU5jYXJvbnVuaTAxNDV1bmkxRTQ0dW5pMUU0NnVuaTFFNDhPbWFjcm9udW5pMDE0RU9odW5nYXJ1bWxhdXR1bmkwMUQxdW5pMUVDQ3VuaTFFQ0V1bmkxRUQwdW5pMUVEMnVuaTFFRDR1bmkxRUQ2dW5pMUVEOE9ob3JudW5pMUVEQXVuaTFFREN1bmkxRURFdW5pMUVFMHVuaTFFRTJ1bmkwMUVBUmFjdXRlUmNhcm9udW5pMDE1NnVuaTFFNUF1bmkxRTVDdW5pMUU1RVNhY3V0ZVNjaXJjdW1mbGV4dW5pMDE1RXVuaTAyMTh1bmkxRTYwdW5pMUU2MnVuaTFFOUVUY2Fyb251bmkwMTYydW5pMDIxQXVuaTFFNkN1bmkxRTZFVXRpbGRlVW1hY3JvblVicmV2ZVVyaW5nVWh1bmdhcnVtbGF1dHVuaTAxRDN1bmkwMUQ1dW5pMDFEN3VuaTAxRDl1bmkwMURCdW5pMUVFNHVuaTFFRTZVb2dvbmVrVWhvcm51bmkxRUU4dW5pMUVFQXVuaTFFRUN1bmkxRUVFdW5pMUVGMFdncmF2ZVdhY3V0ZVdjaXJjdW1mbGV4V2RpZXJlc2lzWWdyYXZlWWNpcmN1bWZsZXh1bmkxRThFdW5pMUVGNHVuaTFFRjZ1bmkxRUY4WmFjdXRlWmRvdGFjY2VudHVuaTFFOTJ1bmkwMThGYW1hY3JvbmFicmV2ZXVuaTAxQ0V1bmkxRUExdW5pMUVBM3VuaTFFQTV1bmkxRUE3dW5pMUVBOXVuaTFFQUJ1bmkxRUFEdW5pMUVBRnVuaTFFQjF1bmkxRUIzdW5pMUVCNXVuaTFFQjdhb2dvbmVrdW5pMDE4MGNhY3V0ZWNjaXJjdW1mbGV4Y2Nhcm9uY2RvdGFjY2VudGRjYXJvbnVuaTFFMER1bmkxRTBGZGNyb2F0ZWNhcm9uZW1hY3JvbmVicmV2ZWVkb3RhY2NlbnR1bmkxRUI5dW5pMUVCQnVuaTFFQkR1bmkxRUJGdW5pMUVDMXVuaTFFQzN1bmkxRUM1dW5pMUVDN2VvZ29uZWtnY2lyY3VtZmxleGdicmV2ZWdkb3RhY2NlbnR1bmkwMTIzZ2Nhcm9udW5pMUUyMXVuaTAwNjcwMzAzaGNpcmN1bWZsZXh1bmkxRTI1dW5pMUUyQmhiYXJpdGlsZGVpbWFjcm9udW5pMDEyRHVuaTAxRDB1bmkxRUM5dW5pMUVDQmlvZ29uZWtpb2dvbmVrLmRqY2lyY3VtZmxleHVuaTAxMzdrZ3JlZW5sYW5kaWNsYWN1dGVsY2Fyb25sZG90dW5pMDEzQ3VuaTFFMzd1bmkxRTM5dW5pMUUzQnVuaTFFNDNuYWN1dGVuY2Fyb251bmkwMTQ2dW5pMUU0NXVuaTFFNDd1bmkxRTQ5bmFwb3N0cm9waGVvbWFjcm9udW5pMDE0Rm9odW5nYXJ1bWxhdXR1bmkwMUQydW5pMUVDRHVuaTFFQ0Z1bmkxRUQxdW5pMUVEM3VuaTFFRDV1bmkxRUQ3dW5pMUVEOW9ob3JudW5pMUVEQnVuaTFFRER1bmkxRURGdW5pMUVFMXVuaTFFRTN1bmkwMUVCcmFjdXRldW5pMDE1N3JjYXJvbnVuaTFFNUJ1bmkxRTVEdW5pMUU1RnNhY3V0ZXNjaXJjdW1mbGV4dW5pMDE1RnVuaTAyMTl1bmkxRTYxdW5pMUU2M3RjYXJvbnVuaTAxNjN1bmkwMjFCdW5pMUU2RHVuaTFFNkZ1bmkxRTk3dXRpbGRldW1hY3JvbnVicmV2ZXVyaW5ndWh1bmdhcnVtbGF1dHVuaTAxRDR1bmkwMUQ2dW5pMDFEOHVuaTAxREF1bmkwMURDdW5pMUVFNXVuaTFFRTd1b2dvbmVrdWhvcm51bmkxRUU5dW5pMUVFQnVuaTFFRUR1bmkxRUVGdW5pMUVGMXdncmF2ZXdhY3V0ZXdjaXJjdW1mbGV4d2RpZXJlc2lzeWdyYXZleWNpcmN1bWZsZXh1bmkxRThGdW5pMUVGNXVuaTFFRjd1bmkxRUY5emFjdXRlemRvdGFjY2VudHVuaTFFOTN1bmkwMjM3dW5pMDI1MHVuaTAyNTF1bmkwMjUydW5pMDI1OXVuaTAyNjF1bmkwMjY1dW5pMDI2RnVuaTAyNzl1bmkwMjg3dW5pMDI4Q3VuaTAyOER1bmkwMjhFdW5pMDI5RWEuYWFncmF2ZS5hYWFjdXRlLmFhY2lyY3VtZmxleC5hYXRpbGRlLmFhZGllcmVzaXMuYWFtYWNyb24uYWFicmV2ZS5hYXJpbmcuYXVuaTAxQ0UuYXVuaTFFQTEuYXVuaTFFQTMuYXVuaTFFQTUuYXVuaTFFQTcuYXVuaTFFQTkuYXVuaTFFQUIuYXVuaTFFQUQuYXVuaTFFQUYuYXVuaTFFQjEuYXVuaTFFQjMuYXVuaTFFQjUuYXVuaTFFQjcuYWFvZ29uZWsuYWcuYWdjaXJjdW1mbGV4LmFnYnJldmUuYWdkb3RhY2NlbnQuYXVuaTAxMjMuYWdjYXJvbi5hdW5pMUUyMS5hdW5pMDA2NzAzMDMuYXplcm8ub251bW9uZS5vbnVtdHdvLm9udW10aHJlZS5vbnVtZm91ci5vbnVtZml2ZS5vbnVtc2l4Lm9udW1zZXZlbi5vbnVtZWlnaHQub251bW5pbmUub251bXVuaTAwQUR1bmkyMDE1dW5pMjExN3VuaTIxMjBhdC5jYXNlYXN0ZXJpc2suYWh5cGhlbi5hdW5pMDBBRC5hZG9sbGFyLmF6ZXJvLnN1cHNvbmUuc3Vwc3R3by5zdXBzdGhyZWUuc3Vwc2ZvdXIuc3Vwc2ZpdmUuc3Vwc3NpeC5zdXBzc2V2ZW4uc3Vwc2VpZ2h0LnN1cHNuaW5lLnN1cHNwYXJlbmxlZnQuc3Vwc3BhcmVucmlnaHQuc3Vwc3BlcmlvZC5zdXBzY29tbWEuc3Vwc3plcm8uc3Vic29uZS5zdWJzdHdvLnN1YnN0aHJlZS5zdWJzZm91ci5zdWJzZml2ZS5zdWJzc2l4LnN1YnNzZXZlbi5zdWJzZWlnaHQuc3Vic25pbmUuc3Vic3BhcmVubGVmdC5zdWJzcGFyZW5yaWdodC5zdWJzcGVyaW9kLnN1YnNjb21tYS5zdWJzemVyby5kbm9tb25lLmRub210d28uZG5vbXRocmVlLmRub21mb3VyLmRub21maXZlLmRub21zaXguZG5vbXNldmVuLmRub21laWdodC5kbm9tbmluZS5kbm9tcGFyZW5sZWZ0LmRub21wYXJlbnJpZ2h0LmRub21wZXJpb2QuZG5vbWNvbW1hLmRub216ZXJvLm51bXJvbmUubnVtcnR3by5udW1ydGhyZWUubnVtcmZvdXIubnVtcmZpdmUubnVtcnNpeC5udW1yc2V2ZW4ubnVtcmVpZ2h0Lm51bXJuaW5lLm51bXJwYXJlbmxlZnQubnVtcnBhcmVucmlnaHQubnVtcnBlcmlvZC5udW1yY29tbWEubnVtcm9yZGZlbWluaW5lLmFhLnN1cHNiLnN1cHNjLnN1cHNkLnN1cHNlLnN1cHNmLnN1cHNnLnN1cHNoLnN1cHNpLnN1cHNqLnN1cHNrLnN1cHNsLnN1cHNtLnN1cHNuLnN1cHNvLnN1cHNwLnN1cHNxLnN1cHNyLnN1cHNzLnN1cHN0LnN1cHN1LnN1cHN2LnN1cHN3LnN1cHN4LnN1cHN5LnN1cHN6LnN1cHNlZ3JhdmUuc3Vwc2VhY3V0ZS5zdXBzdW5pMDI1OS5zdXBzYS5zdXBhZy5zdXBhRXVyb3VuaTAxOTJsaXJhdW5pMjBBNnBlc2V0YWRvbmd1bmkyMEIxdW5pMjBCMnVuaTIwQjV1bmkyMEI5dW5pMjBCQXVuaTIyMTVzbGFzaC5mcmFjdW5pMjIxOWxlc3NlcXVhbGdyZWF0ZXJlcXVhbG5vdGVxdWFsYXBwcm94ZXF1YWxwaWluZmluaXR5dW5pMDBCNXBhcnRpYWxkaWZmaW50ZWdyYWxyYWRpY2FsdW5pMjIwNnVuaTIxMjZzdW1tYXRpb25wcm9kdWN0dW5pMjExM2VzdGltYXRlZHVuaTIxOTBhcnJvd3VwdW5pMjE5MmFycm93ZG93bnVuaTI1QTB1bmkyNUM2dW5pMjVDOXVuaTI3NTJ0cmlhZ3VwdW5pMjVCM3VuaTI1QjZ1bmkyNUI3dHJpYWdkbnVuaTI1QkR1bmkyNUMwdW5pMjVDMXVuaTI2MTB1bmkyNjExdW5pMjcxM3VuaTI2NkFsb3plbmdldW5pMjAzMnVuaTIwMzN1bmkwMkJCdW5pMDJCQ3VuaTAyQkV1bmkwMkJGdW5pMDJDOHVuaTAyQzl1bmkwMkNBdW5pMDJDQnVuaTAyQ0N1bmkwMzAwdW5pMDMwMC5jYXB1bmkwMzAxdW5pMDMwMS5jYXB1bmkwMzAydW5pMDMwMi5jYXB1bmkwMzAzdW5pMDMwMy5jYXB1bmkwMzA0dW5pMDMwNC5jYXB1bmkwMzA2dW5pMDMwNi5jYXB1bmkwMzA3dW5pMDMwNy5jYXB1bmkwMzA4dW5pMDMwOC5jYXB1bmkwMzA5dW5pMDMwOS5jYXB1bmkwMzBBdW5pMDMwQS5jYXB1bmkwMzBCdW5pMDMwQi5jYXB1bmkwMzBDdW5pMDMwQy5jYXB1bmkwMzBGdW5pMDMwRi5jYXB1bmkwMzEydW5pMDMxM3VuaTAzMUJ1bmkwMzIzdW5pMDMyNHVuaTAzMjZ1bmkwMzI3dW5pMDMyNy5jYXB1bmkwMzI4dW5pMDMyOC5jYXB1bmkwMzJFdW5pMDMzMXVuaTAzMDgwMzA0dW5pMDMwODAzMDQuY2FwdW5pMDMwODAzMDF1bmkwMzA4MDMwMS5jYXB1bmkwMzA4MDMwQ3VuaTAzMDgwMzBDLmNhcHVuaTAzMDgwMzAwdW5pMDMwODAzMDAuY2FwdW5pMDMwMjAzMDF1bmkwMzAyMDMwMS5jYXB1bmkwMzAyMDMwMHVuaTAzMDIwMzAwLmNhcHVuaTAzMDIwMzA5dW5pMDMwMjAzMDkuY2FwdW5pMDMwMjAzMDN1bmkwMzAyMDMwMy5jYXB1bmkwMzA2MDMwMXVuaTAzMDYwMzAxLmNhcHVuaTAzMDYwMzAwdW5pMDMwNjAzMDAuY2FwdW5pMDMwNjAzMDl1bmkwMzA2MDMwOS5jYXB1bmkwMzA2MDMwM3VuaTAzMDYwMzAzLmNhcHVuaTAzMDIwMzA2dW5pMDMwMjAzMDYuY2FwdW5pMDMwQy5hdW5pMDMyNi5hdW5pMDBBMHVuaTIwMDdzcGFjZS5mcmFjbmJzcGFjZS5mcmFjdW5pMjUwMHVuaTI1MDF1bmkyNTAydW5pMjUwM3VuaTI1MDR1bmkyNTA1dW5pMjUwNnVuaTI1MDd1bmkyNTA4dW5pMjUwOXVuaTI1MEF1bmkyNTBCdW5pMjUwQ3VuaTI1MER1bmkyNTBFdW5pMjUwRnVuaTI1MTB1bmkyNTExdW5pMjUxMnVuaTI1MTN1bmkyNTE0dW5pMjUxNXVuaTI1MTZ1bmkyNTE3dW5pMjUxOHVuaTI1MTl1bmkyNTFBdW5pMjUxQnVuaTI1MUN1bmkyNTFEdW5pMjUxRXVuaTI1MUZ1bmkyNTIwdW5pMjUyMXVuaTI1MjJ1bmkyNTIzdW5pMjUyNHVuaTI1MjV1bmkyNTI2dW5pMjUyN3VuaTI1Mjh1bmkyNTI5dW5pMjUyQXVuaTI1MkJ1bmkyNTJDdW5pMjUyRHVuaTI1MkV1bmkyNTJGdW5pMjUzMHVuaTI1MzF1bmkyNTMydW5pMjUzM3VuaTI1MzR1bmkyNTM1dW5pMjUzNnVuaTI1Mzd1bmkyNTM4dW5pMjUzOXVuaTI1M0F1bmkyNTNCdW5pMjUzQ3VuaTI1M0R1bmkyNTNFdW5pMjUzRnVuaTI1NDB1bmkyNTQxdW5pMjU0MnVuaTI1NDN1bmkyNTQ0dW5pMjU0NXVuaTI1NDZ1bmkyNTQ3dW5pMjU0OHVuaTI1NDl1bmkyNTRBdW5pMjU0QnVuaTI1NEN1bmkyNTREdW5pMjU0RXVuaTI1NEZ1bmkyNTUwdW5pMjU1MXVuaTI1NTJ1bmkyNTUzdW5pMjU1NHVuaTI1NTV1bmkyNTU2dW5pMjU1N3VuaTI1NTh1bmkyNTU5dW5pMjU1QXVuaTI1NUJ1bmkyNTVDdW5pMjU1RHVuaTI1NUV1bmkyNTVGdW5pMjU2MHVuaTI1NjF1bmkyNTYydW5pMjU2M3VuaTI1NjR1bmkyNTY1dW5pMjU2NnVuaTI1Njd1bmkyNTY4dW5pMjU2OXVuaTI1NkF1bmkyNTZCdW5pMjU2Q3VuaTI1NkR1bmkyNTZFdW5pMjU2RnVuaTI1NzB1bmkyNTcxdW5pMjU3MnVuaTI1NzN1bmkyNTc0dW5pMjU3NXVuaTI1NzZ1bmkyNTc3dW5pMjU3OHVuaTI1Nzl1bmkyNTdBdW5pMjU3QnVuaTI1N0N1bmkyNTdEdW5pMjU3RXVuaTI1N0Z1bmkyNTgwdW5pMjU4MXVuaTI1ODJ1bmkyNTgzdW5pMjU4NHVuaTI1ODV1bmkyNTg2dW5pMjU4N3VuaTI1ODh1bmkyNTg5dW5pMjU4QXVuaTI1OEJ1bmkyNThDdW5pMjU4RHVuaTI1OEV1bmkyNThGdW5pMjU5MHVuaTI1OTF1bmkyNTkydW5pMjU5M3VuaTI1OTR1bmkyNTk1dW5pMjU5NnVuaTI1OTd1bmkyNTk4dW5pMjU5OXVuaTI1OUF1bmkyNTlCdW5pMjU5Q3VuaTI1OUR1bmkyNTlFdW5pMjU5RnVuaTAyNTh1bmkwMjU0MS4wMDBTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5Db3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIElu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+wUGCxX3Ban7BQYLyv//yYAAuQt3AfcwqQup96SnCxX3wKn7ovkjbQYL97AB/wEVgAC4Awv7LKL4H6P4H6IBC/fA+UFt/SP7ogYL+Vylx+kB91KlAwt7CvexCwf7IHw1+xD7UhoLpRLRqwu5+My5C6n3KqkLAAAAAlgAVAAAADIAdwBKAGQAhACcAD0AXABwAGIAegCcAF8AYAA4AHwAPAB8AFAAMgBcAEEADwBTADgASABgAG4AWgBGAFAAeABYAG4AZABCAIIAYQBQAG4ARgBuAEYAqgBXAFQAWgBCAAwAVgBAAEgAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAAACoASgBKAEoASgBKAGQAZABkABwAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAD0APQA9AD0APQA9AD0AXABcAFwAEABwAHAAcABwAHAAcABwAHAAcABwAHAAcABiAHoAmgCcAJwAnACcAEwAnABFAF8AYABgAGAAYABgAGAAYAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgALAA4ADgAOAA4ADgAOAA4AHwAfAB8AHwAfAB8AFAAUABQAFAAUABQAFAAWgAyADIAMgAyADIAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAA8ADwAPAA8AOAA4ADgAOAA4ADgAOAA4AEgASABIAEgAHAB8AEIAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAARACAAWgBaAFoAWgBaAEYARgBGAEYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFgAWABYAFgAWABYAFgAIABuAG4AIABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAEIAggCCAGEAYQBDAGEAYQBhAGEAYQBQAG4AbgBuAG4AbgBuAG7//gBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYACgBGAEYARgBGAEYARgBGAKoAgACqAJ4AngBWAFcAVwBXAFcAVwBXAFcAbgBUAFQAVABUAFQAVABaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoADAAMAAwADABAAEAAQABAAEAAQABAAEAASABIAEgASABGAG4AQgBwAEYAbgBEAEYAUABGAFoAOgBIADoAQgAMAEAAJABYAF0ARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgA5AFQAcABTAEYAKwBAAFoATABKAE4AVABwAFMARgArAEAAXABMAEoATgD4ANAA+ADQADoA+AD4AHYAigEMAKgA5gDmAIIAggDmAIIA1wDjAHMAfwBiAGIAUAAUAFAAFAD4AKQAPADmAHYA9gBeAIQAXgB4AR4AeAEeAGUAngCeAGoAXAAoACgAeAACACIAQABAAGQAeQCOAI4AZgCoANoAugCyALQAsgC6ALsAtgC0AP4A4AEMAQIAqADaALoAsgC0ALIAugC7ALYAtAD+AOABDAECAKgA2gC6ALIAtACyALwAuwC2ALQA/gDgAQwBAgCoANoAugCyALQAsgC6ALsAtgC0AP4A4AEMAQIAsgCQAJYAsgC6AL0AkACqANIAogC+ALQAkgDUAM8AjwC+AJYAugCQAQsArwCvAKoAqwBRALwAlACOAKoAqgCgAJAAkAC+AEwAZgBSAEYARAB+ADQAbgBUAD4APAB8ADwAYgBuAHsASAAmACYAJgAcAD4AJgAmACYAJgAmACYAJgAmACYAYgBiAHQAYgDyAGIAfAByAGIAYgBiAIQAYgBgAGAAYgA8AAQAWgBaANkAVgA2ACoATgBKAJYAGgAUACIAHAAiANkAswCIALYAMQAxAFMAUwAxADEALQAt/+r/6gACAGEAcgEWANYA5gDmAP8A4wDcAPgAwADAAQ0AvgD2ANoBDQC2ALQAvgC4AN4A4AEEAPAA+gDcAMIA+AEMAMAAvgC2ALAAvgC+ALgAvAEEAQoAtADAAPoA+gDeAN4A4ADWAMAAvgCMAIwBBAEEASQBBADAAOYA5gDeAPoA/AC4ALwAvAC+AMAAwADAAL4AwADAAMoAxADKAMQAygDEALYAtgC4AL4AuAC+ALgAvgC2ALYAwgC+AQ4A9AAAAAAAAAAA//H/8QEdAQ4AIQAhAR0BDgASABIBHQEOAR0BHQEOAQ7/8f/x//H/8QEdAR0BDgEO//H/8f/x//EBHQEdAQ4BDgEOAQ4BDgEO//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//EASwBLAR0BDv/xAP8BHQD/AP//8f/x//EBHQD/AP//8f/x//EBHQD/AP//8f/x//H/8f/x//H/8f/x//H/8f/x//EBHf/x//EBHf/x//H/8f/xAR0BHQEd//EBDgEdAQ7/8QEO//EBDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAAAAAAAAAINAAABLAAAAAAAAAAAAAABLAAAAAAAAQAAAAwAAAAAAL4AAgAdAAIANQABAEsATAABAGcAZwABAG4AbgACAH4AfgABAKEAowABAKkAqQABAM0AzgABAOYA5gABAPwA/AABAQQBBAACARgBGAABARwBHAACAR8BHwACAS4BLgACAS8BMAABATUBNQACAVUBVwABAV0BXQABAWwBbAACAYIBgwABAZoBqgABAa0BrQABAcMBxAABAcgByAACAs0CzQABAtcC1wABAt0DHAADAx4DHgADAAIAAwLdAvgAAQMDAxwAAQMeAx4AAQABAAAACgBsAhoAAkRGTFQADmxhdG4AOAAEAAAAAP//ABAAAAACAAQABgAIAAoADAAOABAAEgAUABYAGAAaABwAHgAEAAAAAP//ABAAAQADAAUABwAJAAsADQAPABEAEwAVABcAGQAbAB0AHwAgYWFsdADCYWFsdADKY2FzZQDSY2FzZQDYY2NtcADeY2NtcADsZG5vbQD6ZG5vbQEAZnJhYwEGZnJhYwEQbnVtcgEabnVtcgEgb251bQEmb251bQEsb3JkbgEyb3JkbgE4c2FsdAE+c2FsdAFKc2luZgFWc2luZgFcc3MwMQFic3MwMQFoc3MwMgFuc3MwMgF0c3MwMwF6c3MwMwGAc3MwNAGGc3MwNAGMc3VicwGSc3VicwGYc3VwcwGec3VwcwGmAAAAAgAAAAEAAAACAAAAAQAAAAEAEAAAAAEAEAAAAAUAAwAEAAUABgAHAAAABQADAAQABQAGAAcAAAABAAkAAAABAAkAAAADAAgACgALAAAAAwAIAAoACwAAAAEACAAAAAEACAAAAAEADwAAAAEADwAAAAEADAAAAAEADAAAAAQAEQASABMAFAAA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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Code Pro Light'), local('SourceCodePro-Light'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAATmEAAAAOkNGRiCTrBH5AABI+AAA0/1EU0lHvkvMtAABOcAAACBYR0RFRi8sL9AAASSAAAAA1EdQT1NNQOJiAAEwiAAACPpHU1VC3Z7yFQABJVQAAAsyT1MvMnJwz7UAAAFQAAAAYGNtYXDp1MYJAAA+yAAAChBoZWFk++2HegAAAOwAAAA2aGhlYQaGAN8AAAEkAAAAJGhtdHjAa8POAAEc+AAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZdEIqPsAAAGwAAA9GHBvc3T/uAAzAABI2AAAACAAAQAAAAEEWjTEiMVfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/6f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/p/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAEsAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwQJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFQBFAAEAAAAAAAIABwBaAAEAAAAAAAMAJABhAAEAAAAAAAQAFQBFAAEAAAAAAAUAOQCFAAEAAAAAAAYAEwC+AAEAAAAAAAcAYADRAAEAAAAAAAgAGgExAAEAAAAAAAkADAFLAAEAAAAAAAsAGQFXAAEAAAAAAA0R2QFwAAEAAAAAAA4AJBNJAAEAAAAAABAADxNtAAEAAAAAABEABRN8AAEAAAAAAQAAFhOBAAEAAAAAAQEACxOXAAEAAAAAAQIACxOiAAEAAAAAAQMAFROtAAMAAQQJAAAAihPCAAMAAQQJAAEAKhRMAAMAAQQJAAIADhR2AAMAAQQJAAMASBSEAAMAAQQJAAQAKhRMAAMAAQQJAAUAchTMAAMAAQQJAAYAJhU+AAMAAQQJAAcAwBVkAAMAAQQJAAgANBYkAAMAAQQJAAkAGBZYAAMAAQQJAAsAMhZwAAMAAQQJAA0jthaiAAMAAQQJAA4ASDpYAAMAAQQJABAAHjqgAAMAAQQJABEACjq+AAMAAQQJAQAALDrIAAMAAQQJAQEAFjr0AAMAAQQJAQIAFjsKAAMAAQQJAQMAKjsgQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIExpZ2h0UmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1MaWdodDtBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tTGlnaHRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9MaWdodFR5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAATABpAGcAaAB0AFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBMAGkAZwBoAHQAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEwAaQBnAGgAdABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8ATABpAGcAaAB0AFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCm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8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBMaWdodFNvdXJjZSBDb2RlIFBy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9z/3YXWfBQuxAda39/S3A/esCxVjp3Spqaeisx4L+TrrChWpBq8LXV+IHwufUI0eCwAAAAJYAE4AAAAtAHMASABgAH8AlgA7AFkAawBdAHMAlgBbAFwANgB2ADkAdQBMADAAWQA7AA4ASwAzAEYAXABpAFcAQwBNAHMAVABpAGEAPwB7AF0ASwBpAEMAaQBDAKMAUwBQAFcAPgALAFAAPABIAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0AAAAmAEgASABIAEgASABgAGAAYAAZAH8AfwB/AH8AfwB/AH8AfwB/AH8AfwB/AH8AfwB/AH8AfwA7ADsAOwA7ADsAOwA7AFkAWQBZAA4AawBrAGsAawBrAGsAawBrAGsAawBrAGsAXQBzAJYAlgCWAJYAlgBJAJYAQQBbAFwAXABcAFwAXABcAFwANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ACkANgA2ADYANgA2ADYANgB1AHUAdQB1AHUAdQBMAEwATABMAEwATABMAFcAMAAwADAAMAAwAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQAOAA4ADgAOADMAMwAzADMAMwAzADMAMwBGAEYARgBGABkAdgBBAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAEQAdAFcAVwBXAFcAVwBAAEMAQwBDAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBUAFQAVABUAFQAVABUABoAaQBpAB0AYQBhAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQA/AHsAewBdAF0APABdAF0AXQBdAF0ASwBpAGkAaQBpAGkAaQBp//kAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAAoAQwBDAEMAQwBDAEMAQwCjAH0AowCYAJgAUwBTAFMAUwBTAFMAUwBTAGgAUABQAFAAUABQAFAAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAAsACwALAAsAPAA8ADwAPAA8ADwAPAA8AEgASABIAEgAQwBpAD8AawBDAGkAQgBEAE0AQwBWADcARgA5AD4ACwA8ACEATgBTAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMANQBRAGwATwBDACoAPgBWAEoASABLAFEAbABPAEMAKgA+AFgASgBIAEsA8ADNAPAAzQAzAPIA8gB0AIYBBgCeAOAA4wB4AHsA4wB7ANIA3wBqAHcAXwBfAFAAFABQABQA8AChADwA4AB3APAAXwCBAF8AcgEYAHIBGABgAJYAlgBmAFcAJQAlAHYAAAAdADwAPABgAHQAjACMAGEApgDXALcAsACyALAAtwC6ALQAsgD5AN0BCAD+AKYA1wC3ALAAsgCwALcAugC0ALIA+QDdAQgA/gCmANcAtgCwALIAsAC5ALoAtACyAPkA3QEIAP4ApgDXALcAsACyALAAtwC6ALQAsgD5AN0BCAD+AK8AjgCUAK8AtgC7AI4ApwDPAJ4AugCzAJAAzgDMAIwAugCUALYAjgEFAKsArACnAKUAUQC0AJIAjwCnAKcAngCOAI4AugBHAGEAUQBBAEEAegAzAGoAUgA6ADcAeAA3AF4AagB3AEQAIwAjACMAGwA6ACMAIwAmACMAIwAjACMAIwAjAF8AXwBwAF8A6wBfAHsAcABfAF8AXwB+AF8AWwBbAF8ANgACAFcAVgDQAFAAMQAmAEwARACNABoAEwAiABwAIgDVAK4AgwCyAC4ALgBQAFAALgAuACoAKv/p/+kAAABcAG4BEADJAOAA4wD8AOEA0wD0ALkAuQEHALsA8wDRAQcAsACsALsAtADaANoA/QDrAPYA0wC7APQBBwC5ALcAsACqALsAugC0ALkA/QEEAKwAuQD2APYA2gDaANoA0AC5ALcAgwCDAQEBAgEkAP0AuQDiAOIA2wD2APcAtQC5ALkAugC6ALoAugC3ALoAugDFAL0AxQC9AMUAvQCzALIAtQC7ALUAuwC1ALsAswCyAL0AuwEMAPAAAAAAAAAAAP/q/+oBFgEBACEAIQEWAQEAEgASARYBAQEWARYBAQEB/+r/6v/q/+oBFgEWAQEBAf/q/+r/6v/qARYBFgEBAQEBAQEBAQEBAf/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q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AaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSAMYA2ADeAOQA6gDGAPAA9gD8AMYBAgDGAQgBDgECARQBGgDqAOoAxgEgAMYBCAEmASwBMgE4AT4BRAFKAVABVgFWAVwBYgFoAW4AwAF0AXoBgAGGAYwBkgGYAMAAwAGeAW4AxgGkANgAxgDqAaoA6gDGAOoAxgEIASYBPgGwAbAAwAG2AMAAwAGSAZIBLAGwAbwBngHCAcgBzgGGAdQB2gHgAeYB7AGYAMAB8gH4AZ4BngH+AgQCCgABASwB9gABASwCqQABAScCqQABAVcCqQABAVACqQABAVoCqQABAUwCqQABASsCqQABAUACqQABAUcCqQABALsCqQABATICqQABATwCqQABASsCtAABATkCqQABASoCqQABAS0CqQABAT0B9gABAIMC2gABAVgB9gABAcYC2gABATwB9gABAagC5AABATUB9gABAJcC2gABAV0CpgABALkC2gABASMC2gABATkB9QABAT8B9gABATYB9gABASkB9gABAVcB9gABASoB9gABAQYCeQABASYB9gABAS0B9gABAS8B9gABAdsCtgABAaECqQABAV0B9gABAUEB9gABATgB9gABAToB9gABARkB9gABAR8B9gABATEB9gABASQB9gABASMB9QABAZIB9gABAOMB9gABAS4B9gABARMB9gABATIB9gABASwCxQABASwCvAABBFgEYAABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVoAAAABAT4AAAABAVcAAAABATsAAAABAXkAAAABBCgENgABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmACYAKQAyACYAJgAmADOANQA2gCYAMIA4ADmAOwAmADyAMIA+AD+AQQBCgCqARABFgEcASIBKAEuAPIBNACYAToBQAFGAUwBUgFYAV4AmACYAWQBCgDCAJgBCgEcAJgBWACeAWoA5gDa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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Code Pro'), local('SourceCodePro-Regular'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT80AAAAOkNGRiD9qd9kAABIiAAA2ktEU0lHYnpAEAABP3AAACBYR0RFRi8sL9AAASpcAAAA1EdQT1MK+gbMAAE2ZAAACNBHU1VC3Z7yFQABKzAAAAsyT1MvMnLU0PUAAAFQAAAAYGNtYXDp1MYJAAA+WAAAChBoZWFk+92HfAAAAOwAAAA2aGhlYQZ2AN8AAAEkAAAAJGhtdHisN66qAAEi1AAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZQWUCakAAAGwAAA8pnBvc3T/uAAzAABIaAAAACAAAQAAAAEEWlvC/ZlfDzz1AAMD6AAAAADNFZ/1AAAAAM0Vn/X/2f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/Z/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAGQAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwUJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAQAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAIgGeAAEAAAAAAAAARQAAAAEAAAAAAAEADwBFAAEAAAAAAAIABwBUAAEAAAAAAAMAJgBbAAEAAAAAAAQADwBFAAEAAAAAAAUAOQCBAAEAAAAAAAYAFQC6AAEAAAAAAAcAYADPAAEAAAAAAAgAGgEvAAEAAAAAAAkADAFJAAEAAAAAAAsAGQFVAAEAAAAAAA0R2QFuAAEAAAAAAA4AJBNHAAEAAAAAAQAAFhNrAAEAAAAAAQEACxOBAAEAAAAAAQIACxOMAAEAAAAAAQMAFROXAAMAAQQJAAAAihOsAAMAAQQJAAEAHhQ2AAMAAQQJAAIADhRUAAMAAQQJAAMATBRiAAMAAQQJAAQAHhQ2AAMAAQQJAAUAchSuAAMAAQQJAAYAKhUgAAMAAQQJAAcAwBVKAAMAAQQJAAgANBYKAAMAAQQJAAkAGBY+AAMAAQQJAAsAMhZWAAMAAQQJAA0jthaIAAMAAQQJAA4ASDo+AAMAAQQJAQAALDqGAAMAAQQJAQEAFjqyAAMAAQQJAQIAFjrIAAMAAQQJAQMAKjreQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1SZWd1bGFyO0FET0JFVmVyc2lvbiAxLjAxNztQUyAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41OTAwU291cmNlQ29kZVByby1SZWd1bGFyU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWRQYXVsIEQuIEh1bnRodHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgKGh0dHA6Ly93d3cuYWRvYmUuY29tLyksIHdpdGggUmVzZXJ2ZWQgRm9udCBOYW1lICdTb3VyY2UnLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy4NCg0KVGhpcyBGb250IFNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTSUwgT3BlbiBGb250IExpY2Vuc2UsIFZlcnNpb24gMS4xLg0KDQpUaGlzIGxpY2Vuc2UgaXMgY29waWVkIGJlbG93LCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgd2l0aCBhIEZBUSBhdDogaHR0cDovL3NjcmlwdHMuc2lsLm9yZy9PRkwNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClNJTCBPUEVOIEZPTlQgTElDRU5TRSBWZXJzaW9uIDEuMSAtIDI2IEZlYnJ1YXJ5IDIwMDcNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBSRUFNQkxFDQpUaGUgZ29hbHMgb2YgdGhlIE9wZW4gRm9udCBMaWNlbnNlIChPRkwpIGFyZSB0byBzdGltdWxhdGUgd29ybGR3aWRlIGRldmVsb3BtZW50IG9mIGNvbGxhYm9yYXRpdmUgZm9udCBwcm9qZWN0cywgdG8gc3VwcG9ydCB0aGUgZm9udCBjcmVhdGlvbiBlZmZvcnRzIG9mIGFjYWRlbWljIGFuZCBsaW5ndWlzdGljIGNvbW11bml0aWVzLCBhbmQgdG8gcHJvdmlkZSBhIGZyZWUgYW5kIG9wZW4gZnJhbWV3b3JrIGluIHdoaWNoIGZvbnRzIG1heSBiZSBzaGFyZWQgYW5kIGltcHJvdmVkIGluIHBhcnRuZXJzaGlwIHdpdGggb3RoZXJzLg0KDQpUaGUgT0ZMIGFsbG93cyB0aGUgbGljZW5zZWQgZm9udHMgdG8gYmUgdXNlZCwgc3R1ZGllZCwgbW9kaWZpZWQgYW5kIHJlZGlzdHJpYnV0ZWQgZnJlZWx5IGFzIGxvbmcgYXMgdGhleSBhcmUgbm90IHNvbGQgYnkgdGhlbXNlbHZlcy4gVGhlIGZvbnRzLCBpbmNsdWRpbmcgYW55IGRlcml2YXRpdmUgd29ya3MsIGNhbiBiZSBidW5kbGVkLCBlbWJlZGRlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3Igc29sZCB3aXRoIGFueSBzb2Z0d2FyZSBwcm92aWRlZCB0aGF0IGFueSByZXNlcnZlZCBuYW1lcyBhcmUgbm90IHVzZWQgYnkgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlIGZvbnRzIGFuZCBkZXJpdmF0aXZlcywgaG93ZXZlciwgY2Fubm90IGJlIHJlbGVhc2VkIHVuZGVyIGFueSBvdGhlciB0eXBlIG9mIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgZm9udHMgb3IgdGhlaXIgZGVyaXZhdGl2ZXMuDQoNCkRFRklOSVRJT05TDQoiRm9udCBTb2Z0d2FyZSIgcmVmZXJzIHRvIHRoZSBzZXQgb2YgZmlsZXMgcmVsZWFzZWQgYnkgdGhlIENvcHlyaWdodCBIb2xkZXIocykgdW5kZXIgdGhpcyBsaWNlbnNlIGFuZCBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLiBUaGlzIG1heSBpbmNsdWRlIHNvdXJjZSBmaWxlcywgYnVpbGQgc2NyaXB0cyBhbmQgZG9jdW1lbnRhdGlvbi4NCg0KIlJlc2VydmVkIEZvbnQgTmFtZSIgcmVmZXJzIHRvIGFueSBuYW1lcyBzcGVjaWZpZWQgYXMgc3VjaCBhZnRlciB0aGUgY29weXJpZ2h0IHN0YXRlbWVudChzKS4NCg0KIk9yaWdpbmFsIFZlcnNpb24iIHJlZmVycyB0byB0aGUgY29sbGVjdGlvbiBvZiBGb250IFNvZnR3YXJlIGNvbXBvbmVudHMgYXMgZGlzdHJpYnV0ZWQgYnkgdGhlIENvcHlyaWdodCBIb2xkZXIocykuDQoNCiJNb2RpZmllZCBWZXJzaW9uIiByZWZlcnMgdG8gYW55IGRlcml2YXRpdmUgbWFkZSBieSBhZGRpbmcgdG8sIGRlbGV0aW5nLCBvciBzdWJzdGl0dXRpbmcgLS0gaW4gcGFydCBvciBpbiB3aG9sZSAtLSBhbnkgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhlIE9yaWdpbmFsIFZlcnNpb24sIGJ5IGNoYW5naW5nIGZvcm1hdHMgb3IgYnkgcG9ydGluZyB0aGUgRm9udCBTb2Z0d2FyZSB0byBhIG5ldyBlbnZpcm9ubWVudC4NCg0KIkF1dGhvciIgcmVmZXJzIHRvIGFueSBkZXNpZ25lciwgZW5naW5lZXIsIHByb2dyYW1tZXIsIHRlY2huaWNhbCB3cml0ZXIgb3Igb3RoZXIgcGVyc29uIHdobyBjb250cmlidXRlZCB0byB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KUEVSTUlTU0lPTiAmIENPTkRJVElPTlMNClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIEZvbnQgU29mdHdhcmUsIHRvIHVzZSwgc3R1ZHksIGNvcHksIG1lcmdlLCBlbWJlZCwgbW9kaWZ5LCByZWRpc3RyaWJ1dGUsIGFuZCBzZWxsIG1vZGlmaWVkIGFuZCB1bm1vZGlmaWVkIGNvcGllcyBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQoNCjEpIE5laXRoZXIgdGhlIEZvbnQgU29mdHdhcmUgbm9yIGFueSBvZiBpdHMgaW5kaXZpZHVhbCBjb21wb25lbnRzLCBpbiBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucywgbWF5IGJlIHNvbGQgYnkgaXRzZWxmLg0KDQoyKSBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucyBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgYmUgYnVuZGxlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3Igc29sZCB3aXRoIGFueSBzb2Z0d2FyZSwgcHJvdmlkZWQgdGhhdCBlYWNoIGNvcHkgY29udGFpbnMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbGljZW5zZS4gVGhlc2UgY2FuIGJlIGluY2x1ZGVkIGVpdGhlciBhcyBzdGFuZC1hbG9uZSB0ZXh0IGZpbGVzLCBodW1hbi1yZWFkYWJsZSBoZWFkZXJzIG9yIGluIHRoZSBhcHByb3ByaWF0ZSBtYWNoaW5lLXJlYWRhYmxlIG1ldGFkYXRhIGZpZWxkcyB3aXRoaW4gdGV4dCBvciBiaW5hcnkgZmlsZXMgYXMgbG9uZyBhcyB0aG9zZSBmaWVsZHMgY2FuIGJlIGVhc2lseSB2aWV3ZWQgYnkgdGhlIHVzZXIuDQoNCjMpIE5vIE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZvbnQgU29mdHdhcmUgbWF5IHVzZSB0aGUgUmVzZXJ2ZWQgRm9udCBOYW1lKHMpIHVubGVzcyBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCBieSB0aGUgY29ycmVzcG9uZGluZyBDb3B5cmlnaHQgSG9sZGVyLiBUaGlzIHJlc3RyaWN0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgcHJpbWFyeSBmb250IG5hbWUgYXMgcHJlc2VudGVkIHRvIHRoZSB1c2Vycy4NCg0KNCkgVGhlIG5hbWUocykgb2YgdGhlIENvcHlyaWdodCBIb2xkZXIocykgb3IgdGhlIEF1dGhvcihzKSBvZiB0aGUgRm9udCBTb2Z0d2FyZSBzaGFsbCBub3QgYmUgdXNlZCB0byBwcm9tb3RlLCBlbmRvcnNlIG9yIGFkdmVydGlzZSBhbnkgTW9kaWZpZWQgVmVyc2lvbiwgZXhjZXB0IHRvIGFja25vd2xlZGdlIHRoZSBjb250cmlidXRpb24ocykgb2YgdGhlIENvcHlyaWdodCBIb2xkZXIocykgYW5kIHRoZSBBdXRob3Iocykgb3Igd2l0aCB0aGVpciBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24uDQoNCjUpIFRoZSBGb250IFNvZnR3YXJlLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkLCBpbiBwYXJ0IG9yIGluIHdob2xlLCBtdXN0IGJlIGRpc3RyaWJ1dGVkIGVudGlyZWx5IHVuZGVyIHRoaXMgbGljZW5zZSwgYW5kIG11c3Qgbm90IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGFueSBvdGhlciBsaWNlbnNlLiBUaGUgcmVxdWlyZW1lbnQgZm9yIGZvbnRzIHRvIHJlbWFpbiB1bmRlciB0aGlzIGxpY2Vuc2UgZG9lcyBub3QgYXBwbHkgdG8gYW55IGRvY3VtZW50IGNyZWF0ZWQgdXNpbmcgdGhlIEZvbnQgU29mdHdhcmUuDQoNClRFUk1JTkFUSU9ODQpUaGlzIGxpY2Vuc2UgYmVjb21lcyBudWxsIGFuZCB2b2lkIGlmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4NCg0KRElTQ0xBSU1FUg0KVEhFIEZPTlQgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBDT1BZUklHSFQsIFBBVEVOVCwgVFJBREVNQVJLLCBPUiBPVEhFUiBSSUdIVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBGT05UIFNPRlRXQVJFIE9SIEZST00gT1RIRVIgREVBTElOR1MgSU4gVEhFIEZPTlQgU09GVFdBUkUuaHR0cDovL3d3dy5hZG9iZS5jb20vdHlwZS9sZWdhbC5odG1sVHlwb2dyYXBoaWMgYWx0ZXJuYXRlc0FsdGVybmF0ZSBhQWx0ZXJuYXRlIGdBbHRlcm5hdGUgZG9sbGFyIHNpZ24AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AUgBlAGcAdQBsAGEAcgAxAC4AMAAxADcAOwBBAEQAQgBFADsAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAAAAwAAAAMAAAIUAAEAAAAAABwAAwABAAACFAAGAfgAAAAJAPcAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB5gHrAhUCdgKJAcwB6gH/AgACCQKUAeIB9gHhAgUBzQHOAc8B0AHRAdIB0wHUAdUB1gHjAeQCmgKZApsB6AITAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwIBAgcCAgKfAf4CywAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUCAwIGAgQCoQAAADoAPQBOAFgAjACVAMEA6ADnAOkA6wDqAO4A/wEJAQgBCgEMASUBJAEmASgBPwFGAUUBRwFJAUgBcwFyAXQBdgIKAnQCegJ3AgwB/QINAWsCEAIOAhECzALVAqAATAChAqUCngKcAp0CeAKmAqcCrAKtAqQCqAJSAlQAAAD9AVUB6QHnAqMCqQJ7AqICqgH0AfUB5QMfADYAOQCUAKIBVgH4AfkB7gHvAewB7QKXAsQBkADbAoYCeQHyAfMBqwGsAgsB/AHwAfECigA4AFkANwBbAFcAdAB1AHcAcwCSAJMAAACRAL4AvwC9ATACzQLUAtYC1wLaAtgC2wLZAtwCzgAEB/wAAAEWAQAABwAWAC8AOQBAAFoAYAB6AH4AvwDEANEA1gDfAOQA8QD2ATEBSQFlAX4BgAGPAZIBoQGwAdwB5wHrAhsCNwJDAlICVAJZAmECZQJvAnkChwKOAp4CsAKzArgCvAK/AswC3QLjAwQDDAMPAxMDGwMkAygDLgMxA8AdQx1JHU0dUB1SHVgdWx2cHaAdux4PHiEeJR4rHjseSR5jHm8ehR6PHpMelx6eHvkgByAVIBogHiAiICYgMCAzIDogRCBxIHkgfyCJII4glCChIKQgpyCsILIgtSC6IRMhFyEgISIhJiEuIVQhXiGTIgIiBiIPIhIiFSIaIh4iKyJIImAiZSWfJaAlsyW3Jb0lwSXGJcomESZqJxMnUvsC//8AAAAgADAAOgBBAFsAYQB7AKAAwADFANIA1wDgAOUA8gD3ATQBTAFoAYABjwGSAaABrwHNAeYB6gIYAjcCQwJQAlQCWAJhAmUCbwJ5AocCjAKeArACsgK3ArsCvgLGAtgC4QMAAwYDDwMSAxsDIwMmAy4DMQPAHUMdRx1NHU8dUh1WHVsdnB2gHbseDB4gHiQeKh42HkIeWh5sHoAejh6SHpcenh6gIAcgEiAYIBwgICAmIDAgMiA5IEQgcCB0IH0ggCCNIJQgoSCkIKYgqyCxILUguSETIRchICEiISYhLiFTIVshkCICIgYiDyIRIhUiGSIeIisiSCJgImQlACWgJbIltiW8JcAlxiXJJhAmaicTJ1L7Af//AAABnQAA/8EAAP+7AAAAAP92AAD/vwAAAAcAAABTAAAAAAAA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dQN8A4MDigORA5cDnQOoA7EDtwPCA8kD0APXA94D5APuA/UD/AQDBAkEEAQXBB4EJQQsBDMEOgRBBEgETwRWBF0EZARrBHIEeASDBIkEkwSZBKAEpwStBLMEugTABMoE0QTYBN8E5gTtBPQE+wUCBQkFFAUaBSQFKwUxBTgFQwVOBVUFXAVgBWYFbQV0BXsFggWJBZAFmQWkBasFtwW9BcMFxwXOBdUF3AXjBeoF8AX2Bf0GBAYLBhIGHQYkBisGOAY/BkYGTQZUBlsGYgZpBnAGdQZ8BoMGigaRBpgGnwalBqwGsga5BsAGxwbNBtgG3wbmBu0G9Ab6BwEHCAcPBxYHHQcjByoHMAc1B0IHSQdQB1cHXgdlB2wHcwd6B38HhgeNB5QHmweiB6gHrge5B8IHyAfTB9oH4QfoB+8H9Qf/CAYIDQgUCBsIIggpCDAINwg+CEUITAhTCFoIYQhoCGsIcwh7CIgIkAibCKQIrAizCLwIxQjOCNcI4AjpCPII+wkECQ0JFgkfCSgJMQk0CUEJSQlVCV4JZglvCXwJhQmNCZUJnwmoCbEJuQnDCc0J1gndCeQJ6wnyCfkKAwoLChQKHAolCi0KNQo/CkgKUQpZCmMKbQp2CoQKkwqeCqgKsQq5CsEKywrUCt0K5QrvCvkLAgsQCx8LKgs0Cz0LRQtNC1cLYAtpC3ELewuFC44LnAurC7YLwAvJC9EL2QvjC+wL9Qv9DAcMEQwaDCgMNwxCDEwMWQxfDGUMawxxDHcMfQyDDIkMjwyVDJsMoQynDK0Mswy5DL8MxQzLDNEM1wzdDOMM6QzvDPUNAA0LDRcNHQ0jDScNLg0yDTkNPw1DDUoNUQ1YDV8NZg1tDXcNfg2HDZMNmw2mDagNsA23DcINyg3RDdgN3w3oDe8N9g3/DgYODQ4UDh0OJA4rDjIOOQ5ADkcOTg5VDlwOYw5qDnEOeA5/DoYOjQ6UDpsOog6pDrAOtw6+DsUOzA7TDtoO4Q7oDvMO+g8FDwwPFw8eDykPMA87D0IPTQ9UD18PZg9xD3gPgw+KD5UPnA+nD64PuQ/AD8sP0g/ZD+AP5w/uD/UP/BAHEA4QGRAgECcQMhBBEEwQWxBmEHUQgBCPEJoQqRC0EMMQzhDdEOgQ9xECERERHBErETYRRRFQEV8RahF5EYIRixGSEZkRoxGvEbYRvRHEEcsR0hHZEeAR5xHuEfUR/BIDEgoSERIYEh8SJhItEjQSOxJCEkkSUBJXEl4SZRJsEnMSehKBEogSjxKWEp0SpBKrErISuRLAEscSzhLVEtwS4xLqEvES+BL/EwYTDRMUExsTIhMpEzATNxM+E0UTTBNTE1oTYRNoE28TdhN9E4QTixOSE5kToBOnE64TtRO8E8MTyhPRE9gT3xPmE+0T9BP7FAIUCRQQFBcUHhQlFCwUMxQ6FEEUSBRPFFYUXRRkFGsUchR5FIAUhxSOFJUUnBSjFKoUsRS4FL8UxhTNFNQU2xTiFOkU8BT3FP4VBRUMFRMVGhUhFSgVLxU2FT0VRBVLFVIVWRVgFWcVbhV1FXwVgxWKFZEVmBWfFaYVrRW0FbsVwhXJFdAV1xXeFeUV7BXzFfoWARYIFg8WFhYdFiIWghbHFtZBbWFjcm9uQWJyZXZldW5pMDFDRHVuaTFFQTB1bmkxRUEydW5pMUVBNHVuaTFFQTZ1bmkxRUE4dW5pMUVBQXVuaTFFQUN1bmkxRUFFdW5pMUVCMHVuaTFFQjJ1bmkxRUI0dW5pMUVCNkFvZ29uZWt1bmkwMjQzQ2FjdXRlQ2NpcmN1bWZsZXhDY2Fyb25DZG90YWNjZW50RGNhcm9udW5pMUUwQ3VuaTFFMEVEY3JvYXRFY2Fyb25FbWFjcm9uRWJyZXZlRWRvdGFjY2VudHVuaTFFQjh1bmkxRUJBdW5pMUVCQ3VuaTFFQkV1bmkxRUMwdW5pMUVDMnVuaTFFQzR1bmkxRUM2RW9nb25la0djaXJjdW1mbGV4R2JyZXZlR2RvdGFjY2VudHVuaTAxMjJHY2Fyb251bmkxRTIwdW5pMDA0NzAzMDNIY2lyY3VtZmxleHVuaTFFMjR1bmkxRTJBSGJhckl0aWxkZUltYWNyb251bmkwMTJDSWRvdGFjY2VudHVuaTAxQ0Z1bmkxRUM4dW5pMUVDQUlvZ29uZWtKY2lyY3VtZmxleHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTGRvdHVuaTFFMzZ1bmkxRTM4dW5pMUUzQXVuaTFFNDJOYWN1dGVOY2Fyb251bmkwMTQ1dW5pMUU0NHVuaTFFNDZ1bmkxRTQ4T21hY3JvbnVuaTAxNEVPaHVuZ2FydW1sYXV0dW5pMDFEMXVuaTFFQ0N1bmkxRUNFdW5pMUVEMHVuaTFFRDJ1bmkxRUQ0dW5pMUVENnVuaTFFRDhPaG9ybnVuaTFFREF1bmkxRURDdW5pMUVERXVuaTFFRTB1bmkxRUUydW5pMDFFQVJhY3V0ZVJjYXJvbnVuaTAxNTZ1bmkxRTVBdW5pMUU1Q3VuaTFFNUVTYWN1dGVTY2lyY3VtZmxleHVuaTAxNUV1bmkwMjE4dW5pMUU2MHVuaTFFNjJ1bmkxRTlFVGNhcm9udW5pMDE2MnVuaTAyMUF1bmkxRTZDdW5pMUU2RVV0aWxkZVVtYWNyb25VYnJldmVVcmluZ1VodW5nYXJ1bWxhdXR1bmkwMUQzdW5pMDFENXVuaTAxRDd1bmkwMUQ5dW5pMDFEQnVuaTFFRTR1bmkxRUU2VW9nb25la1Vob3JudW5pMUVFOHVuaTFFRUF1bmkxRUVDdW5pMUVFRXVuaTFFRjBXZ3JhdmVXYWN1dGVXY2lyY3VtZmxleFdkaWVyZXNpc1lncmF2ZVljaXJjdW1mbGV4dW5pMUU4RXVuaTFFRjR1bmkxRUY2dW5pMUVGOFphY3V0ZVpkb3RhY2NlbnR1bmkxRTkydW5pMDE4RmFtYWNyb25hYnJldmV1bmkwMUNFdW5pMUVBMXVuaTFFQTN1bmkxRUE1dW5pMUVBN3VuaTFFQTl1bmkxRUFCdW5pMUVBRHVuaTFFQUZ1bmkxRUIxdW5pMUVCM3VuaTFFQjV1bmkxRUI3YW9nb25la3VuaTAxODBjYWN1dGVjY2lyY3VtZmxleGNjYXJvbmNkb3RhY2NlbnRkY2Fyb251bmkxRTBEdW5pMUUwRmRjcm9hdGVjYXJvbmVtYWNyb25lYnJldmVlZG90YWNjZW50dW5pMUVCOXVuaTFFQkJ1bmkxRUJEdW5pMUVCRnVuaTFFQzF1bmkxRUMzdW5pMUVDNXVuaTFFQzdlb2dvbmVrZ2NpcmN1bWZsZXhnYnJldmVnZG90YWNjZW50dW5pMDEyM2djYXJvbnVuaTFFMjF1bmkwMDY3MDMwM2hjaXJjdW1mbGV4dW5pMUUyNXVuaTFFMkJoYmFyaXRpbGRlaW1hY3JvbnVuaTAxMkR1bmkwMUQwdW5pMUVDOXVuaTFFQ0Jpb2dvbmVraW9nb25lay5kamNpcmN1bWZsZXh1bmkwMTM3a2dyZWVubGFuZGljbGFjdXRlbGNhcm9ubGRvdHVuaTAxM0N1bmkxRTM3dW5pMUUzOXVuaTFFM0J1bmkxRTQzbmFjdXRlbmNhcm9udW5pMDE0NnVuaTFFNDV1bmkxRTQ3dW5pMUU0OW5hcG9zdHJvcGhlb21hY3JvbnVuaTAxNEZvaHVuZ2FydW1sYXV0dW5pMDFEMnVuaTFFQ0R1bmkxRUNGdW5pMUVEMXVuaTFFRDN1bmkxRUQ1dW5pMUVEN3VuaTFFRDlvaG9ybnVuaTFFREJ1bmkxRUREdW5pMUVERnVuaTFFRTF1bmkxRUUzdW5pMDFFQnJhY3V0ZXVuaTAxNTdyY2Fyb251bmkxRTVCdW5pMUU1RHVuaTFFNUZzYWN1dGVzY2lyY3VtZmxleHVuaTAxNUZ1bmkwMjE5dW5pMUU2MXVuaTFFNjN0Y2Fyb251bmkwMTYzdW5pMDIxQnVuaTFFNkR1bmkxRTZGdW5pMUU5N3V0aWxkZXVtYWNyb251YnJldmV1cmluZ3VodW5nYXJ1bWxhdXR1bmkwMUQ0dW5pMDFENnVuaTAxRDh1bmkwMURBdW5pMDFEQ3VuaTFFRTV1bmkxRUU3dW9nb25la3Vob3JudW5pMUVFOXVuaTFFRUJ1bmkxRUVEdW5pMUVFRnVuaTFFRjF3Z3JhdmV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3lncmF2ZXljaXJjdW1mbGV4dW5pMUU4RnVuaTFFRjV1bmkxRUY3dW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmkxRTkzdW5pMDIzN3VuaTAyNTB1bmkwMjUxdW5pMDI1MnVuaTAyNTl1bmkwMjYxdW5pMDI2NXVuaTAyNkZ1bmkwMjc5dW5pMDI4N3VuaTAyOEN1bmkwMjhEdW5pMDI4RXVuaTAyOUVhLmFhZ3JhdmUuYWFhY3V0ZS5hYWNpcmN1bWZsZXguYWF0aWxkZS5hYWRpZXJlc2lzLmFhbWFjcm9uLmFhYnJldmUuYWFyaW5nLmF1bmkwMUNFLmF1bmkxRUExLmF1bmkxRUEzLmF1bmkxRUE1LmF1bmkxRUE3LmF1bmkxRUE5LmF1bmkxRUFCLmF1bmkxRUFELmF1bmkxRUFGLmF1bmkxRUIxLmF1bmkxRUIzLmF1bmkxRUI1LmF1bmkxRUI3LmFhb2dvbmVrLmFnLmFnY2lyY3VtZmxleC5hZ2JyZXZlLmFnZG90YWNjZW50LmF1bmkwMTIzLmFnY2Fyb24uYXVuaTFFMjEuYXVuaTAwNjcwMzAzLmF6ZXJvLm9udW1vbmUub251bXR3by5vbnVtdGhyZWUub251bWZvdXIub251bWZpdmUub251bXNpeC5vbnVtc2V2ZW4ub251bWVpZ2h0Lm9udW1uaW5lLm9udW11bmkwMEFEdW5pMjAxNXVuaTIxMTd1bmkyMTIwYXQuY2FzZWFzdGVyaXNrLmFoeXBoZW4uYXVuaTAwQUQuYWRvbGxhci5hemVyby5zdXBzb25lLnN1cHN0d28uc3Vwc3RocmVlLnN1cHNmb3VyLnN1cHNmaXZlLnN1cHNzaXguc3Vwc3NldmVuLnN1cHNlaWdodC5zdXBzbmluZS5zdXBzcGFyZW5sZWZ0LnN1cHNwYXJlbnJpZ2h0LnN1cHNwZXJpb2Quc3Vwc2NvbW1hLnN1cHN6ZXJvLnN1YnNvbmUuc3Vic3R3by5zdWJzdGhyZWUuc3Vic2ZvdXIuc3Vic2ZpdmUuc3Vic3NpeC5zdWJzc2V2ZW4uc3Vic2VpZ2h0LnN1YnNuaW5lLnN1YnNwYXJlbmxlZnQuc3Vic3BhcmVucmlnaHQuc3Vic3BlcmlvZC5zdWJzY29tbWEuc3Vic3plcm8uZG5vbW9uZS5kbm9tdHdvLmRub210aHJlZS5kbm9tZm91ci5kbm9tZml2ZS5kbm9tc2l4LmRub21zZXZlbi5kbm9tZWlnaHQuZG5vbW5pbmUuZG5vbXBhcmVubGVmdC5kbm9tcGFyZW5yaWdodC5kbm9tcGVyaW9kLmRub21jb21tYS5kbm9temVyby5udW1yb25lLm51bXJ0d28ubnVtcnRocmVlLm51bXJmb3VyLm51bXJmaXZlLm51bXJzaXgubnVtcnNldmVuLm51bXJlaWdodC5udW1ybmluZS5udW1ycGFyZW5sZWZ0Lm51bXJwYXJlbnJpZ2h0Lm51bXJwZXJpb2QubnVtcmNvbW1hLm51bXJvcmRmZW1pbmluZS5hYS5zdXBzYi5zdXBzYy5zdXBzZC5zdXBzZS5zdXBzZi5zdXBzZy5zdXBzaC5zdXBzaS5zdXBzai5zdXBzay5zdXBzbC5zdXBzbS5zdXBzbi5zdXBzby5zdXBzcC5zdXBzcS5zdXBzci5zdXBzcy5zdXBzdC5zdXBzdS5zdXBzdi5zdXBzdy5zdXBzeC5zdXBzeS5zdXBzei5zdXBzZWdyYXZlLnN1cHNlYWN1dGUuc3Vwc3VuaTAyNTkuc3Vwc2Euc3VwYWcuc3VwYUV1cm91bmkwMTkybGlyYXVuaTIwQTZwZXNldGFkb25ndW5pMjBCMXVuaTIwQjJ1bmkyMEI1dW5pMjBCOXVuaTIwQkF1bmkyMjE1c2xhc2guZnJhY3VuaTIyMTlsZXNzZXF1YWxncmVhdGVyZXF1YWxub3RlcXVhbGFwcHJveGVxdWFscGlpbmZpbml0eXVuaTAwQjVwYXJ0aWFsZGlmZmludGVncmFscmFkaWNhbHVuaTIyMDZ1bmkyMTI2c3VtbWF0aW9ucHJvZHVjdHVuaTIxMTNlc3RpbWF0ZWR1bmkyMTkwYXJyb3d1cHVuaTIxOTJhcnJvd2Rvd251bmkyNUEwdW5pMjVDNnVuaTI1Qzl1bmkyNzUydHJpYWd1cHVuaTI1QjN1bmkyNUI2dW5pMjVCN3RyaWFnZG51bmkyNUJEdW5pMjVDMHVuaTI1QzF1bmkyNjEwdW5pMjYxMXVuaTI3MTN1bmkyNjZBbG96ZW5nZXVuaTIwMzJ1bmkyMDMzdW5pMDJCQnVuaTAyQkN1bmkwMkJFdW5pMDJCRnVuaTAyQzh1bmkwMkM5dW5pMDJDQXVuaTAyQ0J1bmkwMkNDdW5pMDMwMHVuaTAzMDAuY2FwdW5pMDMwMXVuaTAzMDEuY2FwdW5pMDMwMnVuaTAzMDIuY2FwdW5pMDMwM3VuaTAzMDMuY2FwdW5pMDMwNHVuaTAzMDQuY2FwdW5pMDMwNnVuaTAzMDYuY2FwdW5pMDMwN3VuaTAzMDcuY2FwdW5pMDMwOHVuaTAzMDguY2FwdW5pMDMwOXVuaTAzMDkuY2FwdW5pMDMwQXVuaTAzMEEuY2FwdW5pMDMwQnVuaTAzMEIuY2FwdW5pMDMwQ3VuaTAzMEMuY2FwdW5pMDMwRnVuaTAzMEYuY2FwdW5pMDMxMnVuaTAzMTN1bmkwMzFCdW5pMDMyM3VuaTAzMjR1bmkwMzI2dW5pMDMyN3VuaTAzMjcuY2FwdW5pMDMyOHVuaTAzMjguY2FwdW5pMDMyRXVuaTAzMzF1bmkwMzA4MDMwNHVuaTAzMDgwMzA0LmNhcHVuaTAzMDgwMzAxdW5pMDMwODAzMDEuY2FwdW5pMDMwODAzMEN1bmkwMzA4MDMwQy5jYXB1bmkwMzA4MDMwMHVuaTAzMDgwMzAwLmNhcHVuaTAzMDIwMzAxdW5pMDMwMjAzMDEuY2FwdW5pMDMwMjAzMDB1bmkwMzAyMDMwMC5jYXB1bmkwMzAyMDMwOXVuaTAzMDIwMzA5LmNhcHVuaTAzMDIwMzAzdW5pMDMwMjAzMDMuY2FwdW5pMDMwNjAzMDF1bmkwMzA2MDMwMS5jYXB1bmkwMzA2MDMwMHVuaTAzMDYwMzAwLmNhcHVuaTAzMDYwMzA5dW5pMDMwNjAzMDkuY2FwdW5pMDMwNjAzMDN1bmkwMzA2MDMwMy5jYXB1bmkwMzAyMDMwNnVuaTAzMDIwMzA2LmNhcHVuaTAzMEMuYXVuaTAzMjYuYXVuaTAwQTB1bmkyMDA3c3BhY2UuZnJhY25ic3BhY2UuZnJhY3VuaTI1MDB1bmkyNTAxdW5pMjUwMnVuaTI1MDN1bmkyNTA0dW5pMjUwNXVuaTI1MDZ1bmkyNTA3dW5pMjUwOHVuaTI1MDl1bmkyNTBBdW5pMjUwQnVuaTI1MEN1bmkyNTBEdW5pMjUwRXVuaTI1MEZ1bmkyNTEwdW5pMjUxMXVuaTI1MTJ1bmkyNTEzdW5pMjUxNHVuaTI1MTV1bmkyNTE2dW5pMjUxN3VuaTI1MTh1bmkyNTE5dW5pMjUxQXVuaTI1MUJ1bmkyNTFDdW5pMjUxRHVuaTI1MUV1bmkyNTFGdW5pMjUyMHVuaTI1MjF1bmkyNTIydW5pMjUyM3VuaTI1MjR1bmkyNTI1dW5pMjUyNnVuaTI1Mjd1bmkyNTI4dW5pMjUyOXVuaTI1MkF1bmkyNTJCdW5pMjUyQ3VuaTI1MkR1bmkyNTJFdW5pMjUyRnVuaTI1MzB1bmkyNTMxdW5pMjUzMnVuaTI1MzN1bmkyNTM0dW5pMjUzNXVuaTI1MzZ1bmkyNTM3dW5pMjUzOHVuaTI1Mzl1bmkyNTNBdW5pMjUzQnVuaTI1M0N1bmkyNTNEdW5pMjUzRXVuaTI1M0Z1bmkyNTQwdW5pMjU0MXVuaTI1NDJ1bmkyNTQzdW5pMjU0NHVuaTI1NDV1bmkyNTQ2dW5pMjU0N3VuaTI1NDh1bmkyNTQ5dW5pMjU0QXVuaTI1NEJ1bmkyNTRDdW5pMjU0RHVuaTI1NEV1bmkyNTRGdW5pMjU1MHVuaTI1NTF1bmkyNTUydW5pMjU1M3VuaTI1NTR1bmkyNTU1dW5pMjU1NnVuaTI1NTd1bmkyNTU4dW5pMjU1OXVuaTI1NUF1bmkyNTVCdW5pMjU1Q3VuaTI1NUR1bmkyNTVFdW5pMjU1RnVuaTI1NjB1bmkyNTYxdW5pMjU2MnVuaTI1NjN1bmkyNTY0dW5pMjU2NXVuaTI1NjZ1bmkyNTY3dW5pMjU2OHVuaTI1Njl1bmkyNTZBdW5pMjU2QnVuaTI1NkN1bmkyNTZEdW5pMjU2RXVuaTI1NkZ1bmkyNTcwdW5pMjU3MXVuaTI1NzJ1bmkyNTczdW5pMjU3NHVuaTI1NzV1bmkyNTc2dW5pMjU3N3VuaTI1Nzh1bmkyNTc5dW5pMjU3QXVuaTI1N0J1bmkyNTdDdW5pMjU3RHVuaTI1N0V1bmkyNTdGdW5pMjU4MHVuaTI1ODF1bmkyNTgydW5pMjU4M3VuaTI1ODR1bmkyNTg1dW5pMjU4NnVuaTI1ODd1bmkyNTg4dW5pMjU4OXVuaTI1OEF1bmkyNThCdW5pMjU4Q3VuaTI1OER1bmkyNThFdW5pMjU4RnVuaTI1OTB1bmkyNTkxdW5pMjU5MnVuaTI1OTN1bmkyNTk0dW5pMjU5NXVuaTI1OTZ1bmkyNTk3dW5pMjU5OHVuaTI1OTl1bmkyNTlBdW5pMjU5QnVuaTI1OUN1bmkyNTlEdW5pMjU5RXVuaTI1OUZ1bmkwMjU4dW5pMDI1NDEuMDAwU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvATACAAEARgB9AK4A0QD4AUABkQGkAbwB6AH3AjgCQwJfAnYCegKZAsAC5gLqAvMDFQMtA2YDlQOiA+kD7wP+BAcEDgQSBCUEOARLBIAEiASdBKgEqwSwBMEE3AThBQUFFQUvBUQFSQVXBWsFcwWCBYYFigXQBdcF2wXlBfsGFAYlBmMG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AF8AXwBfAF8AUQBiAIYAhgCGAIYAhgBCAIYANQBRAFMAUwBTAFMAUwBTAFMAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAtACEAMAAwADAAMAAwADAAMABkAGQAZABkAGQAZABDAEMAQwBDAEMAQwBDAE8AKgAqACoAKgAqAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAKAAoACgAKACYAJgAmACYAJgAmACYAJgBBAEEAQQBBABAAZQA+AFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAEQAUAFAAUABQAFAAUAAyADwAPAA8AEUARQBFAEUARQBFAEUARQBFAEUARQBFAEUARQBFAEUARQBIAEgASABIAEgASABIAAoAXQBdABQAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgA3AGoAagBRAFEAKgBRAFEAUQBRAFEAPABdAF0AXQBdAF0AXQBd/+oAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAsAPAA8ADwAPAA8ADwAPACSAHMAkgCGAIYATABIAEgASABIAEgASABIAFgARQBFAEUARQBFAEUATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAAgACAAIAAgAMQAxADEAMQAxADEAMQAxAEcARwBHAEcAPABdADcAXgA8AF0APQA/AEUAPABNAC4APwA2ADMACAAxABoANAA5ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAKgBHAGIARQA5ACcAOABNAEYARABDAEcAYgBFADkAJwA4AE4ARgBEAEMA2wDFANsAxQAgAOMA4wBtAHsA9QCCANEA2QBfAGcA2QBnAMUA0wBSAGAAVQBVAFAAFABQABQA2wCXADwA0AB6AOIAYwB4AGMAYwEHAGMBBwBUAH8AfwBbAEgAHgAeAHD/+wAPADEAMQBXAGgAhgCGAFUAoQDQAK0ArACsAKwArwC3AK8ArQDsANUA/gD0AKEA0ACtAKwArACsAK8AtwCvAK0A7ADVAP4A9AChANAArQCsAKwArACw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AbYBvADAAcIByAGAAc4B1AFoAMABdAHaAT4BPgE+AeAB5gABASwB/AABASwCpgABASMCpgABAVsCpgABASsCpgABAUsCpgABAVMCpgABAUECpgABAL4CpgABATICpgABATsCpgABAS0CrgABATECpgABATcCpgABAS0CpgABAToB/AABAIoC2gABAVcB/AABAcEC2gABATsB/AABAaQC5AABATMB/AABAJcC2gABAVwCtgABALIC2gABARwC2gABATwB/AABAT4B/AABAS0B/AABAVYB/AABAS8B/AABAQcCgwABAScB/AABATAB/AABAUAB/AABAcMCtgABAZgCpgABAT0CpgABAVwB/AABAT8B/AABATgB/AABARoB/AABASAB/AABATIB/AABASUB/AABAZEB/AABAOsB/AABARcB/AABASwCzwABASwCwgABBFIEWgABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVsAAAABATkAAAABAVYAAAABAToAAAABAXgAAAABBCIEMAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAA5gCYAMIAmADsAPIAmAD4AOwAmAD+AQQBCgEQARYBHAEiASgAvAEuATQBOgCYAUABRgFMAOYBUgFYAMgAmACYAV4BZADCAJgBWAEiAJgBWAEEAWoAngEEAWoAngFwAXYBfAF8AYIBiADIAJgBXgGOAJ4BlAABASz/6gABATT/6gABAVv/6gABASL/6gABAUz/6gABALz/6gABAU//6gABASv/6gABAS3/6gABAVL/6gABAVr/6gABAJX/6gABAUD/6gABATb/6gABAS//6gABASf/6gABATf/6gABAVb/6gABATL/6gABATv/6gABASP/6gABASn/GgABATr/6gABAVz/6gABAOz/GQABAXP/6gABATX/6gABATn/6gABAIj/JgABAcH/JgABAMj/6gABAXv/6gABAUH/6gABAQr/DgABAT3/6gABAUP/6gABASD/6gABAcv/JgABASr/6gABAHb/6gABAW3/6gABAP7/6gABAcz/JgABAsACxgABAAwAEgABAAAADgADAA4AFAAaAAEBLAHmAAEBpAKGAAEB9wKaAAEBnQHm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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local('Source Code Pro Medium'), local('SourceCodePro-Medium'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT1oAAAAOkNGRiDLPo+VAABJBAAA2CNEU0lHEXcESwABPaQAACBYR0RFRjJdMx0AASiwAAAA4EdQT1MzPM2kAAE0xAAACKJHU1VC3Z7yFQABKZAAAAsyT1MvMnM40LUAAAFQAAAAYGNtYXDp1MYJAAA+1AAAChBoZWFk+9WHfAAAAOwAAAA2aGhlYQZuAN8AAAEkAAAAJGhtdHijJaU6AAEhKAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZe4mG4MAAAGwAAA9JHBvc3T/uAAzAABI5AAAACAAAQAAAAEEWkwQeqtfDzz1AAMD6AAAAADNFZ/1AAAAAM0Vn/X/0f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/R/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAH0AAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwUJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFgBFAAEAAAAAAAIABwBbAAEAAAAAAAMAJQBiAAEAAAAAAAQAFgBFAAEAAAAAAAUAOQCHAAEAAAAAAAYAFADAAAEAAAAAAAcAYADUAAEAAAAAAAgAGgE0AAEAAAAAAAkADAFOAAEAAAAAAAsAGQFaAAEAAAAAAA0R2QFzAAEAAAAAAA4AJBNMAAEAAAAAABAADxNwAAEAAAAAABEABhN/AAEAAAAAAQAAFhOFAAEAAAAAAQEACxObAAEAAAAAAQIACxOmAAEAAAAAAQMAFROxAAMAAQQJAAAAihPGAAMAAQQJAAEALBRQAAMAAQQJAAIADhR8AAMAAQQJAAMAShSKAAMAAQQJAAQALBRQAAMAAQQJAAUAchTUAAMAAQQJAAYAKBVGAAMAAQQJAAcAwBVuAAMAAQQJAAgANBYuAAMAAQQJAAkAGBZiAAMAAQQJAAsAMhZ6AAMAAQQJAA0jthasAAMAAQQJAA4ASDpiAAMAAQQJABAAHjqqAAMAAQQJABEADDrIAAMAAQQJAQAALDrUAAMAAQQJAQEAFjsAAAMAAQQJAQIAFjsWAAMAAQQJAQMAKjssQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIE1lZGl1bVJlZ3VsYXIxLjAxNztBREJFO1NvdXJjZUNvZGVQcm8tTWVkaXVtO0FET0JFVmVyc2lvbiAxLjAxNztQUyAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41OTAwU291cmNlQ29kZVByby1NZWRpdW1Tb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9NZWRpdW1UeXBvZ3JhcGhpYyBhbHRlcm5hdGVzQWx0ZXJuYXRlIGFBbHRlcm5hdGUgZ0FsdGVybmF0ZSBkb2xsYXIgc2lnbgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwAgAE0AZQBkAGkAdQBtAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBNAGUAZABpAHUAbQA7AEEARABPAEIARQBWAGUAcgBzAGkAbwBuACAAMQAuADAAMQA3ADsAUABTACAAMQAuADAAMAAwADsAaABvAHQAYwBvAG4AdgAgADEALgAwAC4ANwAwADsAbQBhAGsAZQBvAHQAZgAuAGwAaQBiADIALgA1AC4ANQA5ADAAMABTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0ATQBlAGQAaQB1AG0AUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvAE0AZQBkAGkAdQBtAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARVTb3VyY2VDb2RlUHJvLU1lZGl1bQABAQEu+vYA+vcB+vgMAPr5Avr5A/gXBIwMAVz8JPlW+nwFHDGmDxw0IBHHHQAAxCsSAt8CAAEACAAOABUAHAAjACoAMQA4AD8ARgBNAFQAWwBiAGkAcAB3AH0AiACOAJgAngClAKwAsgC4AL8AxQDPANYA3QDkAOsA8gD5AQABBwEOARkBHwEpATABNgE9AUgBUwFaAWEBZQFrAXIBeQGDAYoBkQGYAZ8BqgGxAbcBvQHEAcgBzwHWAd0B5AHqAfAB9wH+AgUCDAITAhoCJwIuAjUCPAJDAkoCUQJYAl8CZAJrAnICeQKAAocCjgKUApoCoQKoAq8CtgK8AscCzgLVAtwC4wLqAvAC9wL+AwUDDAMSAxkDHwMkAzEDOAM/A0YDTQNUA1sDYgNpA24DdQN8A4MDigORA5cDnQOoA7EDtwPCA8kD0APXA94D5APuA/UD/AQDBAkEEAQXBB4EJQQsBDMEOgRBBEgETwRWBF0EZARrBHIEeASDBIkEkwSZBKAEpwStBLMEugTABMoE0QTYBN8E5gTtBPQE+wUCBQkFFAUaBSQFKwUxBTgFQwVOBVUFXAVgBWYFbQV0BXsFggWJBZAFmQWkBasFtwW9BcMFxwXOBdUF3AXjBeoF8AX2Bf0GBAYLBhIGHQYkBisGOAY/BkYGTQZUBlsGYgZpBnAGdQZ8BoMGigaRBpgGnwalBqwGsga5BsAGxwbNBtgG3wbmBu0G9Ab6BwEHCAcPBxYHHQcjByoHMAc1B0IHSQdQB1cHXgdlB2wHcwd6B38HhgeNB5QHmweiB6gHrge5B8IHyAfTB9oH4QfoB+8H9Qf/CAYIDQgUCBsIIggpCDAINwg+CEUITAhTCFoIYQhoCGsIcwh7CIgIkAibCKQIrAizCLwIxQjOCNcI4AjpCPII+wkECQ0JFgkfCSgJMQk0CUEJSQlVCV4JZglvCXwJhQmNCZUJnwmoCbEJuQnDCc0J1gndCeQJ6wnyCfkKAwoLChQKHAolCi0KNQo/CkgKUQpZCmMKbQp2CoQKkwqeCqgKsQq5CsEKywrUCt0K5QrvCvkLAgsQCx8LKgs0Cz0LRQtNC1cLYAtpC3ELewuFC44LnAurC7YLwAvJC9EL2QvjC+wL9Qv9DAcMEQwaDCgMNwxCDEwMWQxfDGUMawxxDHcMfQyDDIkMjwyVDJsMoQynDK0Mswy5DL8MxQzLDNEM1wzdDOMM6QzvDPUNAA0LDRcNHQ0jDScNLg0yDTkNPw1DDUoNUQ1YDV8NZg1tDXcNfg2HDZMNmw2mDagNsA23DcINyg3RDdgN3w3oDe8N9g3/DgYODQ4UDh0OJA4rDjIOOQ5ADkcOTg5VDlwOYw5qDnEOeA5/DoYOjQ6UDpsOog6pDrAOtw6+DsUOzA7TDtoO4Q7oDvMO+g8FDwwPFw8eDykPMA87D0IPTQ9UD18PZg9xD3gPgw+KD5UPnA+nD64PuQ/AD8sP0g/ZD+AP5w/uD/UP/BAHEA4QGRAgECcQMhBBEEwQWxBmEHUQgBCPEJoQqRC0EMMQzhDdEOgQ9xECERERHBErETYRRRFQEV8RahF5EYIRixGSEZkRoxGvEbYRvRHEEcsR0hHZEeAR5xHuEfUR/BIDEgoSERIYEh8SJhItEjQSOxJCEkkSUBJXEl4SZRJsEnMSehKBEogSjxKWEp0SpBKrErISuRLAEscSzhLVEtwS4xLqEvES+BL/EwYTDRMUExsTIhMpEzATNxM+E0UTTBNTE1oTYRNoE28TdhN9E4QTixOSE5kToBOnE64TtRO8E8MTyhPRE9gT3xPmE+0T9BP7FAIUCRQQFBcUHhQlFCwUMxQ6FEEUSBRPFFYUXRRkFGsUchR5FIAUhxSOFJUUnBSjFKoUsRS4FL8UxhTNFNQU2xTiFOkU8BT3FP4VBRUMFRMVGhUhFSgVLxU2FT0VRBVLFVIVWRVgFWcVbhV1FXwVgxWKFZEVmBWfFaYVrRW0FbsVwhXJFdAV1xXeFeUV7BXzFfoWARYIFg8WFhYdFiIWghbHFtZBbWFjcm9uQWJyZXZldW5pMDFDRHVuaTFFQTB1bmkxRUEydW5pMUVBNHVuaTFFQTZ1bmkxRUE4dW5pMUVBQXVuaTFFQUN1bmkxRUFFdW5pMUVCMHVuaTFFQjJ1bmkxRUI0dW5pMUVCNkFvZ29uZWt1bmkwMjQzQ2FjdXRlQ2NpcmN1bWZsZXhDY2Fyb25DZG90YWNjZW50RGNhcm9udW5pMUUwQ3VuaTFFMEVEY3JvYXRFY2Fyb25FbWFjcm9uRWJyZXZlRWRvdGFjY2VudHVuaTFFQjh1bmkxRUJBdW5pMUVCQ3VuaTFFQkV1bmkxRUMwdW5pMUVDMnVuaTFFQzR1bmkxRUM2RW9nb25la0djaXJjdW1mbGV4R2JyZXZlR2RvdGFjY2VudHVuaTAxMjJHY2Fyb251bmkxRTIwdW5pMDA0NzAzMDNIY2lyY3VtZmxleHVuaTFFMjR1bmkxRTJBSGJhckl0aWxkZUltYWNyb251bmkwMTJDSWRvdGFjY2VudHVuaTAxQ0Z1bmkxRUM4dW5pMUVDQUlvZ29uZWtKY2lyY3VtZmxleHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTGRvdHVuaTFFMzZ1bmkxRTM4dW5pMUUzQXVuaTFFNDJOYWN1dGVOY2Fyb251bmkwMTQ1dW5pMUU0NHVuaTFFNDZ1bmkxRTQ4T21hY3JvbnVuaTAxNEVPaHVuZ2FydW1sYXV0dW5pMDFEMXVuaTFFQ0N1bmkxRUNFdW5pMUVEMHVuaTFFRDJ1bmkxRUQ0dW5pMUVENnVuaTFFRDhPaG9ybnVuaTFFREF1bmkxRURDdW5pMUVERXVuaTFFRTB1bmkxRUUydW5pMDFFQVJhY3V0ZVJjYXJvbnVuaTAxNTZ1bmkxRTVBdW5pMUU1Q3VuaTFFNUVTYWN1dGVTY2lyY3VtZmxleHVuaTAxNUV1bmkwMjE4dW5pMUU2MHVuaTFFNjJ1bmkxRTlFVGNhcm9udW5pMDE2MnVuaTAyMUF1bmkxRTZDdW5pMUU2RVV0aWxkZVVtYWNyb25VYnJldmVVcmluZ1VodW5nYXJ1bWxhdXR1bmkwMUQzdW5pMDFENXVuaTAxRDd1bmkwMUQ5dW5pMDFEQnVuaTFFRTR1bmkxRUU2VW9nb25la1Vob3JudW5pMUVFOHVuaTFFRUF1bmkxRUVDdW5pMUVFRXVuaTFFRjBXZ3JhdmVXYWN1dGVXY2lyY3VtZmxleFdkaWVyZXNpc1lncmF2ZVljaXJjdW1mbGV4dW5pMUU4RXVuaTFFRjR1bmkxRUY2dW5pMUVGOFphY3V0ZVpkb3RhY2NlbnR1bmkxRTkydW5pMDE4RmFtYWNyb25hYnJldmV1bmkwMUNFdW5pMUVBMXVuaTFFQTN1bmkxRUE1dW5pMUVBN3VuaTFFQTl1bmkxRUFCdW5pMUVBRHVuaTFFQUZ1bmkxRUIxdW5pMUVCM3VuaTFFQjV1bmkxRUI3YW9nb25la3VuaTAxODBjYWN1dGVjY2lyY3VtZmxleGNjYXJvbmNkb3RhY2NlbnRkY2Fyb251bmkxRTBEdW5pMUUwRmRjcm9hdGVjYXJvbmVtYWNyb25lYnJldmVlZG90YWNjZW50dW5pMUVCOXVuaTFFQkJ1bmkxRUJEdW5pMUVCRnVuaTFFQzF1bmkxRUMzdW5pMUVDNXVuaTFFQzdlb2dvbmVrZ2NpcmN1bWZsZXhnYnJldmVnZG90YWNjZW50dW5pMDEyM2djYXJvbnVuaTFFMjF1bmkwMDY3MDMwM2hjaXJjdW1mbGV4dW5pMUUyNXVuaTFFMkJoYmFyaXRpbGRlaW1hY3JvbnVuaTAxMkR1bmkwMUQwdW5pMUVDOXVuaTFFQ0Jpb2dvbmVraW9nb25lay5kamNpcmN1bWZsZXh1bmkwMTM3a2dyZWVubGFuZGljbGFjdXRlbGNhcm9ubGRvdHVuaTAxM0N1bmkxRTM3dW5pMUUzOXVuaTFFM0J1bmkxRTQzbmFjdXRlbmNhcm9udW5pMDE0NnVuaTFFNDV1bmkxRTQ3dW5pMUU0OW5hcG9zdHJvcGhlb21hY3JvbnVuaTAxNEZvaHVuZ2FydW1sYXV0dW5pMDFEMnVuaTFFQ0R1bmkxRUNGdW5pMUVEMXVuaTFFRDN1bmkxRUQ1dW5pMUVEN3VuaTFFRDlvaG9ybnVuaTFFREJ1bmkxRUREdW5pMUVERnVuaTFFRTF1bmkxRUUzdW5pMDFFQnJhY3V0ZXVuaTAxNTdyY2Fyb251bmkxRTVCdW5pMUU1RHVuaTFFNUZzYWN1dGVzY2lyY3VtZmxleHVuaTAxNUZ1bmkwMjE5dW5pMUU2MXVuaTFFNjN0Y2Fyb251bmkwMTYzdW5pMDIxQnVuaTFFNkR1bmkxRTZGdW5pMUU5N3V0aWxkZXVtYWNyb251YnJldmV1cmluZ3VodW5nYXJ1bWxhdXR1bmkwMUQ0dW5pMDFENnVuaTAxRDh1bmkwMURBdW5pMDFEQ3VuaTFFRTV1bmkxRUU3dW9nb25la3Vob3JudW5pMUVFOXVuaTFFRUJ1bmkxRUVEdW5pMUVFRnVuaTFFRjF3Z3JhdmV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3lncmF2ZXljaXJjdW1mbGV4dW5pMUU4RnVuaTFFRjV1bmkxRUY3dW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmkxRTkzdW5pMDIzN3VuaTAyNTB1bmkwMjUxdW5pMDI1MnVuaTAyNTl1bmkwMjYxdW5pMDI2NXVuaTAyNkZ1bmkwMjc5dW5pMDI4N3VuaTAyOEN1bmkwMjhEdW5pMDI4RXVuaTAyOUVhLmFhZ3JhdmUuYWFhY3V0ZS5hYWNpcmN1bWZsZXguYWF0aWxkZS5hYWRpZXJlc2lzLmFhbWFjcm9uLmFhYnJldmUuYWFyaW5nLmF1bmkwMUNFLmF1bmkxRUExLmF1bmkxRUEzLmF1bmkxRUE1LmF1bmkxRUE3LmF1bmkxRUE5LmF1bmkxRUFCLmF1bmkxRUFELmF1bmkxRUFGLmF1bmkxRUIxLmF1bmkxRUIzLmF1bmkxRUI1LmF1bmkxRUI3LmFhb2dvbmVrLmFnLmFnY2lyY3VtZmxleC5hZ2JyZXZlLmFnZG90YWNjZW50LmF1bmkwMTIzLmFnY2Fyb24uYXVuaTFFMjEuYXVuaTAwNjcwMzAzLmF6ZXJvLm9udW1vbmUub251bXR3by5vbnVtdGhyZWUub251bWZvdXIub251bWZpdmUub251bXNpeC5vbnVtc2V2ZW4ub251bWVpZ2h0Lm9udW1uaW5lLm9udW11bmkwMEFEdW5pMjAxNXVuaTIxMTd1bmkyMTIwYXQuY2FzZWFzdGVyaXNrLmFoeXBoZW4uYXVuaTAwQUQuYWRvbGxhci5hemVyby5zdXBzb25lLnN1cHN0d28uc3Vwc3RocmVlLnN1cHNmb3VyLnN1cHNmaXZlLnN1cHNzaXguc3Vwc3NldmVuLnN1cHNlaWdodC5zdXBzbmluZS5zdXBzcGFyZW5sZWZ0LnN1cHNwYXJlbnJpZ2h0LnN1cHNwZXJpb2Quc3Vwc2NvbW1hLnN1cHN6ZXJvLnN1YnNvbmUuc3Vic3R3by5zdWJzdGhyZWUuc3Vic2ZvdXIuc3Vic2ZpdmUuc3Vic3NpeC5zdWJzc2V2ZW4uc3Vic2VpZ2h0LnN1YnNuaW5lLnN1YnNwYXJlbmxlZnQuc3Vic3BhcmVucmlnaHQuc3Vic3BlcmlvZC5zdWJzY29tbWEuc3Vic3plcm8uZG5vbW9uZS5kbm9tdHdvLmRub210aHJlZS5kbm9tZm91ci5kbm9tZml2ZS5kbm9tc2l4LmRub21zZXZlbi5kbm9tZWlnaHQuZG5vbW5pbmUuZG5vbXBhcmVubGVmdC5kbm9tcGFyZW5yaWdodC5kbm9tcGVyaW9kLmRub21jb21tYS5kbm9temVyby5udW1yb25lLm51bXJ0d28ubnVtcnRocmVlLm51bXJmb3VyLm51bXJmaXZlLm51bXJzaXgubnVtcnNldmVuLm51bXJlaWdodC5udW1ybmluZS5udW1ycGFyZW5sZWZ0Lm51bXJwYXJlbnJpZ2h0Lm51bXJwZXJpb2QubnVtcmNvbW1hLm51bXJvcmRmZW1pbmluZS5hYS5zdXBzYi5zdXBzYy5zdXBzZC5zdXBzZS5zdXBzZi5zdXBzZy5zdXBzaC5zdXBzaS5zdXBzai5zdXBzay5zdXBzbC5zdXBzbS5zdXBzbi5zdXBzby5zdXBzcC5zdXBzcS5zdXBzci5zdXBzcy5zdXBzdC5zdXBzdS5zdXBzdi5zdXBzdy5zdXBzeC5zdXBzeS5zdXBzei5zdXBzZWdyYXZlLnN1cHNlYWN1dGUuc3Vwc3VuaTAyNTkuc3Vwc2Euc3VwYWcuc3VwYUV1cm91bmkwMTkybGlyYXVuaTIwQTZwZXNldGFkb25ndW5pMjBCMXVuaTIwQjJ1bmkyMEI1dW5pMjBCOXVuaTIwQkF1bmkyMjE1c2xhc2guZnJhY3VuaTIyMTlsZXNzZXF1YWxncmVhdGVyZXF1YWxub3RlcXVhbGFwcHJveGVxdWFscGlpbmZpbml0eXVuaTAwQjVwYXJ0aWFsZGlmZmludGVncmFscmFkaWNhbHVuaTIyMDZ1bmkyMTI2c3VtbWF0aW9ucHJvZHVjdHVuaTIxMTNlc3RpbWF0ZWR1bmkyMTkwYXJyb3d1cHVuaTIxOTJhcnJvd2Rvd251bmkyNUEwdW5pMjVDNnVuaTI1Qzl1bmkyNzUydHJpYWd1cHVuaTI1QjN1bmkyNUI2dW5pMjVCN3RyaWFnZG51bmkyNUJEdW5pMjVDMHVuaTI1QzF1bmkyNjEwdW5pMjYxMXVuaTI3MTN1bmkyNjZBbG96ZW5nZXVuaTIwMzJ1bmkyMDMzdW5pMDJCQnVuaTAyQkN1bmkwMkJFdW5pMDJCRnVuaTAyQzh1bmkwMkM5dW5pMDJDQXVuaTAyQ0J1bmkwMkNDdW5pMDMwMHVuaTAzMDAuY2FwdW5pMDMwMXVuaTAzMDEuY2FwdW5pMDMwMnVuaTAzMDIuY2FwdW5pMDMwM3VuaTAzMDMuY2FwdW5pMDMwNHVuaTAzMDQuY2FwdW5pMDMwNnVuaTAzMDYuY2FwdW5pMDMwN3VuaTAzMDcuY2FwdW5pMDMwOHVuaTAzMDguY2FwdW5pMDMwOXVuaTAzMDkuY2FwdW5pMDMwQXVuaTAzMEEuY2FwdW5pMDMwQnVuaTAzMEIuY2FwdW5pMDMwQ3VuaTAzMEMuY2FwdW5pMDMwRnVuaTAzMEYuY2FwdW5pMDMxMnVuaTAzMTN1bmkwMzFCdW5pMDMyM3VuaTAzMjR1bmkwMzI2dW5pMDMyN3VuaTAzMjcuY2FwdW5pMDMyOHVuaTAzMjguY2FwdW5pMDMyRXVuaTAzMzF1bmkwMzA4MDMwNHVuaTAzMDgwMzA0LmNhcHVuaTAzMDgwMzAxdW5pMDMwODAzMDEuY2FwdW5pMDMwODAzMEN1bmkwMzA4MDMwQy5jYXB1bmkwMzA4MDMwMHVuaTAzMDgwMzAwLmNhcHVuaTAzMDIwMzAxdW5pMDMwMjAzMDEuY2FwdW5pMDMwMjAzMDB1bmkwMzAyMDMwMC5jYXB1bmkwMzAyMDMwOXVuaTAzMDIwMzA5LmNhcHVuaTAzMDIwMzAzdW5pMDMwMjAzMDMuY2FwdW5pMDMwNjAzMDF1bmkwMzA2MDMwMS5jYXB1bmkwMzA2MDMwMHVuaTAzMDYwMzAwLmNhcHVuaTAzMDYwMzA5dW5pMDMwNjAzMDkuY2FwdW5pMDMwNjAzMDN1bmkwMzA2MDMwMy5jYXB1bmkwMzAyMDMwNnVuaTAzMDIwMzA2LmNhcHVuaTAzMEMuYXVuaTAzMjYuYXVuaTAwQTB1bmkyMDA3c3BhY2UuZnJhY25ic3BhY2UuZnJhY3VuaTI1MDB1bmkyNTAxdW5pMjUwMnVuaTI1MDN1bmkyNTA0dW5pMjUwNXVuaTI1MDZ1bmkyNTA3dW5pMjUwOHVuaTI1MDl1bmkyNTBBdW5pMjUwQnVuaTI1MEN1bmkyNTBEdW5pMjUwRXVuaTI1MEZ1bmkyNTEwdW5pMjUxMXVuaTI1MTJ1bmkyNTEzdW5pMjUxNHVuaTI1MTV1bmkyNTE2dW5pMjUxN3VuaTI1MTh1bmkyNTE5dW5pMjUxQXVuaTI1MUJ1bmkyNTFDdW5pMjUxRHVuaTI1MUV1bmkyNTFGdW5pMjUyMHVuaTI1MjF1bmkyNTIydW5pMjUyM3VuaTI1MjR1bmkyNTI1dW5pMjUyNnVuaTI1Mjd1bmkyNTI4dW5pMjUyOXVuaTI1MkF1bmkyNTJCdW5pMjUyQ3VuaTI1MkR1bmkyNTJFdW5pMjUyRnVuaTI1MzB1bmkyNTMxdW5pMjUzMnVuaTI1MzN1bmkyNTM0dW5pMjUzNXVuaTI1MzZ1bmkyNTM3dW5pMjUzOHVuaTI1Mzl1bmkyNTNBdW5pMjUzQnVuaTI1M0N1bmkyNTNEdW5pMjUzRXVuaTI1M0Z1bmkyNTQwdW5pMjU0MXVuaTI1NDJ1bmkyNTQzdW5pMjU0NHVuaTI1NDV1bmkyNTQ2dW5pMjU0N3VuaTI1NDh1bmkyNTQ5dW5pMjU0QXVuaTI1NEJ1bmkyNTRDdW5pMjU0RHVuaTI1NEV1bmkyNTRGdW5pMjU1MHVuaTI1NTF1bmkyNTUydW5pMjU1M3VuaTI1NTR1bmkyNTU1dW5pMjU1NnVuaTI1NTd1bmkyNTU4dW5pMjU1OXVuaTI1NUF1bmkyNTVCdW5pMjU1Q3VuaTI1NUR1bmkyNTVFdW5pMjU1RnVuaTI1NjB1bmkyNTYxdW5pMjU2MnVuaTI1NjN1bmkyNTY0dW5pMjU2NXVuaTI1NjZ1bmkyNTY3dW5pMjU2OHVuaTI1Njl1bmkyNTZBdW5pMjU2QnVuaTI1NkN1bmkyNTZEdW5pMjU2RXVuaTI1NkZ1bmkyNTcwdW5pMjU3MXVuaTI1NzJ1bmkyNTczdW5pMjU3NHVuaTI1NzV1bmkyNTc2dW5pMjU3N3VuaTI1Nzh1bmkyNTc5dW5pMjU3QXVuaTI1N0J1bmkyNTdDdW5pMjU3RHVuaTI1N0V1bmkyNTdGdW5pMjU4MHVuaTI1ODF1bmkyNTgydW5pMjU4M3VuaTI1ODR1bmkyNTg1dW5pMjU4NnVuaTI1ODd1bmkyNTg4dW5pMjU4OXVuaTI1OEF1bmkyNThCdW5pMjU4Q3VuaTI1OER1bmkyNThFdW5pMjU4RnVuaTI1OTB1bmkyNTkxdW5pMjU5MnVuaTI1OTN1bmkyNTk0dW5pMjU5NXVuaTI1OTZ1bmkyNTk3dW5pMjU5OHVuaTI1OTl1bmkyNTlBdW5pMjU5QnVuaTI1OUN1bmkyNTlEdW5pMjU5RXVuaTI1OUZ1bmkwMjU4dW5pMDI1NDEuMDAwU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvASICAAEARwB5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CxVktchs3Bv3H/cWC6qlYLobuKuyxpAfCxXWBjH3LQUhBg73kRX4Hun3Fx0V9wXp+wUGC7RYG15sZlAL9xUK92R3C/trufcNvgELfQr3jgv3iBX7NguFHpRdBQuPH1AGCxPc9wQmBxPs+wQLN54fjwcT+NqmwQsVIAb3BvsFBdsGCwHW9yr3KvcqA9YL/CQcBXhJCgv3ZvsD7vsd+wgmC3AdwgoL9yH3HAoL92P8xOj5IfvABgsVWK9qt7evrL4eC2ppWl2qbLiTk40LGZAGiWaJXIpnCAv5IfUdb7YfDgACWAA3AAAAGgBiAD8AUABuAIAAMwBLAFoASwBaAH8ATQBPAC0AXgAuAFwAPwAnAEsAIwAJAC0AIQA/AEwAWABMADgAQQBiAEMAWABXADQAYgBMADYAWAA4AFgAOACKAEMAQABJAC4ABwA5AC0ARwAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAa//4AFwA/AD8APwA/AD8AUABQAFAADABuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AMwAzADMAMwAzADMAMwBLAEsASwAIAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAEsAWgB/AH8AfwB/AH8APwB/ADAATQBPAE8ATwBPAE8ATwBPAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0AKQAdAC0ALQAtAC0ALQAtAC0AXABcAFwAXABcAFwAPwA/AD8APwA/AD8APwBLACcAJwAnACcAJwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsACQAJAAkACQAhACEAIQAhACEAIQAhACEAPwA/AD8APwAMAF4APQBMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMABEAEABMAEwATABMAEwAKwA4ADgAOABBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQwBDAEMAQwBDAEMAQwACAFgAWAAQAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcANABiAGIATABMACIATABMAEwATABMADYAWABYAFgAWABYAFgAWP/kADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAALADgAOAA4ADgAOAA4ADgAigBvAIoAfwB/AEkAQwBDAEMAQwBDAEMAQwBRAEAAQABAAEAAQABAAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQAHAAcABwAHAC0ALQAtAC0ALQAtAC0ALQBHAEcARwBHADgAWAA0AFkAOABYADoAPABBADgASQAqADwANQAuAAcALAAXACgALQA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ACUAQwBeAEAANQAmADUASQBEAEIAPwBDAF4AQAA1ACYANQBKAEQAQgA/ANIAwQDSAMEAFwDcANwAagB2AO0AdgDLANUAUwBeANUAXgC/AM4ASABXAFEAUQBQABQAUAAUANIAkwA8AMkAewDbAGQAdABkAF0BAABdAQAATwB1AHUAVgBCABsAGwBt//kACQAtAC0AUwBjAIMAgwBQAJ4AzQCpAKoAqQCqAKsAtQCsAKoA5wDRAPoA8ACeAM0AqQCqAKkAqgCrALUArACqAOcA0QD6APAAngDNAKkAqgCpAKoArAC1AKwAqgDnANEA+gDwAJ4AzQCpAKoAqQCqAKsAtQCsAKoA5wDRAPoA8ACkAIcAjACkAKcAsgCHAJ0AwgCRAKoArgCKALUAwAB+AKoAjACnAIcA7ACeAKAAmwCMAFIAlgCJAJMAnQCdAJkAhwCHAKoANABQAEsALwA2AG0AMQBcAEsAKgAlAGkAJgBQAFwAZwAzABkAGQAZABoALAAZABkAJgAZABkAGQAZABkAGQBRAFEAYQBRAM8AUQB3AGgAUQBRAFEAaQBRAEYARgBRACH/+gBJAEgAsAA3AB8AGQBDAC0AagAaABAAIAAeACAAxACZAHIAoQAiACIARABEACIAIgAdAB3/5v/m//cARwBdAPkAmQDLANUA8gDYAK4A5wCgAKAA8gCtAOUArQDyAJcAjACtAKYAygDDAOIA2ADlAK4AoQDnAPMAoACcAJcAlQCtAKwApgCtAOIA7ACMAJwA6ADoAMoAygDDALgAoACcAGIAYgDzAPoBIwDiAJwA0wDTAM4A5QDkAKoArAChAKEAoQChAKEAnAChAKEAsgCkALIApACyAKQApQCkAKoArgCqAK4AqgCuAKUAogCqAKQBBADjAAAAAAAAAAD/0f/RAP0AzwAhACEA/QDPABIAEgD9AM8A/QD9AM8Az//R/9H/0f/RAP0A/QDPAM//0f/R/9H/0QD9AP0AzwDPAM8AzwDPAM//0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0QBLAEsA/QDP/9EAoAD9AKAAoP/R/9H/0QD9AKAAoP/R/9H/0QD9AKAAoP/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0QD9/9H/0QD9/9H/0f/R/9EA/QD9AP3/0QDPAP0Az//RAM//0QDPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAAAAAAAAAAg0AAAEsAAAAAAAAAAAAAAEsAAAAAAABAAAADAAAAAAAygACAB8AAgA1AAEASwBMAAEAZwBnAAEAbgBuAAIAfgB+AAEAoQCjAAEAqQCpAAEAzQDOAAEA5gDmAAEA/AD8AAEBBAEEAAIBGAEYAAEBHAEcAAIBHwEfAAIBLgEuAAIBLwEwAAEBNQE1AAIBVQFXAAEBXQFdAAEBbAFsAAIBggGDAAEBmgGbAAEBnQGdAAEBoQGiAAEBrQGtAAEBwwHEAAEByAHIAAICzQLNAAEC1wLXAAEC3QMcAAMDHgMeAAMAAgADAt0C+AABAwMDHAABAx4DHgABAAEAAAAKAGwCGgACREZMVAAObGF0bgA4AAQAAAAA//8AEAAAAAIABAAGAAgACgAMAA4AEAASABQAFgAYABoAHAAeAAQAAAAA//8AEAABAAMABQAHAAkACwANAA8AEQATABUAFwAZABsAHQAfACBhYWx0AMJhYWx0AMpjYXNlANJjYXNlANhjY21wAN5jY21wAOxkbm9tAPpkbm9tAQBmcmFjAQZmcmFjARBudW1yARpudW1yASBvbnVtASZvbnVtASxvcmRuATJvcmRuAThzYWx0AT5zYWx0AUpzaW5mAVZzaW5mAVxzczAxAWJzczAxAWhzczAyAW5zczAyAXRzczAzAXpzczAzAYBzczA0AYZzczA0AYxzdWJzAZJzdWJzAZhzdXBzAZ5zdXBzAaYAAAACAAAAAQAAAAIAAAABAAAAAQAQAAAAAQAQAAAABQADAAQABQAGAAcAAAAFAAMABAAFAAYABwAAAAEACQAAAAEACQAAAAMACAAKAAsAAAADAAgACgALAAAAAQAIAAAAAQAIAAAAAQAPAAAAAQAPAAAAAQAMAAAAAQAMAAAABAARABIAEwAUAAAABAARABIAEwAUAAAAAQAOAAAAAQAOBAQAAQARA/4AAQARBAgAAQASBAIAAQASBDgAAQATBDIAAQATBEgAAQAUBEIAAQAUAAAAAQAOAAAAAQAOAAAAAgAMAA0AAAACAAwADQAXADAAOABAAEgAUABaAGIAagByAHoAggCKAJYAngCmAK4AtgC+AMYAzgDWAN4A5gABAAAAAQP6AAMAAAABBLAAAgAAAAEArgAGAAAAAQDMAAYAAAACANYA6gAEAAAAAQDyAAQAAAABAWQABgAAAAECKgABAAAAAQI0AAEAAAABAk4AAQAAAAECaAAGAAAAAwJmAngCigABAAAAAQKSAAEAAAABAsoAAQAAAAEC5AABAAAAAQL+AAEAAAABAvwAAQAAAAEC/gABAAAAAQMGAAEAAAABAzoAAQAAAAEDTgAEAAAAAQTcAAEAAAABBOYAAQU+AAQADgAUABoAIAACAAYC4QACABAC4QACACAC4QACACoC4QADAAAAAQUYAAEFJAABAAAAAgADAAAAAgUYBR4AAQUkAAEAAAAVAAMAAAABBRYAAQUQAAEAAAAWAAEFCgADAAwANgBYAAUADAASABgAHgAkAw0AAgLdAwsAAgLfAxEAAgLjAxsAAgLnAw8AAgLtAAQACgAQABYAHAMVAAIC3QMTAAIC3wMZAAIC4wMXAAIC7QAEAAoAEAAWABwDCQACAt0DBQACAt8DAwACAuUDBwACAvMAAQSaABAAJgAwADoARABOAFgAYgBsAHYAgACSAJwApgCwALoAxAABAAQASwACAv8AAQAEAGcAAgL/AAEABABuAAIC4wABAAQAfgACAv8AAQAEAKkAAgL/AAEABADNAAIC/wABAAQA/AACAv8AAQAEAQQAAgLzAAEABAEYAAIC/wACAAYADAEfAAIC4wEcAAIC/QABAAQBLgACAv8AAQAEATUAAgLzAAEABAFdAAIC/wABAAQBbAACAvMAAQAEAYIAAgL/AAEABAHIAAIC/QADAAED8AABBBIAAAABAAAAFgACBDwADgJEAkUCRgJHAkgCSQJKAksCTAJNAlACUQJOAk8AAgQaAA4CNgI3AjgCOQI6AjsCPAI9Aj4CPwJCAkMCQAJBAAEEDgCDAAMAAQQOAAEEGAAAAAEAAAAWAAMAAQQOAAEEHgAAAAEAAAAWAAMAAgQgBBYAAQQMAAAAAQAAABYAAgQUAB0CVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAAIDegAOAhoCGwIcAh0CHgIfAiACIQIiAiMCJgInAiQCJQACA1gADgIoAikCKgIrAiwCLQIuAi8CMAIxAjQCNQIyAjMAAQOmAAoAAQOqAAEAAAEAAAID3gADAhcCGAIWAAABAQACA9gAGQGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMCUwJyAAABAgACA7gACQHEAcUBxgHHAcgByQHKAcsCcwAAAQMAAQOy/6MAAgOyAFwCVgJXAlgCWQJaAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwJvAnABxQHGAccByAHJAcoBywJxAhcCGAIWAhQCUwJyAnMCGQLeAuAC4gLkAuYC6ALqAuwC7gLwAvIC9AL2Av4DAAMEAwYDCAMKAwwDDgMQAxIDFAMWAxgDGgMcAAEDsAAQACYALAAyAD4ASgBWAGIAbgB6AIYAkgCeAKoAtAC+AMgAAgJVAa0AAgJbAcQABQJEAjYCGgIoAdcABQJFAjcCGwIpAdgABQJGAjgCHAIqAdkABQJHAjkCHQIrAdoABQJIAjoCHgIsAdsABQJJAjsCHwItAdwABQJKAjwCIAIuAd0ABQJLAj0CIQIvAd4ABQJMAj4CIgIwAd8ABQJNAj8CIwIxAeAABAJQAkICJgI0AAQCUQJDAicCNQAEAk4CQAIkAjIABAJPAkECJQIzAAEAhAABAAgAAQAEAS8AAgL/AAIC7gAtAyEBLwI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMC3gLgAuIC5ALmAugC6gLsAu4C8ALyAvQC9gL+AwADBAMGAwgDCgMMAw4DEAMSAxQDFgMYAxoDHAMiAAEABABZAJMBCgFHAAEAAQLnAAEAAQAkAAEAAQL/AAEAAQLfAAEAAQEuAAEAAwLhAucC6wABABAAAgAGAAgACgAQABYAHAAfACAAIgAkACcAKgAvADABxAACAAUAAgAbAAAANgBMABoATgB4ADEAegCWAFwAmADmAHkAAQAcAt0C3wLhAuMC5QLnAukC6wLtAu8C8QLzAvUC/QL/AwMDBQMHAwkDCwMNAw8DEQMTAxUDFwMZAxsAAgADAc0B1gAAAeEB4gAKAf8CAAAMAAEAAQIFAAIAAQJEAk0AAAABAAIAAQMfAAIAAgI2AkMAAAKGAogADgACAAECRAJRAAAAAgABAjYCPwAAAAEAAgMhAyIAAgADABwANQAAAQgBCQAaAaEBoQAcAAIAAQHNAdYAAAABAB0CEwLdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL1Av0C/wMDAwUDBwMJAwsDDQMPAxEDEwMVAxcDGQMbAAEAAwH2AfcCCQACAAQAHAAcAAAA5wD8AAECUgJSABcCVQJVABgAAgADACIAIgAAARkBHwABAlsCWwAIAAEAAQJ2AAEAXAAdAB4AHwAgACEAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQDnAOgA6QDqAOsA7ADtAO4A7wDwAPEA8gDzAPQA9QD2APcA+AD5APoA+wD8AQgBCQEZARoBGwEcAR0BHgEfAaEB9gH3AgkCEwJSAlUCWwJ2At0C3wLhAuMC5QLnAukC6wLtAu8C8QLzAvUC/QL/AwMDBQMHAwkDCwMNAw8DEQMTAxUDFwMZAxsAAgAFABwAHAAAACIAIgABAc0B1gACAeEB4gAMAf8CAAAOAAEALQABAS4CRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAt0C3wLhAuMC5QLnAukC6wLtAu8C8QLzAvUC/QL/AwMDBQMHAwkDCwMNAw8DEQMTAxUDFwMZAxsDHwAAAAEAAAAKADgAkgACREZMVAAObGF0bgAeAAQAAAAA//8AAwAAAAIABAAEAAAAAP//AAMAAQADAAUABm1hcmsAJm1hcmsANm1rbWsARm1rbWsATHNpemUAUnNpemUAVgAAAAYAAAABAAIAAwAEAAUAAAAGAAAAAQACAAMABAAFAAAAAQAGAAAAAQAGAFIAAABOAAAABwAQABoAIgAqADIAOgBCAAEAAAACAEQATgAEAAAAAQBMAAQAAAABAyYABAAAAAEDZgAEAAAAAQTYAAQAAAABBQIABgEAAAEFZABkAAAAAAAAAAAAAQZcAAX+1P2oAAEGXAAE/agAAQZeBnQAAQAMAOoANwAAAYYAAAGMAAABhgAAAYwAAAGGAAABjAAAAYYAAAGMAAABhgAAAYwAAAGGAAABjAAAAYYAAAGMAAABhgAAAYwAAAGGAAABjAAAAYYAAAGMAAABhgAAAYwAAAGGAAABjAAAAYYAAAGMAAABhgAAAYYAAAGGAAABjAAAAYYAAAGMAAABhgAAAYwAAAGGAAABjAAAAYYAAAGMAAABhgAAAYwAAAGGAAABjAAAAYYAAAGMAAABhgAAAYwAAAGGAAABjAAAAYYAAAGMAAABhgAAAYwAAAGGAAABjAAAAYYAUwCuALQAugDAAMYAzADSANgArgDeAOQA6gCuAPAArgD2APwBAgEIANgA2ADYAK4BDgCuARQBGgEgASYBLAEyATgBPgFEAUoBUAFWAVwBYgFoAKgBbgF0AXoBgAGGAYwBkgCoAZgBngGkAK4BqgGwAK4BtgG8ANgArgDYAcIByAEaATIBkgHOAKgB1ACoAKgBjAGMASABzgHaAeABPgHaAdoB5gHsAfIAAQEsAf8AAQEsAqUAAQETArYAAQFdAqUAAQEqAqUAAQFAAqUAAQFQAqUAAQFLAqUAAQErAqUAAQGXAqUAAQE/AqUAAQC/AqUAAQEvAqUAAQE6AqUAAQEuAqsAAQEwAqUAAQE4AqUAAQEtAqUAAQE3AqUAAQE2Af8AAQCRAtoAAQFXAf8AAQG8AtoAAQE6Af8AAQFxAuQAAQEzAf8AAQCXAtoAAQFjAr4AAQEtAr4AAQCvAtoAAQEYAtoAAQE7Af8AAQE9Af8AAQE8Af8AAQEuAf8AAQFpAf8AAQEyAf8AAQEIAocAAQEnAf8AAQEtAf8AAQEsAgAAAQExAf8AAQFBAf8AAQG5ArYAAQE7AqUAAQEuAqUAAQGUAqUAAQEkAqUAAQE+AqUAAQFjAf8AAQE+Af8AAQE1Af8AAQEjAf8AAQE0Af8AAQEsAtMAAQEsAsUAAQQUBBwAAQAMABYAAgAAABgAAAAYAAYAFAAaAA4AIAAmACwAAQEsAAAAAQFbAAAAAQExAAAAAQFWAAAAAQE5AAAAAQF3AAAAAQPkA/IAAQAMACIABQAAAJYAAACWAAAAlgAAAJYAAACWAD8AgACGAIwAkgCYAJ4ApACqAIAAsACkALYAgAC8AIAAwgDIAM4AgACqAIAA1ACSAIAA2gDUAOAAtgDmANoA7ADyANoA+AD+AQQBCgDOARAAgAEWARwBIgCGASgAyADgAIAAgAEuATQAqgDsAToA+ACAAOYAvAFAAUYBTAFAAVIAAQEs/+oAAQE1/+oAAQFb/+oAAQEm/+oAAQFL/+oAAQC+/+oAAQFP/+oAAQEr/+oAAQE6/+oAAQFW/+oAAQEy/+oAAQCX/+oAAQFA/+oAAQEx/+oAAQEv/+oAAQE4/+oAAQEt/+oAAQEz/+oAAQEk/+oAAQEl/xoAAQFj/+oAAQDt/xgAAQFM/+oAAQFw/+oAAQE3/+oAAQCM/yYAAQHA/yYAAQDi/+oAAQF4/+oAAQEK/w4AAQE9/+oAAQFD/+oAAQE2/+oAAQEh/+oAAQHK/yYAAQHL/yYAAQLKAtAAAQAMABIAAQAAAA4AAwAOABQAGgABASwB6QABAaUChQABAfkCmQABAZ0B6QABAqgCsAABAAwAFgACAAAAIgAAACIACwAeACQAKgAYADAANgA8AEIAPABIAE4AAQEsAAAAAQHuAAAAAQGoAAAAAQEWAAAAAQErAAAAAQG3AAAAAQGDAAAAAQFeAAAAAQEhAAAAAQGjAAAAAQEeAmAAAQAMAOoANwAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOYAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAwAUABoAGgABASwB/wABASwCpQABASwC3gABASwCvQACAAEChgKIAAAAAgABAt0DHgAAAAIAAwLdAvgAAAMDAxwAHAMeAx4ANgACABUAAgA1AAAASwBMADQAZwBnADYAfgB+ADcAoQCjADgAqQCpADsAzQDOADwA5gDmAD4A/AD8AD8BGAEYAEABLwEwAEEBVQFXAEMBXQFdAEYBggGDAEcBmgGbAEkBnQGdAEsBoQGiAEwBrQGtAE4BwwHEAE8CzQLNAFEC1wLXAFIAAQACAv0C/gABAAYABAAUABUAHgAuAC8AAQAFAvoC+wL8AwEDAgACAA0AAgARAAAAEwA1ABAAowCjADMAzgDOADQA5gDmADUBMAEwADYBVwFXADcBgwGDADgBmgGaADkBnQGdADoBoQGiADsBrQGtAD0BxAHEAD4AAQABAvkAAQADABAAFgAqAAEAAgL/AwAAAQALAAIABgAKABAAFgAgACQAKgEwAaEBrQABAAMC4QLpAusAAAABAAAACAAAAAQADgACaWRlb3JvbW4AAkRGTFQADmxhdG4ADgAGAAAAAAABAAIACAAMAAH/VgABAAAAAAAAAAEAAQABAAAAAQAAIEQAAAAUAAAAAAAAIDwwgiA4BgkqhkiG9w0BBwKggiApMIIgJQIBATELMAkGBSsOAwIaBQAwYQYKKwYBBAGCNwIBBKBTMFEwLAYKKwYBBAGCNwIBHKIegBwAPAA8ADwATwBiAHMAbwBsAGUAdABlAD4APgA+MCEwCQYFKw4DAhoFAAQUqpmcfp6hXMC/i5TjG0RZ8RY2BmOgghsPMIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1kMIID7jCCA1egAwIBAgIQfpPr+3zGTlnqS5p31Ab8OzANBgkqhkiG9w0BAQUFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNMTIxMjIxMDAwMDAwWhcNMjAxMjMwMjM1OTU5WjBeMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALGss0lUS5ccEgrYJXmRIlcqb9y4JsRDc2vCvy5QWvsUwnaOQwElQ7Sh4kX06Ld7w3TMIte0lAAC903tv7S3RCRrzV9FO9FEzkMScxeCi2m0K8uZHqxyGyZNcR+xMd37UWECU6aq9UksBXhFpS+JzueZ5/6M4lc/PcaS3Er4ezPkeQr78HWIQZz/xQNRmarXbJ+TaYdlKYOFwmAUxMjJOxTawIHwHw103pIiq8r3+3R8J+b3Sht/p8OeLa6K6qbmqicWfWH3mHERvOJQoUvlXfrlDqcsn6plINPYlujIfKVOSET/GeJEB5IL12iEgF1qeGRFzWBGflTBE3zFefHJwXECAwEAAaOB+jCB9zAdBgNVHQ4EFgQUX5r1blzMzHSa1N197z/b7EyALt0wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVRpbWVzdGFtcGluZ0NBLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0yMDQ4LTEwDQYJKoZIhvcNAQEFBQADgYEAAwmbj3nvf1kwqu9otfrjCR27T4IGXTdfplKfFo3qHJIJRG71betYfDDo+WmNI3MLEm9Hqa45EfgqsZuwGsOO61mWAK3ODE2y0DGmCFwqevzieh1XTKhlGOl5QGIllm7HxzdqgyEIjkHq3dlXPx13SYcqFgZepjhqIhKjURmDfrYwggSQMIID+aADAgECAhAbCTt4YJbaN7ukUZRGyJZ4MA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMDgwMDAwMDBaFw0yMTExMDcyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK8kCAgpejWeYAyq50s7Ttx8vDxFHLsr4P4pAvlXCKNkhRUn9fGtyDGJXSLoKqqmQrOP+LlVt7G3S7P+j34HV+zvQ9tmYhVhz2ANpNje+ODDYgg9VBPrScpZVIUm5SuPG5/r9aGRwjNJ2ENjalJL0o/ocFFN0Ylpe8dw9rPcEnTbe11LVtOWvxV3obD0oiXyrxySZxjl9AYE75C55ADk3Tq1Gf8CuvQ87uCL6zeL7PTXrPL28D2v3XWRMxkdHEDLdCQZIZPZFP6sKlLHj9UESeSNY0eIPGmDy/5HvSt+T8WVrg6d1NFDwGdz4xQIfuU/n3O4MwrPXT80h5aK7lPoJRUCAwEAAaOCAVswggFXMA8GA1UdEwEB/wQFMAMBAf8wMQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwDgYDVR0PAQH/BAQDAgEGMD0GA1UdIAQ2MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vY3BzMB0GA1UdDgQWBBR/02Wnwt3su/AwCfNDOfoCrzMxMzBtBggrBgEFBQcBDARhMF+hXaBbMFkwVzBVFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBSP5dMahqyNjmvDz4Bq1EgYLHsZLjAlFiNodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvLmdpZjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlzaWduLmNvbTANBgkqhkiG9w0BAQUFAAOBgQCjzX0e98d1jUjnVjRMAJB1qVGlVsFtvP71UyLpmKKsmn5wHrOOO0XjhpUx2m1M+zRQgJbNJPJA3wQ/4mXONCJhFepmcGTS8W7zyhhZakFGfoLeGbBwMVZpDQzmHZ1xWNzM3mL14XoQAth63Dv6V73J6Y9GITmfUWVMjjq+KEFwHTCCBKMwggOLoAMCAQICEA7P9DjI/r81bgTYapgbGlAwDQYJKoZIhvcNAQEFBQAwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0gRzIwHhcNMTIxMDE4MDAwMDAwWhcNMjAxMjI5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xNDAyBgNVBAMTK1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgU2lnbmVyIC0gRzQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCiYws5RLi7I6dESbsO/6HwYQpTk7CY260sD0rFbv+GPFNVDxXOBD8r/amWltm+YXkLW8lMhnbl4ENLIpXuwitDwZ/YaLSOQE/uhTi5EcUj8mRY8BUyb05Xoa6IpALXKh7NS+HdY9UXiTJbsF6ZWqidKFAOF+6W22E7RVEdzxJWC5JH/Kuu9mY9R6xwcueS51/NELnEg2SUGb0lgOHo0iKl0LoCeqF3k1tlw+4XdLxBhircCEyMkoyRLZ53RB9o1qh0d9sOWzKLVoszvdljyEmdOsXF6jML0vGjG/SLvtmzV4s73gSneiKyJK4ux3DFvk6DJgj7C72pT5kI4RAocqrNAgMBAAGjggFXMIIBUzAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBzBggrBgEFBQcBAQRnMGUwKgYIKwYBBQUHMAGGHmh0dHA6Ly90cy1vY3NwLndzLnN5bWFudGVjLmNvbTA3BggrBgEFBQcwAoYraHR0cDovL3RzLWFpYS53cy5zeW1hbnRlYy5jb20vdHNzLWNhLWcyLmNlcjA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vdHMtY3JsLndzLnN5bWFudGVjLmNvbS90c3MtY2EtZzIuY3JsMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBUaW1lU3RhbXAtMjA0OC0yMB0GA1UdDgQWBBRGxmmjDkoUHtVM2lJjFz9eNrwN5jAfBgNVHSMEGDAWgBRfmvVuXMzMdJrU3X3vP9vsTIAu3TANBgkqhkiG9w0BAQUFAAOCAQEAeDu0kSoATPCPYjA3eKOEJwdvGLLeJdyg1JQDqoZOJZ+aQAMc3c7jecshaAbatjK0bb/0LCZjM+RJZG0N5sNnDvcFpDVsfIkWxumy37Lp3SDGcQ/NlXTctlzevTcfQ3jmeLXNKAQgo6rxS8SIKZEOgNER/N1cdm5PXg5FRkFuDbDqOJqxOtoJcRD8HHm0gHusafT9nLYMFivxf1sJPZtb4hbKE4FtAC44DagpjyzhsvRaqQGvFZwsL0kb2yK7w/54lFHDhrGCiF3wPbRRoXkzKy57udwgCRNx62oZW8/opTBXLIlJP7nPf8m/PiJoY1OavWl0rMUdPH+S4MO8HNgEdTCCBZAwggR4oAMCAQICEHQlU60H5K/RFQSvmE1J7WgwDQYJKoZIhvcNAQEFBQAwgbQxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE7MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEgKGMpMTAxLjAsBgNVBAMTJVZlcmlTaWduIENsYXNzIDMgQ29kZSBTaWduaW5nIDIwMTAgQ0EwHhcNMTIwOTE4MDAwMDAwWhcNMTMwOTE4MjM1OTU5WjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCFNhbiBKb3NlMSMwIQYDVQQKFBpBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZDESMBAGA1UECxQJVHlwZSBGb250MT4wPAYDVQQLEzVEaWdpdGFsIElEIENsYXNzIDMgLSBNaWNyb3NvZnQgU29mdHdhcmUgVmFsaWRhdGlvbiB2MjEjMCEGA1UEAxQaQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3whFTXSiiYdME1HG+PDk+WsAeHLrt4pTDxziDwestaw9KuIon/xcVBcre6kuhd5JkDk/28tP2Br6ZlbNjGsayreGmC3Dn1jVSwiGKljIsDWKK1h/Xk+cScfUM0a5xYFV0UtCu4lWVD+APXOk3pghLXJH/1JK6FeRijGpz3VCrqFaeSl5yvxPN6cDTkpuMuWsKuSdPuFGbXhZpHdPuZ9Uo9+QMj+t82FrIeGv1duoyQ99yP5pyaY0AVNIJ+57a6cLgqUPUknRKt8QBj+MwS62xQFhXYNaPg/OL68C91UNPZRE/chUXXq3a/3EFsimenA14iOftS5ySpM2hGv2PCJ6tAgMBAAGjggF7MIIBdzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDBABgNVHR8EOTA3MDWgM6Axhi9odHRwOi8vY3NjMy0yMDEwLWNybC52ZXJpc2lnbi5jb20vQ1NDMy0yMDEwLmNybDBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9jcHMwEwYDVR0lBAwwCgYIKwYBBQUHAwMwcQYIKwYBBQUHAQEEZTBjMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJpc2lnbi5jb20wOwYIKwYBBQUHMAKGL2h0dHA6Ly9jc2MzLTIwMTAtYWlhLnZlcmlzaWduLmNvbS9DU0MzLTIwMTAuY2VyMB8GA1UdIwQYMBaAFM+Zqep7JvRLyY6P1/AFJu/j0qedMBEGCWCGSAGG+EIBAQQEAwIEEDAWBgorBgEEAYI3AgEbBAgwBgEBAAEB/zANBgkqhkiG9w0BAQUFAAOCAQEAqmhhva/dUgLEjkGlfW+Inr7+ucu3a+3COGUbYjFE25utOTO/hZT/bAD5upSUoJtb508fLQNZ4OOi3WPWvOUrdAF7LaQAdDbbXpKZm/h7F7m/3ThM5iyE+k4q2hCZ1fSNlYEz7WQPm0hEIjRfB2Nx22jM0VH/ON/a6A6zweolrwizDJ3KMJPKDH7dO4DYI6IK1RYl3Aza290yA7WbH/rRUvnZmioQPoyxlxtBLqkfAS9vSQncbLcrzn/YL9zMffZpHt+UHcnFdqXi9zQrdtP0Lj4U4upqQfLf7X8OL9zurvYFbApAQPFPIYqDg6S2jgdnFXPUBmDcxNoZi0soNbbB4TCCBgowggTyoAMCAQICEFIA5aolVvwahu2WydRLM8cwDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDIwMDYgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1MB4XDTEwMDIwODAwMDAwMFoXDTIwMDIwNzIzNTk1OVowgbQxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE7MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEgKGMpMTAxLjAsBgNVBAMTJVZlcmlTaWduIENsYXNzIDMgQ29kZSBTaWduaW5nIDIwMTAgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD1I0tepdeKuzLp1Ff37+THJn6tGZj+qJ19lPY2axDXdYEwfwRof8srdR7NHQiM32mUpzejnHuA4Jnh7jdNX847FO6G1ND1JzW8JQs4p4xjnRejCKWrsPvNamKCTNUh2hvZ8eOEO4oqT4VbkAFPyad2EH8nA3y+rn59wd35BbwbSJxp58CkPDxBAD7fluXF5JRx1lUBxwAmSkA8taEmqQynbYCOkCV7z78/HOsvlvrlh3fGtVayejtUMFMb32I0/x7R9FqTKIXlTBdOflv9pJOZf9/N76R17+8V9kfn+Bly2C40Gqa0p0x+vbtPDD1X8TDWpjaO1oB21xkupc1+NC2JAgMBAAGjggH+MIIB+jASBgNVHRMBAf8ECDAGAQH/AgEAMHAGA1UdIARpMGcwZQYLYIZIAYb4RQEHFwMwVjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL2NwczAqBggrBgEFBQcCAjAeGhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMA4GA1UdDwEB/wQEAwIBBjBtBggrBgEFBQcBDARhMF+hXaBbMFkwVzBVFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBSP5dMahqyNjmvDz4Bq1EgYLHsZLjAlFiNodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvLmdpZjA0BgNVHR8ELTArMCmgJ6AlhiNodHRwOi8vY3JsLnZlcmlzaWduLmNvbS9wY2EzLWc1LmNybDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlzaWduLmNvbTAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwMwKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFZlcmlTaWduTVBLSS0yLTgwHQYDVR0OBBYEFM+Zqep7JvRLyY6P1/AFJu/j0qedMB8GA1UdIwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQBWIuY0pMRhy0i5Aa1WqGQP2YyRxLvMDOWteqAif99HOEotbNF/cRp87HCpsfBP5A8MU/oVXv50mEkkhYEmHJEUR7BMY4y7oTTUxkXoDYUmcwPQqYxkbdxxkuZFBWAVWVE5/FgUa/7UpO15awgMQXLnNyIGCb4j6T9Emh7pYZ3MsZBc/D3SjaxCPWU21LQ9QCiPmxDPIybMSyDLkB9djEw0yjzY5TfWb6UgvTTrJtmuDefFmvehtCGRM2+G6Fi7JXx0Dlj+dRtjP84xfJuPG5aexVN2hFucrZH6rO2Tul3IIVPCglNjrxINUIcRGz1UUpaKLJw9khoImgUux5OlSJHTMYIEmzCCBJcCAQEwgckwgbQxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE7MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEgKGMpMTAxLjAsBgNVBAMTJVZlcmlTaWduIENsYXNzIDMgQ29kZSBTaWduaW5nIDIwMTAgQ0ECEHQlU60H5K/RFQSvmE1J7WgwCQYFKw4DAhoFAKCBmDAUBgkrBgEEAYI3KAExBwMFAAMAAAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIgYKKwYBBAGCNwIBDDEUMBKhEIAOd3d3LmFkb2JlLmNvbSAwIwYJKoZIhvcNAQkEMRYEFEQh354CULB8bvLymMsMrs43VH5wMA0GCSqGSIb3DQEBAQUABIIBAJQ1aNYs/SHCi1Q4w5IgHmNGcwxePqIkYQk/JttnzxIt+cKdcWzjvREoeanshMhLcmn1ywAL84CAbX/rUmW0enFs+2XYD9T8LFd9bUGfWKKzQHf3fsA1Dkz3vcO8Wbh/7Y3V5pPf8jtcs8gawmLIUpp8lX4AvCM2PhbpodGrrMGnby5XvT5CfOqte2+zngetS2YVdGuPhZUjdsg2VbT3Lh8muZFeh+rADtptT+hAfCFSa6ELHIYmG241kbmPMKw0H9TSinh6+ZnmR7ohfl2KsxpiQWN7AL7Hu3aEAV601LqgXlVt5Vb15K/uErSlE++LXwzzh+egK7nrB5u+RwrX/l2hggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQCAQEwcjBeMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMgIQDs/0OMj+vzVuBNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwMTExMTkyNTUxWjAjBgkqhkiG9w0BCQQxFgQUlS+DBbHMKsh3Bi+Vb0KiJe0kFykwDQYJKoZIhvcNAQEBBQAEggEAcFxMuU/J/jG8sY53DX+6xE1hupzKK4nDIOMfMxioFfYk9qbujqhAp31bHpQ6SNlOvtaY3inwoEiq6fTl78ObwEk0h2/vJBkLgwGVxn3oC9/vicQSVv6hSOk1AJ7b38XW+r7vbxii+1ZTx6rq762Yv+LYT6DmMXGvth35mXFPiiBJorwt08fQ4+WllG3c0SoNf1umRvX71llajhNlnGXncxzEzOtNilyooG8F1zJdVX41ARYt67DxQo0ZG0rC3yiSsYpNG60itJ1u/J2thP3VIZEH/eEGrL8msILgStv/k+AC6rzK43z4+2fNRLp9OIhZG30bO/03bMNEu+juqfM1hA==) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Code Pro Semibold'), local('SourceCodePro-Semibold'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT8cAAAAOkNGRiC2ZBOfAABJHAAA2XlEU0lHBLtt/AABP1gAACBYR0RFRi8sL9AAASogAAAA1EdQT1MlURFbAAE2KAAACPRHU1VC3Z7yFQABKvQAAAsyT1MvMnOc0bUAAAFQAAAAYGNtYXDp1MYJAAA+7AAAChBoZWFk+82HfgAAAOwAAAA2aGhlYQZmAOAAAAEkAAAAJGhtdHialJxBAAEimAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZXGkOKIAAAGwAAA9PHBvc3T/uAAzAABI/AAAACAAAQAAAAEEWrrz6QNfDzz1AAMD6AAAAADNFZ/2AAAAAM0Vn/b/yv5wAsED6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/K/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAJYAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwYJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAGABFAAEAAAAAAAIABwBdAAEAAAAAAAMAJwBkAAEAAAAAAAQAGABFAAEAAAAAAAUAOQCLAAEAAAAAAAYAFgDEAAEAAAAAAAcAYADaAAEAAAAAAAgAGgE6AAEAAAAAAAkADAFUAAEAAAAAAAsAGQFgAAEAAAAAAA0R2QF5AAEAAAAAAA4AJBNSAAEAAAAAABAADxN2AAEAAAAAABEACBOFAAEAAAAAAQAAFhONAAEAAAAAAQEACxOjAAEAAAAAAQIACxOuAAEAAAAAAQMAFRO5AAMAAQQJAAAAihPOAAMAAQQJAAEAMBRYAAMAAQQJAAIADhSIAAMAAQQJAAMAThSWAAMAAQQJAAQAMBRYAAMAAQQJAAUAchTkAAMAAQQJAAYALBVWAAMAAQQJAAcAwBWCAAMAAQQJAAgANBZCAAMAAQQJAAkAGBZ2AAMAAQQJAAsAMhaOAAMAAQQJAA0jthbAAAMAAQQJAA4ASDp2AAMAAQQJABAAHjq+AAMAAQQJABEAEDrcAAMAAQQJAQAALDrsAAMAAQQJAQEAFjsYAAMAAQQJAQIAFjsuAAMAAQQJAQMAKjtEQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIFNlbWlib2xkUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1TZW1pYm9sZDtBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tU2VtaWJvbGRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9TZW1pYm9sZFR5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAAUwBlAG0AaQBiAG8AbABkAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBTAGUAbQBpAGIAbwBsAGQAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFMAZQBtAGkAYgBvAGwAZABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AUwBlAG0AaQBiAG8AbABkAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARdTb3VyY2VDb2RlUHJvLVNlbWlib2xkAAEBAS769gD69wH6+AwA+vkC+voD+BoEjAwBVfwk+VX6fAUcMZ4PHDQYEckdAADFDxIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3xbuQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2Vy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ACsAKwArACsAKwArACsAKwAmABoAKwArACsAKwArACsAKwBUAFQAVABUAFQAVAA6ADoAOgA6ADoAOgA6AEcAJAAkACQAJAAkAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASAAHAAcABwAHABsAGwAbABsAGwAbABsAGwA9AD0APQA9AAkAVwA8AEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcAEAANAEkASQBJAEkASQAlADUANQA1AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+//sAUgBSAA0AVABUAFQAVABUAFQAVABUAFQAVABUAFQAVAAxAFoAWgBHAEcAGwBHAEcARwBHAEcAMABSAFIAUgBSAFIAUgBS/94ANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1AAsANQA1ADUANQA1ADUANQCCAGwAggB4AHgARgA+AD4APgA+AD4APgA+AEoAOwA7ADsAOwA7ADsARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAAYABgAGAAYAKAAoACgAKAAoACgAKAAoAEcARwBHAEcANQBSADEAUwA1AFIAOAA6AD4ANQBEACcAOgA0ACkABgAnABQAHQAiADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUAIABAAFoAPAAyACUAMwBEAEIAQAA8AEAAWgA8ADIAJQAzAEUAQgBAADwAyQC9AMkAvQAPANUA1QBoAHEA5gBqAMQA0gBIAFYA0gBWALoAyQA+AE0ATgBOAFAAFABQABQAyQCQADwAwgB8ANUAZgBxAGYAVgD5AFYA+QBKAGwAbABRADwAGAAYAGr/9wADACgAKABOAF4AgQCBAEoAnADKAKYAqACmAKgAqAC0AKoAqADhAM4A9QDrAJwAygCmAKgApgCoAKgAtACqAKgA4QDOAPUA6wCcAMoApACoAKYAqACpALQAqgCoAOEAzgD1AOsAnADKAKYAqACmAKgAqAC0AKoAqADhAM4A9QDrAKEAhQCJAKEAowCvAIUAmgC+AI0ApQCsAIgArgC9AHsApQCJAKMAhQDlAJkAnQCXAIUAUwCNAIYAlQCaAJoAlwCFAIUApQAvAEoASQAqADMAaAAwAFcASQAlACAAZAAgAEsAVwBiAC4AFgAWABYAFwAnABYAFgAlABYAFgAWABYAFgAWAE4ATgBdAE4AxwBOAHYAZgBOAE4ATgBiAE4AQABAAE4AGv/3AEYARACmADAAGQAUAEAAJgBfABoADwAgAB4AIAC/AJMAbACcAB4AHgBAAEAAHgAeABkAGf/l/+X/9QBBAFgA8wCLAMQA0gDvANYApADiAJgAmADsAKoA4gCjAOwAkACDAKoAoQDFALwA2gDSAOAApACZAOIA7QCYAJQAkACOAKoApwChAKoA2gDlAIMAlADjAOMAxQDFALwAsQCYAJQAWABYAPAA+AEjANoAlADOAM4AywDgAN4ApwCpAJoAmgCaAJoAmgCUAJoAmgCsAJwArACcAKwAnACiAJwApwCrAKcAqwCnAKsAogCdAKQAnAEBAN4AAAAAAAAAAP/K/8oA9gDAACEAIQD2AMAAEgASAPYAwAD2APYAwADA/8r/yv/K/8oA9gD2AMAAwP/K/8r/yv/KAPYA9gDAAMAAwADAAMAAwP/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/KAEsASwD2AMD/ygCKAPYAigCK/8r/yv/KAPYAigCK/8r/yv/KAPYAigCK/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/KAPb/yv/KAPb/yv/K/8r/ygD2APYA9v/KAMAA9gDA/8oAwP/KAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAA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ASoCpAABAUYCpAABAU0CpAABAUsCpAABASsCpAABAUECpAABATwCpAABAMECpAABATICpAABAToCpAABAS8CqQABATACpAABATUCpAABATsCpAABATcCAQABAJEC2gABAVYCAQABAb0C2gABAToCAQABAaAC5QABATICAQABAJcC2gABAVoCxQABAKwC2gABARUC2gABAT8CAgABATwCAQABAT4CAQABATACAQABAVQCAQABATQCAQABAQgCigABAScCAQABAS4CAQABAS0CAQABAUICAQABAa8CtgABAS8CpAABAZECpAABAT4CpAABATkCAQABAVoCAQABAT0CAQABATgCAQABATYCAQABARwCAQABASICAQABASUCAQABASoCAgABAZACAQABAPICAQABARoCAQABASwC1gABASwCxwABBEYETgABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVsAAAABATQAAAABAVUAAAABATgAAAABAXYAAAABBBYEJAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAAngCYAJgAwgDmAOwAmADyAPgA5gD+AQQBCgDsARAA8gEWARwAzgEiAPgAngCYASgBLgE0AQQBOgDgAMgBQACYAUYBTACYAJgBUgEWAJgA4AFYAV4BZADIAVIAngCqAWoBcADIAXYBfADIAUABggGIAWQBjgABASz/6gABATb/6gABAVv/6gABASL/6gABAUb/6gABAMD/6gABAU//6gABASv/6gABAS7/6gABAUr/6gABAVP/6gABAJn/6gABAUD/6gABAS//6gABAST/6gABATf/6gABATL/6gABAVX/6gABATT/6gABATr/6gABASL/GwABAVr/6gABAO7/FwABAW7/6gABAIv/JgABAb//JgABAMr/6gABAXb/6gABAS3/6gABAQv/DwABAT3/6gABAUX/6gABATP/6gABAUP/6gABATj/6gABAcn/JgABASn/6gABAIH/6gABAW//6gABAQn/DwABAQD/6gABAcr/JgABAroCwAABAAwAEgABAAAADgADAA4AFAAaAAEBLAHrAAEBpgKEAAEB/AKYAAEBnQHrAAECmAKgAAEADAAWAAIAAAAk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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAUlwAAAAOkNGRiAHSupxAABIqAAA5CBEU0lHE/UMPwABSawAACBYR0RFRi8sL9AAATRQAAAA1EdQT1MlBRrrAAFAWAAACRhHU1VC3Z7yFQABNSQAAAsyT1MvMnQA0tUAAAFQAAAAYGNtYXDp1MYJAAA+eAAAChBoZWFk+7+HegAAAOwAAAA2aGhlYQZXAOAAAAEkAAAAJGhtdHiJeIp6AAEsyAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZU1Di90AAAGwAAA8x3Bvc3T/uAAzAABIiAAAACAAAQAAAAEEWmW2IDdfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/u/5wAsED6AABAAMAAgAAAAAAAAABAAAD2P7vAAACWP+7/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAK8AAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwcJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAIAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAIgGeAAEAAAAAAAAARQAAAAEAAAAAAAEADwBFAAEAAAAAAAIABABUAAEAAAAAAAMAIwBYAAEAAAAAAAQAFAB7AAEAAAAAAAUAOQCPAAEAAAAAAAYAEgDIAAEAAAAAAAcAYADaAAEAAAAAAAgAGgE6AAEAAAAAAAkADAFUAAEAAAAAAAsAGQFgAAEAAAAAAA0R2QF5AAEAAAAAAA4AJBNSAAEAAAAAAQAAFhN2AAEAAAAAAQEACxOMAAEAAAAAAQIACxOXAAEAAAAAAQMAFROiAAMAAQQJAAAAihO3AAMAAQQJAAEAHhRBAAMAAQQJAAIACBRfAAMAAQQJAAMARhRnAAMAAQQJAAQAKBStAAMAAQQJAAUAchTVAAMAAQQJAAYAJBVHAAMAAQQJAAcAwBVrAAMAAQQJAAgANBYrAAMAAQQJAAkAGBZfAAMAAQQJAAsAMhZ3AAMAAQQJAA0jthapAAMAAQQJAA4ASDpfAAMAAQQJAQAALDqnAAMAAQQJAQEAFjrTAAMAAQQJAQIAFjrpAAMAAQQJAQMAKjr/Q29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvQm9sZDEuMDE3O0FEQkU7U291cmNlQ29kZVByby1Cb2xkO0FET0JFU291cmNlIENvZGUgUHJvIEJvbGRWZXJzaW9uIDEuMDE3O1BTIDEuMDAwO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU5MDBTb3VyY2VDb2RlUHJvLUJvbGRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxUeXBvZ3JhcGhpYyBhbHRlcm5hdGVzQWx0ZXJuYXRlIGFBbHRlcm5hdGUgZ0FsdGVybmF0ZSBkb2xsYXIgc2lnbgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBCAG8AbABkADEALgAwADEANwA7AEEARABCAEUAOwBTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0AQgBvAGwAZAA7AEEARABPAEIARQBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwAgAEIAbwBsAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEIAbwBsAGQAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAADAAAAAwAAAhQAAQAAAAAAHAADAAEAAAIUAAYB+AAAAAkA9wABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHNAc4BzwHQAdEB0gHTAdQB1QHWAeMB5AKaApkCmwHoAhMAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbAgECBwICAp8B/gLLABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQIDAgYCBAKhAAAAOgA9AE4AWACMAJUAwQDoAOcA6QDrAOoA7gD/AQkBCAEKAQwBJQEkASYBKAE/AUYBRQFHAUkBSAFzAXIBdAF2AgoCdAJ6AncCDAH9Ag0BawIQAg4CEQLMAtUCoABMAKECpQKeApwCnQJ4AqYCpwKsAq0CpAKoAlICVAAAAP0BVQHpAecCowKpAnsCogKqAfQB9QHlAx8ANgA5AJQAogFWAfgB+QHuAe8B7AHtApcCxAGQANsChgJ5AfIB8wGrAawCCwH8AfAB8QKKADgAWQA3AFsAVwB0AHUAdwBzAJIAkwAAAJEAvgC/AL0BMALNAtQC1gLXAtoC2ALbAtkC3ALOAAQH/AAAARYBAAAHABYALwA5AEAAWgBgAHoAfgC/AMQA0QDWAN8A5ADxAPYBMQFJAWUBfgGAAY8BkgGhAbAB3AHnAesCGwI3AkMCUgJUAlkCYQJlAm8CeQKHAo4CngKwArMCuAK8Ar8CzALdAuMDBAMMAw8DEwMbAyQDKAMuAzEDwB1DHUkdTR1QHVIdWB1bHZwdoB27Hg8eIR4lHiseOx5JHmMebx6FHo8ekx6XHp4e+SAHIBUgGiAeICIgJiAwIDMgOiBEIHEgeSB/IIkgjiCUIKEgpCCnIKwgsiC1ILohEyEXISAhIiEmIS4hVCFeIZMiAiIGIg8iEiIVIhoiHiIrIkgiYCJlJZ8loCWzJbclvSXBJcYlyiYRJmonEydS+wL//wAAACAAMAA6AEEAWwBhAHsAoADAAMUA0gDXAOAA5QDyAPcBNAFMAWgBgAGPAZIBoAGvAc0B5gHqAhgCNwJDAlACVAJYAmECZQJvAnkChwKMAp4CsAKyArcCuwK+AsYC2ALhAwADBgMPAxIDGwMjAyYDLgMxA8AdQx1HHU0dTx1SHVYdWx2cHaAdux4MHiAeJB4qHjYeQh5aHmwegB6OHpIelx6eHqAgByASIBggHCAgICYgMCAyIDkgRCBwIHQgfSCAII0glCChIKQgpiCrILEgtSC5IRMhFyEgISIhJiEuIVMhWyGQIgIiBiIPIhEiFSIZIh4iKyJIImAiZCUAJaAlsiW2JbwlwCXGJckmECZqJxMnUvsB//8AAAGdAAD/wQAA/7sAAAAA/3YAAP+/AAAABwAAAFMAAAAAAAAAAP9+/1cA6QAAAAAAAAAAAAAAAP9k/gr/TP9L/0j/Qf8+/zX/LP8f/xv/DP+sAAAAAAAMAAsABwAAAAAAAAAA/+b/5f/e/9cAAP/T/9H+5OUSAADlDgAA5REAAOUP5LvkuuSzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLa4hkAAOMZAAAAAAAAAADhv+Ja4pPhueJCAADhqgAA4ajhpeHd4dvh2eHYAADh0OHO4cvhm+D44PLg7+GF4YHhO+E14SDgpeCk4J4AAOByAADgh+B94FrgQOA43iPdFN0G3QTdANz+3O8AANyw3Fnbr9tlBqoAAQEWAAABMgAAATwAAAFEAUoAAAGGAAABnAAAAaoAAAHAAjQCXgKQAAAAAAAAArYCuAK6AtgC2gLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyALKAAAAAAAAAsYC0ALUAtwAAAAAAAAAAALgAAAAAAAAAAAC3AAAAt4AAALeAAAAAAAAAAAC2gLgAuIC5ALmAvAC/gMQAxYDIAMiAAAAAAMgAAAD0APWA9oD3gAAAAAAAAAAAAAD2AAAA9gAAAAAAAAAAAAAAAAD0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0AAADtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOeAAAAAAAAAAAAAAAAAAEB5gHrAhUCdgKJAcwB6gH/AgACCQKUAeIB9gHhAgUB4wHkApoCmQKbAegCEwIBAgcCAgKfAf4CywIDAgYCBAKhAx8B5wJ6AncCdQJ4AggCDALVAg4CUgH0AqMB9wIQAtYCdAKeAhwCHQLMAqYCDQH8AtsCGwJUAfUCiwKMAo0B6QA9AEwATgBXAFgAWQBbAHMAdAB1AHcA5ACMApYAoQC9AL4AvwDBANkA5QFrAO4A/QD/AQgBCQEKAQwBJAElASYBKAGZAT8ClwFVAXIBcwF0AXYBjgGaAZAAOwDsADwA7QBLAPwATwEAAFABAQBSAQMAUQECAFMBBABWAQcAXAENAF0BDgBeAQ8AZwEYAFoBCwBoARkAaQEaAGoBGwBrARwAbwEgAHIBIwB2AScAeAEpAHkBKgB+AS4AegEwAH8BMQCAATIBMwCBATQAgwE3AIIBNQCEATYAiAE7AIoBPQCNAUAAiwE+AUQAlgFKAJcBSwCYAUwAogFWAKoBXgCsAV8AqwFgALABZACxAWUAswFnALIBZgC5AW0AuAFsAMABdQDCAXcAwwF4AMQBeQDFAXoAzQGCANYBiwDaAY8A2wDgAZUA4gGXAOEBlgCjAVcAzgGDAD4A7wB7ASsAmQFNAMYBewDHAXwAyAF9AMkBfgDKAX8AbAEdAKkBXQC0AWgAugFuAl4CZgJrAm0C1wLaAtgC3ALUAtkCYAJnAmwC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC/AL9Av8CVgJYAlkCXwJhAmQCaAJpAFQBBQBVAQYAbQEeAHABIQBxASIAhQE4AIYBOQCHAToAiQE8AI4BQQCPAUIAkAFDAK0BYQCuAWIArwFjALUBaQC2AWoAuwFvALwBcADUAYkA1QGKANcBjADcAZEA4wGYAD8A8ABAAPEAQQDyAEIA8wBDAPQARAD1AEUA9gBGAPcARwD4AEgA+QBJAPoASgD7AF8BEABgAREAYQESAGIBEwBjARQAZAEVAGUBFgBmARcAfAEsAH0BLQCaAU4AmwFPAJwBUACdAVEAngFSAJ8BUwCgAVQApAFYAKUBWQCmAVoApwFbAKgBXADLAYAAzAGBAM8BhADQAYUA0QGGANIBhwDTAYgA2AGNAN0BkgDeAZMA3wGUAfoB+AH5AfsB7AHtAfAB7gHvAfECCgILAf0CGgJdAiQCJQJiAoACeQKsApUCmAKpArYCxAADAAAAAAAA/7UAMgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAEAgABAQETU291cmNlQ29kZVByby1Cb2xkAAEBAS769gD69wH6+AwA+vkC+voD+BQEjAwBRvwk+VX6fAUcMkMPHDS9EcsdAADOrhIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW2xbqQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBCb2xkU291cmNlIENvZGUgUHJvAS4CAAEASACAAKYAxwEKAVsBpAG+AfMCSwJlAm4CcgKMApYCswLXAuQC8AM/A0cDZAOLA64DswPNA9cEDQQZBCkELQQ6BIIEmQThBOwFdAWB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AEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAABAAEAAQABAAQABAAEAAQABAAEAAQABAAOAA4ADgAOAACAEkAOgA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9ABAABgBDAEMAQwBDAEMAGQAvAC8ALwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANAA0ADQANAA0ADQANP/uAEgASAAGAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AKgBMAEwAPgA+AAwAPgA+AD4APgA+ACQASABIAEgASABIAEgASP/SAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAMAC8ALwAvAC8ALwAvAC8AdABkAHQAaQBpAEEANQA1ADUANQA1ADUANQA9ADEAMQAxADEAMQAxAD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgAEAAQABAAEAB8AHwAfAB8AHwAfAB8AHwBGAEYARgBGAC8ASAAqAEgALwBIADQANgA3AC8APAAgADQAMgAfAAQAHQAPAAcACwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvABcAOABSADMAKgAjAC4APAA+AD0ANQA4AFIAMwAqACMALgA9AD4APQA1ALgAtgC4ALb//wDIAMgAYgBnANcAUgC4AMoAMwBFAMoARQCvAMAAKgA7AEYARgBQABQAUAAUALgAiAA8ALUAfgDJAGkAagBpAEoA6wBKAOsAQABZAFkARwAwABMAEwBl//P/9wAfAB8ARgBUAHwAfABAAJgAxACeAKUAoQClAKEAsQCmAKQA1gDHAO0A4wCYAMQAngClAKEApQChALEApgCkANYAxwDtAOMAmADEAJwApQChAKUAogCxAKYApADWAMcA7QDjAJgAxACeAKUAoQClAKEAsQCmAKQA1gDHAO0A4wCaAIAAhQCaAJoAqgCAAJQAtwCFAJwAqQCFAKAAtgBzAJwAhQCaAIAA1gCRAJYAkAB2AFMAfACBAJcAlACUAJQAgACAAJwAJABAAEMAHwAtAGAALgBPAEMAGwAVAFsAFgBDAE8AWAAkABEAEQAR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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 900; + src: local('Source Code Pro Black'), local('SourceCodePro-Black'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAATq8AAAAOkNGRiDcZxQDAABI+AAA1VlEU0lHIymbLAABOvgAACBYR0RFRi8sL9AAASXcAAAA1EdQT1NOSdIWAAEx5AAACNZHU1VC3Z7yFQABJrAAAAsyT1MvMnTI07UAAAFQAAAAYGNtYXDp1MYJAAA+yAAAChBoZWFk+7OHeAAAAOwAAAA2aGhlYQZMAOAAAAEkAAAAJGhtdHh8E3yCAAEeVAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZbSud8oAAAGwAAA9GHBvc3T/uAAzAABI2AAAACAAAQAAAAEEWpUd6D1fDzz1AAMD6AAAAADNFZ/zAAAAAM0Vn/P/sP5wAsED6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP+w/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAOEAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwgJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFQBFAAEAAAAAAAIABwBaAAEAAAAAAAMAJABhAAEAAAAAAAQAFQBFAAEAAAAAAAUAOQCFAAEAAAAAAAYAEwC+AAEAAAAAAAcAYADRAAEAAAAAAAgAGgExAAEAAAAAAAkADAFLAAEAAAAAAAsAGQFXAAEAAAAAAA0R2QFwAAEAAAAAAA4AJBNJAAEAAAAAABAADxNtAAEAAAAAABEABRN8AAEAAAAAAQAAFhOBAAEAAAAAAQEACxOXAAEAAAAAAQIACxOiAAEAAAAAAQMAFROtAAMAAQQJAAAAihPCAAMAAQQJAAEAKhRMAAMAAQQJAAIADhR2AAMAAQQJAAMASBSEAAMAAQQJAAQAKhRMAAMAAQQJAAUAchTMAAMAAQQJAAYAJhU+AAMAAQQJAAcAwBVkAAMAAQQJAAgANBYkAAMAAQQJAAkAGBZYAAMAAQQJAAsAMhZwAAMAAQQJAA0jthaiAAMAAQQJAA4ASDpYAAMAAQQJABAAHjqgAAMAAQQJABEACjq+AAMAAQQJAQAALDrIAAMAAQQJAQEAFjr0AAMAAQQJAQIAFjsKAAMAAQQJAQMAKjsgQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIEJsYWNrUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1CbGFjaztBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tQmxhY2tTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9CbGFja1R5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAAQgBsAGEAYwBrAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBCAGwAYQBjAGsAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEIAbABhAGMAawBTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AQgBsAGEAYwBrAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCm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8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBCbGFja1NvdXJjZSBDb2RlIFBy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ADYANgA2ADYAEAAAAD4APgA+AD4APgAPACoAKgAqADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAsACwALAAsACwALAAs/+MAQABAAAAASgBKAEoASgBKAEoASgBKAEoASgBKAEoASgAlAEAAQAA2ADYAAAA2ADYANgA2ADYAGgBAAEAAQABAAEAAQABA/8cAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAAwAKgAqACoAKgAqACoAKgBoAF4AaABeAF4APAAuAC4ALgAuAC4ALgAuADIAKgAqACoAKgAqACoAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAIAAgACAAIAGAAYABgAGAAYABgAGAAYAEYARgBGAEYAKgBAACUAQAAqAEAAMAAyADIAKgA2ABoAMAAwABgAAgAWAAr/9v/6ACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAEAAyAEsALAAkACEAKgA2ADsAOgAwADIASwAsACQAIQAqADYAOwA6ADAAqgCxAKoAqv/zAL4AvgBeAGAAzABAAK4AwgAiADYAwgA2AKYAuAAaACwAQABAAFAAFABQABQAqgCCADwAqgCAAL8AawBkAGsAQADgAEAA4AA4AEoASgBAACYADgAOAGH/8P/uABgAGABAAEwAeAB4ADgAlAC/AJgAogCdAKIAnACvAKIAoADOAMIA5gDcAJQAvwCYAKIAnQCiAJwArwCiAKAAzgDCAOYA3ACUAL8AlgCiAJ0AogCcAK8AogCgAM4AwgDmANwAlAC/AJgAogCdAKIAnACvAKIAoADOAMIA5gDcAJUAfQCBAJUAkwCmAH0AjwCxAH8AlQCnAIIAlQCxAG0AlQCBAJMAfQDLAIsAkQCLAGsAVABuAH0AmQCPAI8AkQB9AH0AlQAbADgAPwAXACgAWgAtAEgAPwAUAA0AVAAOADwASABRABwADAAMAAwADQAYAAwADAAMAAwADAAMAAwADAAMAEAAQABNAEAAqgBAAHIAXgBAAEAAQABMAEAAKgAqAEAABP/vADgANQCEABYABgAGADcADgA7ABoADAAeACAAHgCuAH4AWgCLABIAEgA0ADQAEgASAAwADP/h/+H/7AAsAEYA2wBZAK4AwgDlAM0AfgDUAH4AfgDWAJwA1AB+ANYAdgBiAJwAkgC0AKQAvgC+AM4AfgB+ANQA2AB+AHgAdgB4AJwAmACSAJ4AvgDMAGIAdgDUANQAtAC0AKQAmAB+AHgANgA2AOIA8AEiAL4AdgC+AL4AvgDOAMoAnACcAIAAgACAAIAAgAB4AIAAgACYAIIAmACCAJgAggCQAIIAnACeAJwAngCcAJ4AlACMAJAAggD5ANAAAAAAAAAAAP+w/7AA3ACMACEAIQDcAIwAEgASANwAjADcANwAjACM/7D/sP+w/7AA3ADcAIwAjP+w/7D/sP+wANwA3ACMAIwAjACMAIwAjP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+wAEsASwDcAIz/sAA8ANwAPAA8/7D/sP+wANwAPAA8/7D/sP+wANwAPAA8/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+wANz/sP+wANz/sP+w/7D/sADcANwA3P+wAIwA3ACM/7AAjP+wAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAAABYAAQUKAAMADAA2AFgABQAMABIAGAAeACQDDQACAt0DCwACAt8DEQACAuMDGwACAucDDwACAu0ABAAKABAAFgAcAxUAAgLdAxMAAgLfAxkAAgLjAxcAAgLtAAQACgAQABYAHAMJAAIC3QMFAAIC3wMDAAIC5QMHAAIC8wABBJoAEAAmADAAOgBEAE4AWABiAGwAdgCAAJIAnACmALAAugDEAAEABABLAAIC/wABAAQAZwACAv8AAQAEAG4AAgLj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AxkDGwMfAAAAAQAAAAoAOACSAAJERkxUAA5sYXRuAB4ABAAAAAD//wADAAAAAgAEAAQAAAAA//8AAwABAAMABQAGbWFyawAmbWFyawA2bWttawBGbWttawBMc2l6ZQBSc2l6ZQBWAAAABgAAAAEAAgADAAQABQAAAAYAAAABAAIAAwAEAAUAAAABAAYAAAABAAYAUgAAAE4AAAAHABAAGgAiACoAMgA6AEIAAQAAAAIARABOAAQAAAABAEwABAAAAAEDMgAEAAAAAQNsAAQAAAABBSAABAAAAAEFSgAGAQAAAQWoAGQAAAAAAAAAAAABBqAABf7U/agAAQagAAT9qAABBqIGuAABAAwA6gA3AAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSANgA3gDkAOoA8ADGAOQA9gD8AMYBAgDGAQgBAgEOAQIAxgDGAMYAxgDGAMYBFAEaASABJgEsATIBOAE+AUQBSgFKAVABVgFcAWIAwAFoAW4BdAF6AYABhgGMAZIAwAGYAWgAxgGeAN4AxgECAaQAxgDGAMYAxgGqARoBsAG2AbYAwAFiAMAAwAGGAYYBIAG2ATIBegG8AcIByAHOAdQB2gHgAeYB7AGMAZIBGgHyAXoBegHUAfgB/gABASwCCgABASwCoAABARsCoAABAWQCoAABASgCoAABAT4CoAABAUICoAABAUoCoAABASsCoAABATQCoAABAMUCoAABATICoAABATgCoAABAS4CoAABAToCoAABATICCgABAJwC2gABAVQCCgABAbYC2gABATgCCgABAZoC5QABAS8CCgABAJcC2gABAVgC3QABAKIC2gABAQoC2gABAUQCDAABAToCCgABAUQCCgABATUCCgABAVICCgABATwCCgABAQoCmAABASgCCgABAS4CCgABAS0CCgABATQCCgABAYsCtgABAYQCoAABAUACoAABATcCCgABAVgCCgABAT4CCgABAR4CCgABASQCCgABATECCgABATYCCgABASYCCgABATACDAABAY4CCgABAP4CCgABASACCgABASwC5AABASwC0AABBEAESAABAAwAFgACAAAAGAAAABgABgAUAA4ADgAaACAAJgABASwAAAABAVwAAAABAVQAAAABATYAAAABAXQAAAABBBYEJAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAA5gCYAJgA7ADyAPgAmADmAP4BBAEKAOYA/gEQARYBHAEiASgA4AEuAPIAyACYATQBOgFAAUYBTADOAPIBUgCYAVgAzgCYAJgBXgEiAJgAzgEEAWQAzgDsAWoA/gFwAXYBfADmAYIBiADyAVIBjgGUAM4BdgABASz/6gABATr/6gABAVz/6gABASL/6gABATz/6gABAMj/6gABAU7/6gABASv/6gABATD/6gABAT7/6gABAUb/6gABAKH/6gABAUD/6gABATb/6gABASj/6gABAS7/6gABASD/6gABATj/6gABATP/6gABAVT/6gABASb/6gABART/GwABATH/6gABAVj/6gABAPH/EwABAWb/6gABAJH/JgABAbv/JgABAMz/6gABATL/6gABAWz/6gABAS3/6gABAQv/DwABAUz/6gABAUL/6gABAUf/6gABASX/6gABAcb/JgABASf/6gABAJT/6gABAXL/6gABAQn/DwABAQT/6gABArQCugABAAwAEgABAAAADgADAA4AFAAaAAEBLAH0AAEBqgKAAAECBAKUAAEBngH0AAECkgKaAAEADAAWAAIAAAAkAAAAJAAMACAAJgAsABoAGgAyADgAPgA4ADIARABKAAEBLAAAAAEB7AAAAAEBogAAAAEBGgAAAAEBlAAAAAEBjAAAAAEBYgAAAAEBJQAAAAEBqAAAAAEBHgJQAAEADADqADcAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADmAAAA5gAA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) format('truetype'); +} +@font-face { + font-family: 'clipperz-icons'; + font-style: normal; + font-weight: normal; + src: url(data:application/x-font-ttf;charset=utf-8;base64,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X25fZQdzX2Ffdl9lB3RfYV9nX3MHZF9vX25fZQdiX2FfY19rB2VfZF9pX3QHZV94X2lfdAV0X2FfZwVhX2RfZANnX28AAAAB//8AAgABAAAADgAAACQAAAAAAAIAAwADAAMAAQAEAB4AAgAfADYAAQAEAAAAAgAAAAEAAAAKAB4ALAABbGF0bgAIAAQAAAAA//8AAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQHWAA0AIABiAIoAnAC2ANoBAAEsAXABiAGcAaYByAAEAAoAHAAqADgABQAIACAALwAhACYAIAAkAB8ADgAGACIAKwAkACUAJgASAAYAIgAmACIAKwAiABgABAAgACEAIgADAAgAFAAeABQABQA0ACQAJQAmABoABAAfACUAKwAbAAQANgAlACsAAQAEABAABgAkACUAJgAiAB8AAgAGABIAEwAFACYAIgAsACsAHQADAB8AHwACAAYAFgAMAAcAIAAkAB8AJQAhAC0ADQAGACAAJwAoACIAHwACAAYAGAAIAAgAJgAlADAAMAAiACwAMQAPAAYAJAAhACcAIgAmAAIABgAaAAQACQAhACoAKwAkACwALAAiAB8ABgAIACEAJgAgACcAKAAiAB8ABAAKABwALAA6AAcACAAiACsAKwAlACEALQAqAAkABwArACQALAAsACIAHwARAAYAIgAkACwAJwAuABYABAAkADIAIgACAAYAEAAXAAQAJAAtACoAHAADACQALQABAAQACwAHACIAIwAsACIAKgAuAAEABAAeAAIAIAACAAYAFgAKAAcAJAAzADQAIgAhACsAFQAFAC4AIAAhACIAAQAEABkABAAkACcAKAABAA0AHwAiACMAJAAmACcAKQAqACsALAAtADAANQABAAAACgAcAB4AAWxhdG4ACAAEAAAAAP//AAAAAAAAAAAAAQAAAADJiW8xAAAAAM5FKjwAAAAAzkUqPA==) format('truetype'); +} +/* +@font-face { + font-family: 'blokkregular'; + font-style: normal; + font-weight: normal; + src: url(data:application/x-font-ttf;charset=utf-8;base64,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AUMAAwABBAkACQASAW0AAwABBAkACgBMAX8AAwABBAkACwAuAcsAAwABBAkADABgAfkAAwABBAkADQBQAlkAAwABBAkADgBcAqkAAwABBAkAEwBSAwUAAwABBAkAyAAWA1cAAwABBAkAyQAwA21GaXZlIGJpZyBxdWFja2luZyB6ZXBoeXJzIGpvbHQgbXkgd2F4IGJlZABDAG8AcAB5AHIAaQBnAGgAdAAgAGIAYQBrAGsAZQBtAG8AZQBuACAAMgAwADEAMwBCAEwATwBLAEsAUgBlAGcAdQBsAGEAcgBGAG8AbgB0AFMAdAByAHUAYwB0ACAAQgBMAE8ASwBLAEIATABPAEsASwAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAEIATABPAEsASwBGAG8AbgB0AFMAdAByAHUAYwB0ACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAARgBTAEkAIABGAG8AbgB0AFMAaABvAHAAIABJAG4AdABlAHIAbgBhAHQAaQBvAG4AYQBsACAARwBtAGIASABoAHQAdABwADoALwAvAGYAbwBuAHQAcwB0AHIAdQBjAHQALgBjAG8AbQBiAGEAawBrAGUAbQBvAGUAbiAaAMQA+gBCAEwATwBLAEsgGgDEAPkAIAB3AGEAcwAgAGIAdQBpAGwAdAAgAHcAaQB0AGgAIABGAG8AbgB0AFMAdAByAHUAYwB0AAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGYAbwBuAHQAcwBoAG8AcAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABzAHQAcgB1AGMAdAAuAGMAbwBtAC8AZgBvAG4AdABzAHQAcgB1AGMAdABpAG8AbgBzAC8AcwBoAG8AdwAvADcANwAwADgAMgAzAEMAcgBlAGEAdABpAHYAZQAgAEMAbwBtAG0AbwBuAHMAIABBAHQAdAByAGkAYgB1AHQAaQBvAG4AIABTAGgAYQByAGUAIABBAGwAaQBrAGUAaAB0AHQAcAA6AC8ALwBjAHIAZQBhAHQAaQB2AGUAYwBvAG0AbQBvAG4AcwAuAG8AcgBnAC8AbABpAGMAZQBuAHMAZQBzAC8AYgB5AC0AcwBhAC8AMwAuADAALwBGAGkAdgBlACAAYgBpAGcAIABxAHUAYQBjAGsAaQBuAGcAIAB6AGUAcABoAHkAcgBzACAAagBvAGwAdAAgAG0AeQAgAHcAYQB4ACAAYgBlAGQAVwBlAGIAZgBvAG4AdAAgADEALgAwAFQAaAB1ACAARgBlAGIAIAAgADcAIAAwADkAOgAyADUAOgAwADEAIAAyADAAMQAzAAACAAAAAAAAAMsAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAECAQMAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMAsgCzALYAtwC0ALUBFAEVARYGZ2x5cGgxBmdseXBoMgd1bmkwMEEwB3VuaTAwQUQHdW5pMjAwMAd1bmkyMDAxB3VuaTIwMDIHdW5pMjAwMwd1bmkyMDA0B3VuaTIwMDUHdW5pMjAwNgd1bmkyMDA3B3VuaTIwMDgHdW5pMjAwOQd1bmkyMDBBB3VuaTIwMTAHdW5pMjAxMQpmaWd1cmVkYXNoB3VuaTIwMkYHdW5pMjA1Rgd1bmlFMDAwAAAAuAH/hbABjQBLsAhQWLEBAY5ZsUYGK1ghsBBZS7AUUlghsIBZHbAGK1xYAbABIEWwAytEsAIgRboAAX//AAIrsQNGditEWbAUKwAAAAABURO5PQAA) format('truetype'); +} +*/ +@font-face { + font-family: 'clipperz-password'; + font-style: normal; + font-weight: normal; + src: url(data:application/x-font-ttf;charset=utf-8;base64,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AZP/HwGU/x8Bl/9OAZj/HwGa/04BnP8fAZ7/agGg/7QBo/9qAaT/jwGm/x8Bqv8fAaz/UAGt/x8Brv+PAa//agGxALwBsv9OAbP/HwG0/04AGwAE/9sAEP76ABH/RgAS/voAHv+PAB//jwF4ALwBef9oAXz/aAGA/40Bg/9oAYf/jQGN/40BkP+eAZX/aAGW/7QBmP9GAZr/ngGe/2gBoP+0AaH/aAGj/2gBpv9GAar/RgGt/0YBsQB5AbP/RgADAXn/xQGM/74Bkv++AAoBk/+yAZj/sgGb/7IBn//ZAab/sgGq/7IBrf+yAbD/sgGz/7IBtf+yABUABP/bAXgAqgF5/2gBfP9oAYD/jQGD/2gBh/+NAY3/jQGQ/54Blf9oAZb/tAGY/0YBnv9oAaD/tAGh/2gBo/9oAab/RgGq/0YBrf9GAbEAYgGz/0YABAGi/9kBp//jAav/4wGu/8kAEgGT/3cBlf/bAZj/dwGa/6oBm/+0AZ7/2wGf/54BoP/bAaH/2wGk/6oBpv93Aaf/qgGq/3cBq/+qAa3/dwGw/3cBs/93AbX/dwABAaL/2QANAZP/5wGY/+cBm//nAZ3/5wGf/+cBpf/nAab/5wGp/+cBqv/nAa3/5wGw/+cBs//nAbX/5wANAZP/4QGY/+EBm//hAaX/4QGm/+EBqf/RAar/4QGs/88Brf/bAbD/4QGz/+EBtP/PAbX/4QAKAZP/yQGY/8kBm//JAZ3/yQGl/8kBpv/JAan/yQGq/8kBrf/JAbP/yQAJAZP/4wGY/+MBnf/jAab/4wGp/+MBqv/jAa3/4wGw/+MBtf/jAAMBov/ZAaf/4wGr/+MACgGT/+MBmP/jAZv/4wGd/+MBpv/jAan/4wGq/+MBrf/jAbD/4wG1/+MACwGT/8kBmP/JAZv/yQGd/8kBpv/JAan/yQGq/8kBrf/JAbD/yQGz/8kBtf/JAAUAEP8GABL/BgBu/3cAfv93A5L/0wABA5b/YAABA5b/dwARAckARAHM/+kB0AAtAdP/0wHU/+kB1v/TAdf/YAHY/6YB2f+8Adz/YAHi/9MB5QAXAff/0wH4/+kB+QAXAgIALQOW/40ADgHF/9MBzP/pAdP/6QHW/+kB1/+kAdj/0QHZ/+kB2v/TAdz/pAHf/7wB4v/pAeT/6QHw/+kB+P/TABUBxf+8Acn/0wHL/9MBzP+8AdD/6QHT/7wB1v+8Adf/dwHY/7wB2f+8Adr/pgHc/6QB3/+NAeT/vAHp/+kB8f/pAff/vAH4/+kB+v/pAfz/vAIE/+kAHAAQ/wYAEv8GAG7/dwB+/3cBxf93Acn/dwHM/9MB0P+NAdH/0QHT/40B1v+kAeT/vAHl/40B5/+NAen/dwHq/3cB7f+NAfD/jQHx/40B8v+NAfP/dwH1/40B+P93AgD/jQIB/40CA/+NAgT/dwOS/9MABgHYABcB2f/TAdz/ugHsAEQB8wAXAfgALQACAcz/0wH2/+kACgHM/+kB0//TAdb/6QHXABcB2AAtAd8ALQHlABcB6v/nAfP/6QH4/+kACAHQ/+kB0//pAdb/6QHX/9MB2P/pAdn/6QHc/9MB5P/pAAUBzP/pAdP/6QHW/+kB2AAXAdn/ugADAdn/6QHmABcB+AAXAAkB2f/pAdz/6QHlABcB6gAXAfMAFwH2ABcB+AAXAfz/6QICABcACwHF/9MByf/TAcv/0wHQ/+kB2P/TAdr/pAHc/9MB5P/TAen/0wHw/+kB+v/pABgAEP59ABL+fQAe/9MAH//TAH7/jQHF/3cByf93Acv/6QHM/9MB0P+NAdH/6QHT/9MB1v/pAdf/pAHY/9MB2f/pAdr/pAHk/9MB5f+8Aen/YAHq/6YB8/+mAgL/0wIE/7wADwHF/9MByf/TAcz/6QHQ/7wB0f/pAdP/0wHX/7wB2P+8Adr/jQHc/7wB3/+6AeL/6QHlABcB6wAtAfz/6QAfABD/HQAS/x0Abv+mAH7/pgHF/7wByf+8AcsAFwHM/+kB0P/TAdP/pAHZ/7wB5P/TAeX/pAHn/6YB6v+NAe3/pgHv/6YB8P+kAfH/pgHz/2AB9P+mAfX/jQH2/40B+P+NAfr/pgH+/6YCAP+mAgH/pgID/6YCBP+NA5L/0wAmABD+8AAS/vAAHv/TAB//0wBu/6YAfv+kAcX/dwHJ/6QBzP/TAdD/vAHT/7wB2f+8AeL/0wHk/9MB5v/TAef/jQHo/6QB6f9gAer/dwHr/7wB7P+NAe3/pAHu/7wB7/+kAfD/dwHx/6QB8v+kAfP/dwH0/6QB9f+kAfb/dwH6/6QB+/+kAf3/pAH+/6QCA/+kAgT/dwOS/+kACAHF/9MByf+8AdD/vAHX/40B2P+kAdz/0wHk/7oB8P+8AAcBzP/TAdP/vAHW/7wB2f+8AeL/ugHz/+kB+P/TAAIB0//TAeUALQACAeUAFwH4AC0AAgHk/7wDlv93AA4Bxf/TAcn/0wHL/7wBzP/pAdD/ugHR/9MB0//TAdb/0wHX/zMB2v+kAdz/YAHi/+kB5P+kA5b/YAALAcn/vAHL/+cBzP/pAdD/vAHa/7oB5P/TAen/vAHrABcB8P+8AfH/6QIE/+kADAHF/7wByf+mAcv/0wHQ/6QB0//pAdb/6QHX/40B2v+kAdz/vAHp/6QB8P+kAfH/6QAEAez/6QH3/9MB+P/pAfz/0wAPAeX/0QHp/6QB6v/pAev/6QHs/9MB8P+kAfH/0wH2/+kB+P/TAfn/6QH6/7wB/P+8Af//vAIC/+kCBP/TABAB5f/pAeb/6QHp/+kB6v/pAev/6QHs/+kB8P/RAfH/6QHz/+kB9v/pAff/0wH4/9MB+f/pAfz/pAH//7wCBP/pAAoAEP8GABL/BgHl/9MB6f+kAer/0wHs/+kB8P/TAfP/0wH2/9MCBP/pAAIB///TAgIAFwAJAeb/6QHp/9MB6//pAez/0wHw/7wB9/+8Afj/6QH6/9MB/P+8AAQB5gAXAfgAFwH8/+kB/wAtAAsB5v/pAen/0wHq/+kB7P/pAfD/6QHz/+kB9v/pAfj/6QH5/+kB/P+8Af//0wAKAeUALQHmAC0B6gAXAewAFwHwABcB8wAXAfYAFwH3ABcB+AAXAgIAFwACAfMAFwH8/9MAAwHm/+kB7P/pAfgAFwAIAen/0wHr/+kB7P/pAfD/0wH3/9MB+P/pAfr/6QH8/9MACAHp/9EB7P/pAfD/ugH3/9MB+P/pAfr/6QH8/9MCBP/pAAQB6wAXAfMAFwH8/+kCAgAXAAoAEP8dABL/HQHl/+kB6f+8Aer/6QHrAEQB8P/TAfP/6QH2/+kB+AAXABAAEP8zABL/MwB+ABcB5f/pAeYAFwHp/7wB6v/pAesAFwHw/9MB8f/pAfP/5wH1/+kB9v/pAfn/6QIC/+kCBP/pAAcB5v/pAen/0wHw/9MB9//TAfj/6QH8/9MCBP/pAAkB5f/pAeb/6QHq/+kB7P/pAfP/6QH2/+kB9//pAfn/6QH8/9MABAHq/+kB7P/pAfP/6QH2/+kAAwHq/+kB8//pAfgAFwACAff/YAH8/3cACAHp/9MB6gAXAez/6QHw/9MB8wAXAff/0wH6/+kCBP/pAAcB6f/TAev/6QHw/9MB8f/pAff/0wH6/+kB/P/TAAIAEP8zABL/MwAHABD/BgAS/wYAHv/TAB//0wBu/2AAfv9gA5L/0wABA5X/2wADAAT/tABX/9sDlv/bAAUBuP9gAcH/YAHX/2AB3P+8Ad//vAABAGkABAAVACUAKgAwADQANgA4ADoAOwA9AEoAVgBaAFsAXQFwAXUBdgF3AXkBewF8AYABggGDAYcBiQGKAYsBjAGNAY8BkAGSAZsBnQGfAaEBogGlAaYBpwGoAasBrQGuAbABswG1AbkBvwHAAcUBxgHHAcgByQHKAcsBzAHPAdAB0QHTAdUB1gHXAdgB2QHaAdsB3gHfAeEB4gHjAeUB5gHnAegB6QHqAesB7AHvAfAB8QHzAfUB9gH3AfgB+QH6AfsB/gIBAgICAwIRAhMDlQOWA5sAAQAAAAoAfADiAAVERkxUACBhcmFiACpjeXJsAFRncmVrAF5sYXRuAGgABAAAAAD//wAAAAoAAU1BUiAAGgAAAAAABQACAAMABAAGAAcAAAAAAAUAAQADAAUABgAHAAQAAAAA//8AAAAEAAAAAP//AAAABAAAAAD//wAAAAggUlFEADJmaW5hADhmaW5hAD5pbml0AERpc29sAEppc29sAFBsaWdhAFhtZWRpAGAAAAABAAYAAAABAAQAAAABAAUAAAABAAIAAAABAAEAAAACAAAAAQAAAAIABgAHAAAAAQADAAgAEgAaACIAKgAyADoAQgBKAAEAAQABAEAAAQABAAEARAABAAEAAQBSAAEAAQABAWgAAQABAAECfgABAAEAAQPwAAQACQABBWIABAAHAAEGdAABAAYDrgABAAEC2QACAAwAAwTEAusCaAABAAMC7ALtAu4AAgCuAFQE5wTrBO8E8gT1BPgE+wUCBQUFCAULBQ4FEQUUBRcFGgUdBSAFIwUmBSkFMQX5BfoEmgSUBIsGDgYRBI4ElwSRBhQGFwSmBKMGGgSpBKwGKQYsBi8GMgY1AswGOQX6BjwGPwSdBkIEoAUaBJ0GRwZKBk0EywZQBLkGUwS/BlYEvAZZBlwGXwZiBmUGaASaBmsEjgZvBMUGdQTUBnoGfQaABLYExwUxBMcAAgASAmUCZQAAAmcCZwABAmkCbQACAnICeQAHAnsCgAAPAoMCgwAVApwCnQAWAqYCtAAYAscC5QAnAucC6gBGAuwC7ABKAvgC+ABLAvoC+gBMAxoDHABNBLQEtABQBMcExwBRBNYE1gBSBSsFKwBTAAIArgBUBOgE7ATwBPME9gT5BPwFAwUGBQkFDAUPBRIFFQUYBRsFHgUhBSQFJwUqBTIF+QX7BJsElQSMBg8GEgSPBJgEkgYVBhgEpwSkBhsEqgStBioGLQYwBjMGNgY3BjoF+wY9BkAEngZDBKEFGwSeBkgGSwZOBMwGUQS6BlQEwAZXBL0GWgZdBmAGYwZmBmkEmgZsBI8GcATGBnYE1QZ7Bn4GgQS3BS0FMgUtAAIAEgJlAmUAAAJnAmcAAQJpAm0AAgJyAnkABwJ7AoAADwKDAoMAFQKcAp0AFgKmArQAGALHAuUAJwLnAuoARgLsAuwASgL4AvgASwL6AvoATAMaAxwATQS0BLQAUATHBMcAUQTWBNYAUgUrBSsAUwACASIAjgTjBOQE5QTmBOkE6gTtBO4E8QT0BPcE+gT9BP4E/wUABQEFBAUHBQoFDQUQBRMFFgUZBRwFHwUiBSUFKAUuBS8FMAKcAp0EiQYHBggGCQYKBgsGDASZBJMEigYNBhAEjQSWBJAGEwYWBKUEogYZBKgEqwSxBhwGHQYeBK8ErgSwBh8GIASzBiEGIgYjBiQGJQYmBLIGJwYoBisGLgYxBjQGNwY4As4GOwY+BJwGQQSfBkQGRQZGBkkGTAaIBk8EuAZSBL4GVQS7BlgGWwZeBmEGZAZnBMEEwgZqBm0GbgTDAuwC7QLuBnEE0QTOBM0EzwTSBnIE0AZzBnQGdwTTBngEyATJBnkGfAZ/BLUFLATXBOIFLAU0BTYFOAU6AAIADgJiAnkAAAJ7AoMAGAKcAp0AIQKfAv0AIwMaAxwAggS0BLQAhQTHBMcAhgTWBNYAhwThBOEAiAUrBSsAiQUzBTMAigU1BTUAiwU3BTcAjAU5BTkAjQACASIAjgTjBOQE5QTmBOkE6gTtBO4E8QT0BPcE+gT9BP4E/wUABQEFBAUHBQoFDQUQBRMFFgUZBRwFHwUiBSUFKAUuBS8FMAKcAp0EiQYHBggGCQYKBgsGDASZBJMEigYNBhAEjQSWBJAGEwYWBKUEogYZBKgEqwSxBhwGHQYeBK8ErgSwBh8GIASzBiEGIgYjBiQGJQYmBLIGJwYoBisGLgYxBjQGNwY4As4GOwY+BJwGQQSfBkQGRQZGBkkGTATKBk8EuAZSBL4GVQS7BlgGWwZeBmEGZAZnBMEEwgZqBm0GbgTDAuwC7QLuBnEE0QTOBM0EzwTSBnIE0AZzBnQGdwTTBngEyATJBnkGfAZ/BLUFLATXBOIFLAU0BTYFOAU6AAIADgJiAnkAAAJ7AoMAGAKcAp0AIQKfAv0AIwMaAxwAggS0BLQAhQTHBMcAhgTWBNYAhwThBOEAiAUrBSsAiQUzBTMAigU1BTUAiwU3BTcAjAU5BTkAjQABAQIACgAaAHAAsgC8AMYA0ADaAOQA7gD4AAoAFgAeACYALAAyADgAPgBEAEoAUATfAAMFJAUsBN8AAwUkAuwGjAACBggGigACBgcFOQACBOkFNwACBOUFNQACBOMFMwACBOIGmgACBIkGjgACBgkACAASABgAHgAkACoAMAA2ADwGmwACBIkGjwACBgkGjQACBggGiwACBgcFOgACBOkFOAACBOUFNgACBOMFNAACBOIAAQAEBpAAAgTpAAEABAaRAAIE6QABAAQGkgACBOkAAQAEBpMAAgTpAAEABAaUAAIE6QABAAQGlQACBOkAAQAEBpYAAgTpAAEABAaXAAIE6QABAAoFIwUkBlwGXQZfBmAGYgZjBmUGZgABADoAAQAIAAYADgAUABoAIAAmACwE3AACAokE2wACAogE2gACAocE2QACAoYE2AACAoUEMgACAoQAAQABAooAAQAAAAFhcmFiAAwABgAAAAAABQJ6BDMF6wXsBe0AAAABA50BkAAFAAQFmgUzAAABGwWaBTMAAAPRAGYCEggFAgsGBAICAgICBAAAeoeAAAAAAAAACAAAAABNb25vAEAADf/8Bmb+ZgAABQAAKEAAAf///wAAAAAAAAADAAAAAwAAABwAAQAAAAAHGgADAAEAAAAcAAQG/gAAAbgBAAAHALgADQB+AX8BjwGSAaEBsAHcAf8CWQLHAskC3QMBAwMDCQMjA4oDjAOhA84D1gQMBE8EXARfBJMElwSdBKMEswS7BOkFuQXDBeoF9AYMBhsGHwYhBjoGRgZVBmsGcwaoBr0GywbrBu0G9gb+HoUe+SAKIBUgHiAiICYgMCAzIDogPCA+IEQgXyBvIH8gpCCnIKwhBSETIRYhIiEmIS4hVCFeIZUhqCICIgYiDyISIhoiHyIpIisiSCJhImUjAiMQIyElACUCJQwlECUUJRglHCUkJSwlNCU8JWwlgCWEJYgljCWTJaElrCWyJbolvCXEJcslzyXZJeYmPCZAJkImYCZjJmYma+AA6AXoGOg68DH7Avsg+zb7PPs++0H7RPtP+1H7VftZ+137Yftl+2n7bftx+3X7eft9+4H7g/uF+4f7ifuL+5H7lfuZ+537n/uh+6b7qvus+6/7sfvW+9j72vvc+9/74fvj++f7/fxi/T/98v6C/oT+hv6I/oz+jv6S/pT+mP6c/qD+pP6o/qr+rP6u/rD+tP64/rz+wP7E/sj+zP7Q/tT+2P7c/uD+5P7s/u7+8P78//z//wAAAA0AIACgAY8BkgGgAa8BzQH6AlkCxgLJAtgDAAMDAwkDIwOEA4wDjgOjA9YEAQQOBFEEXgSQBJYEmgSiBK4EuAToBbAFuwXQBfAGDAYbBh8GIQYjBkAGSAZgBm0GdQaqBr8GzQbtBvQG+h6AHqAgACAMIBcgICAmICogMiA5IDwgPiBEIF8gaiB/IKMgpyCqIQUhEyEWISIhJiEuIVMhWyGQIagiAiIGIg8iESIaIh4iKSIrIkgiYCJkIwIjECMgJQAlAiUMJRAlFCUYJRwlJCUsJTQlPCVQJYAlhCWIJYwlkCWgJaolsiW6JbwlxCXKJc8l2CXmJjomQCZCJmAmYyZlJmrgAOgB6BjoOvAE+wH7Hfsq+zj7PvtA+0P7RvtR+1P7V/tb+1/7Y/tn+2v7b/tz+3f7e/t/+4P7hfuH+4n7i/uN+5P7l/ub+5/7oful+6j7rPuv+7H71PvY+9r73Pvf++H74/vl+/z8Xv0+/fL+gP6E/ob+iP6K/o7+kP6U/pb+mv6e/qL+pv6q/qz+rv6w/rL+tv66/r7+wv7G/sr+zv7S/tb+2v7e/uL+5v7u/vD+8v/8////9v/k/8P/tP+y/6X/mP98/1//Bv6a/pn+i/5p/mj+Y/5K/er96f3o/ef94P22/bX9tP2z/YP9gf1//Xv9cf1t/UH8e/x6/G78afxS/ET8QfxA/D/8Ovw5/C/8Lvwt/Cz8K/wq/Cn8I/wg5J/kheN/437jfeN843njduN143Djb+Nu42njT+NF4zbjE+MR4w/it+Kq4qjineKa4pPib+Jp4jjiJuHN4crhwuHB4brht+Gu4a3hkeF64Xjg3ODP4MDe4t7h3tje1d7S3s/ezN7F3r7et96w3p3eit6H3oTegd5+3nLeat5l3l7eXd5W3lHeTt5G3jrd593k3ePdxt3E3cPdwCQsHCwcGhv5FDAJYQlHCT4JPQk8CTsJOgk5CTgJNwk2CTUJNAkzCTIJMQkwCS8JLgktCSwJKwkqCSkJKAknCSYJJQkkCSMJIgkhCR4JHQkbCRkJGAj2CPUI9AjzCPEI8AjvCO4I2gh6B58G7QZgBl8GXgZdBlwGWwZaBlkGWAZXBlYGVQZUBlMGUgZRBlAGTwZOBk0GTAZLBkoGSQZIBkcGRgZFBkQGQwAABkAGPwY+BT8AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAABSgFKQUqBSsFLATHBS0ABgIKAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAABAAIAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAAACHAIgAigCMAJQAmQCfAKQAowClAKcApgCoAKoArACrAK0ArgCwAK8AsQCyALQAtgC1ALcAuQC4AL0AvAC+AL8DnABzAGUAZgBqA54AeQCiAHEAbAO/AHcAawPaAIkAmwPVAHQD3APdAGgAeAPPA9ID0QGnA9gAbQB9AZAAqQC7AIIAZABvA9QBRAPZA9AAbgB+A58AYwCDAIYAmAEVARYDkQOSA5kDmgOVA5YAugQbAMIBOwOtA7sDqQOqBGIEYwOdAHoDlwObA6YAhQCNAIQAjgCLAJAAkQCSAI8AlgCXAAAAlQCdAJ4AnAD0AWABZwByAWMBZAFlAHsBaAFmAWEFugAZBboAGgWnABkEJgAYAAD/5wAA/+gAAP/n/mn/6AW6ABn+af/oAuoAAAC4AAAAuAAAAAAAqACtAWkArQC/AMIB8AAYAK8AuQC0AMgAFwBEAJwAfACUAIcABgBaAMgAiQBSAFIABQBEAJQBGf+0AC8AoQADAKEAzQAXAFcAfgC6ABYBGP/pAH8AhQPTAIcAhQANACIAQQBQAG8AjQFM/3UAXADfBIMANwBMAG4AcAGA/1j/jv+S/6QApQC5A8j//QALABoAYwBjAM3/7gXY/9wALQBcAJUAmQDfAZIJtQBAAFcAgAC5A50AcgCaA10EAf9n//oAAwAhAHcAzQAEAE0AzQHAAisATABlAOcBGAF8A0MF2P+j/7D/xAADABwAXQBoAJoAugE1AUcCIQVc/03/zQAWAC0AeACAAJkAsgC2ALYAuAC9ANoBDAXw/6T/8AAZACwASQB/ALQAzgHAA/79gf4/AAAABQAYACkAOQBJAG8AvgDHANABIwHBAm8FDAUyBUAFev/UABQAMQBVAFcApwC0AOYB9wJ+An4CfwPGBEb/QgAOAIUAkQC/AMIAxQDhARoBLwFPAVYCKQJvAp4DcgAIACwAMQAxAGQAaQCJAJgAxwDeASsBtgIMAs8DowSrBPsGHf7g/w4ABgAmAJsAnQDBAQ0BGAEgAXMBggHWAeMCQwJfApsC4gOUBKkE0gdhABwAXgBtAI0AqwD3ARIBOAFRAVsBaAF8AYcBkQGZAc0B0AHoAkECVAJrAu8DaANxA70EQgRCBFMEcwSDBYYFiwbo/lj+xP7R/vf/Mv+GAFEAfACBAJEAlQCeALQAuQDPANkA2QDfAOIBBQELAQ4BDgEgASEBVQF7AXsBfgGNAaIBqAGpAbQB0AHQAeIB6QHyAfUB+wIAAgACBgIbAiECIgIiAiMCcgJ3ApQCnALPAs8C0ALsAvkDFwMiAysDNQM8A1kDbwNxA4cDkAOQA7UD4QQaBM8E/wUyBTIFlgWfBagFqwXCBfAGDAeCCAAIzPyj/Sr93v4A/oj+lv6y/rT/4QAVABkAGgAcAB8APABRAGEAYQBqAHgAlgClAK8A0wEMARgBGgEqAT4BTAFRAV8BagFxAXgBggGEAZoBpQGoAakBrgG8Ac0B1wHvAgACDQIcAiECIgIuAjUCQgJPAk8CXgJlAnECkAKSArQC1gL6AwcDCwMPAxUDKgNHA10DZQN0A3kDlgOwA8wD3QPiA/YD/AP8A/8ECgQfBCIEJgQrBEcEXwR1BJ4E5wTnBVwFywXlBgoGbQaGBrgG8Qc2Bz4HUAdRB10Hjwe2B9QIYAC2AMMAtQC3AAAAAAAAAAAAAAAAAeADgQNFA7UAjgIzBBkCzgLOAC0AXwBkA00CPwAAAqgBiAJ9AbQCJAV4BjsCOwFOAPAEJgKUAsYCnwL2AjsDTQFLAVMAagIxAAAAAAAABhQEqgAAADwEwwDtBLwCZQLOA7UAeAYMAX4C7wYMALIBAAI5AAABxQMwBCsDywDaA98BBwShANsECgEXAe0CpwNQAQsBvQQ+BVgAIQOcAK4DcQF9ALUCRQAACvsIjAErAU4BqgCHAFQBMgH4A/8AAwJOALQANwPjAIMAawLYAO0AdwCIAJcBZARnAI4AMwF8AOcApgKeAykFbgYqBhUByQJpBIoCEwG0AAIEqQAAAjkBJAEDBRQAhAFdA5oG7wLZAHUAzwQKAN4DrAS8As8CrgNNBPAFUgFoAG0AfQCGAHH/gQB5BVgE0gFnAAMBVgAlBOAAlAB8AzIEIQCUAH8AcgBcAC8AtgAYALoAuABBA00AcgAYAB8ATAFqAVUAmQCaAJoAmACyAAQAeABpABQAVwBuAM4AtAZUArgAZwUOAWUA5wAABMv+UgBa/6YAmf9nAG7/kgAt/9QAh/98ALgAqADlAI8AqAGF/nsAcAAeANkA3gFMBUYCzwVG/y0CigLZAlMClgC3AAAAAAAAAAAAAAAAAAABJQEYAOoA6gCuAAAAPgW7AIoE1wBTAD//jP/VABUAKAAiAJkAYgBKAOQAbQDuAOUASAPAADP+TgKx/0YDcAB5Bd8AUf+n/x8BCgBo/2wATwC8AKUHBQBhBytAQ1VUQUA/Pj08Ozo5ODc1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAsRSNGYCCwJmCwBCYjSEgtLEUjRiNhILAmYbAEJiNISC0sRSNGYLAgYSCwRmCwBCYjSEgtLEUjRiNhsCBgILAmYbAgYbAEJiNISC0sRSNGYLBAYSCwZmCwBCYjSEgtLEUjRiNhsEBgILAmYbBAYbAEJiNISC0sARAgPAA8LSwgRSMgsM1EIyC4AVpRWCMgsI1EI1kgsO1RWCMgsE1EI1kgsJBRWCMgsA1EI1khIS0sICBFGGhEILABYCBFsEZ2aIpFYEQtLAGxCwpDI0NlCi0sALEKC0MjQwstLACwFyNwsQEXPgGwFyNwsQIXRTqxAgAIDS0sRbAaI0RFsBkjRC0sIEWwAyVFYWSwUFFYRUQbISFZLSywAUNjI2KwACNCsA8rLSwgRbAAQ2BELSwBsAZDsAdDZQotLCBpsEBhsACLILEswIqMuBAAYmArDGQjZGFcWLADYVktLEWwESuwFyNEsBd65BgtLEWwESuwFyNELSywEkNYh0WwESuwFyNEsBd65BsDikUYaSCwFyNEioqHILCgUViwESuwFyNEsBd65BshsBd65FlZGC0sLSywAiVGYIpGsEBhjEgtLEtTIFxYsAKFWViwAYVZLSwgsAMlRbAZI0RFsBojREVlI0UgsAMlYGogsAkjQiNoimpgYSCwGoqwAFJ5IbIaGkC5/+AAGkUgilRYIyGwPxsjWWFEHLEUAIpSebMZQCAZRSCKVFgjIbA/GyNZYUQtLLEQEUMjQwstLLEOD0MjQwstLLEMDUMjQwstLLEMDUMjQ2ULLSyxDg9DI0NlCy0ssRARQyNDZQstLEtSWEVEGyEhWS0sASCwAyUjSbBAYLAgYyCwAFJYI7ACJTgjsAIlZTgAimM4GyEhISEhWQEtLEuwZFFYRWmwCUNgihA6GyEhIVktLAGwBSUQIyCK9QCwAWAj7ewtLAGwBSUQIyCK9QCwAWEj7ewtLAGwBiUQ9QDt7C0sILABYAEQIDwAPC0sILABYQEQIDwAPC0ssCsrsCoqLSwAsAdDsAZDCy0sPrAqKi0sNS0sdrgCIyNwECC4AiNFILAAUFiwAWFZOi8YLSwhIQxkI2SLuEAAYi0sIbCAUVgMZCNki7ggAGIbsgBALytZsAJgLSwhsMBRWAxkI2SLuBVVYhuyAIAvK1mwAmAtLAxkI2SLuEAAYmAjIS0stAABAAAAFbAIJrAIJrAIJrAIJg8QFhNFaDqwARYtLLQAAQAAABWwCCawCCawCCawCCYPEBYTRWhlOrABFi0sS1MjS1FaWCBFimBEGyEhWS0sS1RYIEWKYEQbISFZLSxLUyNLUVpYOBshIVktLEtUWDgbISFZLSywE0NYAxsCWS0ssBNDWAIbA1ktLEtUsBJDXFpYOBshIVktLLASQ1xYDLAEJbAEJQYMZCNkYWS4BwhRWLAEJbAEJQEgRrAQYEggRrAQYEhZCiEhGyEhWS0ssBJDXFgMsAQlsAQlBgxkI2RhZLgHCFFYsAQlsAQlASBGuP/wYEggRrj/8GBIWQohIRshIVktLEtTI0tRWliwOisbISFZLSxLUyNLUVpYsDsrGyEhWS0sS1MjS1FasBJDXFpYOBshIVktLAyKA0tUsAQmAktUWoqKCrASQ1xaWDgbISFZLSxLUliwBCWwBCVJsAQlsAQlSWEgsABUWCEgQ7AAVViwAyWwAyW4/8A4uP/AOFkbsEBUWCBDsABUWLACJbj/wDhZGyBDsABUWLADJbADJbj/wDi4/8A4G7ADJbj/wDhZWVlZISEhIS0sRiNGYIqKRiMgRopgimG4/4BiIyAQI4q5AsICwopwRWAgsABQWLABYbj/uosbsEaMWbAQYGgBOi0ssQIAQrEjAYhRsUABiFNaWLkQAAAgiFRYsgIBAkNgQlmxJAGIUVi5IAAAQIhUWLICAgJDYEKxJAGIVFiyAiACQ2BCAEsBS1JYsgIIAkNgQlkbuUAAAICIVFiyAgQCQ2BCWblAAACAY7gBAIhUWLICCAJDYEJZuUAAAQBjuAIAiFRYsgIQAkNgQlm5QAACAGO4BACIVFiyAkACQ2BCWVlZWVktLLACQ1RYS1MjS1FaWDgbISFZGyEhISFZLQAAAAEAAf//AA8AAgEAAAAFAAUAAAMABwAAIREhESUhESEBAAQA/CADwPxABQD7ACAEwAAAAAABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQAAAAAEHwQfAAMAABEhESEEH/vhBB/74QAAAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAFcA/wOMBCAACwAAEzQ2MzIWFRQGIyImV/GpqvHxqqnxApCm6uqmpuvrAAEAVwD/A4wEIAALAAATNDYzMhYVFAYjIiZX8amq8fGqqfECkKbq6qam6+sAAQBXAP8DjAQgAAsAABM0NjMyFhUUBiMiJlfxqarx8aqp8QKQpurqpqbr6wABAAAAAwAAv0d9pF8PPPUCiwgAAAAAAM06u6QAAAAAzTq7pAAAAAAFAAUAAAAACAAAAAAAAAAAAAEAAAUA/9gAAAgAAAAAAAUAAAEAAAAAAAAAAAAAAAAAAAQuBgABAAAAAAAIAAAAAjkAAAI5AAAD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAjkAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwKAAAAFAAAAAoAAAAUAAAABqgAAAUAAAADVAAAA1QAAAKAAAAEAAAAARwAAA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAQAAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAUAAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXBB8AAAPkAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAAABYAFgAWABYAFgAsAEIAWABuAIQAmgCwAMYA3ADyAQgBHgE0AUoBYAF2AYwBogG4Ac4B5AH6AhACJgI8AlICaAJ+ApQCqgLAAtYC7AMCAxgDLgNEA1oDcAOGA5wDsgPIA94D9AQKBCAENgRMBGIEeASOBKQEugTQBOYE/AUSBSgFPgVUBWoFgAWWBawFwgXYBe4GBAYaBjAGRgZcBnIGiAaeBrQGygbgBvYHDAciBzgHTgdkB3oHkAemB7wH0gfoB/4IFAgqCCoIQAhWCGwIggiYCK4IxAjaCPAJBgkcCTIJSAleCXQJigmgCbYJzAniCfgKDgokCjoKUApmCnwKkgqoCr4K1ArqCwALFgssC0ILWAtuC4QLmguwC8YL3AvyDAgMHgw0DEoMYAx2DIwMogy4DM4M5Az6DRANJg08DVINaA1+DZQNqg3ADdYN7A4CDhgOLg5EDloOcA6GDpwOsg7IDt4O9A8KDyAPNg9MD2IPeA+OD6QPug/QD+YP/BASECgQPhBUEGoQgBCWEKwQwhDYEO4RBBEaETARRhFcEXIRiBGeEbQRyhHgEfYSDBIiEjgSThJkEnoSkBKmErwS0hLoEv4TFBMqE0ATVhNsE4ITmBOuE8QT2hPwFAYUHBQyFEgUXhR0FIoUoBS2FMwU4hT4FQ4VJBU6FVAVZhV8FZIVqBW+FdQV6hYAFhYWLBZCFlgWbhaEFpoWsBbGFtwW8hcIFx4XNBdKF2AXdheMF6IXuBfOF+QX+hgQGCYYPBhSGGgYfhiUGKoYwBjWGOwZAhkYGS4ZRBlaGXAZhhmcGbIZyBneGfQaChogGjYaTBpiGngajhqkGroa0BrmGvwbEhsoGz4bVBtqG4AblhusG8Ib2BvuHAQcGhwwHEYcXBxyHIgcnhy0HMoc4Bz2HQwdIh04HU4dZB16HZAdph28HdId6B3+HhQeKh5AHlYebB6CHpgerh7EHtoe8B8GHxwfMh9IH14fdB+KH6Afth/MH+If+CAOICQgOiBQIGYgfCCSIKggviDUIOohACEWISwhQiFYIW4hhCGaIbAhxiHcIfIiCCIeIjQiSiJgInYijCKiIrgiziLkIvojECMmIzwjUiNoI34jlCOqI8Aj1iPsJAIkGCQuJEQkWiRwJIYknCSyJMgk3iT0JQolICU2JUwlYiV4JY4lpCW6JdAl5iX8JhImKCY+JlQmaiaAJpYmrCbCJtgm7icEJxonMCdGJ1wncieIJ54ntCfKJ+An9igMKCIoOChOKGQoeiiQKKYovCjSKOgo/ikUKSopQClWKWwpgimYKa4pxCnaKfAqBiocKjIqSCpeKnQqiiqgKrYqzCriKvgrDiskKzorUCtmK3wrkiuoK74r1CvqLAAsFiwsLEIsWCxuLIQsmiywLMYs3CzyLQgtHi00LUotYC12LYwtoi24Lc4t5C36LhAuJi48LlIuaC5+LpQuqi7ALtYu7C8CLxgvLi9EL1ovcC+GL5wvsi/IL94v9DAKMCAwNjBMMGIweDCOMKQwujDQMOYw/DESMSgxPjFUMWoxgDGWMawxwjHYMe4yBDIaMjAyRjJcMnIyiDKeMrQyyjLgMvYzDDMiMzgzTjNkM3ozkDOmM7wz0jPoM/40FDQqNEA0VjRsNII0mDSuNMQ02jTwNQY1HDUyNUg1XjV0NYo1oDW2Ncw14jX4Ng42JDY6NlA2ZjZ8NpI2qDa+NtQ26jcANxY3LDdCN1g3bjeEN5o3sDfGN9w38jgIOB44NDhKOGA4djiMOKI4uDjOOOQ4+jkQOSY5PDlSOWg5fjmUOao5wDnWOew6AjoYOi46RDpaOnA6hjqcOrI6yDreOvQ7CjsgOzY7TDtiO3g7jjukO7o70DvmO/w8EjwoPD48VDxqPIA8ljysPMI82DzuPQQ9Gj0wPUY9XD1yPYg9nj20Pco94D32Pgw+Ij44Pk4+ZD56PpA+pj68PtI+6D7+PxQ/Kj9AP1Y/bD+CP5g/rj/EP9o/8EAGQBxAMkBIQF5AdECKQKBAtkDMQOJA+EEOQSRBOkFQQWZBfEGSQahBvkHUQepCAEIWQixCQkJYQm5ChEKaQrBCxkLcQvJDCEMeQzRDSkNgQ3ZDjEOiQ7hDzkPkQ/pEEEQmRDxEUkRoRH5ElESqRMBE1kTsRQJFGEUuRURFWkVwRYZFnEWyRchF3kX0RgpGIEY2RkxGYkZ4Ro5GpEa6RtBG5kb8RxJHKEc+R1RHakeAR5ZHrEfCR9hH7kgESBpIMEhGSFxIckiISJ5ItEjKSOBI9kkMSSJJOElOSWRJekmQSaZJvEnSSehJ/koUSipKQEpWSmxKgkqYSq5KxEraSvBLBkscSzJLSEteS3RLikugS7ZLzEviS/hMDkwkTDpMUExmTHxMfEx8THxMfEx8THxMfEx8THxMfEx8TJJMqEy+TNRM6k0ATRZNLE1CTVhNbk2ETZpNsE3GTdxN8k4ITh5ONE5KTmBOdk6MTqJOuE7OTs5O5E76TxBPJk88T1JPaE9+T35PlE+qT8BP1k/sUAJQGFAuUERQWlBwUIZQnFCyUMhQ3lD0UQpRIFE2UUxRYlF4UY5RpFG6UdBR5lH8UhJSKFI+UlRSalKAUpZSrFLCUthS7lMEUxpTMFNGU1xTclOIU55TtFPKU+BT9lQMVCJUOFROVGRUelSQVKZUvFTSVOhU/lUUVSpVQFVWVWxVglWYVa5VxFXaVfBWBlYcVjJWSFZeVnRWilagVrZWzFbiVvhXDlckVzpXUFdmV3xXkleoV75X1FfqWABYFlgsWEJYWFhuWIRYmliwWMZY3FjyWQhZHlk0WUpZYFl2WYxZolm4Wc5Z5Fn6WhBaJlo8WkpaYFp2Woxaolq4Ws5a5Fr6WxBbJls8W1JbaFt+W5RbqlvAW9Zb7FwCXBhcLlxEXFpccFyGXJxcslzIXN5c9F0KXSBdNl1MXWJdeF2OXaRdul3QXeZd/F4SXihePl5UXmpegF6WXqxewl7YXu5fBF8aXzBfRl9cX3JfiF+eX7Rfyl/gX/ZgDGAiYDhgTmBkYHpgkGCmYLxg0mDoYP5hFGEqYUBhVmFsYYJhmGGuYcRh2mHwYgZiHGIyYkhiXmJ0YopioGK2Ysxi4mL4Yw5jJGM6Y1BjZmN8Y5JjqGO+Y9Rj6mQAZBZkLGRCZFhkbmSEZJpksGTGZNxk8mUIZR5lNGVKZWBldmWMZaJluGXOZeRl+mYQZiZmPGZSZmhmfmaUZqpmwGbWZuxnAmcYZy5nRGdaZ3BnhmecZ7JnyGfeZ/RoCmggaDZoTGhiaHhojmikaLpo0GjmaPxpEmkoaT5pVGlqaYBplmmsacJp2GnuagRqGmowakZqXGpyaohqnmq0aspq4Gr2awxrIms4a05rZGt6a5Brpmu8a9Jr6Gv+bBRsKmxAbFZsbGyCbJhsrmzEbNps8G0GbRxtMm1IbV5tdG2KbaBttm3MbeJt+G4ObiRuOm5QbmZufG6Sbqhuvm7UbupvAG8WbyxvQm9Yb25vhG+ab7Bvxm/cb/JwCHAecDRwSnBgcHZwjHCicLhwznDkcPpxEHEmcTxxUnFocX5xlHGqccBx1nHscgJyGHIuckRyWnJwcoZynHKycshy3nL0cwpzIHM2c0xzYnN4c45zpHO6c9Bz5nP8dBJ0KHQ+dFR0anSAdJZ0rHTCdNh07nUEdRp1MHVGdVx1cnWIdZ51tHXKdeB19nYMdiJ2OHZOdmR2enaQdqZ2vHbSduh2/ncUdyp3QHdWd2x3gneYd653xHfad/B4BngceDJ4SHheeHR4inigeLZ4zHjiePh5DnkkeTp5UHlmeXx5knmoeb551HnqegB6FnosekJ6WHpueoR6mnqwesZ63Hryewh7Hns0e0p7YHt2e4x7onu4e8575Hv6fBB8Jnw8fFJ8aHx+fJR8qnzAfNZ87H0CfRh9Ln1EfVp9cH2GfZx9sn3Ifd599H4KfiB+Nn5MfmJ+eH6OfqR+un7QfuZ+/H8Sfyh/Pn9Uf2p/gH+Wf6x/wn/Yf+6ABIAagDCARoBcgHKAiICegLSAyoDggPaBDIEigTiBToFkgXqBkIGmgbyB0oHogf6CFIIqgkCCVoJsgoKCmIKugsSC2oLwgwaDHIMyg0iDXoN0g4qDoIO2g8yD4oP4hA6EJIQ6hFCEZoR8hJKEqIS+hNSE6oUAhRaFLIVChViFboWEhZqFsIXGhdyF8oYIhh6GNIZKhmCGdoaMhqKGuIbOhuSG+ocQhyaHPIdSh2iHfoeUh6qHwIfWh+yIAogYiC6IRIhaiHCIhoiciLKIyIjeiPSJCokgiTaJTIliiXiJjomkibqJ0InmifyKEoooij6KVIpqioCKloqsisKK2IruiwSLGoswi0aLXItyi4iLnou0i8qL4Iv2jAyMIow4jE6MZIx6jJCMpoy8jNKM6Iz+jRSNKo1AjVaNbI2CjZiNro3EjdqN8I4GjhyOMo5Ijl6OdI6KjqCOto7MjuKO+I8OjySPOo9Qj2aPfI+Sj6iPvo/UAAAAAQAABpwADAACAAAAAAACABAALwBWAAAEDQAAAAAAAAAAABAAxgADAAEECQABABAAAAADAAEECQACAA4AEAADAAEECQADACIAHgADAAEECQAEACAAQAADAAEECQAFABgAYAADAAEECQAGABAAeAADAAEECQAHABAAiAADAAEECQAIACYAmAADAAEECQAJAIoAvgADAAEECQAKBMIBSAADAAEECQALAGIGCgADAAEECQAMAGYGbAADAAEECQANBrQG0gADAAEECQAOAFwNhgADAAEECQDIABYN4gADAAEECQDJADAN+ABQAGEAcwBzAHcAbwByAGQAUgBlAGcAdQBsAGEAcgBNAG8AbgBvAHQAeQBwAGUAOgBQAGEAcwBzAHcAbwByAGQAUABhAHMAcwB3AG8AcgBkACAAUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMQAuADAAMABQAGEAcwBzAHcAbwByAGQAUABhAHMAcwB3AG8AcgBkAE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAG8AZwByAGEAcABoAHkATQBvAG4AbwB0AHkAcABlACAAVAB5AHAAZQAgAEQAcgBhAHcAaQBuAGcAIABPAGYAZgBpAGMAZQAgAC0AIABSAG8AYgBpAG4AIABOAGkAYwBoAG8AbABhAHMALAAgAFAAYQB0AHIAaQBjAGkAYQAgAFMAYQB1AG4AZABlAHIAcwAgADEAOQA4ADIAQwBvAG4AdABlAG0AcABvAHIAYQByAHkAIABzAGEAbgBzACAAcwBlAHIAaQBmACAAZABlAHMAaQBnAG4ALAAgAEEAcgBpAGEAbAAgAGMAbwBuAHQAYQBpAG4AcwAgAG0AbwByAGUAIABoAHUAbQBhAG4AaQBzAHQAIABjAGgAYQByAGEAYwB0AGUAcgBpAHMAdABpAGMAcwAgAHQAaABhAG4AIABtAGEAbgB5ACAAbwBmACAAaQB0AHMAIABwAHIAZQBkAGUAYwBlAHMAcwBvAHIAcwAgAGEAbgBkACAAYQBzACAAcwB1AGMAaAAgAGkAcwAgAG0AbwByAGUAIABpAG4AIAB0AHUAbgBlACAAdwBpAHQAaAAgAHQAaABlACAAbQBvAG8AZAAgAG8AZgAgAHQAaABlACAAbABhAHMAdAAgAGQAZQBjAGEAZABlAHMAIABvAGYAIAB0AGgAZQAgAHQAdwBlAG4AdABpAGUAdABoACAAYwBlAG4AdAB1AHIAeQAuACAAIABUAGgAZQAgAG8AdgBlAHIAYQBsAGwAIAB0AHIAZQBhAHQAbQBlAG4AdAAgAG8AZgAgAGMAdQByAHYAZQBzACAAaQBzACAAcwBvAGYAdABlAHIAIABhAG4AZAAgAGYAdQBsAGwAZQByACAAdABoAGEAbgAgAGkAbgAgAG0AbwBzAHQAIABpAG4AZAB1AHMAdAByAGkAYQBsACAAcwB0AHkAbABlACAAcwBhAG4AcwAgAHMAZQByAGkAZgAgAGYAYQBjAGUAcwAuACAAIABUAGUAcgBtAGkAbgBhAGwAIABzAHQAcgBvAGsAZQBzACAAYQByAGUAIABjAHUAdAAgAG8AbgAgAHQAaABlACAAZABpAGEAZwBvAG4AYQBsACAAdwBoAGkAYwBoACAAaABlAGwAcABzACAAdABvACAAZwBpAHYAZQAgAHQAaABlACAAZgBhAGMAZQAgAGEAIABsAGUAcwBzACAAbQBlAGMAaABhAG4AaQBjAGEAbAAgAGEAcABwAGUAYQByAGEAbgBjAGUALgAgACAAQQByAGkAYQBsACAAaQBzACAAYQBuACAAZQB4AHQAcgBlAG0AZQBsAHkAIAB2AGUAcgBzAGEAdABpAGwAZQAgAGYAYQBtAGkAbAB5ACAAbwBmACAAdAB5AHAAZQBmAGEAYwBlAHMAIAB3AGgAaQBjAGgAIABjAGEAbgAgAGIAZQAgAHUAcwBlAGQAIAB3AGkAdABoACAAZQBxAHUAYQBsACAAcwB1AGMAYwBlAHMAcwAgAGYAbwByACAAdABlAHgAdAAgAHMAZQB0AHQAaQBuAGcAIABpAG4AIAByAGUAcABvAHIAdABzACwAIABwAHIAZQBzAGUAbgB0AGEAdABpAG8AbgBzACwAIABtAGEAZwBhAHoAaQBuAGUAcwAgAGUAdABjACwAIABhAG4AZAAgAGYAbwByACAAZABpAHMAcABsAGEAeQAgAHUAcwBlACAAaQBuACAAbgBlAHcAcwBwAGEAcABlAHIAcwAsACAAYQBkAHYAZQByAHQAaQBzAGkAbgBnACAAYQBuAGQAIABwAHIAbwBtAG8AdABpAG8AbgBzAC4AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAG0AbwBuAG8AdAB5AHAAZQAuAGMAbwBtAC8AaAB0AG0AbAAvAG0AdABuAGEAbQBlAC8AbQBzAF8AYQByAGkAYQBsAC4AaAB0AG0AbABoAHQAdABwADoALwAvAHcAdwB3AC4AbQBvAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBoAHQAbQBsAC8AbQB0AG4AYQBtAGUALwBtAHMAXwB3AGUAbABjAG8AbQBlAC4AaAB0AG0AbABOAE8AVABJAEYASQBDAEEAVABJAE8ATgAgAE8ARgAgAEwASQBDAEUATgBTAEUAIABBAEcAUgBFAEUATQBFAE4AVAANAAoADQAKAFQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAG8AZwByAGEAcABoAHkAIABhAG4AZAAgAGkAdABzACAAdQBzAGUAIABiAHkAIAB5AG8AdQAgAGkAcwAgAGMAbwB2AGUAcgBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAGEAIABsAGkAYwBlAG4AcwBlACAAYQBnAHIAZQBlAG0AZQBuAHQALgAgAFkAbwB1ACAAaABhAHYAZQAgAG8AYgB0AGEAaQBuAGUAZAAgAHQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABzAG8AZgB0AHcAYQByAGUAIABlAGkAdABoAGUAcgAgAGQAaQByAGUAYwB0AGwAeQAgAGYAcgBvAG0AIABNAG8AbgBvAHQAeQBwAGUAIABvAHIAIAB0AG8AZwBlAHQAaABlAHIAIAB3AGkAdABoACAAcwBvAGYAdAB3AGEAcgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAbwBuAGUAIABvAGYAIABNAG8AbgBvAHQAeQBwAGUAJwBzACAAbABpAGMAZQBuAHMAZQBlAHMALgANAAoADQAKAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABhACAAdgBhAGwAdQBhAGIAbABlACAAYQBzAHMAZQB0ACAAbwBmACAATQBvAG4AbwB0AHkAcABlAC4AIABVAG4AbABlAHMAcwAgAHkAbwB1ACAAaABhAHYAZQAgAGUAbgB0AGUAcgBlAGQAIABpAG4AdABvACAAYQAgAHMAcABlAGMAaQBmAGkAYwAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGcAcgBhAG4AdABpAG4AZwAgAHkAbwB1ACAAYQBkAGQAaQB0AGkAbwBuAGEAbAAgAHIAaQBnAGgAdABzACwAIAB5AG8AdQByACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAG0AaQB0AGUAZAAgAHQAbwAgAHkAbwB1AHIAIAB3AG8AcgBrAHMAdABhAHQAaQBvAG4AIABmAG8AcgAgAHkAbwB1AHIAIABvAHcAbgAgAHAAdQBiAGwAaQBzAGgAaQBuAGcAIAB1AHMAZQAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAgAG8AcgAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBJAGYAIAB5AG8AdQAgAGgAYQB2AGUAIABhAG4AeQAgAHEAdQBlAHMAdABpAG8AbgAgAGMAbwBuAGMAZQByAG4AaQBuAGcAIAB5AG8AdQByACAAcgBpAGcAaAB0AHMAIAB5AG8AdQAgAHMAaABvAHUAbABkACAAcgBlAHYAaQBlAHcAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHkAbwB1ACAAcgBlAGMAZQBpAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBvAGYAdAB3AGEAcgBlACAAbwByACAAYwBvAG4AdABhAGMAdAAgAE0AbwBuAG8AdAB5AHAAZQAgAGYAbwByACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAuAA0ACgANAAoATQBvAG4AbwB0AHkAcABlACAAYwBhAG4AIABiAGUAIABjAG8AbgB0AGEAYwB0AGUAZAAgAGEAdAA6AA0ACgANAAoAVQBTAEEAIAAtACAAKAA4ADQANwApACAANwAxADgALQAwADQAMAAwAAkACQBVAEsAIAAtACAAMAAxADEANAA0ACAAMAAxADcAMwA3ACAANwA2ADUAOQA1ADkADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBtAG8AbgBvAHQAeQBwAGUALgBjAG8AbQBoAHQAdABwADoALwAvAHcAdwB3AC4AbQBvAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBoAHQAbQBsAC8AdAB5AHAAZQAvAGwAaQBjAGUAbgBzAGUALgBoAHQAbQBsAFcAZQBiAGYAbwBuAHQAIAAxAC4AMABGAHIAaQAgAEYAZQBiACAAIAA4ACAAMAA5ADoAMgA2ADoANAA0ACAAMgAwADEAMwAAAAIAAAAAAAD/JwCWAAAAAAAAAAAAAAAAAAAAAAAAAAAGnAAAAAEAAgECAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQEDAKMAhACFAL0AlgDoAIYAjgCLAJ0AqQCkAQQAigEFAIMAkwDyAPMAjQEGAIgAwwDeAPEAngCqAPUA9AD2AKIArQDJAMcArgBiAGMAkABkAMsAZQDIAMoAzwDMAM0AzgDpAGYA0wDQANEArwBnAPAAkQDWANQA1QBoAOsA7QCJAGoAaQBrAG0AbABuAKAAbwBxAHAAcgBzAHUAdAB2AHcA6gB4AHoAeQB7AH0AfAC4AKEAfwB+AIAAgQDsAO4AugEHAQgBCQEKAQsBDAD9AP4BDQEOAQ8BEAD/AQABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAD4APkBIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAD6ANcBMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8A4gDjAUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOALAAsQFPAVABUQFSAVMBVAFVAVYBVwFYAPsA/ADkAOUBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgC7AW8BcAFxAXIA5gDnAXMBdACmAXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPANgA4QDaANsA3ADdAOAA2QDfAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIAqAGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AJ8BtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccAlwHIAckBygCbAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwOYA5kDmgObA5wDnQOeA58DoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrAOtA64DrwOwA7EDsgOzALIAswO0A7UAtgC3AMQDtgC0ALUAxQCCAMIAhwCrA7cDuAO5A7oDuwO8AMYDvQO+AL4AvwO/A8AAvAPBA8IDwwPEA8UDxgPHA8gA9wPJA8oDywPMA80DzgPPA9AAjAPRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wCYA+AAmgCZAO8ApQCSA+ED4gCcAKcAjwPjAJQAlQPkA+UD5gPnA+gD6QPqA+sD7APtA+4D7wPwA/ED8gPzA/QD9QP2A/cD+AP5A/oD+wP8A/0D/gP/BAAEAQQCBAMEBAQFBAYEBwQIBAkECgQLBAwEDQQOBA8EEAQRBBIEEwQUBBUEFgQXBBgEGQQaBBsEHAQdBB4EHwQgALkEIQQiBCMEJAQlBCYEJwQoBCkEKgQrBCwELQQuBC8EMAQxBDIEMwQ0BDUENgQ3BDgEOQQ6BDsEPAQ9BD4EPwRABEEEQgRDBEQERQRGBEcESARJBEoESwRMBE0ETgRPBFAEUQRSBFMEVARVBFYEVwRYBFkEWgRbBFwEXQReBF8EYARhBGIEYwRkBGUEZgDAAMEEZwRoBGkEagRrBGwEbQRuBG8EcARxBHIEcwR0BHUEdgR3BHgEeQR6BHsEfAR9BH4EfwSABIEEggSDBIQEhQSGBIcEiASJBIoEiwSMBI0EjgSPBJAEkQSSBJMElASVBJYElwSYBJkEmgSbBJwEnQSeBJ8EoAShBKIEowSkBKUEpgSnBKgEqQSqBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/BMAEwQTCBMMExATFBMYExwTIBMkEygTLBMwEzQTOBM8E0ATRBNIE0wTUBNUE1gTXBNgE2QTaBNsE3ATdBN4E3wTgBOEE4gTjBOQE5QTmBOcE6ATpBOoE6wTsBO0E7gTvBPAE8QTyBPME9AT1BPYE9wT4BPkE+gT7BPwE/QT+BP8FAAUBBQIFAwUEBQUFBgUHBQgFCQUKBQsFDAUNBQ4FDwUQBREFEgUTBRQFFQUWBRcFGAUZBRoFGwUcBR0FHgUfBSAFIQUiBSMFJAUlBSYFJwUoBSkFKgUrBSwFLQUuBS8FMAUxBTIFMwU0BTUFNgU3BTgFOQU6BTsFPAU9BT4FPwVABUEFQgVDBUQFRQVGBUcFSAVJBUoFSwVMBU0FTgVPBVAFUQVSBVMFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVkBWUFZgVnBWgFaQVqBWsFbAVtBW4FbwVwBXEFcgVzBXQFdQV2BXcFeAV5BXoFewV8BX0FfgV/BYAFgQWCBYMFhAWFBYYFhwWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQWaBZsFnAWdBZ4FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtAW1BbYFtwW4BbkFugW7BbwFvQW+Bb8FwAXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwXQBdEF0gXTBdQF1QXWBdcF2AXZBdoF2wXcBd0F3gXfBeAF4QXiBeMF5AXlBeYF5wXoBekF6gXrBewF7QXuBe8F8AXxBfIF8wX0BfUF9gX3BfgF+QX6BfsF/AX9Bf4F/wYABgEGAgYDBgQGBQYGBgcGCAYJBgoGCwYMBg0GDgYPBhAGEQYSBhMGFAYVBhYGFwYYBhkGGgYbBhwGHQYeBh8GIAYhBiIGIwYkBiUGJgYnBigGKQYqBisGLAYtBi4GLwYwBjEGMgYzBjQGNQY2BjcGOAY5BjoGOwY8Bj0GPgY/BkAGQQZCBkMGRAZFBkYGRwZIBkkGSgZLBkwGTQZOBk8GUAZRBlIGUwZUBlUGVgZXBlgGWQZaBlsGXAZdBl4GXwZgBmEGYgZjBmQGZQZmBmcGaAZpBmoGawZsBm0GbgZvBnAGcQZyBnMGdAZ1BnYGdwZ4BnkGegZ7BnwGfQZ+Bn8GgAaBBoIGgwaEBoUGhgaHBogGiQaKBosGjAaNBo4GjwaQBpEGkgaTBpQGlQaWBpcGmAaZBpoGmwacBp0Gngd1bmkwMDBEB3VuaTAwQTAHdW5pMDBBRAlvdmVyc2NvcmUDbXUxB0FtYWNyb24HYW1hY3JvbgZBYnJldmUGYWJyZXZlB0FvZ29uZWsHYW9nb25lawtDY2lyY3VtZmxleAtjY2lyY3VtZmxleARDZG90BGNkb3QGRGNhcm9uBmRjYXJvbgZEc2xhc2gHZG1hY3JvbgdFbWFjcm9uB2VtYWNyb24GRWJyZXZlBmVicmV2ZQRFZG90BGVkb3QHRW9nb25lawdlb2dvbmVrBkVjYXJvbgZlY2Fyb24LR2NpcmN1bWZsZXgLZ2NpcmN1bWZsZXgER2RvdARnZG90CEdjZWRpbGxhCGdjZWRpbGxhC0hjaXJjdW1mbGV4C2hjaXJjdW1mbGV4BEhiYXIEaGJhcgZJdGlsZGUGaXRpbGRlB0ltYWNyb24HaW1hY3JvbgZJYnJldmUGaWJyZXZlB0lvZ29uZWsHaW9nb25lawJJSgJpagtKY2lyY3VtZmxleAtqY2lyY3VtZmxleAhLY2VkaWxsYQhrY2VkaWxsYQxrZ3JlZW5sYW5kaWMGTGFjdXRlBmxhY3V0ZQhMY2VkaWxsYQhsY2VkaWxsYQZMY2Fyb24GbGNhcm9uBExkb3QEbGRvdAZOYWN1dGUGbmFjdXRlCE5jZWRpbGxhCG5jZWRpbGxhBk5jYXJvbgZuY2Fyb24LbmFwb3N0cm9waGUDRW5nA2VuZwdPbWFjcm9uB29tYWNyb24GT2JyZXZlBm9icmV2ZQlPZGJsYWN1dGUJb2RibGFjdXRlBlJhY3V0ZQZyYWN1dGUIUmNlZGlsbGEIcmNlZGlsbGEGUmNhcm9uBnJjYXJvbgZTYWN1dGUGc2FjdXRlC1NjaXJjdW1mbGV4C3NjaXJjdW1mbGV4CFRjZWRpbGxhCHRjZWRpbGxhBlRjYXJvbgZ0Y2Fyb24EVGJhcgR0YmFyBlV0aWxkZQZ1dGlsZGUHVW1hY3Jvbgd1bWFjcm9uBlVicmV2ZQZ1YnJldmUFVXJpbmcFdXJpbmcJVWRibGFjdXRlCXVkYmxhY3V0ZQdVb2dvbmVrB3VvZ29uZWsLV2NpcmN1bWZsZXgLd2NpcmN1bWZsZXgLWWNpcmN1bWZsZXgLeWNpcmN1bWZsZXgGWmFjdXRlBnphY3V0ZQRaZG90BHpkb3QFbG9uZ3MHdW5pMDE4RgVPaG9ybgVvaG9ybgVVaG9ybgV1aG9ybgd1bmkwMUNEB3VuaTAxQ0UHdW5pMDFDRgd1bmkwMUQwB3VuaTAxRDEHdW5pMDFEMgd1bmkwMUQzB3VuaTAxRDQHdW5pMDFENQd1bmkwMUQ2B3VuaTAxRDcHdW5pMDFEOAd1bmkwMUQ5B3VuaTAxREEHdW5pMDFEQgd1bmkwMURDCkFyaW5nYWN1dGUKYXJpbmdhY3V0ZQdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUHdW5pMDI1ORRjb21iaW5pbmdncmF2ZWFjY2VudBRjb21iaW5pbmdhY3V0ZWFjY2VudBRjb21iaW5pbmd0aWxkZWFjY2VudBJjb21iaW5pbmdob29rYWJvdmURY29tYmluaW5nZG90YmVsb3cFdG9ub3MNZGllcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxFpb3RhZGllcmVzaXN0b25vcwVBbHBoYQRCZXRhBUdhbW1hB0Vwc2lsb24EWmV0YQNFdGEFVGhldGEESW90YQVLYXBwYQZMYW1iZGECTXUCTnUCWGkHT21pY3JvbgJQaQNSaG8FU2lnbWEDVGF1B1Vwc2lsb24DUGhpA0NoaQNQc2kMSW90YWRpZXJlc2lzD1Vwc2lsb25kaWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MUdXBzaWxvbmRpZXJlc2lzdG9ub3MFYWxwaGEEYmV0YQVnYW1tYQVkZWx0YQdlcHNpbG9uBHpldGEDZXRhBXRoZXRhBGlvdGEFa2FwcGEGbGFtYmRhAm51AnhpB29taWNyb24DcmhvBnNpZ21hMQVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQxpb3RhZGllcmVzaXMPdXBzaWxvbmRpZXJlc2lzDG9taWNyb250b25vcwx1cHNpbG9udG9ub3MKb21lZ2F0b25vcwZvbWVnYTEJYWZpaTEwMDIzCWFmaWkxMDA1MQlhZmlpMTAwNTIJYWZpaTEwMDUzCWFmaWkxMDA1NAlhZmlpMTAwNTUJYWZpaTEwMDU2CWFmaWkxMDA1NwlhZmlpMTAwNTgJYWZpaTEwMDU5CWFmaWkxMDA2MAlhZmlpMTAwNjEJYWZpaTEwMDYyCWFmaWkxMDE0NQlhZmlpMTAwMTcJYWZpaTEwMDE4CWFmaWkxMDAxOQlhZmlpMTAwMjAJYWZpaTEwMDIxCWFmaWkxMDAyMglhZmlpMTAwMjQJYWZpaTEwMDI1CWFmaWkxMDAyNglhZmlpMTAwMjcJYWZpaTEwMDI4CWFmaWkxMDAyOQlhZmlpMTAwMzAJYWZpaTEwMDMxCWFmaWkxMDAzMglhZmlpMTAwMzMJYWZpaTEwMDM0CWFmaWkxMDAzNQlhZmlpMTAwMzYJYWZpaTEwMDM3CWFmaWkxMDAzOAlhZmlpMTAwMzkJYWZpaTEwMDQwCWFmaWkxMDA0MQlhZmlpMTAwNDIJYWZpaTEwMDQzCWFmaWkxMDA0NAlhZmlpMTAwNDUJYWZpaTEwMDQ2CWFmaWkxMDA0NwlhZmlpMTAwNDgJYWZpaTEwMDQ5CWFmaWkxMDA2NQlhZmlpMTAwNjYJYWZpaTEwMDY3CWFmaWkxMDA2OAlhZmlpMTAwNjkJYWZpaTEwMDcwCWFmaWkxMDA3MglhZmlpMTAwNzMJYWZpaTEwMDc0CWFmaWkxMDA3NQlhZmlpMTAwNzYJYWZpaTEwMDc3CWFmaWkxMDA3OAlhZmlpMTAwNzkJYWZpaTEwMDgwCWFmaWkxMDA4MQlhZmlpMTAwODIJYWZpaTEwMDgzCWFmaWkxMDA4NAlhZmlpMTAwODUJYWZpaTEwMDg2CWFmaWkxMDA4NwlhZmlpMTAwODgJYWZpaTEwMDg5CWFmaWkxMDA5MAlhZmlpMTAwOTEJYWZpaTEwMDkyCWFmaWkxMDA5MwlhZmlpMTAwOTQJYWZpaTEwMDk1CWFmaWkxMDA5NglhZmlpMTAwOTcJYWZpaTEwMDcxCWFmaWkxMDA5OQlhZmlpMTAxMDAJYWZpaTEwMTAxCWFmaWkxMDEwMglhZmlpMTAxMDMJYWZpaTEwMTA0CWFmaWkxMDEwNQlhZmlpMTAxMDYJYWZpaTEwMTA3CWFmaWkxMDEwOAlhZmlpMTAxMDkJYWZpaTEwMTEwCWFmaWkxMDE5MwlhZmlpMTAwNTAJYWZpaTEwMDk4B3VuaTA0OTIHdW5pMDQ5Mwd1bmkwNDk2B3VuaTA0OTcHdW5pMDQ5QQd1bmkwNDlCB3VuaTA0OUMHdW5pMDQ5RAd1bmkwNEEyB3VuaTA0QTMHdW5pMDRBRQd1bmkwNEFGB3VuaTA0QjAHdW5pMDRCMQd1bmkwNEIyB3VuaTA0QjMHdW5pMDRCOAd1bmkwNEI5B3VuaTA0QkEHdW5pMDRCQgd1bmkwNEU4B3VuaTA0RTkFc2hldmEKaGF0YWZzZWdvbApoYXRhZnBhdGFoC2hhdGFmcWFtYXRzBWhpcmlxBXRzZXJlBXNlZ29sBXBhdGFoBnFhbWF0cwVob2xhbQZxdWJ1dHMGZGFnZXNoBW1ldGVnBW1hcWFmBHJhZmUFcGFzZXEHc2hpbmRvdAZzaW5kb3QIc29mcGFzdXEEYWxlZgNiZXQFZ2ltZWwFZGFsZXQCaGUDdmF2BXpheWluA2hldAN0ZXQDeW9kCGZpbmFsa2FmA2thZgVsYW1lZAhmaW5hbG1lbQNtZW0IZmluYWxudW4DbnVuBnNhbWVraARheWluB2ZpbmFscGUCcGUKZmluYWx0c2FkaQV0c2FkaQNxb2YEcmVzaARzaGluA3Rhdglkb3VibGV2YXYGdmF2eW9kCWRvdWJsZXlvZAZnZXJlc2gJZ2Vyc2hheWltCWFmaWk1NzM4OAlhZmlpNTc0MDMJYWZpaTU3NDA3CWFmaWk1NzQwOQlhZmlpNTc0MTEJYWZpaTU3NDEyCWFmaWk1NzQxMwlhZmlpNTc0MTQJYWZpaTU3NDE1CWFmaWk1NzQxNglhZmlpNTc0MTcJYWZpaTU3NDE4CWFmaWk1NzQxOQlhZmlpNTc0MjAJYWZpaTU3NDIxCWFmaWk1NzQyMglhZmlpNTc0MjMJYWZpaTU3NDI0CWFmaWk1NzQyNQlhZmlpNTc0MjYJYWZpaTU3NDI3CWFmaWk1NzQyOAlhZmlpNTc0MjkJYWZpaTU3NDMwCWFmaWk1NzQzMQlhZmlpNTc0MzIJYWZpaTU3NDMzCWFmaWk1NzQzNAlhZmlpNTc0NDAJYWZpaTU3NDQxCWFmaWk1NzQ0MglhZmlpNTc0NDMJYWZpaTU3NDQ0CWFmaWk1NzQ0NQlhZmlpNTc0NDYJYWZpaTU3NDQ4CWFmaWk1NzQ0OQlhZmlpNTc0NTAJYWZpaTU3NDUxCWFmaWk1NzQ1MglhZmlpNTc0NTMJYWZpaTU3NDU0CWFmaWk1NzQ1NQlhZmlpNTc0NTYJYWZpaTU3NDU3CWFmaWk1NzQ1OAd1bmkwNjUzB3VuaTA2NTQHdW5pMDY1NQlhZmlpNTczOTIJYWZpaTU3MzkzCWFmaWk1NzM5NAlhZmlpNTczOTUJYWZpaTU3Mzk2CWFmaWk1NzM5NwlhZmlpNTczOTgJYWZpaTU3Mzk5CWFmaWk1NzQwMAlhZmlpNTc0MDEJYWZpaTU3MzgxCWFmaWk1NzQ2MQlhZmlpNjMxNjcJZ2x5cGgxMzIwCWdseXBoMTMyNAd1bmkwNjcwB3VuaTA2NzEHdW5pMDY3Mgd1bmkwNjczB3VuaTA2NzUHdW5pMDY3Ngd1bmkwNjc3B3VuaTA2NzgHdW5pMDY3OQd1bmkwNjdBB3VuaTA2N0IHdW5pMDY3Qwd1bmkwNjdECWFmaWk1NzUwNgd1bmkwNjdGB3VuaTA2ODAHdW5pMDY4MQd1bmkwNjgyB3VuaTA2ODMHdW5pMDY4NAd1bmkwNjg1CWFmaWk1NzUwNwd1bmkwNjg3B3VuaTA2ODgHdW5pMDY4OQd1bmkwNjhBB3VuaTA2OEIHdW5pMDY4Qwd1bmkwNjhEB3VuaTA2OEUHdW5pMDY4Rgd1bmkwNjkwB3VuaTA2OTEHdW5pMDY5Mgd1bmkwNjkzB3VuaTA2OTQHdW5pMDY5NQd1bmkwNjk2B3VuaTA2OTcJYWZpaTU3NTA4B3VuaTA2OTkHdW5pMDY5QQd1bmkwNjlCB3VuaTA2OUMHdW5pMDY5RAd1bmkwNjlFB3VuaTA2OUYHdW5pMDZBMAd1bmkwNkExB3VuaTA2QTIHdW5pMDZBMwd1bmkwNkE0B3VuaTA2QTUHdW5pMDZBNgd1bmkwNkE3B3VuaTA2QTgHdW5pMDZBQQd1bmkwNkFCB3VuaTA2QUMHdW5pMDZBRAd1bmkwNkFFCWFmaWk1NzUwOQd1bmkwNkIwB3VuaTA2QjEHdW5pMDZCMgd1bmkwNkIzB3VuaTA2QjQHdW5pMDZCNQd1bmkwNkI2B3VuaTA2QjcHdW5pMDZCOAd1bmkwNkI5B3VuaTA2QkEHdW5pMDZCQgd1bmkwNkJDB3VuaTA2QkQHdW5pMDZCRgd1bmkwNkMwB3VuaTA2QzEHdW5pMDZDMgd1bmkwNkMzB3VuaTA2QzQHdW5pMDZDNQd1bmkwNkM2B3VuaTA2QzcHdW5pMDZDOAd1bmkwNkM5B3VuaTA2Q0EHdW5pMDZDQgd1bmkwNkNEB3VuaTA2Q0UHdW5pMDZDRgd1bmkwNkQwB3VuaTA2RDEHdW5pMDZEMgd1bmkwNkQzB3VuaTA2RDQJYWZpaTU3NTM0B3VuaTA2RDYHdW5pMDZENwd1bmkwNkQ4B3VuaTA2RDkHdW5pMDZEQQd1bmkwNkRCB3VuaTA2REMHdW5pMDZERAd1bmkwNkRFB3VuaTA2REYHdW5pMDZFMAd1bmkwNkUxB3VuaTA2RTIHdW5pMDZFMwd1bmkwNkU0B3VuaTA2RTUHdW5pMDZFNgd1bmkwNkU3B3VuaTA2RTgHdW5pMDZFOQd1bmkwNkVBB3VuaTA2RUIHdW5pMDZFRAlhZmlpNjI4NDMJYWZpaTYyODQ0CWFmaWk2Mjg0NQd1bmkwNkZBB3VuaTA2RkIHdW5pMDZGQwd1bmkwNkZEB3VuaTA2RkUGV2dyYXZlBndncmF2ZQZXYWN1dGUGd2FjdXRlCVdkaWVyZXNpcwl3ZGllcmVzaXMJQWRvdGJlbG93CWFkb3RiZWxvdwpBaG9va2Fib3ZlCmFob29rYWJvdmUQQWNpcmN1bWZsZXhhY3V0ZRBhY2lyY3VtZmxleGFjdXRlEEFjaXJjdW1mbGV4Z3JhdmUQYWNpcmN1bWZsZXhncmF2ZRRBY2lyY3VtZmxleGhvb2thYm92ZRRhY2lyY3VtZmxleGhvb2thYm92ZRBBY2lyY3VtZmxleHRpbGRlEGFjaXJjdW1mbGV4dGlsZGUTQWNpcmN1bWZsZXhkb3RiZWxvdxNhY2lyY3VtZmxleGRvdGJlbG93C0FicmV2ZWFjdXRlC2FicmV2ZWFjdXRlC0FicmV2ZWdyYXZlC2FicmV2ZWdyYXZlD0FicmV2ZWhvb2thYm92ZQ9hYnJldmVob29rYWJvdmULQWJyZXZldGlsZGULYWJyZXZldGlsZGUOQWJyZXZlZG90YmVsb3cOYWJyZXZlZG90YmVsb3cJRWRvdGJlbG93CWVkb3RiZWxvdwpFaG9va2Fib3ZlCmVob29rYWJvdmUGRXRpbGRlBmV0aWxkZRBFY2lyY3VtZmxleGFjdXRlEGVjaXJjdW1mbGV4YWN1dGUQRWNpcmN1bWZsZXhncmF2ZRBlY2lyY3VtZmxleGdyYXZlFEVjaXJjdW1mbGV4aG9va2Fib3ZlFGVjaXJjdW1mbGV4aG9va2Fib3ZlEEVjaXJjdW1mbGV4dGlsZGUQZWNpcmN1bWZsZXh0aWxkZRNFY2lyY3VtZmxleGRvdGJlbG93E2VjaXJjdW1mbGV4ZG90YmVsb3cKSWhvb2thYm92ZQppaG9va2Fib3ZlCUlkb3RiZWxvdwlpZG90YmVsb3cJT2RvdGJlbG93CW9kb3RiZWxvdwpPaG9va2Fib3ZlCm9ob29rYWJvdmUQT2NpcmN1bWZsZXhhY3V0ZRBvY2lyY3VtZmxleGFjdXRlEE9jaXJjdW1mbGV4Z3JhdmUQb2NpcmN1bWZsZXhncmF2ZRRPY2lyY3VtZmxleGhvb2thYm92ZRRvY2lyY3VtZmxleGhvb2thYm92ZRBPY2lyY3VtZmxleHRpbGRlEG9jaXJjdW1mbGV4dGlsZGUTT2NpcmN1bWZsZXhkb3RiZWxvdxNvY2lyY3VtZmxleGRvdGJlbG93Ck9ob3JuYWN1dGUKb2hvcm5hY3V0ZQpPaG9ybmdyYXZlCm9ob3JuZ3JhdmUOT2hvcm5ob29rYWJvdmUOb2hvcm5ob29rYWJvdmUKT2hvcm50aWxkZQpvaG9ybnRpbGRlDU9ob3JuZG90YmVsb3cNb2hvcm5kb3RiZWxvdwlVZG90YmVsb3cJdWRvdGJlbG93ClVob29rYWJvdmUKdWhvb2thYm92ZQpVaG9ybmFjdXRlCnVob3JuYWN1dGUKVWhvcm5ncmF2ZQp1aG9ybmdyYXZlDlVob3JuaG9va2Fib3ZlDnVob3JuaG9va2Fib3ZlClVob3JudGlsZGUKdWhvcm50aWxkZQ1VaG9ybmRvdGJlbG93DXVob3JuZG90YmVsb3cGWWdyYXZlBnlncmF2ZQlZZG90YmVsb3cJeWRvdGJlbG93Cllob29rYWJvdmUKeWhvb2thYm92ZQZZdGlsZGUGeXRpbGRlB3VuaTIwMDAHdW5pMjAwMQd1bmkyMDAyB3VuaTIwMDMHdW5pMjAwNAd1bmkyMDA1B3VuaTIwMDYHdW5pMjAwNwd1bmkyMDA4B3VuaTIwMDkHdW5pMjAwQRJ6ZXJvd2lkdGhub25qb2luZXIPemVyb3dpZHRoam9pbmVyD2xlZnR0b3JpZ2h0bWFyaw9yaWdodHRvbGVmdG1hcmsHdW5pMjAxMAd1bmkyMDExCmZpZ3VyZWRhc2gJYWZpaTAwMjA4DXVuZGVyc2NvcmVkYmwNcXVvdGVyZXZlcnNlZAd1bmkyMDJBB3VuaTIwMkIHdW5pMjAyQwd1bmkyMDJEB3VuaTIwMkUHdW5pMjAyRgZtaW51dGUGc2Vjb25kCWV4Y2xhbWRibAlyYWRpY2FsZXgHdW5pMjA1Rgd1bmkyMDZBB3VuaTIwNkIIdW5pMjA2QzsHdW5pMjA2RAd1bmkyMDZFCHVuaTIwNkY7CW5zdXBlcmlvcglhZmlpMDg5NDEGcGVzZXRhDW5ld3NoZXFlbHNpZ24IZG9uZ3NpZ24ERXVybwlhZmlpNjEyNDgJYWZpaTYxMjg5CWFmaWk2MTM1MgNPaG0JZXN0aW1hdGVkCG9uZXRoaXJkCXR3b3RoaXJkcwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQd1bmkyMjA2Cm9ydGhvZ29uYWwMaW50ZXJzZWN0aW9uC2VxdWl2YWxlbmNlBWhvdXNlDXJldmxvZ2ljYWxub3QKaW50ZWdyYWx0cAppbnRlZ3JhbGJ0CFNGMTAwMDAwCFNGMTEwMDAwCFNGMDEwMDAwCFNGMDMwMDAwCFNGMDIwMDAwCFNGMDQwMDAwCFNGMDgwMDAwCFNGMDkwMDAwCFNGMDYwMDAwCFNGMDcwMDAwCFNGMDUwMDAwCFNGNDMwMDAwCFNGMjQwMDAwCFNGNTEwMDAwCFNGNTIwMDAwCFNGMzkwMDAwCFNGMjIwMDAwCFNGMjEwMDAwCFNGMjUwMDAwCFNGNTAwMDAwCFNGNDkwMDAwCFNGMzgwMDAwCFNGMjgwMDAwCFNGMjcwMDAwCFNGMjYwMDAwCFNGMzYwMDAwCFNGMzcwMDAwCFNGNDIwMDAwCFNGMTkwMDAwCFNGMjAwMDAwCFNGMjMwMDAwCFNGNDcwMDAwCFNGNDgwMDAwCFNGNDEwMDAwCFNGNDUwMDAwCFNGNDYwMDAwCFNGNDAwMDAwCFNGNTQwMDAwCFNGNTMwMDAwCFNGNDQwMDAwB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveAZIMjIwNzMGSDE4NTQzBkgxODU1MQpmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlBkgxODUzMwlpbnZidWxsZXQJaW52Y2lyY2xlCm9wZW5idWxsZXQJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsB3VuaUUwMDAKdmF2c2hpbmRvdA1maW5hbGthZnNoZXZhDmZpbmFsa2FmcWFtYXRzCmxhbWVkaG9sYW0QbGFtZWRob2xhbWRhZ2VzaAlhZmlpNjI4ODEJYWZpaTU3MzkxC2NvbW1hYWNjZW50EHVuZGVyY29tbWFhY2NlbnQHdW5pRjAwNgd1bmlGMDA3B3VuaUYwMDgHdW5pRjAwOQd1bmlGMDBBB3VuaUYwMEIHdW5pRjAwQwd1bmlGMDBEB3VuaUYwMEUHdW5pRjAwRgd1bmlGMDEwB3VuaUYwMTEHdW5pRjAxMgd1bmlGMDEzB3VuaUYwMTQHdW5pRjAxNQd1bmlGMDE2B3VuaUYwMTcHdW5pRjAxOAd1bmlGMDE5B3VuaUYwMUEHdW5pRjAxQgd1bmlGMDFDB3VuaUYwMUQHdW5pRjAxRQd1bmlGMDFGB3VuaUYwMjAHdW5pRjAyMQd1bmlGMDIyB3VuaUYwMjMHdW5pRjAyNAd1bmlGMDI1B3VuaUYwMjYHdW5pRjAyNwd1bmlGMDI4B3VuaUYwMjkHdW5pRjAyQQd1bmlGMDJCB3VuaUYwMkMHdW5pRjAyRAd1bmlGMDJFB3VuaUYwMkYHdW5pRjAzMAd1bmlGMDMxB3VuaUZCMUQHdW5pRkIxRQd1bmlGQjFGB2FsdGF5aW4Lc2hpbnNoaW5kb3QKc2hpbnNpbmRvdBFzaGluZGFnZXNoc2hpbmRvdBBzaGluZGFnZXNoc2luZG90CWFsZWZwYXRhaAphbGVmcWFtYXRzCWFsZWZtYXBpcQliZXRkYWdlc2gLZ2ltZWxkYWdlc2gLZGFsZXRkYWdlc2gIaGVkYWdlc2gJdmF2ZGFnZXNoC3pheWluZGFnZXNoCXRldGRhZ2VzaAl5b2RkYWdlc2gOZmluYWxrYWZkYWdlc2gJa2FmZGFnZXNoC2xhbWVkZGFnZXNoCW1lbWRhZ2VzaAludW5kYWdlc2gMc2FtZWtoZGFnZXNoDWZpbmFscGVkYWdlc2gIcGVkYWdlc2gLdHNhZGlkYWdlc2gJcW9mZGFnZXNoCnJlc2hkYWdlc2gKc2hpbmRhZ2VzaAh0YXZkYWdlcwh2YXZob2xhbQdiZXRyYWZlB2thZnJhZmUGcGVyYWZlCWFsZWZsYW1lZAd1bmlGQjUxB3VuaUZCNTMHdW5pRkI1NAd1bmlGQjU1CWFmaWk2Mjk1OAlhZmlpNjI5NTYJYWZpaTUyOTU3B3VuaUZCNUIHdW5pRkI1Qwd1bmlGQjVEB3VuaUZCNUYHdW5pRkI2MAd1bmlGQjYxB3VuaUZCNjMHdW5pRkI2NAd1bmlGQjY1B3VuaUZCNjcHdW5pRkI2OAd1bmlGQjY5B3VuaUZCNkIHdW5pRkI2Qwd1bmlGQjZEB3VuaUZCNkYHdW5pRkI3MAd1bmlGQjcxB3VuaUZCNzMHdW5pRkI3NAd1bmlGQjc1B3VuaUZCNzcHdW5pRkI3OAd1bmlGQjc5CWFmaWk2Mjk2MQlhZmlpNjI5NTkJYWZpaTYyOTYwB3VuaUZCN2YHdW5pRkI4MAd1bmlGQjgxB3VuaUZCODMHdW5pRkI4NQd1bmlGQjg3B3VuaUZCODkJYWZpaTYyOTYyB3VuaUZCOEQJYWZpaTU3NTY3CWFmaWk2Mjk2NAlhZmlpNTIzMDUJYWZpaTUyMzA2CWFmaWk2Mjk2NwlhZmlpNjI5NjUJYWZpaTYyOTY2B3VuaUZCOTcHdW5pRkI5OAd1bmlGQjk5B3VuaUZCOUIHdW5pRkI5Qwd1bmlGQjlEB3VuaUZCOUYHdW5pRkJBMQd1bmlGQkE1B3VuaUZCQTYHdW5pRkJBOAd1bmlGQkE5CWFmaWk1NzQ3MAd1bmlGQkFGB3VuaUZCQjEHdW5pRkJENAd1bmlGQkQ1B3VuaUZCRDYHdW5pRkJEOAd1bmlGQkRBB3VuaUZCREMHdW5pRkJERgd1bmlGQkUxB3VuaUZCRTMHdW5pRkJFNQd1bmlGQkU2B3VuaUZCRTcJYWZpaTU3NTU1CWFmaWk1MjM2NAlhZmlpNjI4ODIJYWZpaTYyODgzCWFmaWk2Mjg4NAlhZmlpNjI4ODUJYWZpaTYyODg2CWFmaWk2NDA2MAlhZmlpNjQwNjEJYWZpaTY0MTg0CWFmaWk1MjM5OQlhZmlpNTI0MDAJYWZpaTYyNzUzCWFmaWk2Mjc1NAlhZmlpNjI3NTUJYWZpaTYyNzU2CWFmaWk2Mjc1OQlhZmlpNjI3NTcJYWZpaTYyNzU4CWFmaWk2Mjc2MAlhZmlpNjI3NjMJYWZpaTYyNzYxCWFmaWk2Mjc2MglhZmlpNjI3NjQJYWZpaTYyNzY3CWFmaWk2Mjc2NQlhZmlpNjI3NjYJYWZpaTYyNzcwCWFmaWk2Mjc2OAlhZmlpNjI3NjkJYWZpaTYyNzczCWFmaWk2Mjc3MQlhZmlpNjI3NzIJYWZpaTYyNzc2CWFmaWk2Mjc3NAlhZmlpNjI3NzUJYWZpaTYyNzc5CWFmaWk2Mjc3NwlhZmlpNjI3NzgJYWZpaTYyNzgwCWFmaWk2Mjc4MQlhZmlpNjI3ODIJYWZpaTYyNzgzCWFmaWk2Mjc4NglhZmlpNjI3ODQJYWZpaTYyNzg1CWFmaWk2Mjc4OQlhZmlpNjI3ODcJYWZpaTYyNzg4CWFmaWk2Mjc5MglhZmlpNjI3OTAJYWZpaTYyNzkxCWFmaWk2Mjc5NQlhZmlpNjI3OTMJYWZpaTYyNzk0CWFmaWk2Mjc5OAlhZmlpNjI3OTYJYWZpaTYyNzk3CWFmaWk2MjgwMQlhZmlpNjI3OTkJYWZpaTYyODAwCWFmaWk2MjgwNAlhZmlpNjI4MDIJYWZpaTYyODAzCWFmaWk2MjgwNwlhZmlpNjI4MDUJYWZpaTYyODA2CWFmaWk2MjgxMAlhZmlpNjI4MDgJYWZpaTYyODA5CWFmaWk2MjgxMwlhZmlpNjI4MTEJYWZpaTYyODEyCWFmaWk2MjgxNglhZmlpNTc0MTAJYWZpaTYyODE1CWFmaWk2MjgxOQlhZmlpNjI4MTcJYWZpaTYyODE4CWFmaWk2MjgyMglhZmlpNjI4MjAJYWZpaTYyODIxCWFmaWk2MjgyNQlhZmlpNjI4MjMJYWZpaTYyODI0CWFmaWk1NzQ0NwlhZmlpNjI4MjgJYWZpaTYyODI3CWFmaWk2MjgyOQlhZmlpNjI4MzAJYWZpaTYyODMzCWFmaWk2MjgzMQlhZmlpNjI4MzIJYWZpaTYyODM0CWFmaWk2MjgzNQlhZmlpNjI4MzYJYWZpaTYyODM3CWFmaWk2MjgzOAlhZmlpNjI4MzkJYWZpaTYyODQwCWFmaWk2Mjg0MQd1bmlGRkZDCWFmaWk1NzQ1OQlhZmlpNTc1NDMJYWZpaTU3NDk0CWFmaWk2NDI0MAlhZmlpNjQyNDEJYWZpaTYzOTU0CWFmaWk1NzM4MglhZmlpNjQyNDIJYWZpaTU3NTA0CWFmaWk1NzM2OQlhZmlpNTczNzAJYWZpaTU3MzcxCWFmaWk1NzM3MglhZmlpNTczNzMJYWZpaTU3Mzc0CWFmaWk1NzM3NQlhZmlpNTc0NzEJYWZpaTU3NDYwCWFmaWk1MjI1OAlhZmlpNjI4ODkJYWZpaTYyODg3CWFmaWk2Mjg4OAlhZmlpNjM3NTMJYWZpaTYzNzU0CWFmaWk2Mzc1OQlhZmlpNjM3NjMJYWZpaTYzNzk1CWFmaWk2Mjg5MQlhZmlpNjM4MDgJYWZpaTYyOTM4CWFmaWk2MzgxMAlhZmlpNjI5NDIJYWZpaTYyOTQ3CWFmaWk2MzgxMwlhZmlpNjM4MjMJYWZpaTYzODI0CWFmaWk2MzgzMwlhZmlpNjM4NDQJYWZpaTYzODQ2CWFmaWk2Mzg0OQlhZmlpNjM5MDQJYWZpaTYzOTA1CWFmaWk2MzkwNglhZmlpNjM5MDgJYWZpaTYzOTEwCWFmaWk2MzkxMglhZmlpNjI5MjcJYWZpaTYzOTQxCWFmaWk2MjkzOQlhZmlpNjM5NDMJYWZpaTYyOTQzCWFmaWk2Mjk0NglhZmlpNjM5NDYJYWZpaTYyOTUxCWFmaWk2Mzk0OAlhZmlpNjI5NTMJYWZpaTYzOTUwCWFmaWk2Mzk1MQlhZmlpNjM5NTIJYWZpaTYzOTUzCWFmaWk2Mzk1NglhZmlpNjM5NTgJYWZpaTYzOTU5CWFmaWk2Mzk2MAlhZmlpNjM5NjEJYWZpaTY0MDQ2CWFmaWk2NDA1OAlhZmlpNjQwNTkJYWZpaTYyOTQ1CWdseXBoMTAyMQthZmlpNTc1NDMtMgthZmlpNTc0NTQtMgthZmlpNTc0NTEtMglnbHlwaDEwMjUJZ2x5cGgxMDI2C2FmaWk1NzQ3MS0yC2FmaWk1NzQ1OC0yC2FmaWk1NzQ1Ny0yC2FmaWk1NzQ5NC0yC2FmaWk1NzQ1OS0yC2FmaWk1NzQ1NS0yC2FmaWk1NzQ1Mi0yCWdseXBoMTAzNAlnbHlwaDEwMzUJZ2x5cGgxMDM2C2FmaWk2Mjg4NC0yC2FmaWk2Mjg4MS0yC2FmaWk2Mjg4Ni0yC2FmaWk2Mjg4My0yC2FmaWk2Mjg4NS0yC2FmaWk2Mjg4Mi0yC2FmaWk1NzUwNC0yC2FmaWk1NzQ1Ni0yC2FmaWk1NzQ1My0yCWdseXBoMTA0NglnbHlwaDEwNDcLYWZpaTU3NTQzLTMLYWZpaTU3NDU0LTMLYWZpaTU3NDUxLTMJZ2x5cGgxMDUxCWdseXBoMTA1MgthZmlpNTc0NzEtMwthZmlpNTc0NTgtMwthZmlpNTc0NTctMwthZmlpNTc0OTQtMwthZmlpNTc0NTktMwthZmlpNTc0NTUtMwthZmlpNTc0NTItMwlnbHlwaDEwNjAJZ2x5cGgxMDYxCWdseXBoMTA2MgthZmlpNjI4ODQtMwthZmlpNjI4ODEtMwthZmlpNjI4ODYtMwthZmlpNjI4ODMtMwthZmlpNjI4ODUtMwthZmlpNjI4ODItMwthZmlpNTc1MDQtMwthZmlpNTc0NTYtMwthZmlpNTc0NTMtMwlnbHlwaDEwNzIJZ2x5cGgxMDczC2FmaWk1NzU0My00C2FmaWk1NzQ1NC00C2FmaWk1NzQ1MS00CWdseXBoMTA3NwlnbHlwaDEwNzgLYWZpaTU3NDcxLTQLYWZpaTU3NDU4LTQLYWZpaTU3NDU3LTQLYWZpaTU3NDk0LTQLYWZpaTU3NDU5LTQLYWZpaTU3NDU1LTQLYWZpaTU3NDUyLTQJZ2x5cGgxMDg2CWdseXBoMTA4NwlnbHlwaDEwODgLYWZpaTYyODg0LTQLYWZpaTYyODgxLTQLYWZpaTYyODg2LTQLYWZpaTYyODgzLTQLYWZpaTYyODg1LTQLYWZpaTYyODgyLTQLYWZpaTU3NTA0LTQLYWZpaTU3NDU2LTQLYWZpaTU3NDUzLTQJZ2x5cGgxMDk4CWdseXBoMTA5OQlnbHlwaDExMDAJZ2x5cGgxMTAxCWdseXBoMTEwMglnbHlwaDExMDMJZ2x5cGgxMTA0CWdseXBoMTEwNQlnbHlwaDExMDYJZ2x5cGgxMTA3CWdseXBoMTEwOAlnbHlwaDExMDkJZ2x5cGgxMTEwCWdseXBoMTExMQlnbHlwaDExMTIJZ2x5cGgxMTEzCWdseXBoMTExNAlnbHlwaDExMTUJZ2x5cGgxMTE2CWdseXBoMTExNwlnbHlwaDExMTgJZ2x5cGgxMTE5CWdseXBoMTEyMAlnbHlwaDExMjEJZ2x5cGgxMTIyCWdseXBoMTEyMwlnbHlwaDExMjQJZ2x5cGgxMTI1CWdseXBoMTEyNgthZmlpNTc0NDAtMgthZmlpNTc0NDAtMwthZmlpNTc0NDAtNAlnbHlwaDExMzQJZ2x5cGgxMTM1CWdseXBoMTEzNglnbHlwaDExNDcJZ2x5cGgxMTQ4CWdseXBoMTE1NAlnbHlwaDExNTUJZ2x5cGgxMjkyCWdseXBoMTI5MwlnbHlwaDEyOTQJZ2x5cGgxMjk1CWdseXBoMTMyMQlnbHlwaDEzMjIJZ2x5cGgxMzIzCWdseXBoMTMyNQlnbHlwaDEzMjYJZ2x5cGgxMzI3CWdseXBoMTMyOAlnbHlwaDEzMjkJZ2x5cGgxMzMwCWdseXBoMTMzMQlnbHlwaDEzMzIJZ2x5cGgxMzMzCWdseXBoMTMzNAlnbHlwaDEzMzUJZ2x5cGgxMzQzCWdseXBoMTM0NQdnbHlwaDQ3CWdseXBoMTM0OQlnbHlwaDEzNTEFZ2x5cGgJZ2x5cGgxMzY3CWdseXBoMTM2OAlnbHlwaDEzNjkJZ2x5cGgxMzcxCWdseXBoMTM3MglnbHlwaDEzNzMJZ2x5cGgxMzgzCWdseXBoMTM4NAlnbHlwaDEzODUJZ2x5cGgxMzg3CWdseXBoMTM4OAlnbHlwaDEzODkJZ2x5cGgxMzk5CWdseXBoMTQwMAlnbHlwaDE0MDEJZ2x5cGgxNDA5CWdseXBoMTQxMQlnbHlwaDE0MTMJZ2x5cGgxNDIxCWdseXBoMTQyMwlnbHlwaDE0MjYJZ2x5cGgxNDI5CWdseXBoMTQzMQlnbHlwaDE0MzMJZ2x5cGgxNDM1CWdseXBoMTQzNwlnbHlwaDE0MzkJZ2x5cGgxNDQxCWdseXBoMTQ0MglnbHlwaDE0NDMJZ2x5cGgxNDQ1CWdseXBoMTQ0NglnbHlwaDE0NDcJZ2x5cGgxNDQ5CWdseXBoMTQ1MAlnbHlwaDE0NTEJZ2x5cGgxNDUzCWdseXBoMTQ1NAlnbHlwaDE0NTUJZ2x5cGgxNDU3CWdseXBoMTQ1OAlnbHlwaDE0NTkJZ2x5cGgxNDYxCWdseXBoMTQ2MwlnbHlwaDE0NjQJZ2x5cGgxNDY1CWdseXBoMTQ2OAlnbHlwaDE0NjkJZ2x5cGgxNDcwCWdseXBoMTQ3MglnbHlwaDE0NzMJZ2x5cGgxNDc0CWdseXBoMTQ4MAlnbHlwaDE0ODEJZ2x5cGgxNDgyCWdseXBoMTQ4OAlnbHlwaDE0OTAJZ2x5cGgxNDkyCWdseXBoMTQ5MwlnbHlwaDE0OTQJZ2x5cGgxNDk2CWdseXBoMTQ5NwlnbHlwaDE0OTgJZ2x5cGgxNTAwCWdseXBoMTUwMQlnbHlwaDE1MDIJZ2x5cGgxNTA4CWdseXBoMTUwOQlnbHlwaDE1MTAJZ2x5cGgxNTEyCWdseXBoMTUxMwlnbHlwaDE1MTQJZ2x5cGgxNTIwCWdseXBoMTUyMQlnbHlwaDE1MjIJZ2x5cGgxNTI4CWdseXBoMTUyOQlnbHlwaDE1MzAJZ2x5cGgxNTMyCWdseXBoMTUzMwlnbHlwaDE1MzQJZ2x5cGgxNTM2CWdseXBoMTUzNwlnbHlwaDE1MzgJZ2x5cGgxNTQwCWdseXBoMTU0MQlnbHlwaDE1NDIJZ2x5cGgxNTQ0CWdseXBoMTU0NQlnbHlwaDE1NDYJZ2x5cGgxNTQ4CWdseXBoMTU0OQlnbHlwaDE1NTAJZ2x5cGgxNTU2CWdseXBoMTU1NwlnbHlwaDE1NTgJZ2x5cGgxNTYwCWdseXBoMTU2MglnbHlwaDE1NjMJZ2x5cGgxNTY0CWdseXBoMTU3MQlnbHlwaDE1ODMJZ2x5cGgxNTg3CWdseXBoMTU4OQlnbHlwaDE1OTAJZ2x5cGgxNTkxCWdseXBoMTU5MwlnbHlwaDE1OTkJZ2x5cGgxNjI5CWdseXBoMTYzMAlnbHlwaDE2MzEJZ2x5cGgxNjMzCWdseXBoMTYzNAlnbHlwaDE2MzUJZ2x5cGgxNjM3CWdseXBoMTYzOAlnbHlwaDE2MzkJZ2x5cGgxNjQ1CWdseXBoMTY0NglnbHlwaDE2NDcJZ2x5cGgxNjQ4CWdseXBoMTY0OQlnbHlwaDE2NTAJZ2x5cGgxNjUxCWdseXBoMTY1NAlnbHlwaDE2NTYJZ2x5cGgxNjU3CWdseXBoMTY1OAlnbHlwaDE2NTkJZ2x5cGgxNjYwCWdseXBoMTY2MQlnbHlwaDE2NjIJZ2x5cGgxNjYzCWdseXBoMTY2NAlnbHlwaDE2NjUJZ2x5cGgxNjY2CWdseXBoMTY2NwlnbHlwaDE2NjgJZ2x5cGgxNjY5CWdseXBoMTY3MAlnbHlwaDE2NzEJZ2x5cGgxNjcyCWds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) format('truetype'); +} +div.overlay { + z-index: 99999; + position: fixed; + top: 50%; + left: 50%; + width: 200px; + height: 200px; + margin-left: -100px; + margin-top: -100px; + background: rgba(0, 0, 0, 0.8); + border-radius: 20px; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; +} +div.overlay .title { + color: #FFF; + font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-weight: bold; + text-align: center; + display: block; + font-size: 26px; + position: absolute; + bottom: 30px; + left: 0; + width: 100%; +} +div.overlay .icon { + position: relative; + display: inline-block; + width: 128px; + height: 128px; + top: 40%; + left: 50%; + margin-left: -64px; + margin-top: -64px; + text-align: center; + vertical-align: middle; + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-size: 96pt; + color: white; + text-shadow: none; +} +div.overlay.ios-overlay-show { + -webkit-animation-name: ios-overlay-show; + -webkit-animation-duration: 750ms; + -webkit-animation-fill-mode: none; + -webkit-animation-iteration-count: 1; + -moz-animation-name: ios-overlay-show; + -moz-animation-duration: 750ms; + -moz-animation-fill-mode: none; + -moz-animation-iteration-count: 1; + -ms-animation-name: ios-overlay-show; + -ms-animation-duration: 750ms; + -ms-animation-fill-mode: none; + -ms-animation-iteration-count: 1; + -o-animation-name: ios-overlay-show; + -o-animation-duration: 750ms; + -o-animation-fill-mode: none; + -o-animation-iteration-count: 1; + animation-name: ios-overlay-show; + animation-duration: 750ms; + animation-fill-mode: none; + animation-iteration-count: 1; +} +div.overlay.ios-overlay-hide { + -webkit-animation-name: ios-overlay-hide; + -webkit-animation-duration: 750ms; + -webkit-animation-fill-mode: forwards; + -webkit-animation-iteration-count: 1; + -moz-animation-name: ios-overlay-hide; + -moz-animation-duration: 750ms; + -moz-animation-fill-mode: forwards; + -moz-animation-iteration-count: 1; + -ms-animation-name: ios-overlay-hide; + -ms-animation-duration: 750ms; + -ms-animation-fill-mode: forwards; + -ms-animation-iteration-count: 1; + -o-animation-name: ios-overlay-hide; + -o-animation-duration: 750ms; + -o-animation-fill-mode: forwards; + -o-animation-iteration-count: 1; + animation-name: ios-overlay-hide; + animation-duration: 750ms; + animation-fill-mode: forwards; + animation-iteration-count: 1; +} +div.overlay div.spinner { + position: relative; + width: 100px; + height: 100px; + left: 50% !important; + top: 40% !important; + margin-left: -50px; + margin-top: -50px; + display: block; +} +div.overlay div.spinner div { + width: 12%; + height: 26%; + background: #ffffff; + position: absolute; + left: 44.5%; + top: 37%; + opacity: 0; + -webkit-animation-name: fade; + -webkit-animation-duration: 1s; + -webkit-animation-fill-mode: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-name: fade; + -moz-animation-duration: 1s; + -moz-animation-fill-mode: linear; + -moz-animation-iteration-count: infinite; + -ms-animation-name: fade; + -ms-animation-duration: 1s; + -ms-animation-fill-mode: linear; + -ms-animation-iteration-count: infinite; + -o-animation-name: fade; + -o-animation-duration: 1s; + -o-animation-fill-mode: linear; + -o-animation-iteration-count: infinite; + animation-name: fade; + animation-duration: 1s; + animation-fill-mode: linear; + animation-iteration-count: infinite; + border-radius: 50px; + -moz-border-radius: 50px; + -webkit-border-radius: 50px; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + -ms-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + -o-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); +} +div.overlay div.spinner div.bar01 { + -webkit-transform: rotate(0deg) translate(0, -142%); + -moz-transform: rotate(0deg) translate(0, -142%); + -ms-transform: rotate(0deg) translate(0, -142%); + -o-transform: rotate(0deg) translate(0, -142%); + transform: rotate(0deg) translate(0, -142%); + -webkit-animation-delay: 0s; + -moz-animation-delay: 0s; + -ms-animation-delay: 0s; + -o-animation-delay: 0s; + animation-delay: 0s; +} +div.overlay div.spinner div.bar02 { + -webkit-transform: rotate(30deg) translate(0, -142%); + -moz-transform: rotate(30deg) translate(0, -142%); + -ms-transform: rotate(30deg) translate(0, -142%); + -o-transform: rotate(30deg) translate(0, -142%); + transform: rotate(30deg) translate(0, -142%); + -webkit-animation-delay: -0.9167s; + -moz-animation-delay: -0.9167s; + -ms-animation-delay: -0.9167s; + -o-animation-delay: -0.9167s; + animation-delay: -0.9167s; +} +div.overlay div.spinner div.bar03 { + -webkit-transform: rotate(60deg) translate(0, -142%); + -moz-transform: rotate(60deg) translate(0, -142%); + -ms-transform: rotate(60deg) translate(0, -142%); + -o-transform: rotate(60deg) translate(0, -142%); + transform: rotate(60deg) translate(0, -142%); + -webkit-animation-delay: -0.833s; + -moz-animation-delay: -0.833s; + -ms-animation-delay: -0.833s; + -o-animation-delay: -0.833s; + animation-delay: -0.833s; +} +div.overlay div.spinner div.bar04 { + -webkit-transform: rotate(90deg) translate(0, -142%); + -moz-transform: rotate(90deg) translate(0, -142%); + -ms-transform: rotate(90deg) translate(0, -142%); + -o-transform: rotate(90deg) translate(0, -142%); + transform: rotate(90deg) translate(0, -142%); + -webkit-animation-delay: -0.75s; + -moz-animation-delay: -0.75s; + -ms-animation-delay: -0.75s; + -o-animation-delay: -0.75s; + animation-delay: -0.75s; +} +div.overlay div.spinner div.bar05 { + -webkit-transform: rotate(120deg) translate(0, -142%); + -moz-transform: rotate(120deg) translate(0, -142%); + -ms-transform: rotate(120deg) translate(0, -142%); + -o-transform: rotate(120deg) translate(0, -142%); + transform: rotate(120deg) translate(0, -142%); + -webkit-animation-delay: -0.667s; + -moz-animation-delay: -0.667s; + -ms-animation-delay: -0.667s; + -o-animation-delay: -0.667s; + animation-delay: -0.667s; +} +div.overlay div.spinner div.bar06 { + -webkit-transform: rotate(150deg) translate(0, -142%); + -moz-transform: rotate(150deg) translate(0, -142%); + -ms-transform: rotate(150deg) translate(0, -142%); + -o-transform: rotate(150deg) translate(0, -142%); + transform: rotate(150deg) translate(0, -142%); + -webkit-animation-delay: -0.5833s; + -moz-animation-delay: -0.5833s; + -ms-animation-delay: -0.5833s; + -o-animation-delay: -0.5833s; + animation-delay: -0.5833s; +} +div.overlay div.spinner div.bar07 { + -webkit-transform: rotate(180deg) translate(0, -142%); + -moz-transform: rotate(180deg) translate(0, -142%); + -ms-transform: rotate(180deg) translate(0, -142%); + -o-transform: rotate(180deg) translate(0, -142%); + transform: rotate(180deg) translate(0, -142%); + -webkit-animation-delay: -0.5s; + -moz-animation-delay: -0.5s; + -ms-animation-delay: -0.5s; + -o-animation-delay: -0.5s; + animation-delay: -0.5s; +} +div.overlay div.spinner div.bar08 { + -webkit-transform: rotate(210deg) translate(0, -142%); + -moz-transform: rotate(210deg) translate(0, -142%); + -ms-transform: rotate(210deg) translate(0, -142%); + -o-transform: rotate(210deg) translate(0, -142%); + transform: rotate(210deg) translate(0, -142%); + -webkit-animation-delay: -0.41667s; + -moz-animation-delay: -0.41667s; + -ms-animation-delay: -0.41667s; + -o-animation-delay: -0.41667s; + animation-delay: -0.41667s; +} +div.overlay div.spinner div.bar09 { + -webkit-transform: rotate(240deg) translate(0, -142%); + -moz-transform: rotate(240deg) translate(0, -142%); + -ms-transform: rotate(240deg) translate(0, -142%); + -o-transform: rotate(240deg) translate(0, -142%); + transform: rotate(240deg) translate(0, -142%); + -webkit-animation-delay: -0.333s; + -moz-animation-delay: -0.333s; + -ms-animation-delay: -0.333s; + -o-animation-delay: -0.333s; + animation-delay: -0.333s; +} +div.overlay div.spinner div.bar10 { + -webkit-transform: rotate(270deg) translate(0, -142%); + -moz-transform: rotate(270deg) translate(0, -142%); + -ms-transform: rotate(270deg) translate(0, -142%); + -o-transform: rotate(270deg) translate(0, -142%); + transform: rotate(270deg) translate(0, -142%); + -webkit-animation-delay: -0.25s; + -moz-animation-delay: -0.25s; + -ms-animation-delay: -0.25s; + -o-animation-delay: -0.25s; + animation-delay: -0.25s; +} +div.overlay div.spinner div.bar11 { + -webkit-transform: rotate(300deg) translate(0, -142%); + -moz-transform: rotate(300deg) translate(0, -142%); + -ms-transform: rotate(300deg) translate(0, -142%); + -o-transform: rotate(300deg) translate(0, -142%); + transform: rotate(300deg) translate(0, -142%); + -webkit-animation-delay: -0.1667s; + -moz-animation-delay: -0.1667s; + -ms-animation-delay: -0.1667s; + -o-animation-delay: -0.1667s; + animation-delay: -0.1667s; +} +div.overlay div.spinner div.bar12 { + -webkit-transform: rotate(330deg) translate(0, -142%); + -moz-transform: rotate(330deg) translate(0, -142%); + -ms-transform: rotate(330deg) translate(0, -142%); + -o-transform: rotate(330deg) translate(0, -142%); + transform: rotate(330deg) translate(0, -142%); + -webkit-animation-delay: -0.0833s; + -moz-animation-delay: -0.0833s; + -ms-animation-delay: -0.0833s; + -o-animation-delay: -0.0833s; + animation-delay: -0.0833s; +} +@-webkit-keyframes fade { + from { + opacity: 1; + } + to { + opacity: 0.25; + } +} +@-o-keyframes fade { + from { + opacity: 1; + } + to { + opacity: 0.25; + } +} +@keyframes fade { + from { + opacity: 1; + } + to { + opacity: 0.25; + } +} +@-webkit-keyframes ios-overlay-show { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-moz-keyframes ios-overlay-show { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-ms-keyframes ios-overlay-show { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-o-keyframes ios-overlay-show { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes ios-overlay-show { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-webkit-keyframes ios-overlay-hide { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@-moz-keyframes ios-overlay-hide { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@-ms-keyframes ios-overlay-hide { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@-o-keyframes ios-overlay-hide { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@keyframes ios-overlay-hide { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +.page { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.page.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +.page.center { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.page.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: hidden; + display: none; +} +.page.right.transition { + visibility: visible; + display: block; +} +.page.transition { + -webkit-transition-duration: .25s; + transition-duration: .25s; +} +/* +.registrationForm { + .steps { + .step { + position: absolute; + +// top: 0; +// left: 0; +// width: 100%; +// height: 100%; + + .slide(); + } + } +} +*/ +/* +.page { + transform: rotateY( 0deg) translateZ( 100px); + + &.left { + transform: rotateY( -90deg) translateZ( 100px); + } + + &.center { + transform: rotateY( 0deg) translateZ( 100px); + } + + &.right { + transform: rotateY( 90deg) translateZ( 100px); + } +} + +#mainDiv { + width: 100%; + height: 100%; + position: absolute; + transform-style: preserve-3d; + + transition: transform 3s; + + &.show-front { transform: translateZ( -100px ) rotateY( 0deg ); } + &.show-back { transform: translateZ( -100px ) rotateX( -180deg ); } + &.show-right { transform: translateZ( -100px ) rotateY( -90deg ); } + &.show-left { transform: translateZ( -100px ) rotateY( 90deg ); } + &.show-top { transform: translateZ( -100px ) rotateX( -90deg ); } + &.show-bottom { transform: translateZ( -100px ) rotateX( 90deg ); } +} +*/ +/* + # box-sizing: { content-box | border-box | inherit }; + + # css flex box (also with LESSCSS mixin): + - https://github.com/ProLoser/Flexbox.less; + - https://gist.github.com/jayj/4012969 + +*/ +body { + font-family: "Source Code Pro"; + background: #f8f8f8 url('data:image/png;base64,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') top left; + font-size: 18pt; +} +a { + cursor: pointer; +} +.button { + min-height: 48px; + min-width: 48px; + color: white; + font-size: 100%; + font-weight: 700; + border: 0px; + padding-left: 20px; + padding-right: 20px; + background-color: #dc322f; + -webkit-transition: background-color 0.2s linear; + -moz-transition: background-color 0.2s linear; + -o-transition: background-color 0.2s linear; + -ms-transition: background-color 0.2s linear; + transition: background-color 0.2s linear; +} +.button:disabled { + background-color: #c0c0c0; +} +div.page { + padding: 0px; + margin: 0px; + width: 100%; +} +div.page div.header h1 { + font-size: 36pt; + font-weight: 900; + color: #ff9900; + margin: 0px 10px; +} +div.page div.content { + margin: 0px 10px; +} +#loadingPage { + background-image: -ms-radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%); + /* IE10 */ + background-image: -moz-radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%); + /* Mozilla Firefox */ + background-image: -o-radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%); + /* Opera */ + background-image: -webkit-radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%); + /* Webkit (Chrome 11+) */ + background-image: radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%); + /* Proposed W3C Markup */ + background-image: -webkit-gradient(radial, center center, 0, center center, 495, color-stop(0, #d9daf0), color-stop(1, #6c71c4)); + /* Webkit (Safari/Chrome 10) */ +} +#loadingPage div { + vertical-align: middle; + width: 100%; + text-align: center; +} +#loadingPage div h1 { + font-size: 40pt; + color: #ffffff; + margin-top: 5%; + margin-bottom: 5px; +} +#loadingPage div h3 { + font-size: 18pt; + color: #6c71c4; + margin: 0px; +} +#loginPage form label { + display: none; +} +#loginPage form input { + display: block; + border: 1px solid #eee8d5; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + padding: 5px; + margin-top: 5px; + margin-bottom: 10px; + font-size: 100%; + box-shadow: inset 0 0 0; +} +#loginPage .registrationLink { + color: #cb4b16; + background: none; +} +#loginPage .registrationLink:before { + content: "> "; +} +#loginPage .registrationLink a { + color: #cb4b16; +} +#registrationPage label { + display: none; +} +#registrationPage input { + display: block; + border: 1px solid #eee8d5; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + padding: 5px; + margin-top: 5px; + margin-bottom: 10px; + font-size: 100%; + box-shadow: inset 0 0 0; +} +#registrationPage .steps .step { + display: none; +} +#registrationPage .steps .step.center { + display: block; +} +#registrationPage .steps .step h1 { + color: #268bd2; + font-size: 24pt; + font-weight: 700; + margin: 0px; +} +#registrationPage .steps .step p { + color: #657b83; + font-size: 14pt; + font-weight: 100; + margin: 0px; +} +#registrationPage .steps .step.TERMS_OF_SERVICE .checkboxBlock { + margin-top: 10px; + margin-bottom: 10px; + clear: both; +} +#registrationPage .steps .step.TERMS_OF_SERVICE .checkboxBlock input { + display: block; + float: left; + margin: 5px; + width: 30px; +} +#registrationPage .steps .step.TERMS_OF_SERVICE .checkboxBlock p { + font-size: 12pt; + font-weight: 500; + display: block; +} +#registrationPage .steps .step.TERMS_OF_SERVICE .checkboxBlock p a { + color: #dc322f; +} +#registrationPage .steps .step .stepIndex { + text-align: center; +} +#registrationPage .steps .step .stepIndex .stepIndexItem { + font-weight: 900; + font-size: 28pt; + display: inline; + color: lightgrey; +} +#registrationPage .steps .step .stepIndex .stepIndexItem.center { + color: gray; +} +#registrationPage .steps .step .buttons { + text-align: center; + margin-top: 10px; +} +#registrationPage .steps .step .buttons .button { + margin: 10px; + text-align: center; + vertical-align: middle; + display: inline-block; + width: 80px; + font-weight: 900; + line-height: 45px; + font-size: 24px; +} +#registrationPage .steps .step .buttons .button.back { + background-color: lightgrey; +} +#registrationPage .steps .step .buttons .button.disabled { + background-color: #c0c0c0; + cursor: default; +} +#cardListPage .header { + border-bottom: 2px solid #2aa198; + display: inline-block; + width: 100%; + margin-bottom: 0px; + height: 46px; +} +#cardListPage .header a.account { + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + color: #ff9900; + display: block; + float: left; + font-size: 28pt; + padding-top: 3px; + padding-left: 15px; + padding-right: 15px; + vertical-align: top; +} +#cardListPage .header .features { + text-align: right; + display: block; + float: right; + padding-right: 5px; + height: 100%; +} +#cardListPage .header .features a { + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + color: #2aa198; + display: inline-block; + font-size: 28pt; + padding-left: 10px; + padding-right: 10px; + height: 100%; + line-height: 33pt; +} +#cardListPage .header .features a.selected { + background-color: #2aa198; + color: white; +} +#cardListPage .searchBox { + background-color: #2aa198; + width: 100%; + clear: both; +} +#cardListPage .searchBox > div { + padding: 4px; + padding-top: 2px; +} +#cardListPage .searchBox input { + font-size: 14pt; + display: block; + border: 1px solid #eee8d5; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + box-shadow: inset 0 0 0; + width: 100%; + margin: 0px; + color: #657b83; +} +#cardListPage .content.cardList { + margin-left: 0px; + margin-right: 0px; +} +#cardListPage .content.cardList .listItem { + min-height: 48px; + line-height: 24pt; + cursor: pointer; + display: inline-table; + width: 100%; +} +#cardListPage .content.cardList .listItem:nth-child(odd) { + background-color: #eee8d5; +} +#cardListPage .content.cardList .listItem .labelWrapper { + float: left; + width: 100%; +} +#cardListPage .content.cardList .listItem .labelWrapper span { + margin: 0px; + margin-left: 42px; + margin-right: 30px; + display: block; + padding-top: 7px; + padding-bottom: 7px; + color: #dc322f; + font-weight: 400; +} +#cardListPage .content.cardList .listItem .faviconWrapper { + float: left; + width: 42px; + margin-left: -100%; +} +#cardListPage .content.cardList .listItem .faviconWrapper .favicon { + width: 32px; + height: 32px; + padding: 8px 5px; + vertical-align: text-bottom; +} +#cardListPage .content.cardList .listItem .detailLinkWrapper { + float: left; + width: 30px; + margin-left: -30px; + text-align: center; + padding-top: 7px; +} +#cardListPage .content.cardList .listItem .detailLinkWrapper span { + color: #2aa198; + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} +#cardDetailPage .header { + border-bottom: 2px solid #2aa198; + width: 100%; + margin-bottom: 0px; + height: 46px; +} +#cardDetailPage .header .backWrapper { + float: left; + width: 48px; + margin-left: -100%; +} +#cardDetailPage .header .backWrapper .back { + display: inline-block; + background-color: #2aa198; + padding: 11px; + box-sizing: border-box; + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} +#cardDetailPage .header .titleWrapper { + float: left; + width: 100%; + height: 48px; + overflow: hidden; +} +#cardDetailPage .header .titleWrapper .title { + margin-left: 48px; + margin-right: 48px; + display: inline-block; + padding-left: 10px; + color: #dc322f; + font-weight: 400; + line-height: 36pt; + white-space: nowrap; +} +#cardDetailPage .header .starWrapper { + float: left; + width: 48px; + margin-left: -48px; + text-align: center; +} +#cardDetailPage .header .starWrapper .star { + font-size: 18pt; + line-height: 35pt; + color: #d33682; + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} +#cardDetailPage .content { + overflow: scroll; + margin: 0px; +} +#cardDetailPage .content .fields .listItem { + display: inline-table; + width: 100%; + font-size: 14pt; + border-bottom: 1px solid #eee8d5; +} +#cardDetailPage .content .fields .listItem .fieldWrapper { + width: 100%; + float: left; +} +#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper { + padding: 3px 10px 3px 10px; + margin: 0px; + margin-right: 48px; + display: block; +} +#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .labelWrapper { + display: block; +} +#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .labelWrapper .label { + color: #cb4b16; + font-size: 10pt; + font-weight: 300; +} +#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .valueWrapper { + display: block; + box-sizing: border-box; +} +#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .valueWrapper .value { + color: #268bd2; + font-weight: 500; +} +#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .valueWrapper .value.PASSWORD { + font-family: 'clipperz-password'; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-size: 28pt; +} +#cardDetailPage .content .fields .listItem .actionWrapper { + float: left; + width: 48px; + margin-left: -48px; + text-align: center; +} +#cardDetailPage .content .fields .listItem .actionWrapper div { + font-size: 18pt; + line-height: 35pt; + color: #2aa198; + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} +#cardDetailPage .content .directLogins .listItem { + min-height: 47px; + line-height: 35pt; + cursor: pointer; + display: inline-table; + width: 100%; + background-color: #859900; + border-bottom: 1px solid #eee8d5; + font-size: 14pt; +} +#cardDetailPage .content .directLogins .listItem .labelWrapper { + float: left; + width: 100%; +} +#cardDetailPage .content .directLogins .listItem .labelWrapper span { + margin: 0px; + margin-left: 42px; + margin-right: 48px; + display: block; + color: white; + font-weight: 500; +} +#cardDetailPage .content .directLogins .listItem .faviconWrapper { + float: left; + width: 42px; + margin-left: -100%; +} +#cardDetailPage .content .directLogins .listItem .faviconWrapper .favicon { + width: 32px; + height: 32px; + padding: 8px 5px; + vertical-align: text-bottom; +} +#cardDetailPage .content .directLogins .listItem .directLoginLinkWrapper { + float: left; + width: 48px; + margin-left: -48px; + text-align: center; +} +#cardDetailPage .content .directLogins .listItem .directLoginLinkWrapper span { + font-size: 18pt; + color: white; + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} +#cardDetailPage .footer { + font-family: 'clipperz-icons'; + -webkit-font-feature-settings: "@foo", "@bar"; + -moz-font-feature-settings: "@foo=1, @bar=1"; + -moz-font-feature-settings: "@foo", "@bar"; + -ms-font-feature-settings: "@foo", "@bar"; + -o-font-feature-settings: "@foo", "@bar"; + font-feature-settings: "@foo", "@bar"; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + color: white; + width: 100%; + position: fixed; + bottom: 0px; + display: none; +} +#cardDetailPage .footer a { + display: inline-block; + text-align: center; + padding: 11px; + box-sizing: border-box; +} +#cardDetailPage .footer a.cancel { + width: 33%; + background-color: #dc322f; +} +#cardDetailPage .footer a.save { + width: 67%; + background-color: #859900; +} +.icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +/* +================================== + +THREE COLUMN LAYOUT (left/right fixed size; center elastic) + +------------- ~~~~~~ ------------ +| | | | +| a | b | c | +| | | | +------------- ~~~~~~ ------------ + +================================== + +.listItem + .bWrapper + .b + .aWrapper + .a + .cWrapper + .c + +================================== + +.listItem { + + display: inline-table; + width: 100%; + + .aWrapper { + float: left; + width: <a.width>px; + margin-left: -100%; + + .a { + + } + } + + .bWrapper { + float: left; + width: 100%; + + + .b { + margin: 0px; + margin-left: <a.width>px; + margin-right: <c.width>px; + display: block; + } + } + + .cWrapper { + float: left; + width: <c.width>px; + margin-left: -<c.width>px; + + .c { + + } + } + +} +*/@media only screen and (min-width: 480px) { + .loginForm { + font-size: 1.2em; + } +} +@media only screen and (min-width: 768px) { + +} +@media only screen and (min-width: 992px) { + +} +/** + * + * Main container + * + */ +#addToHomeScreen { + z-index: 9999; + -webkit-user-select: none; + user-select: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-touch-callout: none; + touch-callout: none; + width: 240px; + font-size: 15px; + padding: 12px 14px; + text-align: left; + font-family: helvetica; + background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #ffffff), color-stop(0.02, #eeeeee), color-stop(0.98, #cccccc), color-stop(1, #a3a3a3)); + border: 1px solid #505050; + -webkit-border-radius: 8px; + -webkit-background-clip: padding-box; + color: #333; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.75); + line-height: 130%; + -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.5); +} +#addToHomeScreen.addToHomeIpad { + width: 268px; + font-size: 18px; + padding: 14px; +} +/** + * + * The 'wide' class is added when the popup contains the touch icon + * + */ +#addToHomeScreen.addToHomeWide { + width: 296px; +} +#addToHomeScreen.addToHomeIpad.addToHomeWide { + width: 320px; + font-size: 18px; + padding: 14px; +} +/** + * + * The balloon arrow + * + */ +#addToHomeScreen .addToHomeArrow { + position: absolute; + background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(0, rgba(204, 204, 204, 0)), color-stop(0.4, rgba(204, 204, 204, 0)), color-stop(0.4, #cccccc)); + border-width: 0 1px 1px 0; + border-style: solid; + border-color: #505050; + width: 16px; + height: 16px; + -webkit-transform: rotateZ(45deg); + bottom: -9px; + left: 50%; + margin-left: -8px; + -webkit-box-shadow: inset -1px -1px 0 #a9a9a9; + -webkit-border-bottom-right-radius: 2px; +} +/** + * + * The balloon arrow for iPad + * + */ +#addToHomeScreen.addToHomeIpad .addToHomeArrow { + -webkit-transform: rotateZ(-135deg); + background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(0, rgba(238, 238, 238, 0)), color-stop(0.4, rgba(238, 238, 238, 0)), color-stop(0.4, #eeeeee)); + -webkit-box-shadow: inset -1px -1px 0 #ffffff; + top: -9px; + bottom: auto; + left: 50%; +} +/** + * + * Close button + * + */ +#addToHomeScreen .addToHomeClose { + -webkit-box-sizing: border-box; + position: absolute; + right: 4px; + top: 4px; + width: 18px; + height: 18px; + line-height: 14px; + text-align: center; + text-indent: 1px; + -webkit-border-radius: 9px; + background: rgba(0, 0, 0, 0.12); + color: #707070; + -webkit-box-shadow: 0 1px 0 #fff; + font-size: 16px; +} +/** + * + * The '+' icon, displayed only on iOS < 4.2 + * + */ +#addToHomeScreen .addToHomePlus { + font-weight: bold; + font-size: 1.3em; +} +/** + * + * The 'share' icon, displayed only on iOS >= 4.2 + * + */ +#addToHomeScreen .addToHomeShare { + display: inline-block; + width: 18px; + height: 15px; + background-repeat: no-repeat; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAQAAADu6HTYAAADPElEQVR4Xq3TX2gcRRzA8e/M7mVv2+TSNpc/TZtrY6jUGqgaSAmEChKLrYK0YH0RFC2CSCkEfCghiKU04J8qNigq6os+iQV98MHWFwVBrQQRWs21lBw5cw3NNb1/udu72RGG5Y77IzXW77D7sAwf5scyYoL6BGXSDKFZwaGpLvIUaeoCkvX1MmsM0Ny6oRSQYOLuIS+YZOpfQdqslpUxcZrzTVAz4qPwW2O3CeIwC/RSzeY6Ow1QhUrkr+YOWfEKDkEP8Rij7CHKJmrFSDHBdwGEE5wiGChPN+PnT8VdRtEIl1d4gRj/1EVe5ZSBKGh8iqQpo/Fo5+3C/gz0MYg4zgwbqday1/Q4B8BGQ45d/Hi54lakCrU5obOcidJpu1+Lg9whjabyaOYLnrIBFFaRD+xe2ybMDWY66GmP/WA9cGfGp0CWhy0wkMN8inepFiH2rV1j0NQSNQbFLRQnS8/8YSDBBpadfv4CYDub2fmeHDNAsL1MBWUel0iA+Xik6eHcyvD3vAMSU1TGuA/YRS+dD7ovCQN43GKRFCU20Kd3V/avDVVyAZ5niTEuLA5/zBGWg9EEEhfJKN200Tat8CmRAQb9+wv7soPlHt2tQorsz1uPbr0HTY4sJwrH47zJZwABBAKLMBoQXepwgTwdHCo+fXMkQ4lrxEmQ5AaXipPqDY9V2vn09tgvTPI71EEGYxM+/uMJLJ4svpgaWGKOi/xKgmqLSUGSUd5f2vIVJ/CgBaTIUsZ7ZBsn0+NzfMOXLFCXQyTcybN6ep5ZZgUOHn7jpfUpsZshdugPGf+E5zjbyHTSRyQ8xfRPPM/s63RHeuknSoT22mjmmnAOIMkUZ6D1xSfPPAfd1WFKM3sO2CMaHx8M1NjnXKHaAGGkOW0C02WeYHUz4qMtx+w5gUDS8NckYe5lHsMYwCZEPyEEmjLDZFmAS7CDviMdxyTkMNVBKEmYLvbiQQBIBBbCQG04bGQvFWz6CfsCQLWCigILFwcfkGYBiOpbYuOizTAyYyDdCtrGaRG1LCkIgMYEFhI0WqQZoSlbGRyHKe4qOx7iv2bVQW9dp4dlM/x6kmwnWQcd/Q3FCqwTEiT5s+6D5v/pb0SSHyg7uhMWAAAAAElFTkSuQmCC); + background-size: 18px 15px; + text-indent: -9999em; + overflow: hidden; +} +#addToHomeScreen .addToHomeShare.addToHomeShareOS7 { + width: 11px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAA8CAYAAAAQTCjdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAASCQAAEgkB80sG3AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKjSURBVGiB7dpPiFVVHMDxz7m9NCtMyI2bEJEC25WrEkzHUXCRraIwdNE8ZxfYIlcis1ZEbGEzT1QCF4XgH1CyWhUoJKIWNRGEiCNKmkSiYTzfcfGuOokx77x3ZlS8382959zfn+/invvn3RdijHIRBrwkOINCYXEcdjpb7VyiYdBsLScwt5y6IloYdzqXo36Ro0gY9IKWo+5JwmzBt2HQnBw9ehYNazyn5TBee8Dh+Vq+CWu92GufnkTDR6ab7gDeBNHouMM/l9tXTXM0fGBmL726Fg1Dam74EsvKqR8VNowL2Yzj5f7rnnE4DHq2235diYYhhTGfC94up35T0y+6di/ITU0rKVd+sEi0P7xr2pSJOu8zvF+OzqEv7vDH/WFxt7/cshy/ticsN8sXYUht0kXDOlsF9XJ4UaEvNoz9X3zc5bKaZThbyr5jzJ4wlNY7KTgM+ES0vhz+KeiPw36fKC/ucAF9uFBOrTZm26SJCtaV27+xIo7cXdkTEhvOoh+XyxprU1qnim7CQdGK2HAyKRexYVShT3RItDElN+mkjiP2Ym+S3f01hv2EVal5WW6hU0ElmptaqJuBpXg6MbeFH2LDpU6CQ93zWIKnEvs0cayGU3glMfkOo1jQYewZzOuyz7FC95Jwo5OgUFfgeg993hh/eTqCTxOSm/iuk8DY0Ap1b2GhtHXxsfZN4j/X0fOx4auEIknEhqv4OiUn1L13Z/+xWfWVaG4q0dxUormpRHNTieamEs1NJZqbJ1Q0jHvdiJo5S2cVjSNOCHZhn3/SnuYnIvl3yomIIz7MXZMn9hydRCrR3FSiualEc1OJ5qYSzU0lmptKNDePjWgwcPePT7/g+4cp8wCW4GXaryK3tL+mLdD5x62ppllgu7bso8q/2HIbzGWdNmWnSJwAAAAASUVORK5CYII=); + background-size: 11px 15px; +} +/** + * + * The touch icon (if available) + * + */ +#addToHomeScreen .addToHomeTouchIcon { + display: block; + float: left; + -webkit-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5), inset 0 0 2px rgba(255, 255, 255, 0.9); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5), inset 0 0 2px rgba(255, 255, 255, 0.9); + background-repeat: no-repeat; + width: 57px; + height: 57px; + -webkit-background-size: 57px 57px; + background-size: 57px 57px; + margin: 0 12px 0 0; + border: 1px solid #333; + -webkit-background-clip: padding-box; + background-clip: padding-box; +} diff --git a/frontend/delta/fonts/clipperz-icons.json b/frontend/delta/fonts/clipperz-icons.json new file mode 100644 index 0000000..1c58732 --- a/dev/null +++ b/frontend/delta/fonts/clipperz-icons.json @@ -0,0 +1 @@ +{"share":"6", "iconsVersion":"1.5", "icomoon":{"selected":[{"idx":"1014","unicode":"64x6fx6ex65"},{"idx":"1013","unicode":"66x61x69x6cx65x64"},{"idx":"994","unicode":"6cx6fx63x6bx65x64"},{"idx":"879","unicode":"75x6ex6cx6fx63x6bx65x64"},{"idx":"1021","unicode":"73x74x61x72x72x65x64"},{"idx":"1020","unicode":"75x6ex73x74x61x72x72x65x64"},{"idx":"1008","unicode":"73x65x74x74x69x6ex67x73"},{"idx":"1024","unicode":"73x65x61x72x63x68"},{"idx":"997","unicode":"72x65x66x72x65x73x68"},{"idx":"947","unicode":"64x65x74x61x69x6c"},{"idx":"815","unicode":"64x6fx77x6ex6cx6fx61x64"},{"idx":"873","unicode":"61x6cx65x72x74"},{"idx":"0","unicode":"63x6cx69x70x70x65x72x7a"},{"idx":"944","unicode":"63x61x6ex63x65x6c"},{"idx":"943","unicode":"73x61x76x65"},{"idx":"837","unicode":"70x61x79x6dx65x6ex74"},{"idx":"946","unicode":"61x64x64"},{"idx":"945","unicode":"64x65x6cx65x74x65"},{"idx":"986","unicode":"74x61x67"},{"idx":"985","unicode":"74x61x67x73"},{"idx":"783","unicode":"6cx6fx61x64x69x6ex67"},{"idx":"948","unicode":"62x61x63x6b"},{"idx":"797","unicode":"67x6f"},{"idx":"892","unicode":"65x78x69x74"},{"idx":"966","unicode":"65x64x69x74"},{"idx":"886","unicode":"70x68x6fx6ex65"},{"idx":"828","unicode":"65x6dx61x69x6c"}],"customIcons":[{"metadata":{"id":"fontawesome","name":"Font Awesome","link":"http://fortawesome.github.com/Font-Awesome/","grid":"14","author":"Dave Gandy","authorLink":"https://github.com/davegandy","license":"CC BY 3.0","licenseLink":"http://creativecommons.org/licenses/by/3.0/","defaultunicode":true},"svgs":["<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"folder-open-alt, open, directory, category, browse\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 445.25,232.75q0.00-8.75 -13.25-8.75l-272.00,0.00 q-10.00,0.00 -21.375,5.375t-17.875,13.125l-73.50,90.75q-4.50,6.00 -4.50,10.00q0.00,8.75 13.25,8.75l 272.00,0.00 q 10.00,0.00 21.50-5.50t 17.75-13.25l 73.50-90.75q 4.50-5.50 4.50-9.75zM 160.00,192.00l 192.00,0.00 l0.00-40.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-144.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-16.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-80.00,0.00 q-10.00,0.00 -17.00,7.00t-7.00,17.00 l0.00,213.25 l 64.00-78.75q 11.00-13.25 29.00-21.875t 35.00-8.625zM 477.25,232.75q0.00,15.50 -11.50,30.00l-73.75,90.75q-10.75,13.25 -29.00,21.875t-35.00,8.625l-272.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-240.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 80.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,8.00 l 136.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,40.00 l 48.00,0.00 q 13.50,0.00 24.75,6.125t 16.75,17.625q 3.75,8.00 3.75,17.00z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"folder-close-alt, directory, category\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,328.00l0.00-176.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-176.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-16.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-80.00,0.00 q-10.00,0.00 -17.00,7.00t-7.00,17.00l0.00,240.00 q0.00,10.00 7.00,17.00t 17.00,7.00l 304.00,0.00 q 10.00,0.00 17.00-7.00t 7.00-17.00zM 416.00,152.00l0.00,176.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-304.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-240.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 80.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,8.00 l 168.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"github-alt, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 160.00,304.00q0.00,10.00 -3.125,20.50t-10.75,19.00t-18.125,8.50t-18.125-8.50t-10.75-19.00t-3.125-20.50t 3.125-20.50t 10.75-19.00t 18.125-8.50t 18.125,8.50t 10.75,19.00t 3.125,20.50zM 320.00,304.00q0.00,10.00 -3.125,20.50t-10.75,19.00t-18.125,8.50t-18.125-8.50t-10.75-19.00t-3.125-20.50t 3.125-20.50t 10.75-19.00t 18.125-8.50t 18.125,8.50t 10.75,19.00t 3.125,20.50zM 360.00,304.00 q0.00-30.00 -17.25-51.00t-46.75-21.00q-10.25,0.00 -48.75,5.25q-17.75,2.75 -39.25,2.75t-39.25-2.75q-38.00-5.25 -48.75-5.25q-29.50,0.00 -46.75,21.00t-17.25,51.00q0.00,22.00 8.00,38.375t 20.25,25.75t 30.50,15.00t 35.00,7.375t 37.25,1.75l 42.00,0.00 q 20.50,0.00 37.25-1.75t 35.00-7.375t 30.50-15.00t 20.25-25.75t 8.00-38.375zM 416.00,260.00q0.00,51.75 -15.25,82.75q-9.50,19.25 -26.375,33.25t-35.25,21.50 t-42.50,11.875t-42.875,5.50t-41.75,1.125q-19.50,0.00 -35.50-0.75t-36.875-3.125t-38.125-7.50t-34.25-12.875t-30.25-20.25t-21.50-28.75q-15.50-30.75 -15.50-82.75q0.00-59.25 34.00-99.00q-6.75-20.50 -6.75-42.50q0.00-29.00 12.75-54.50q 27.00,0.00 47.50,9.875t 47.25,30.875q 36.75-8.75 77.25-8.75q 37.00,0.00 70.00,8.00q 26.25-20.50 46.75-30.25t 47.25-9.75q 12.75,25.50 12.75,54.50 q0.00,21.75 -6.75,42.00q 34.00,40.00 34.00,99.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"reply, arrow, left\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,280.00q0.00,41.50 -31.75,112.75q-0.75,1.75 -2.625,6.00t-3.375,7.50t-3.25,5.50q-3.00,4.25 -7.00,4.25q-3.75,0.00 -5.875-2.50t-2.125-6.25q0.00-2.25 0.625-6.625t 0.625-5.875q 1.25-17.00 1.25-30.75q0.00-25.25 -4.375-45.25t-12.125-34.625t-20.00-25.25t-26.375-17.375t-33.25-10.625t-38.50-5.375t-43.875-1.50l-56.00,0.00 l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75 l-128.00-128.00q-4.75-4.75 -4.75-11.25t 4.75-11.25l 128.00-128.00q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,64.00 l 56.00,0.00 q 178.25,0.00 218.75,100.75q 13.25,33.50 13.25,83.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"392\" height=\"448\" viewBox=\"0 0 392 448\" data-du=\"\" data-tags=\"spinner, loading, busy, progress\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 124.00,336.00q0.00,15.00 -10.625,25.50t-25.375,10.50q-15.00,0.00 -25.50-10.50t-10.50-25.50t 10.50-25.50t 25.50-10.50q 14.75,0.00 25.375,10.50t 10.625,25.50zM 232.00,384.00q0.00,13.25 -9.375,22.625t-22.625,9.375t-22.625-9.375t-9.375-22.625t 9.375-22.625t 22.625-9.375t 22.625,9.375t 9.375,22.625zM 80.00,224.00q0.00,16.50 -11.75,28.25t-28.25,11.75t-28.25-11.75t-11.75-28.25 t 11.75-28.25t 28.25-11.75t 28.25,11.75t 11.75,28.25zM 340.00,336.00q0.00,11.50 -8.25,19.75t-19.75,8.25t-19.75-8.25t-8.25-19.75t 8.25-19.75t 19.75-8.25t 19.75,8.25t 8.25,19.75zM 132.00,112.00q0.00,18.25 -12.875,31.125t-31.125,12.875t-31.125-12.875t-12.875-31.125t 12.875-31.125t 31.125-12.875t 31.125,12.875t 12.875,31.125zM 248.00,64.00q0.00,20.00 -14.00,34.00t-34.00,14.00 t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 384.00,224.00q0.00,10.00 -7.00,17.00t-17.00,7.00t-17.00-7.00t-7.00-17.00t 7.00-17.00t 17.00-7.00t 17.00,7.00t 7.00,17.00zM 332.00,112.00q0.00,8.25 -5.875,14.125t-14.125,5.875t-14.125-5.875t-5.875-14.125t 5.875-14.125t 14.125-5.875t 14.125,5.875t 5.875,14.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"quote-right, rdquo\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,80.00l0.00,176.00 q0.00,26.00 -10.125,49.625t-27.375,40.875t-40.875,27.375t-49.625,10.125l-16.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 16.00,0.00 q 26.50,0.00 45.25-18.75t 18.75-45.25l0.00-8.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-56.00,0.00 q-20.00,0.00 -34.00-14.00t-14.00-34.00l0.00-96.00 q0.00-20.00 14.00-34.00t 34.00-14.00l 96.00,0.00 q 20.00,0.00 34.00,14.00t 14.00,34.00zM 416.00,80.00 l0.00,176.00 q0.00,26.00 -10.125,49.625t-27.375,40.875t-40.875,27.375t-49.625,10.125l-16.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 16.00,0.00 q 26.50,0.00 45.25-18.75t 18.75-45.25l0.00-8.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-56.00,0.00 q-20.00,0.00 -34.00-14.00t-14.00-34.00l0.00-96.00 q0.00-20.00 14.00-34.00t 34.00-14.00l 96.00,0.00 q 20.00,0.00 34.00,14.00t 14.00,34.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"quote-left, ldquo\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,240.00l0.00,96.00 q0.00,20.00 -14.00,34.00t-34.00,14.00l-96.00,0.00 q-20.00,0.00 -34.00-14.00t-14.00-34.00l0.00-176.00 q0.00-26.00 10.125-49.625t 27.375-40.875t 40.875-27.375t 49.625-10.125l 16.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-16.00,0.00 q-26.50,0.00 -45.25,18.75t-18.75,45.25l0.00,8.00 q0.00,10.00 7.00,17.00t 17.00,7.00l 56.00,0.00 q 20.00,0.00 34.00,14.00t 14.00,34.00z M 416.00,240.00l0.00,96.00 q0.00,20.00 -14.00,34.00t-34.00,14.00l-96.00,0.00 q-20.00,0.00 -34.00-14.00t-14.00-34.00l0.00-176.00 q0.00-26.00 10.125-49.625t 27.375-40.875t 40.875-27.375t 49.625-10.125l 16.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-16.00,0.00 q-26.50,0.00 -45.25,18.75t-18.75,45.25l0.00,8.00 q0.00,10.00 7.00,17.00t 17.00,7.00l 56.00,0.00 q 20.00,0.00 34.00,14.00t 14.00,34.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-blank\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375 t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"192\" height=\"448\" viewBox=\"0 0 192 448\" data-du=\"\" data-tags=\"mobile, phone\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 116.00,352.00q0.00-8.25 -5.875-14.125t-14.125-5.875t-14.125,5.875t-5.875,14.125t 5.875,14.125t 14.125,5.875t 14.125-5.875t 5.875-14.125zM 168.00,312.00l0.00-176.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-128.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,176.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 128.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 120.00,100.00 q0.00-4.00 -4.00-4.00l-40.00,0.00 q-4.00,0.00 -4.00,4.00t 4.00,4.00l 40.00,0.00 q 4.00,0.00 4.00-4.00zM 192.00,96.00l0.00,256.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-256.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"tablet, mobile\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 160.00,352.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 256.00,312.00l0.00-240.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-208.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,240.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 208.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 288.00,72.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-208.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 208.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"laptop, computer, notebook\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 104.00,320.00q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-176.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 272.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,176.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-272.00,0.00 zM 96.00,104.00l0.00,176.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 272.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-176.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-272.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625z M 440.00,336.00l 40.00,0.00 l0.00,24.00 q0.00,10.00 -11.75,17.00t-28.25,7.00l-400.00,0.00 q-16.50,0.00 -28.25-7.00t-11.75-17.00l0.00-24.00 l 40.00,0.00 l 400.00,0.00 zM 260.00,360.00q 4.00,0.00 4.00-4.00t-4.00-4.00l-40.00,0.00 q-4.00,0.00 -4.00,4.00t 4.00,4.00l 40.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"desktop, computer, screen, display, pc\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 448.00,248.00l0.00-208.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-400.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,208.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 400.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 480.00,40.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-136.00,0.00 q0.00,9.25 4.00,19.375t 8.00,17.75t 4.00,10.875q0.00,6.50 -4.75,11.25t-11.25,4.75l-128.00,0.00 q-6.50,0.00 -11.25-4.75 t-4.75-11.25q0.00-3.50 4.00-11.00t 8.00-17.50t 4.00-19.50l-136.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"angle-down, arrow, down\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 268.75,184.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 98.25,98.25l 98.25-98.25q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"angle-up, arrow, up\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 268.75,296.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-98.25-98.25l-98.25,98.25q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"160\" height=\"448\" viewBox=\"0 0 160 448\" data-du=\"\" data-tags=\"angle-right, arrow, right\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 148.75,240.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 98.25-98.25l-98.25-98.25q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"160\" height=\"448\" viewBox=\"0 0 160 448\" data-du=\"\" data-tags=\"angle-left, arrow, left\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 156.75,136.00q0.00,3.25 -2.50,5.75l-98.25,98.25l 98.25,98.25q 2.50,2.50 2.50,5.75t-2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"double-angle-down, down, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 268.75,216.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 98.25,98.25l 98.25-98.25q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75zM 268.75,120.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75 t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 98.25,98.25l 98.25-98.25q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"double-angle-up, up, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 268.75,328.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-98.25-98.25l-98.25,98.25q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75zM 268.75,232.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-98.25-98.25l-98.25,98.25 q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"double-angle-right, right, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 148.75,240.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 98.25-98.25l-98.25-98.25q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75zM 244.75,240.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75 l 98.25-98.25l-98.25-98.25q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"double-angle-left, left, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 156.75,344.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75t-2.50,5.75l-98.25,98.25l 98.25,98.25q 2.50,2.50 2.50,5.75zM 252.75,344.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75 t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75t-2.50,5.75l-98.25,98.25l 98.25,98.25q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"plus-sign, add, sum\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,240.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-80.00,0.00 l0.00-80.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,80.00 l-80.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 80.00,0.00 l0.00,80.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-80.00 l 80.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"h-sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,336.00l0.00-224.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,80.00 l-128.00,0.00 l0.00-80.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,224.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-80.00 l 128.00,0.00 l0.00,80.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"beer, mug, drink\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 160.00,224.00l0.00-96.00 l-64.00,0.00 l0.00,40.00 q0.00,11.25 0.50,19.00t 1.875,14.125t 3.625,10.00t 5.75,6.625t 8.375,3.875t 11.25,1.875t 14.50,0.625t 18.125-0.125zM 416.00,336.00l0.00,48.00 l-288.00,0.00 l0.00-48.00 l 32.00-48.00l-24.25,0.00 q-52.75,0.00 -78.25-25.625t-25.50-78.625l0.00-71.75 l-16.00-16.00l 8.00-32.00l 120.00,0.00 l 8.00-32.00l 240.00,0.00 l 8.00,48.00l-16.00,8.00l0.00,200.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"fighter-jet, pane, aircraft\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 408.00,184.00q 65.25,14.50 71.75,23.25l 0.25,0.75q-0.25,8.00 -72.00,24.00l-88.00,8.00l-56.00,16.00l-16.00,0.00 l-73.25,88.00l 17.25,0.00 q 6.50,0.00 11.25,1.125t 4.75,2.875t-4.75,2.875t-11.25,1.125l-24.00,0.00 l-40.00,0.00 l-16.00,0.00 l0.00-8.00 l 16.00,0.00 l0.00-104.00 l-40.00,0.00 l-48.00,56.00l-24.00,0.00 l-8.00-8.00l0.00-48.00 l 8.00,0.00 l0.00-8.00 l 32.00,0.00 l0.00-2.00 l-48.00-6.00l0.00-32.00 l 48.00-6.00l0.00-2.00 l-32.00,0.00 l0.00-8.00 l-8.00,0.00 l0.00-48.00 l 8.00-8.00l 24.00,0.00 l 48.00,56.00l 40.00,0.00 l0.00-104.00 l-16.00,0.00 l0.00-8.00 l 16.00,0.00 l 40.00,0.00 l 24.00,0.00 q 6.50,0.00 11.25,1.125t 4.75,2.875t-4.75,2.875t-11.25,1.125l-17.25,0.00 l 73.25,88.00l 16.00,0.00 l 56.00,16.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"medkit, medicine, kit\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 320.00,280.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-56.00,0.00 l0.00-56.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-48.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,56.00 l-56.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 56.00,0.00 l0.00,56.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 48.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75l0.00-56.00 l 56.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 160.00,96.00l 128.00,0.00 l0.00-32.00 l-128.00,0.00 l0.00,32.00 zM 64.00,96.00l0.00,320.00 l-8.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-208.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 8.00,0.00 zM 360.00,96.00l0.00,320.00 l-272.00,0.00 l0.00-320.00 l 40.00,0.00 l0.00-40.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 144.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,40.00 l 40.00,0.00 zM 448.00,152.00l0.00,208.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-8.00,0.00 l0.00-320.00 l 8.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"ambulance\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 160.00,352.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 64.00,224.00l 96.00,0.00 l0.00-64.00 l-39.50,0.00 q-3.50,0.50 -5.50,2.25l-48.75,48.75q-1.75,3.00 -2.25,5.50l0.00,7.50 zM 384.00,352.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375 t 22.625-9.375t 9.375-22.625zM 416.00,184.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-56.00,0.00 l0.00-56.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-48.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,56.00 l-56.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 56.00,0.00 l0.00,56.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 48.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75l0.00-56.00 l 56.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 480.00,48.00l0.00,288.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-48.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-96.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75l0.00-104.00 q0.00-6.50 3.25-14.50t 8.00-12.75l 49.50-49.50q 4.75-4.75 12.75-8.00t 14.50-3.25l 40.00,0.00 l0.00-80.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 288.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"hospital, building\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,328.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 288.00,328.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 224.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 224.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 224.00,416.00l 96.00,0.00 l0.00-288.00 l-64.00,0.00 l0.00,8.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-112.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-8.00 l-64.00,0.00 l0.00,288.00 l 96.00,0.00 l0.00-56.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 80.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,56.00 zM 224.00,120.00l0.00-80.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-16.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,24.00 l-32.00,0.00 l0.00-24.00 q0.00-3.25 -2.375-5.625 t-5.625-2.375l-16.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,80.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 16.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-24.00 l 32.00,0.00 l0.00,24.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 16.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 352.00,112.00l0.00,320.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-320.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-320.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 80.00,0.00 l0.00-72.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 112.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,72.00 l 80.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"building, office, work\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,328.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 288.00,328.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 224.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,136.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 288.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 224.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,136.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,72.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 288.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 224.00,136.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,72.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,136.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 224.00,72.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,72.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 224.00,416.00l 96.00,0.00 l0.00-384.00 l-288.00,0.00 l0.00,384.00 l 96.00,0.00 l0.00-56.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 80.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,56.00 zM 352.00,16.00l0.00,416.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-320.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-416.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 320.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"320\" height=\"448\" viewBox=\"0 0 320 448\" data-du=\"\" data-tags=\"file-alt, paper, document\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 256.00,296.00l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-176.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 176.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 256.00,232.00l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-176.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 176.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 32.00,384.00l 256.00,0.00 l0.00-192.00 l-104.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-128.00,0.00 l0.00,320.00 z M 192.00,160.00l 74.75,0.00 l-74.75-74.75l0.00,74.75 zM 320.00,192.00l0.00,200.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-272.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-336.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 136.00,0.00 q 10.00,0.00 22.00,5.00t 19.00,12.00l 102.00,102.00q 7.00,7.00 12.00,19.00t 5.00,22.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"food, lunch, fork, knife, dinner\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 160.00,16.00l0.00,160.00 q0.00,15.25 -8.875,27.75t-23.125,17.50l0.00,194.75 q0.00,13.00 -9.50,22.50t-22.50,9.50l-32.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-194.75 q-14.25-5.00 -23.125-17.50t-8.875-27.75l0.00-160.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,104.00 q0.00,6.50 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25l0.00-104.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,104.00 q0.00,6.50 4.75,11.25 t 11.25,4.75t 11.25-4.75t 4.75-11.25l0.00-104.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25zM 352.00,16.00l0.00,400.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-32.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-128.00 l-56.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-200.00 q0.00-33.00 23.50-56.50t 56.50-23.50l 64.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"coffee, break, drink, cup, tea\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 416.00,160.00q0.00-20.00 -14.00-34.00t-34.00-14.00l-16.00,0.00 l0.00,96.00 l 16.00,0.00 q 20.00,0.00 34.00-14.00t 14.00-34.00zM0.00,352.00l 448.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75l-320.00,0.00 q-26.50,0.00 -45.25-18.75t-18.75-45.25zM 464.00,160.00q0.00,39.75 -28.125,67.875t-67.875,28.125l-16.00,0.00 l0.00,8.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-176.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-184.00 q0.00-6.50 4.75-11.25 t 11.25-4.75l 288.00,0.00 q 39.75,0.00 67.875,28.125t 28.125,67.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"bell-alt, alarm, notification\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 212.00,424.00q0.00-4.00 -4.00-4.00q-14.75,0.00 -25.375-10.625t-10.625-25.375q0.00-4.00 -4.00-4.00t-4.00,4.00q0.00,18.25 12.875,31.125t 31.125,12.875q 4.00,0.00 4.00-4.00zM 416.00,352.00q0.00,13.00 -9.50,22.50t-22.50,9.50l-112.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-112.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50q 47.50-40.25 71.75-99.375t 24.25-124.625 q0.00-41.25 24.00-65.50t 66.00-29.25q-2.00-4.50 -2.00-9.25q0.00-10.00 7.00-17.00t 17.00-7.00t 17.00,7.00t 7.00,17.00q0.00,4.75 -2.00,9.25q 42.00,5.00 66.00,29.25t 24.00,65.50q0.00,65.50 24.25,124.625t 71.75,99.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"suitcase, briefcase, travel, vacation\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 160.00,96.00l 128.00,0.00 l0.00-32.00 l-128.00,0.00 l0.00,32.00 zM 72.00,96.00l0.00,320.00 l-16.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-208.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 16.00,0.00 zM 352.00,96.00l0.00,320.00 l-256.00,0.00 l0.00-320.00 l 32.00,0.00 l0.00-40.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 144.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,40.00 l 32.00,0.00 zM 448.00,152.00l0.00,208.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-16.00,0.00 l0.00-320.00 l 16.00,0.00 q 23.00,0.00 39.50,16.50 t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"stethoscope\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 320.00,176.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 352.00,176.00q0.00,15.50 -8.875,27.75t-23.125,17.50l0.00,98.75 q0.00,39.75 -32.875,67.875t-79.125,28.125t-79.125-28.125t-32.875-67.875l0.00-33.00 q-41.00-5.00 -68.50-32.00t-27.50-63.00l0.00-128.00 q0.00-6.50 4.75-11.25t 11.25-4.75q 1.50,0.00 4.00,0.50q 4.25-7.50 11.75-12.00 t 16.25-4.50q 13.25,0.00 22.625,9.375t 9.375,22.625t-9.375,22.625t-22.625,9.375q-8.25,0.00 -16.00-4.50l0.00,100.50 q0.00,26.50 23.50,45.25t 56.50,18.75t 56.50-18.75t 23.50-45.25l0.00-100.50 q-7.75,4.50 -16.00,4.50q-13.25,0.00 -22.625-9.375t-9.375-22.625t 9.375-22.625t 22.625-9.375q 8.75,0.00 16.25,4.50t 11.75,12.00q 2.50-0.50 4.00-0.50q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,128.00 q0.00,36.00 -27.50,63.00 t-68.50,32.00l0.00,33.00 q0.00,26.50 23.50,45.25t 56.50,18.75t 56.50-18.75t 23.50-45.25l0.00-98.75 q-14.25-5.25 -23.125-17.50t-8.875-27.75q0.00-20.00 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"user-md, medic, doctor\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,336.00q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25zM 352.00,351.25q0.00,30.25 -18.25,47.50t-48.50,17.25l-218.50,0.00 q-30.25,0.00 -48.50-17.25t-18.25-47.50q0.00-17.00 1.375-32.75t 6.00-34.50t 11.875-33.125t 20.25-25.75t 30.00-15.125q-5.50,13.00 -5.50,30.00l0.00,50.75 q-14.50,5.00 -23.25,17.50t-8.75,27.75q0.00,20.00 14.00,34.00t 34.00,14.00 t 34.00-14.00t 14.00-34.00q0.00-15.25 -8.875-27.75t-23.125-17.50l0.00-50.75 q0.00-15.50 6.25-23.25q 33.00,26.00 73.75,26.00t 73.75-26.00q 6.25,7.75 6.25,23.25l0.00,16.00 q-26.50,0.00 -45.25,18.75t-18.75,45.25l0.00,22.25 q-8.00,7.25 -8.00,17.75q0.00,10.00 7.00,17.00t 17.00,7.00t 17.00-7.00t 7.00-17.00q0.00-10.50 -8.00-17.75l0.00-22.25 q0.00-13.00 9.50-22.50t 22.50-9.50t 22.50,9.50t 9.50,22.50l0.00,22.25 q-8.00,7.25 -8.00,17.75q0.00,10.00 7.00,17.00 t 17.00,7.00t 17.00-7.00t 7.00-17.00q0.00-10.50 -8.00-17.75l0.00-22.25 q0.00-17.00 -8.625-31.875t-23.375-23.375q0.00-2.50 0.125-10.625t0.00-12.00t-0.625-10.375t-1.75-11.75t-3.25-10.00q 17.00,3.75 30.00,15.125t 20.25,25.75t 11.875,33.125t 6.00,34.50t 1.375,32.75zM 272.00,128.00q0.00,39.75 -28.125,67.875t-67.875,28.125t-67.875-28.125t-28.125-67.875t 28.125-67.875t 67.875-28.125 t 67.875,28.125t 28.125,67.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"cloud-upload, upload, load, open\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 320.00,216.00q0.00-3.50 -2.25-5.75l-88.00-88.00q-2.25-2.25 -5.75-2.25t-5.75,2.25l-87.75,87.75q-2.50,3.00 -2.50,6.00q0.00,3.50 2.25,5.75t 5.75,2.25l 56.00,0.00 l0.00,88.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-88.00 l 56.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 480.00,288.00q0.00,39.75 -28.125,67.875t-67.875,28.125l-272.00,0.00 q-46.25,0.00 -79.125-32.875t-32.875-79.125q0.00-32.50 17.50-60.00t 47.00-41.25q-0.50-7.50 -0.50-10.75q0.00-53.00 37.50-90.50t 90.50-37.50q 39.00,0.00 71.375,21.75t 47.125,57.75q 17.75-15.50 41.50-15.50q 26.50,0.00 45.25,18.75t 18.75,45.25q0.00,19.00 -10.25,34.50q 32.50,7.75 53.375,33.875t 20.875,59.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"cloud-download, download, store, save\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 320.00,232.00q0.00-3.50 -2.25-5.75t-5.75-2.25l-56.00,0.00 l0.00-88.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,88.00 l-56.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625q0.00,3.50 2.25,5.75l 88.00,88.00q 2.25,2.25 5.75,2.25t 5.75-2.25l 87.75-87.75q 2.50-3.00 2.50-6.00zM 480.00,288.00q0.00,39.75 -28.125,67.875t-67.875,28.125l-272.00,0.00 q-46.25,0.00 -79.125-32.875t-32.875-79.125q0.00-32.50 17.50-60.00t 47.00-41.25q-0.50-7.50 -0.50-10.75q0.00-53.00 37.50-90.50t 90.50-37.50q 39.00,0.00 71.375,21.75t 47.125,57.75q 17.75-15.50 41.50-15.50q 26.50,0.00 45.25,18.75t 18.75,45.25q0.00,19.00 -10.25,34.50q 32.50,7.75 53.375,33.875t 20.875,59.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"exchange, transfer, tab, traffic\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,296.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-344.00,0.00 l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375q-3.00,0.00 -6.00-2.50l-79.75-80.00q-2.25-2.25 -2.25-5.50q0.00-3.50 2.25-5.75l 80.00-80.00q 2.25-2.25 5.75-2.25q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,48.00 l 344.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,160.00q0.00,3.50 -2.25,5.75l-80.00,80.00q-2.25,2.25 -5.75,2.25 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 l-344.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 344.00,0.00 l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25q 3.00,0.00 6.00,2.50l 79.75,79.75q 2.25,2.25 2.25,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"lightbulb, idea, tip\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 184.00,144.00q0.00,3.25 -2.375,5.625t-5.625,2.375t-5.625-2.375t-2.375-5.625q0.00-11.50 -13.50-17.75t-26.50-6.25q-3.25,0.00 -5.625-2.375t-2.375-5.625t 2.375-5.625t 5.625-2.375q 12.50,0.00 24.875,4.00t 21.75,13.50t 9.375,22.50zM 224.00,144.00q0.00-18.00 -8.625-33.50t-22.50-25.375t-30.75-15.50t-34.125-5.625t-34.125,5.625t-30.75,15.50t-22.50,25.375t-8.625,33.50 q0.00,25.25 17.00,45.00q 2.50,2.75 7.625,8.25t 7.625,8.25q 32.00,38.25 35.25,74.50l 57.00,0.00 q 3.25-36.25 35.25-74.50q 2.50-2.75 7.625-8.25t 7.625-8.25q 17.00-19.75 17.00-45.00zM 256.00,144.00q0.00,38.75 -25.75,67.00q-11.25,12.25 -18.625,21.75t-14.875,23.875t-8.50,26.875q 11.75,7.00 11.75,20.50q0.00,9.25 -6.25,16.00q 6.25,6.75 6.25,16.00q0.00,13.00 -11.25,20.25q 3.25,5.75 3.25,11.75 q0.00,11.50 -7.875,17.75t-19.375,6.25q-5.00,11.00 -15.00,17.50t-21.75,6.50t-21.75-6.50t-15.00-17.50q-11.50,0.00 -19.375-6.25t-7.875-17.75q0.00-6.00 3.25-11.75q-11.25-7.25 -11.25-20.25q0.00-9.25 6.25-16.00q-6.25-6.75 -6.25-16.00q0.00-13.50 11.75-20.50q-1.00-12.50 -8.50-26.875t-14.875-23.875t-18.625-21.75q-25.75-28.25 -25.75-67.00q0.00-24.75 11.125-46.125t 29.25-35.50t 41.00-22.25t 46.625-8.125 t 46.625,8.125t 41.00,22.25t 29.25,35.50t 11.125,46.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"paste, clipboard\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 192.00,416.00l 224.00,0.00 l0.00-160.00 l-104.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-96.00,0.00 l0.00,288.00 zM 256.00,56.00l0.00-16.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-176.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,16.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 176.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 320.00,224.00l 74.75,0.00 l-74.75-74.75l0.00,74.75 zM 448.00,256.00l0.00,168.00 q0.00,10.00 -7.00,17.00t-17.00,7.00 l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-40.00 l-136.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-336.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 272.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,82.00 q 5.25,3.25 9.00,7.00l 102.00,102.00q 7.00,7.00 12.00,19.00t 5.00,22.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"umbrella, rainy\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 224.00,207.00l0.00,145.00 q0.00,26.00 -19.00,45.00t-45.00,19.00t-45.00-19.00t-19.00-45.00q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25q0.00,12.50 9.75,22.25t 22.25,9.75t 22.25-9.75t 9.75-22.25l0.00-145.00 q 8.25-2.75 16.00-2.75t 16.00,2.75zM 416.00,213.75q0.00,3.25 -2.375,5.625t-5.625,2.375q-2.75,0.00 -5.75-2.50q-12.25-11.50 -23.25-17.25t-25.50-5.75q-17.00,0.00 -32.00,9.25t-25.75,24.25 q-1.75,2.50 -4.375,7.00t-3.625,6.00q-2.75,4.25 -7.00,4.25q-4.50,0.00 -7.25-4.25q-1.00-1.50 -3.625-6.00t-4.375-7.00q-10.75-15.00 -25.625-24.25t-31.875-9.25t-31.875,9.25t-25.625,24.25q-1.75,2.50 -4.375,7.00t-3.625,6.00q-2.75,4.25 -7.25,4.25q-4.25,0.00 -7.00-4.25q-1.00-1.50 -3.625-6.00t-4.375-7.00q-10.75-15.00 -25.75-24.25t-32.00-9.25q-14.50,0.00 -25.50,5.75t-23.25,17.25 q-3.00,2.50 -5.75,2.50q-3.25,0.00 -5.625-2.375t-2.375-5.625q0.00-1.25 0.25-1.75q 11.25-45.75 43.125-79.875t 74.50-51.125t 90.125-17.00q 35.00,0.00 68.625,10.00t 61.625,28.375t 48.625,46.75t 28.875,62.875q 0.25,0.50 0.25,1.75zM 224.00,32.00l0.00,24.50 q-10.50-0.50 -16.00-0.50t-16.00,0.50l0.00-24.50 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"sitemap, tree\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,312.00l0.00,80.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-80.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 24.00,0.00 l0.00-48.00 l-128.00,0.00 l0.00,48.00 l 24.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,80.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-80.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 24.00,0.00 l0.00-48.00 l-128.00,0.00 l0.00,48.00 l 24.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,80.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-80.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 24.00,0.00 l0.00-48.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 l0.00-48.00 l-24.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-80.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,80.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-24.00,0.00 l0.00,48.00 l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50l0.00,48.00 l 24.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"224\" height=\"448\" viewBox=\"0 0 224 448\" data-du=\"\" data-tags=\"bolt, lightning, power, electricity, energy\" style=\"margin-left: 12px; margin-top: 8px;\"><path d=\"M 221.25,141.50q 4.50,5.00 1.75,11.00l-135.00,289.25q-3.25,6.25 -10.50,6.25q-1.00,0.00 -3.50-0.50q-4.25-1.25 -6.375-4.75t-1.125-7.50l 49.25-202.00l-101.50,25.25q-1.00,0.25 -3.00,0.25q-4.50,0.00 -7.75-2.75q-4.50-3.75 -3.25-9.75l 50.25-206.25q 1.00-3.50 4.00-5.75t 7.00-2.25l 82.00,0.00 q 4.75,0.00 8.00,3.125t 3.25,7.375q0.00,2.00 -1.25,4.50l-42.75,115.75l 99.00-24.50q 2.00-0.50 3.00-0.50q 4.75,0.00 8.50,3.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"comments-alt, chat, talk, bubbles\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 176.00,96.00q-38.25,0.00 -71.50,13.00t-52.875,35.25t-19.625,47.75q0.00,20.50 13.25,39.50t 37.25,33.00l 24.25,14.00l-8.75,21.00q 8.50-5.00 15.50-9.75l 11.00-7.75l 13.25,2.50q 19.50,3.50 38.25,3.50q 38.25,0.00 71.50-13.00t 52.875-35.25t 19.625-47.75t-19.625-47.75t-52.875-35.25t-71.50-13.00zM 176.00,64.00q 47.75,0.00 88.375,17.125t 64.125,46.625t 23.50,64.25t-23.50,64.25 t-64.125,46.625t-88.375,17.125q-21.50,0.00 -44.00-4.00q-31.00,22.00 -69.50,32.00q-9.00,2.25 -21.50,4.00l-0.75,0.00 q-2.75,0.00 -5.125-2.00t-2.875-5.25q-0.25-0.75 -0.25-1.625t 0.125-1.625t 0.50-1.50l 0.625-1.25t 0.875-1.375t 1.00-1.25t 1.125-1.25t 1.00-1.125q 1.25-1.50 5.75-6.25t 6.50-7.375t 5.625-7.25t 6.25-9.625t 5.125-11.00q-31.00-18.00 -48.75-44.25t-17.75-56.00q0.00-34.75 23.50-64.25t 64.125-46.625 t 88.375-17.125zM 381.50,356.25q 2.50,6.00 5.125,11.00t 6.25,9.625t 5.625,7.25t 6.50,7.375t 5.75,6.25q 0.25,0.25 1.00,1.125t 1.125,1.25t 1.00,1.25t 0.875,1.375l 0.625,1.25t 0.50,1.50t 0.125,1.625t-0.25,1.625q-0.75,3.50 -3.25,5.50t-5.50,1.75q-12.50-1.75 -21.50-4.00q-38.50-10.00 -69.50-32.00q-22.50,4.00 -44.00,4.00q-67.75,0.00 -118.00-33.00q 14.50,1.00 22.00,1.00q 40.25,0.00 77.25-11.25t 66.00-32.25 q 31.25-23.00 48.00-53.00t 16.75-63.50q0.00-19.25 -5.75-38.00q 32.25,17.75 51.00,44.50t 18.75,57.50q0.00,30.00 -17.75,56.125t-48.75,44.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"comment-alt, chat, talk, bubble\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 224.00,96.00q-51.00,0.00 -95.375,17.375t-70.50,46.875t-26.125,63.75q0.00,28.00 17.875,53.375t 50.375,43.875l 21.75,12.50l-6.75,24.00q-6.00,22.75 -17.50,43.00q 38.00-15.75 68.75-42.75l 10.75-9.50l 14.25,1.50q 17.25,2.00 32.50,2.00q 51.00,0.00 95.375-17.375t 70.50-46.875t 26.125-63.75t-26.125-63.75t-70.50-46.875t-95.375-17.375zM 448.00,224.00 q0.00,43.50 -30.00,80.375t-81.50,58.25t-112.50,21.375q-17.50,0.00 -36.25-2.00q-49.50,43.75 -115.00,60.50q-12.25,3.50 -28.50,5.50l-1.25,0.00 q-3.75,0.00 -6.75-2.625t-4.00-6.875l0.00-0.25 q-0.75-1.00 -0.125-3.00t 0.50-2.50t 1.125-2.375l 1.50-2.25t 1.75-2.125t 2.00-2.25q 1.75-2.00 7.75-8.625t 8.625-9.50t 7.75-9.875t 8.125-12.75t 6.75-14.75t 6.50-19.00q-39.25-22.25 -61.875-55.00t-22.625-70.25q0.00-43.50 30.00-80.375 t 81.50-58.25t 112.50-21.375t 112.50,21.375t 81.50,58.25t 30.00,80.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"dashboard, meter, speed\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 96.00,288.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 144.00,176.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 251.00,296.25l 25.25-95.50q 1.50-6.50 -1.875-12.125t-9.625-7.375 t-12.00,1.625t-7.50,9.875l-25.25,95.50q-15.00,1.25 -26.75,10.875t-15.75,24.625q-5.00,19.25 5.00,36.50t 29.25,22.25t 36.50-5.00t 22.25-29.25q 4.00-15.00 -1.50-29.25t-18.00-22.75zM 416.00,288.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 256.00,128.00q0.00-13.25 -9.375-22.625 t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 368.00,176.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 448.00,288.00q0.00,65.25 -35.25,120.75q-4.75,7.25 -13.50,7.25l-350.50,0.00 q-8.75,0.00 -13.50-7.25 q-35.25-55.25 -35.25-120.75q0.00-45.50 17.75-87.00t 47.75-71.50t 71.50-47.75t 87.00-17.75t 87.00,17.75t 71.50,47.75t 47.75,71.50t 17.75,87.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"legal, hammer, rules\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 442.75,384.00q0.00,13.25 -9.25,22.50l-26.75,27.00q-9.75,9.25 -22.75,9.25q-13.25,0.00 -22.50-9.25l-90.75-91.00q-9.50-9.00 -9.50-22.50q0.00-13.25 10.75-24.00l-64.00-64.00l-31.50,31.50q-3.50,3.50 -8.50,3.50t-8.50-3.50q 0.50,0.50 3.125,3.00t 3.125,3.25t 2.50,2.875t 2.50,3.375t 1.50,3.375t 1.375,4.125t 0.375,4.50q0.00,9.50 -7.00,17.00q-0.75,0.75 -4.125,4.50t-4.75,5.125 t-4.625,4.125t-5.50,3.875t-5.50,2.25t-6.50,1.125q-10.00,0.00 -17.00-7.00l-102.00-102.00q-7.00-7.00 -7.00-17.00q0.00-3.25 1.125-6.50t 2.25-5.50t 3.875-5.50t 4.125-4.625t 5.125-4.75t 4.50-4.125q 7.50-7.00 17.00-7.00q 2.50,0.00 4.50,0.375t 4.125,1.375t 3.375,1.50t 3.375,2.50t 2.875,2.50t 3.25,3.125t 3.00,3.125q-3.50-3.50 -3.50-8.50t 3.50-8.50l 87.00-87.00q 3.50-3.50 8.50-3.50t 8.50,3.50 q-0.50-0.50 -3.125-3.00t-3.125-3.25t-2.50-2.875t-2.50-3.375t-1.50-3.375t-1.375-4.125t-0.375-4.50q0.00-9.50 7.00-17.00q 0.75-0.75 4.125-4.50t 4.75-5.125t 4.625-4.125t 5.50-3.875t 5.50-2.25t 6.50-1.125q 10.00,0.00 17.00,7.00l 102.00,102.00q 7.00,7.00 7.00,17.00q0.00,3.25 -1.125,6.50t-2.25,5.50t-3.875,5.50t-4.125,4.625t-5.125,4.75t-4.50,4.125q-7.50,7.00 -17.00,7.00 q-2.50,0.00 -4.50-0.375t-4.125-1.375t-3.375-1.50t-3.375-2.50t-2.875-2.50t-3.25-3.125t-3.00-3.125q 3.50,3.50 3.50,8.50t-3.50,8.50l-31.50,31.50l 64.00,64.00q 10.75-10.75 24.00-10.75q 13.00,0.00 22.75,9.25l 90.75,90.75q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"undo, arrow, loop\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00q0.00,39.00 -15.25,74.50t-41.00,61.25t-61.25,41.00t-74.50,15.25q-44.75,0.00 -84.125-19.00t-66.50-53.25t-36.875-78.00q-0.75-3.50 1.75-6.75q 2.25-3.00 6.25-3.00l 49.75,0.00 q 5.75,0.00 7.50,5.75q 12.50,40.50 46.25,65.375t 76.00,24.875q 26.00,0.00 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625t-10.125-49.625t-27.375-40.875t-40.875-27.375 t-49.625-10.125q-24.50,0.00 -47.00,8.875t-40.00,25.375l 34.25,34.50q 7.75,7.50 3.50,17.25q-4.25,10.00 -14.75,10.00l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-10.50 10.00-14.75q 9.75-4.25 17.25,3.50l 32.50,32.25q 26.75-25.25 61.125-39.125t 71.125-13.875q 39.00,0.00 74.50,15.25t 61.25,41.00t 41.00,61.25t 15.25,74.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"344\" height=\"448\" viewBox=\"0 0 344 448\" data-du=\"\" data-tags=\"linkedin, social\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 253.50,143.75q 42.75,0.00 67.00,21.375t 24.25,63.625l0.00,146.50 q0.00,3.50 -2.625,6.125t-6.125,2.625l-63.00,0.00 q-3.50,0.00 -6.125-2.625t-2.625-6.125l0.00-132.25 q0.00-17.75 -6.625-26.00t-23.875-8.25q-22.00,0.00 -30.875,12.875t-8.875,35.875l0.00,117.75 q0.00,3.50 -2.625,6.125t-6.375,2.625l-61.50,0.00 q-3.50,0.00 -6.125-2.625t-2.625-6.125l0.00-217.00 q0.00-3.50 2.625-6.125 t 6.125-2.625l 59.75,0.00 q 3.25,0.00 5.25,1.25t 2.625,4.625t 0.75,4.50t 0.125,5.625q 23.25-21.75 61.50-21.75zM 72.50,149.50q 3.50,0.00 6.125,2.625t 2.625,6.125l0.00,217.00 q0.00,3.50 -2.625,6.125t-6.125,2.625l-61.50,0.00 q-3.50,0.00 -6.125-2.625t-2.625-6.125l0.00-217.00 q0.00-3.50 2.625-6.125t 6.125-2.625l 61.50,0.00 zM 41.75,41.25q 17.25,0.00 29.50,12.25t 12.25,29.50t-12.25,29.50t-29.50,12.25 t-29.50-12.25t-12.25-29.50t 12.25-29.50t 29.50-12.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"envelope-alt, letter, email, mail, contact\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,177.50l0.00,198.50 q0.00,16.50 -11.75,28.25t-28.25,11.75l-368.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-198.50 q 11.00,12.25 25.25,21.75q 90.50,61.50 124.25,86.25q 14.25,10.50 23.125,16.375t 23.625,12.00t 27.50,6.125l 0.25,0.00 l 0.25,0.00 q 12.75,0.00 27.50-6.125t 23.625-12.00t 23.125-16.375q 42.50-30.75 124.50-86.25q 14.25-9.75 25.00-21.75zM 448.00,104.00q0.00,19.75 -12.25,37.75t-30.50,30.75 q-94.00,65.25 -117.00,81.25q-2.50,1.75 -10.625,7.625t-13.50,9.50t-13.00,8.125t-14.375,6.75t-12.50,2.25l-0.25,0.00 l-0.25,0.00 q-5.75,0.00 -12.50-2.25t-14.375-6.75t-13.00-8.125t-13.50-9.50t-10.625-7.625q-22.75-16.00 -65.50-45.625t-51.25-35.625q-15.50-10.50 -29.25-28.875t-13.75-34.125q0.00-19.50 10.375-32.50t 29.625-13.00l 368.00,0.00 q 16.25,0.00 28.125,11.75t 11.875,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"sort-up\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,176.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"sort-down\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,272.00q0.00,6.50 -4.75,11.25l-112.00,112.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-112.00-112.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 224.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"sort, menu, dropdown, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,272.00q0.00,6.50 -4.75,11.25l-112.00,112.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-112.00-112.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 224.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 256.00,176.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"columns, layout\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 40.00,384.00l 152.00,0.00 l0.00-288.00 l-160.00,0.00 l0.00,280.00 q0.00,3.25 2.375,5.625t 5.625,2.375zM 384.00,376.00l0.00-280.00 l-160.00,0.00 l0.00,288.00 l 152.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 416.00,72.00l0.00,304.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-336.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-304.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 336.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"160\" height=\"448\" viewBox=\"0 0 160 448\" data-du=\"\" data-tags=\"caret-right, right, arrow, next\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 144.00,224.00q0.00,6.50 -4.75,11.25l-112.00,112.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-224.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"160\" height=\"448\" viewBox=\"0 0 160 448\" data-du=\"\" data-tags=\"caret-left, previous, arrow, left\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 160.00,112.00l0.00,224.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-112.00-112.00q-4.75-4.75 -4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"caret-up, upload, top, arrow\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,304.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"caret-down, download, bottom, arrow\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,176.00q0.00,6.50 -4.75,11.25l-112.00,112.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-112.00-112.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 224.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"money, bill\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 192.00,288.00l 96.00,0.00 l0.00-24.00 l-32.00,0.00 l0.00-112.00 l-28.50,0.00 l-37.00,34.25l 19.25,20.00q 10.50-9.25 13.75-14.25l 0.50,0.00 l0.00,72.00 l-32.00,0.00 l0.00,24.00 zM 320.00,224.00q0.00,17.50 -5.25,35.50t-14.875,33.50t-25.375,25.25t-34.50,9.75t-34.50-9.75t-25.375-25.25t-14.875-33.50t-5.25-35.50t 5.25-35.50t 14.875-33.50t 25.375-25.25t 34.50-9.75t 34.50,9.75t 25.375,25.25t 14.875,33.50t 5.25,35.50zM 448.00,288.00 l0.00-128.00 q-26.50,0.00 -45.25-18.75t-18.75-45.25l-288.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75l0.00,128.00 q 26.50,0.00 45.25,18.75t 18.75,45.25l 288.00,0.00 q0.00-26.50 18.75-45.25t 45.25-18.75zM 480.00,80.00l0.00,288.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-448.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-288.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 448.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"google-plus, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 219.00,366.25q0.00-5.25 -1.125-10.125t-2.375-9.00t-4.375-8.625t-5.25-7.625t-6.625-7.375t-6.875-6.375t-8.00-6.375t-7.75-5.75t-8.25-5.75t-7.625-5.25q-4.25-0.50 -12.50-0.50q-13.50,0.00 -26.50,1.75t-27.00,6.25t-24.50,11.50t-17.25,18.75t-6.75,26.75q0.00,17.00 8.875,30.375t 23.25,21.00t 30.125,11.375t 31.75,3.75q 14.75,0.00 28.125-3.125t 25.125-9.75t 18.625-18.375 t 6.875-27.50zM 189.00,150.75q0.00-15.00 -4.125-31.875t-11.75-32.625t-21.00-26.00t-29.875-10.25q-23.25,0.00 -36.00,17.25t-12.75,41.25q0.00,11.75 2.875,24.75t 8.875,26.00t 14.00,23.375t 19.50,16.875t 24.25,6.50q 24.25,0.00 35.125-15.125t 10.875-40.125zM 156.25,32.00l 109.25,0.00 l-33.75,19.75l-33.75,0.00 q 17.75,11.25 27.50,31.50t 9.75,42.25q0.00,18.50 -5.75,32.875t-14.00,23.125t-16.50,16.125 t-14.00,15.25t-5.75,16.875q0.00,6.50 4.125,12.75t 10.75,12.00t 14.625,12.00t 16.00,13.875t 14.625,16.50t 10.75,21.25t 4.125,26.625q0.00,40.00 -35.00,70.50q-38.00,32.75 -105.00,32.75q-14.75,0.00 -29.875-2.50t-30.50-8.375t-27.125-14.50t-19.25-22.25t-7.50-30.375q0.00-15.25 9.25-33.75q 8.00-16.00 24.00-27.625t 36.25-17.75t 38.75-9.00t 37.50-3.375q-16.00-20.75 -16.00-37.25q0.00-3.00 0.50-5.875 t 1.25-4.875t 2.00-5.375t 1.75-5.375q-10.00,1.25 -17.50,1.25q-37.25,0.00 -63.875-24.50t-26.625-61.50q0.00-35.00 23.75-62.625t 58.50-35.375q 23.50-5.00 46.75-5.00zM 416.00,96.00l0.00,32.00 l-64.00,0.00 l0.00,64.00 l-32.00,0.00 l0.00-64.00 l-64.00,0.00 l0.00-32.00 l 64.00,0.00 l0.00-64.00 l 32.00,0.00 l0.00,64.00 l 64.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"google-plus-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 169.50,398.25q0.00,9.50 -2.50,17.75l-95.00,0.00 q-23.75,0.00 -42.875-14.125t-25.875-36.875q 6.00-11.25 17.25-19.375t 25.00-12.375t 26.75-6.00t 26.75-1.75q 8.00,0.00 12.25,0.50q 1.50,1.00 7.625,5.25t 8.25,5.75t 7.75,5.75t 8.00,6.375t 6.875,6.375t 6.625,7.375t 5.25,7.625t 4.375,8.625t 2.375,9.00t 1.125,10.125zM 96.25,310.50q-58.50,1.75 -96.25,21.25l0.00-108.25 q 25.75,29.50 68.25,29.50 q 8.00,0.00 17.50-1.25q-5.25,15.25 -5.25,21.50q0.00,16.75 15.75,37.25zM 139.50,182.75q0.00,25.00 -10.875,40.125t-35.125,15.125q-12.75,0.00 -24.25-6.50t-19.50-16.875t-14.00-23.375t-8.875-26.00t-2.875-24.75q0.00-24.00 12.875-41.25t 36.125-17.25q 16.50,0.00 29.75,10.25t 21.00,26.00t 11.75,32.50t 4.00,32.00zM 384.00,160.00l0.00,184.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-117.00,0.00 q 9.75-18.25 9.75-39.25q0.00-16.50 -5.50-30.625t-13.875-23.25t-18.00-17.75t-18.00-14.875t-13.875-13.625t-5.50-14.875q0.00-9.00 5.75-17.00t 14.00-15.375t 16.375-16.125t 13.875-23.25t 5.75-32.75t-6.625-36.375t-18.875-29.625q-1.50-1.50 -3.50-2.75t-3.125-1.875t-2.50-2.375t-2.625-4.25l 33.75,0.00 l 33.75-16.00l-109.25,0.00 q-34.50,0.00 -61.125,9.625t-45.625,33.375q0.00-31.50 20.25-53.25t 51.75-21.75l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875l0.00,24.00 l-64.00,0.00 l0.00-64.00 l-32.00,0.00 l0.00,64.00 l-64.00,0.00 l0.00,32.00 l 64.00,0.00 l0.00,64.00 l 32.00,0.00 l0.00-64.00 l 64.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"pinterest-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 312.00,32.00q 29.75,0.00 50.875,21.125t 21.125,50.875l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-181.25,0.00 q 21.25-30.50 27.00-52.50q 2.25-8.50 13.25-52.25q 5.25,9.75 18.375,16.75t 28.125,7.00q 45.25,0.00 73.875-36.875t 28.625-93.375q0.00-21.00 -8.75-40.625t-24.125-34.75t-38.125-24.25t-49.25-9.125q-26.00,0.00 -48.625,7.125t-38.25,19.125 t-26.875,27.375t-16.625,32.00t-5.375,33.125q0.00,25.50 9.875,45.00t 29.125,27.50q 3.25,1.25 5.875,0.00t 3.625-4.75q 2.50-11.00 3.75-15.25q 1.50-5.75 -2.75-10.50q-12.50-15.50 -12.50-37.50q0.00-37.50 25.875-64.125t 67.625-26.625q 37.25,0.00 58.125,20.25t 20.875,52.50q0.00,42.00 -16.875,71.50t-43.375,29.50q-15.00,0.00 -24.25-10.875t-5.75-25.875q 2.00-8.50 6.625-23.125 t 7.375-25.50t 2.75-18.625q0.00-12.25 -6.625-20.375t-18.875-8.125q-15.25,0.00 -25.875,14.125t-10.625,34.875q0.00,18.00 6.00,30.25l-24.50,103.50q-6.00,25.00 -1.75,63.50l-45.75,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"pinterest, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75q-27.75,0.00 -54.50-8.00q 14.75-23.25 19.50-41.00q 2.25-8.50 13.50-52.75q 5.00,9.75 18.25,16.875t 28.50,7.125q 30.25,0.00 54.00-17.125t 36.75-47.125t 13.00-67.50q0.00-28.50 -14.875-53.50t-43.125-40.75t-63.75-15.75q-26.25,0.00 -49.00,7.25t-38.625,19.25t-27.25,27.625t-16.75,32.375t-5.375,33.50 q0.00,26.00 10.00,45.75t 29.25,27.75q 7.50,3.00 9.50-5.00q 0.50-1.75 2.00-7.75t 2.00-7.50q 1.50-5.75 -2.75-10.75q-12.75-15.25 -12.75-37.75q0.00-37.75 26.125-64.875t 68.375-27.125q 37.75,0.00 58.875,20.50t 21.125,53.25q0.00,42.50 -17.125,72.25t-43.875,29.75q-15.25,0.00 -24.50-10.875t-5.75-26.125q 2.00-8.75 6.625-23.375t 7.50-25.75t 2.875-18.875q0.00-12.50 -6.75-20.75t-19.25-8.25 q-15.50,0.00 -26.25,14.25t-10.75,35.50q0.00,18.25 6.25,30.50l-24.75,104.50q-4.25,17.50 -3.25,44.25q-51.50-22.75 -83.25-70.25t-31.75-105.75q0.00-52.25 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"truck, transfer, transport\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 160.00,352.00q0.00-13.00 -9.50-22.50t-22.50-9.50t-22.50,9.50t-9.50,22.50t 9.50,22.50t 22.50,9.50t 22.50-9.50t 9.50-22.50zM 64.00,224.00l 96.00,0.00 l0.00-64.00 l-39.50,0.00 q-3.25,0.00 -5.50,2.25l-48.75,48.75q-2.25,2.25 -2.25,5.50l0.00,7.50 zM 384.00,352.00q0.00-13.00 -9.50-22.50t-22.50-9.50t-22.50,9.50t-9.50,22.50t 9.50,22.50t 22.50,9.50t 22.50-9.50t 9.50-22.50zM 448.00,80.00l0.00,256.00 q0.00,3.75 -1.00,6.625t-3.375,4.625 t-4.125,2.875t-5.875,1.50t-5.625,0.50t-6.375,0.00t-5.625-0.125q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-96.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-16.00,0.00 q-0.75,0.00 -5.625,0.125t-6.375,0.00t-5.625-0.50t-5.875-1.50t-4.125-2.875t-3.375-4.625t-1.00-6.625q0.00-6.50 4.75-11.25t 11.25-4.75l0.00-80.00 q0.00-2.00 -0.125-8.75t0.00-9.50 t 0.625-8.625t 1.625-9.25t 3.50-7.625t 5.625-7.50l 49.50-49.50q 4.75-4.75 12.625-8.00t 14.625-3.25l 40.00,0.00 l0.00-48.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 256.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"magic, wand, wizard\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 297.50,145.25l 73.25-73.25l-26.75-26.75l-73.25,73.25zM 409.25,72.00q0.00,6.75 -4.50,11.25l-321.50,321.50q-4.50,4.50 -11.25,4.50t-11.25-4.50l-49.50-49.50q-4.50-4.50 -4.50-11.25t 4.50-11.25l 321.50-321.50q 4.50-4.50 11.25-4.50t 11.25,4.50l 49.50,49.50q 4.50,4.50 4.50,11.25zM 71.50,24.50l 24.50,7.50l-24.50,7.50l-7.50,24.50l-7.50-24.50l-24.50-7.50l 24.50-7.50l 7.50-24.50zM 159.00,65.00 l 49.00,15.00l-49.00,15.00l-15.00,49.00l-15.00-49.00l-49.00-15.00l 49.00-15.00l 15.00-49.00zM 391.50,184.50l 24.50,7.50l-24.50,7.50l-7.50,24.50l-7.50-24.50l-24.50-7.50l 24.50-7.50l 7.50-24.50zM 231.50,24.50l 24.50,7.50l-24.50,7.50l-7.50,24.50l-7.50-24.50l-24.50-7.50l 24.50-7.50l 7.50-24.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"table, grid\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 128.00,344.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 128.00,248.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 256.00,344.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75 l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 128.00,152.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 256.00,248.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 384.00,344.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 256.00,152.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 384.00,248.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 384.00,152.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 416.00,72.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-336.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 336.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"underline, editor, format\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 12.00,55.75q-9.25-0.50 -11.25-1.00l-0.75-22.00q 3.25-0.25 10.00-0.25q 15.00,0.00 28.00,1.00q 33.00,1.75 41.50,1.75q 21.50,0.00 42.00-0.75q 29.00-1.00 36.50-1.25q 14.00,0.00 21.50-0.50l-0.25,3.50l 0.50,16.00l0.00,2.25 q-15.00,2.25 -31.00,2.25q-15.00,0.00 -19.75,6.25q-3.25,3.50 -3.25,33.00q0.00,3.25 0.125,8.125t 0.125,6.375l 0.25,57.25l 3.50,70.00q 1.50,31.00 12.75,50.50q 8.75,14.75 24.00,23.00q 22.00,11.75 44.25,11.75 q 26.00,0.00 47.75-7.00q 14.00-4.50 24.75-12.75q 12.00-9.00 16.25-16.00q 9.00-14.00 13.25-28.50q 5.25-18.25 5.25-57.25q0.00-19.75 -0.875-32.00t-2.75-30.625t-3.375-39.875l-1.00-14.75q-1.25-16.75 -6.00-22.00q-8.50-8.75 -19.25-8.50l-25.00,0.50l-3.50-0.75l 0.50-21.50l 21.00,0.00 l 51.25,2.50q 19.00,0.75 49.00-2.50l 4.50,0.50q 1.50,9.50 1.50,12.75q0.00,1.75 -1.00,7.75q-11.25,3.00 -21.00,3.25q-18.25,2.75 -19.75,4.25q-3.75,3.75 -3.75,10.25 q0.00,1.75 0.375,6.75t 0.375,7.75q 2.00,4.75 5.50,99.00q 1.50,48.75 -3.75,76.00q-3.75,19.00 -10.25,30.50q-9.50,16.25 -28.00,30.75q-18.75,14.25 -45.50,22.25q-27.25,8.25 -63.75,8.25q-41.75,0.00 -71.00-11.50q-29.75-11.75 -44.75-30.50q-15.25-19.00 -20.75-48.75q-4.00-20.00 -4.00-59.25l0.00-83.25 q0.00-47.00 -4.25-53.25q-6.25-9.00 -36.75-9.75zM 384.00,408.00l0.00-16.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-368.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,16.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 368.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"strikethrough, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 440.00,224.00q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-432.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 432.00,0.00 zM 120.75,208.00q-7.00-8.75 -12.75-20.00q-12.00-24.25 -12.00-47.00q0.00-45.25 33.50-77.25q 33.25-31.75 98.25-31.75q 12.50,0.00 41.75,4.75q 16.50,3.00 44.25,12.00q 2.50,9.50 5.25,29.50q 3.50,30.75 3.50,45.75q0.00,4.50 -1.25,11.25l-3.00,0.75l-21.00-1.50 l-3.50-0.50q-12.50-37.25 -25.75-51.25q-22.00-22.75 -52.50-22.75q-28.50,0.00 -45.50,14.75q-16.75,14.50 -16.75,36.50q0.00,18.25 16.50,35.00t 69.75,32.25q 17.25,5.00 43.25,16.50q 14.50,7.00 23.75,13.00l-185.75,0.00 zM 247.50,272.00l 102.75,0.00 q 1.75,9.75 1.75,23.00q0.00,27.75 -10.25,53.00q-5.75,13.75 -17.75,26.00q-9.25,8.75 -27.25,20.25q-20.00,12.00 -38.25,16.50q-20.00,5.25 -50.75,5.25q-28.50,0.00 -48.75-5.75 l-35.00-10.00q-14.25-4.00 -18.00-7.00q-2.00-2.00 -2.00-5.50l0.00-3.25 q0.00-27.00 -0.50-39.00q-0.25-7.50 0.00-17.00l 0.50-9.25l0.00-11.00 l 25.50-0.50q 3.75,8.50 7.50,17.75t 5.625,14.00t 3.125,6.75q 8.75,14.25 20.00,23.50q 10.75,9.00 26.25,14.25q 14.75,5.50 33.00,5.50q 16.00,0.00 34.75-6.75q 19.25-6.50 30.50-21.50q 11.75-15.25 11.75-32.25q0.00-21.00 -20.25-39.25q-8.50-7.25 -34.25-17.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"list-ol, numbered list\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 95.25,405.00q0.00,20.00 -13.625,31.50t-33.875,11.50q-26.50,0.00 -43.00-16.50l 14.25-22.00q 12.25,11.25 26.50,11.25q 7.25,0.00 12.625-3.625t 5.375-10.625q0.00-16.00 -26.25-14.00l-6.50-14.00q 2.00-2.50 8.125-10.875t 10.625-13.50t 9.25-9.625l0.00-0.25 q-4.00,0.00 -12.125,0.25t-12.125,0.25l0.00,13.25 l-26.50,0.00 l0.00-38.00 l 83.25,0.00 l0.00,22.00 l-23.75,28.75q 12.75,3.00 20.25,12.25t 7.50,22.00zM 95.75,248.25l0.00,39.75 l-90.50,0.00 q-1.50-9.00 -1.50-13.50q0.00-12.75 5.875-23.25t 14.125-17.00t 16.50-11.875t 14.125-10.875t 5.875-11.25q0.00-6.25 -3.625-9.625t-9.875-3.375q-11.50,0.00 -20.25,14.50l-21.25-14.75q 6.00-12.75 17.875-19.875t 26.375-7.125q 18.25,0.00 30.75,10.375t 12.50,28.125q0.00,12.50 -8.50,22.875t-18.75,16.125t-18.875,12.625t-8.875,13.125l 31.75,0.00 l0.00-15.00 l 26.25,0.00 zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625 t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,103.25l0.00,24.75 l-83.75,0.00 l0.00-24.75 l 26.75,0.00 q0.00-10.25 0.125-30.50t 0.125-30.25l0.00-3.00 l-0.50,0.00 q-2.00,4.25 -12.50,13.50l-17.75-19.00l 34.00-31.75l 26.50,0.00 l0.00,101.00 l 27.00,0.00 zM 448.00,200.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375 t-2.375-5.625l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,72.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"list-ul, bullets\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 96.00,352.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 96.00,224.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625 t 5.625-2.375l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,96.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 448.00,200.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 448.00,72.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"reorder, list, menu\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 384.00,208.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 384.00,80.00l0.00,32.00 q0.00,6.50 -4.75,11.25 t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"sign-blank, square\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"save, disk, floppy, store\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 96.00,384.00l 192.00,0.00 l0.00-96.00 l-192.00,0.00 l0.00,96.00 zM 320.00,384.00l 32.00,0.00 l0.00-224.00 q0.00-3.50 -2.50-9.625t-5.00-8.625l-70.25-70.25q-2.50-2.50 -8.50-5.00t-9.75-2.50l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-144.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-32.00,0.00 l0.00,320.00 l 32.00,0.00 l0.00-104.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 208.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,104.00 zM 224.00,152.00l0.00-80.00 q0.00-3.25 -2.375-5.625t-5.625-2.375 l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,80.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 384.00,160.00l0.00,232.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-336.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-336.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 232.00,0.00 q 10.00,0.00 22.00,5.00t 19.00,12.00l 70.00,70.00q 7.00,7.00 12.00,19.00t 5.00,22.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"paper-clip, attachment\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 351.00,346.25q0.00,29.25 -19.75,49.00t-49.00,19.75q-33.75,0.00 -58.75-25.00l-194.25-194.00q-28.25-28.75 -28.25-67.75q0.00-39.75 27.50-67.50t 67.25-27.75q 39.50,0.00 68.25,28.25l 151.25,151.50q 2.50,2.50 2.50,5.50q0.00,4.00 -7.625,11.625t-11.625,7.625q-3.25,0.00 -5.75-2.50l-151.50-151.75q-19.75-19.25 -45.25-19.25q-26.50,0.00 -44.75,18.75t-18.25,45.25q0.00,26.25 19.00,45.25 l 194.00,194.25q 15.75,15.75 36.25,15.75q 16.00,0.00 26.50-10.50t 10.50-26.50q0.00-20.50 -15.75-36.25l-145.25-145.25q-6.50-6.00 -15.00-6.00q-7.25,0.00 -12.00,4.75t-4.75,12.00q0.00,8.00 6.25,14.75l 102.50,102.50q 2.50,2.50 2.50,5.50q0.00,4.00 -7.75,11.75t-11.75,7.75q-3.00,0.00 -5.50-2.50l-102.50-102.50q-15.75-15.25 -15.75-37.25q0.00-20.50 14.25-34.75t 34.75-14.25q 22.00,0.00 37.25,15.75l 145.25,145.25q 25.00,24.50 25.00,58.75 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"copy, duplicate, paper, files\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 424.00,96.00q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,304.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-72.00 l-136.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-168.00 q0.00-10.00 5.00-22.00t 12.00-19.00l 102.00-102.00q 7.00-7.00 19.00-12.00t 22.00-5.00l 104.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,82.00 q 17.00-10.00 32.00-10.00l 104.00,0.00 zM 288.00,149.25l-74.75,74.75l 74.75,0.00 l0.00-74.75 zM 128.00,53.25l-74.75,74.75 l 74.75,0.00 l0.00-74.75 zM 177.00,215.00l 79.00-79.00l0.00-104.00 l-96.00,0.00 l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-104.00,0.00 l0.00,160.00 l 128.00,0.00 l0.00-64.00 q0.00-10.00 5.00-22.00t 12.00-19.00zM 416.00,416.00l0.00-288.00 l-96.00,0.00 l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-104.00,0.00 l0.00,160.00 l 224.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"cut, scissors\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 240.00,224.00q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25t-11.25,4.75t-11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75zM 315.00,240.00l 126.75,99.50q 7.00,5.00 6.25,14.00q-1.25,8.75 -8.75,12.75l-32.00,16.00q-3.25,1.75 -7.25,1.75q-4.25,0.00 -7.75-2.00l-172.50-96.75l-27.50,16.50q-2.00,1.00 -3.00,1.25q 3.50,12.25 2.50,24.25q-1.75,19.25 -14.00,36.875t-33.00,30.875q-33.00,21.00 -69.25,21.00 q-34.00,0.00 -55.50-19.50q-22.50-21.00 -19.75-51.75q 1.75-19.00 14.00-36.75t 32.75-31.00q 33.00-21.00 69.50-21.00q 20.75,0.00 37.75,7.75q 2.25-3.25 5.50-5.50l 30.50-18.25l-30.50-18.25q-3.25-2.25 -5.50-5.50q-17.00,7.75 -37.75,7.75q-36.50,0.00 -69.50-21.00q-20.50-13.25 -32.75-31.00t-14.00-36.75q-1.25-14.75 3.875-28.25t 15.875-23.25q 21.25-19.75 55.50-19.75q 36.25,0.00 69.25,21.00q 20.75,13.00 33.00,30.75t 14.00,37.00 q 1.00,12.00 -2.50,24.25q 1.00,0.25 3.00,1.25l 27.50,16.50l 172.50-96.75q 3.50-2.00 7.75-2.00q 4.00,0.00 7.25,1.75l 32.00,16.00q 7.50,4.00 8.75,12.75q 0.75,9.00 -6.25,14.00zM 144.75,175.00q 11.50-10.50 5.25-27.00t-26.50-29.25q-23.00-14.75 -48.00-14.75q-18.50,0.00 -28.25,9.00q-11.50,10.50 -5.25,27.00t 26.50,29.25q 23.00,14.75 48.00,14.75q 18.50,0.00 28.25-9.00zM 123.50,361.25q 20.25-12.75 26.50-29.25t-5.25-27.00 q-9.75-9.00 -28.25-9.00q-25.00,0.00 -48.00,14.75q-20.25,12.75 -26.50,29.25t 5.25,27.00q 9.75,9.00 28.25,9.00q 25.00,0.00 48.00-14.75zM 168.00,208.00l 24.00,14.50l0.00-2.75 q0.00-9.00 8.25-14.00l 3.50-2.00l-19.75-11.75l-6.50,6.50q-0.75,0.75 -2.50,2.75t-3.00,3.00q-0.50,0.50 -1.00,0.875t-0.75,0.625zM 224.00,264.00l 24.00,8.00l 184.00-144.00l-32.00-16.00l-192.00,107.75l0.00,28.25 l-40.00,24.00l 2.25,2.00q 0.50,0.50 1.75,1.50 q 1.00,1.00 2.75,3.00t 2.75,3.00l 6.50,6.50zM 400.00,368.00l 32.00-16.00l-130.00-102.00l-44.25,34.50q-0.50,0.75 -3.25,1.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"beaker, lab, beta, experiment, test\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 381.75,362.00q 14.00,22.25 5.375,38.125t-35.125,15.875l-288.00,0.00 q-26.50,0.00 -35.125-15.875t 5.375-38.125l 125.75-198.25l0.00-99.75 l-16.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75l 128.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25t-11.25,4.75l-16.00,0.00 l0.00,99.75 zM 187.00,180.75l-68.00,107.25l 178.00,0.00 l-68.00-107.25l-5.00-7.75l0.00-9.25 l0.00-99.75 l-32.00,0.00 l0.00,99.75 l0.00,9.25 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"cloud, weather\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 480.00,288.00q0.00,39.75 -28.125,67.875t-67.875,28.125l-272.00,0.00 q-46.25,0.00 -79.125-32.875t-32.875-79.125q0.00-33.00 17.75-60.375t 46.75-40.875q-0.50-7.00 -0.50-10.75q0.00-53.00 37.50-90.50t 90.50-37.50q 39.50,0.00 71.625,22.00t 46.875,57.50q 17.50-15.50 41.50-15.50q 26.50,0.00 45.25,18.75t 18.75,45.25q0.00,18.75 -10.25,34.50q 32.25,7.50 53.25,33.625t 21.00,59.875z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"link, chain, anchor\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 364.00,304.00q0.00-10.00 -7.00-17.00l-52.00-52.00q-7.00-7.00 -17.00-7.00q-10.50,0.00 -18.00,8.00q 0.75,0.75 4.75,4.625t 5.375,5.375t 3.75,4.75t 3.25,6.375t 0.875,6.875q0.00,10.00 -7.00,17.00t-17.00,7.00q-3.75,0.00 -6.875-0.875t-6.375-3.25t-4.75-3.75t-5.375-5.375t-4.625-4.75q-8.25,7.75 -8.25,18.25q0.00,10.00 7.00,17.00l 51.50,51.75q 6.75,6.75 17.00,6.75q 10.00,0.00 17.00-6.50 l 36.75-36.50q 7.00-7.00 7.00-16.75zM 188.25,127.75q0.00-10.00 -7.00-17.00l-51.50-51.75q-7.00-7.00 -17.00-7.00q-9.75,0.00 -17.00,6.75l-36.75,36.50q-7.00,7.00 -7.00,16.75q0.00,10.00 7.00,17.00l 52.00,52.00q 6.75,6.75 17.00,6.75q 10.50,0.00 18.00-7.75q-0.75-0.75 -4.75-4.625t-5.375-5.375t-3.75-4.75t-3.25-6.375t-0.875-6.875q0.00-10.00 7.00-17.00t 17.00-7.00q 3.75,0.00 6.875,0.875t 6.375,3.25t 4.75,3.75 t 5.375,5.375t 4.625,4.75q 8.25-7.75 8.25-18.25zM 412.00,304.00q0.00,30.00 -21.25,50.75l-36.75,36.50q-20.75,20.75 -50.75,20.75q-30.25,0.00 -51.00-21.25l-51.50-51.75q-20.75-20.75 -20.75-50.75q0.00-30.75 22.00-52.25l-22.00-22.00q-21.50,22.00 -52.00,22.00q-30.00,0.00 -51.00-21.00l-52.00-52.00q-21.00-21.00 -21.00-51.00t 21.25-50.75l 36.75-36.50q 20.75-20.75 50.75-20.75q 30.25,0.00 51.00,21.25l 51.50,51.75 q 20.75,20.75 20.75,50.75q0.00,30.75 -22.00,52.25l 22.00,22.00q 21.50-22.00 52.00-22.00q 30.00,0.00 51.00,21.00l 52.00,52.00q 21.00,21.00 21.00,51.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"group, people, users, team, members, community\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 148.25,224.00q-40.50,1.25 -66.25,32.00l-33.50,0.00 q-20.50,0.00 -34.50-10.125t-14.00-29.625q0.00-88.25 31.00-88.25q 1.50,0.00 10.875,5.25t 24.375,10.625t 29.75,5.375q 16.75,0.00 33.25-5.75q-1.25,9.25 -1.25,16.50q0.00,34.75 20.25,64.00zM 416.00,383.25q0.00,30.00 -18.25,47.375t-48.50,17.375l-218.50,0.00 q-30.25,0.00 -48.50-17.375t-18.25-47.375q0.00-13.25 0.875-25.875t 3.50-27.25t 6.625-27.125 t 10.75-24.375t 15.50-20.25t 21.375-13.375t 27.875-5.00q 2.50,0.00 10.75,5.375t 18.25,12.00t 26.75,12.00t 33.75,5.375t 33.75-5.375t 26.75-12.00t 18.25-12.00t 10.75-5.375q 15.25,0.00 27.875,5.00t 21.375,13.375t 15.50,20.25t 10.75,24.375t 6.625,27.125t 3.50,27.25t 0.875,25.875zM 160.00,64.00q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25t 18.75-45.25t 45.25-18.75t 45.25,18.75 t 18.75,45.25zM 336.00,160.00q0.00,39.75 -28.125,67.875t-67.875,28.125t-67.875-28.125t-28.125-67.875t 28.125-67.875t 67.875-28.125t 67.875,28.125t 28.125,67.875zM 480.00,216.25q0.00,19.50 -14.00,29.625t-34.50,10.125l-33.50,0.00 q-25.75-30.75 -66.25-32.00q 20.25-29.25 20.25-64.00q0.00-7.25 -1.25-16.50q 16.50,5.75 33.25,5.75q 14.75,0.00 29.75-5.375t 24.375-10.625 t 10.875-5.25q 31.00,0.00 31.00,88.25zM 448.00,64.00q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25t 18.75-45.25t 45.25-18.75t 45.25,18.75t 18.75,45.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"fullscreen, maximize, expand, enlarge\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.75,135.25l-88.75,88.75l 88.75,88.75l 36.00-36.00q 7.25-7.75 17.50-3.50q 9.75,4.25 9.75,14.75l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-112.00,0.00 q-10.50,0.00 -14.75-10.00q-4.25-9.75 3.50-17.25l 36.00-36.00l-88.75-88.75l-88.75,88.75l 36.00,36.00q 7.75,7.50 3.50,17.25q-4.25,10.00 -14.75,10.00l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-10.50 10.00-14.75q 9.75-4.25 17.25,3.50l 36.00,36.00 l 88.75-88.75l-88.75-88.75l-36.00,36.00q-4.75,4.75 -11.25,4.75q-3.00,0.00 -6.00-1.25q-10.00-4.25 -10.00-14.75l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 112.00,0.00 q 10.50,0.00 14.75,10.00q 4.25,9.75 -3.50,17.25l-36.00,36.00l 88.75,88.75l 88.75-88.75l-36.00-36.00q-7.75-7.50 -3.50-17.25q 4.25-10.00 14.75-10.00l 112.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,112.00 q0.00,10.50 -9.75,14.75q-3.25,1.25 -6.25,1.25q-6.50,0.00 -11.25-4.75z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"briefcase, suitcase, work, portfolio\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 160.00,96.00l 128.00,0.00 l0.00-32.00 l-128.00,0.00 l0.00,32.00 zM 448.00,256.00l0.00,120.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-368.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-120.00 l 168.00,0.00 l0.00,40.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 80.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-40.00 l 168.00,0.00 zM 256.00,256.00l0.00,32.00 l-64.00,0.00 l0.00-32.00 l 64.00,0.00 zM 448.00,136.00l0.00,96.00 l-448.00,0.00 l0.00-96.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 88.00,0.00 l0.00-40.00 q0.00-10.00 7.00-17.00 t 17.00-7.00l 144.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,40.00 l 88.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"filter\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 350.75,73.75q 4.25,10.25 -3.50,17.50l-123.25,123.25l0.00,185.50 q0.00,10.50 -9.75,14.75q-3.25,1.25 -6.25,1.25q-6.75,0.00 -11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25l0.00-121.50 l-123.25-123.25q-7.75-7.25 -3.50-17.50q 4.25-9.75 14.75-9.75l 320.00,0.00 q 10.50,0.00 14.75,9.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"tasks, bars\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 256.00,352.00l 160.00,0.00 l0.00-32.00 l-160.00,0.00 l0.00,32.00 zM 160.00,224.00l 256.00,0.00 l0.00-32.00 l-256.00,0.00 l0.00,32.00 zM 320.00,96.00l 96.00,0.00 l0.00-32.00 l-96.00,0.00 l0.00,32.00 zM 448.00,304.00l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,176.00l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75 t-4.75-11.25l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,48.00l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"wrench, took, fix, preferences, settings, options\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 96.00,368.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 257.00,263.00l-170.50,170.50q-9.25,9.25 -22.50,9.25q-13.00,0.00 -22.75-9.25l-26.50-27.00q-9.50-9.00 -9.50-22.50q0.00-13.25 9.50-22.75l 170.25-170.25q 9.75,24.50 28.625,43.375t 43.375,28.625zM 415.50,154.25q0.00,9.75 -5.75,26.50q-11.75,33.50 -41.125,54.375 t-64.625,20.875q-46.25,0.00 -79.125-32.875t-32.875-79.125t 32.875-79.125t 79.125-32.875q 14.50,0.00 30.375,4.125t 26.875,11.625q 4.00,2.75 4.00,7.00t-4.00,7.00l-73.25,42.25l0.00,56.00 l 48.25,26.75q 1.25-0.75 19.75-12.125t 33.875-20.25t 17.625-8.875q 3.75,0.00 5.875,2.50t 2.125,6.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"globe, earth, universal, language, localization\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 298.25,135.75q 2.75-1.75 6.25-5.50l0.00,0.25 q0.00,0.50 -2.375,2.50t-2.875,3.00q-0.25-0.25 -1.00-0.25zM 296.75,136.00q-0.25-0.25 -0.625-0.75t-0.375-0.75q 0.75,0.50 2.50,1.25q-1.50,1.00 -1.50,0.25zM 182.00,90.25q-4.00-0.50 -6.50-1.25q 0.25,0.00 1.625,0.25t 2.625,0.50t 2.25,0.50zM 193.25,81.00q 1.75-1.00 3.375-0.625t 1.875,1.875q-1.25-0.75 -5.25-1.25zM 191.25,82.50l-0.75-0.50q-0.50-0.75 -1.375-1.25t-1.125-0.50q 0.50,0.25 5.25,0.75 q-1.50,1.00 -2.00,1.50zM 165.75,61.50l0.00-0.50 q 0.25,0.50 0.75,1.375t 0.75,1.375zM 139.50,71.50q0.00,0.50 -0.25,0.50l-0.25-0.50l 0.50,0.00 zM 233.25,332.50l0.00,0.25 l0.00-0.25 zM 192.00,32.00q 52.25,0.00 96.375,25.75t 69.875,69.875t 25.75,96.375t-25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75zM 310.00,343.50 l 1.25-1.25q-1.75-2.50 -7.25-3.00q 0.25-3.00 -3.50-6.625t-6.75-3.875q0.00-1.00 -2.625-2.75t-4.375-2.00q-2.25-0.50 -6.75,2.25q-1.75,0.75 -1.00,1.25q-0.75-0.75 -3.00-2.75t-4.00-2.75q-0.50-0.25 -1.875-0.25t-2.125-0.50q-0.25-0.25 -1.50-1.125t-1.75-1.125t-1.625-0.75t-1.875-0.375t-1.875,0.625t-2.125,1.50t-1.125,3.875t-0.625,3.625q-2.00-1.50 -0.125-5.00t 0.375-5.00q-1.75-1.75 -5.25-0.125t-5.25,3.875 q-0.25,0.25 -2.375,1.375t-2.875,1.875q-1.00,1.50 -2.25,4.375t-1.50,3.375q0.00-0.50 -0.625-1.625t-0.625-1.625q-3.00,0.50 -4.00-0.75q 1.25,4.00 2.00,4.25l-1.00-0.50q-0.25,1.50 0.75,3.75t 1.00,2.75q 0.25,1.25 -0.375,3.25t-0.625,2.75q0.00,0.50 1.25,2.75q 1.00,4.75 -0.50,8.00q0.00,0.25 -0.875,1.75t-1.625,2.75l-0.50,1.25l-0.50-0.25q-0.25-0.25 -0.50,0.00q-0.25,1.50 -2.25,3.25t-2.50,2.75q-3.75,5.75 -2.25,9.50 q 0.75,2.00 2.50,2.50q 0.75,0.25 0.75-0.50q 0.25,2.25 -2.75,6.75q 0.25,0.25 1.00,0.75q-4.25,0.00 -2.50,3.50q 50.50-9.00 88.00-45.25l-0.75,0.00 zM 170.00,297.25q 4.00-0.75 7.625,4.00t 5.625,5.75q 10.25,5.00 14.75,2.75q0.00,2.25 3.50,7.00q 0.75,1.00 1.625,2.875t 1.375,2.625q 1.25,1.75 4.75,4.00t 4.75,4.00q 1.50-0.75 2.25-2.25q 3.25,8.75 6.00,8.50q 1.25,0.00 2.00-2.00q0.00,0.25 -0.125,0.75t-0.375,0.75q 1.75-3.75 1.25-6.50l 1.50-1.00q 1.25-1.00 1.25-1.25 q-1.50-1.50 -2.25,0.75q-7.50,3.50 -12.00-5.50q-0.50-0.75 -1.125-2.00t-1.25-3.00t-0.375-2.875t 1.50-1.125q 2.75,0.00 3.125-0.375t-0.625-1.50t-1.00-1.875q-0.25-1.00 -0.375-3.125t-0.375-3.125l-1.25-1.50q-1.25-1.50 -2.875-3.375t-1.875-2.375q-1.00,2.50 -4.125,2.125t-4.625-2.375q 0.25,0.50 -0.125,1.625t-0.375,1.625q-3.50,0.00 -4.25-0.25q 0.25-1.50 0.75-5.25t 1.00-5.50q 0.25-1.25 1.375-3.375t 2.00-3.875t 1.125-3.50 t-1.125-2.625t-4.625-0.625q-5.00,0.25 -7.25,5.50q-0.25,0.75 -0.75,2.875t-1.25,3.125t-2.25,1.75q-2.00,0.75 -6.75,0.50t-6.50-1.25q-3.50-2.00 -6.00-7.625t-2.75-10.375q0.00-2.50 0.75-6.875t 0.75-6.75t-1.50-6.625q 0.75-0.50 2.50-2.625t 2.75-2.875q 0.50-0.50 1.25-0.50l 1.25,0.00 t 1.00-0.50t 0.75-1.50q-0.25-0.25 -1.00-0.75q-0.75-0.75 -1.00-0.75q 1.00,0.75 4.75,0.25t 4.75-0.50q0.00-0.25 5.50,0.00q 4.25,3.25 6.00-0.50q0.00-0.25 -0.625-2.625t-0.125-3.625 q 1.25,7.25 8.00,2.50q 0.75,1.00 4.125,1.50t 4.625,1.25q 0.75,0.50 1.75,1.375t 1.50,1.25t 1.50,0.125t 2.25-1.75q 2.75,4.25 3.25,6.25q 2.75,10.75 5.00,12.00q 2.00,0.50 3.125,0.50t 1.25-2.625t0.00-3.875t-0.375-3.25l-0.50-9.25q-4.00-0.75 -5.00-3.125t 0.375-5.00t 4.125-4.875q 0.25-0.25 4.125-2.00t 5.375-3.00q 6.00-4.75 4.25-9.75q 2.25,0.50 2.75-2.25l-1.25-0.75q-1.00-0.75 -2.00-1.375t-1.25-0.375q 2.75-1.75 0.50-4.50q 1.25-0.75 2.00-2.875 t 2.25-2.875q 2.25,3.50 5.50,0.75q 2.00-2.25 0.50-4.50q 1.25-2.00 5.50-2.875t 5.00-2.375q 1.25,0.25 1.75,0.00t 0.50-1.125l0.00-1.875 t 0.25-2.125t 0.75-1.875q 1.00-1.50 4.00-2.625t 3.50-1.375l 4.75-3.00q 1.00-1.00 0.00-1.00q 4.50,0.50 8.00-2.75q 3.25-3.00 -1.25-5.75q 0.50-1.75 -1.00-2.625t-4.00-1.375q 0.75-0.25 3.00-0.125t 3.00-0.375q 3.75-2.75 -1.75-4.25q-5.00-1.25 -11.75,3.25q-0.75,0.50 -3.25,3.00t-4.25,2.75q 3.75-4.50 1.25-5.50q 2.00,0.25 5.625-2.25t 3.875-2.75 q 1.00-0.50 2.625-0.625t 2.125-0.375q 17.75-6.25 23.00,0.25q 2.00-2.75 2.75-3.75t 2.375-2.25t 3.875-2.00q 5.25-1.75 5.75-2.25l 0.25-5.75q-3.00,0.25 -4.50-2.00t-1.75-5.50l-1.50,2.00q0.00-1.50 -0.875-1.875t-1.875-0.125t-2.375,0.50t-1.875,0.00q-2.25-0.50 -4.875-3.875t-3.625-4.125q 2.25,0.00 2.25-1.25q-0.50-1.25 -2.50-2.00q 0.25-1.50 -0.50-2.00t-2.25,0.00q-0.50-3.00 -0.25-3.25q-1.50-0.25 -2.75-2.75t-2.00-2.50q-0.50,0.00 -1.125,0.50t-1.25,1.375l-1.25,1.75 t-0.875,1.375l-0.50,0.50q-3.00-1.50 -6.00,2.50q-2.25-0.25 -4.25,0.50q 3.75-1.50 0.50-3.25q-2.75-1.25 -5.25-0.50q 3.00-1.25 2.50-3.50t-3.00-4.00q 0.25,0.00 1.00,0.25t 1.00,0.25q-0.25-1.25 -2.375-2.375t-4.875-2.25t-3.50-1.625q-1.75-1.25 -9.00-2.625t-9.00-0.375q-1.25,0.75 -1.50,1.50t 0.375,2.125t 0.875,2.125q 1.50,5.75 1.25,6.75q-0.25,0.75 -2.125,2.00t-1.375,3.00q 0.25,1.00 2.875,2.50t 3.125,3.00q 1.25,3.25 -1.00,6.25 q-1.00,1.25 -3.75,2.75t-3.50,2.50q-1.25,1.25 -0.875,2.875t 0.125,2.375q 0.25-0.25 0.25-0.625t 0.25-0.625q0.00,3.25 2.75,5.50q 2.00,1.50 -4.00,4.50q-5.00,2.75 -5.00,1.00q 0.25-2.00 -1.875-4.00t-2.625-3.00t-0.875-4.75t-2.375-5.25q-1.50-1.00 -4.75-1.00t-4.50,1.25q0.00-2.50 -12.25-7.50q-4.25-2.00 -14.50-1.00q 1.75-0.25 0.00-4.25q-2.00-4.00 -5.25-3.00q-2.00-6.25 -1.00-8.75q 0.50-1.25 2.25-3.50t 2.25-3.75q 0.25-0.75 3.875-1.50t 4.125-2.00 q 0.25-1.00 -0.625-1.625t-2.375-1.125q 13.25,1.50 15.75-4.50q 1.25-2.25 0.75-3.50q0.00,0.25 0.50,0.25t 0.50,0.25q 3.00-0.75 1.75-4.25q 4.75-2.00 6.50-2.00q 1.25,0.25 2.75,1.50t 2.50,1.25q 4.25,0.75 5.375-2.50t-2.375-5.75q 1.75,1.00 1.75-1.50q-0.25-3.25 -1.75-4.75q-0.75-0.50 -1.625-0.625t-1.625,0.00t-1.75-0.125q-0.25,0.00 -2.00-0.50q-0.25,0.25 -0.50,0.25l-2.00,0.00 q-1.00,0.50 -1.00,1.25l0.00,0.25 q-0.25,0.75 1.00,1.50l 1.25,0.25l 0.75,0.50q-0.25,0.00 -0.625,0.625t-0.625,0.625 q0.00,0.75 0.75,1.25q-0.50,0.25 -3.50,1.875t-4.25,2.625q-0.25,0.25 -1.00,0.625t-1.00,0.625q-0.50,0.25 -1.00-0.50t-1.00-2.25t-1.00-2.875t-1.125-2.50t-1.375-1.125q-3.00,0.00 -4.50,4.25q 0.75-2.50 -3.25-4.375t-6.25-1.875q 5.00-3.75 -2.25-7.50l-0.25-0.25q-7.50,1.00 -11.25,1.75q-0.50,1.50 0.75,3.00q-0.25,1.75 1.50,2.25q0.00,0.25 0.125,0.25t 0.125,0.25q0.00-0.25 -0.125-0.25t-0.125-0.25q 0.75,0.25 2.625,0.375t 2.375,0.375 q 0.75,0.25 1.125,0.50l 1.875,1.25t 1.375,1.50t-0.625,1.25q-0.50,0.25 -2.25,1.00t-3.125,1.375t-1.625,0.875q-0.75,1.25 0.00,4.00t-0.50,3.75q-1.25-1.25 -2.50-4.625t-2.00-4.375q 2.00,2.25 -7.50,1.50l-2.00-0.25q-1.00,0.00 -3.75,0.50t-4.00,0.25q-1.75,0.00 -7.25-1.50q 1.75-4.25 1.25-6.25q 1.25,0.00 1.75-0.50l-1.50-0.75q-0.75,0.25 -6.25,2.25q 0.50,0.75 2.00,2.375t 2.25,2.875q-5.50-1.50 -6.75,0.50q0.00,0.25 -2.25,0.00q-6.25-0.25 -6.00,1.75 q 0.25,1.00 2.25,3.00q0.00,2.25 -0.25,2.25q-6.75-5.50 -7.50-5.75q-43.00,20.75 -69.00,62.00q 0.25,0.50 0.625,2.75t 0.875,2.125t 2.75-1.125q 2.25,2.25 0.75,5.25q 0.50-0.50 9.00,5.25q 14.00,10.00 5.50,13.25l0.00-1.375 t 0.25-1.625q-2.25,0.25 -4.75-1.25q-0.75,1.50 0.125,5.00t 2.875,3.50q-2.00,0.00 -2.625,4.25t-0.625,9.625t-0.25,6.375l 0.50,0.25q-0.75,3.25 1.50,9.375t 6.00,5.125q-1.00,4.50 1.25,5.25q-0.25,1.00 0.00,2.00 t 1.125,2.125t 1.50,1.75l 1.875,1.875l 1.50,1.50q 7.00,2.75 10.25,7.25q 1.00,1.50 2.625,6.125t 3.875,6.375q-0.50,1.50 2.50,5.375t 2.75,6.375q-0.25,0.00 -0.625,0.125t-0.625,0.125q 0.75,2.00 4.125,4.00t 4.125,3.50q 0.50,0.75 0.625,2.625t 0.75,3.00t 2.125,0.625q 0.75-6.00 -6.50-17.00q-4.00-6.75 -4.50-7.75q-0.75-1.25 -1.375-4.125t-1.125-3.875q 6.75,2.25 6.50,3.25q-1.25,2.50 6.50,13.00 q 0.50,0.75 2.50,2.50t 2.75,3.00q 0.75,1.00 2.375,3.625t 2.625,3.875q-0.25,0.00 -0.75,0.50l-0.75,0.75q 1.00,0.50 2.25,1.25t 2.00,1.125t 1.875,1.25t 1.875,1.875q 4.00,4.50 5.00,8.25q 0.25,1.00 0.125,3.875t 0.375,4.125q 0.50,1.50 1.50,2.75t 2.875,2.50t 2.875,1.75t 3.625,1.625t 2.875,1.375q 0.50,0.25 4.50,2.75t 6.25,3.50q 2.50,1.00 4.125,1.125t 4.00-0.625t 3.875-1.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-arrow-down, download, arrow, bottom\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 321.00,224.25q0.00-6.75 -4.50-11.25l-22.75-22.75q-4.50-4.50 -11.25-4.50t-11.25,4.50l-47.25,47.25l0.00-125.50 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,125.50 l-47.25-47.25q-4.75-4.75 -11.25-4.75t-11.25,4.75l-22.75,22.75q-4.50,4.50 -4.50,11.25t 4.50,11.25l 90.50,90.50l 22.75,22.75q 4.50,4.50 11.25,4.50t 11.25-4.50l 22.75-22.75l 90.50-90.50q 4.50-4.50 4.50-11.25zM 384.00,224.00 q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-arrow-up, upload, arrow, top\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 321.00,223.75q0.00-6.75 -4.50-11.25l-90.50-90.50l-22.75-22.75q-4.50-4.50 -11.25-4.50t-11.25,4.50l-22.75,22.75l-90.50,90.50q-4.50,4.50 -4.50,11.25t 4.50,11.25l 22.75,22.75q 4.50,4.50 11.25,4.50t 11.25-4.50l 47.25-47.25l0.00,125.50 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-125.50 l 47.25,47.25q 4.75,4.75 11.25,4.75t 11.25-4.75l 22.75-22.75q 4.50-4.50 4.50-11.25zM 384.00,224.00 q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-arrow-right, right, arrow, next\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 321.25,224.00q0.00-6.75 -4.50-11.25l-22.75-22.75l-90.50-90.50q-4.50-4.50 -11.25-4.50t-11.25,4.50l-22.75,22.75q-4.50,4.50 -4.50,11.25t 4.50,11.25l 47.25,47.25l-125.50,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 125.50,0.00 l-47.25,47.25q-4.75,4.75 -4.75,11.25t 4.75,11.25l 22.75,22.75q 4.50,4.50 11.25,4.50t 11.25-4.50l 90.50-90.50l 22.75-22.75q 4.50-4.50 4.50-11.25zM 384.00,224.00 q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-arrow-left, left, arrow, previous\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,240.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-125.50,0.00 l 47.25-47.25q 4.75-4.75 4.75-11.25t-4.75-11.25l-22.75-22.75q-4.50-4.50 -11.25-4.50t-11.25,4.50l-90.50,90.50l-22.75,22.75q-4.50,4.50 -4.50,11.25t 4.50,11.25l 22.75,22.75l 90.50,90.50q 4.50,4.50 11.25,4.50t 11.25-4.50l 22.75-22.75q 4.50-4.50 4.50-11.25t-4.50-11.25l-47.25-47.25l 125.50,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,224.00 q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"hand-down, down, bottom, point\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,240.00q0.00-21.00 -8.00-45.75t-16.00-48.50t-8.00-41.75l0.00-8.00 l-160.00,0.00 l0.00,8.00 q0.00,11.50 -6.25,22.75t-13.00,18.00t-18.00,16.50q-2.25,2.00 -3.50,3.00q-20.25,18.00 -36.25,28.00q-5.50,3.50 -17.00,9.50q-0.75,0.25 -5.625,2.625t-9.00,4.625t-8.875,5.00t-7.625,5.375t-2.875,4.625q0.00,17.75 7.625,28.875t 24.375,11.125q 10.75,0.00 21.125-3.75t 17.00-8.25t 13.75-8.25 t 12.125-3.75l0.00,144.00 q0.00,12.50 9.625,22.25t 22.375,9.75q 13.00,0.00 22.50-9.50t 9.50-22.50l0.00-82.75 q 11.50,8.75 25.75,8.75q 17.25,0.00 29.75-13.25q 8.00,4.50 17.25,4.50t 18.375-4.375t 13.125-11.875q 6.00,1.00 14.00,1.00q 21.25,0.00 31.50-12.125t 10.25-33.875zM 320.00,48.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 384.00,239.00q0.00,35.50 -19.375,57.50 t-54.375,21.75l-1.25-0.25q-19.00,15.25 -44.50,15.25q-5.50,0.00 -10.75-0.75q-13.50,7.50 -29.75,9.25l0.00,42.25 q0.00,26.25 -19.00,45.125t-45.25,18.875q-25.75,0.00 -44.75-19.00t-19.00-45.00l0.00-93.50 q-13.50,5.50 -32.00,5.50q-30.25,0.00 -47.125-20.375t-16.875-51.625q0.00-9.50 4.375-17.375t 12.375-13.75t 15.75-10.125t 18.00-9.25t 15.50-8.25q 13.75-8.75 32.25-25.00q 0.75-0.50 4.25-3.50t 5.375-4.75 t 5.375-5.125t 5.625-6.00t 4.50-5.625t 3.50-5.875t 1.125-5.375l0.00-72.00 q0.00-13.25 9.375-22.625t 22.625-9.375l 160.00,0.00 q 13.25,0.00 22.625,9.375t 9.375,22.625l0.00,72.00 q0.00,14.75 14.75,55.75q 17.25,47.50 17.25,79.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"hand-up, up, top, point\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,400.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 352.00,209.00q0.00-47.25 -41.75-47.25q-6.50,0.00 -14.00,1.25q-4.00-7.50 -13.125-11.875t-18.375-4.375t-17.25,4.50q-12.50-13.25 -29.75-13.25q-6.25,0.00 -13.875,2.50t-11.875,6.25l0.00-82.75 q0.00-13.00 -9.50-22.50t-22.50-9.50q-12.75,0.00 -22.375,9.75t-9.625,22.25l0.00,144.00 q-5.00,0.00 -12.125-3.75t-13.75-8.25t-17.00-8.25t-21.125-3.75q-16.75,0.00 -24.375,11.125t-7.625,28.875q0.00,6.00 34.75,22.50q 11.00,6.00 16.25,9.25q 16.00,10.00 36.25,28.00q 20.25,17.75 26.50,25.25q 14.25,17.25 14.25,35.00l0.00,8.00 l 160.00,0.00 l0.00-8.00 q0.00-18.00 8.00-41.75t 16.00-48.375t 8.00-44.875zM 384.00,207.75q0.00,33.25 -17.25,80.50q-14.75,41.00 -14.75,55.75l0.00,72.00 q0.00,13.25 -9.375,22.625 t-22.625,9.375l-160.00,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-72.00 q0.00-2.50 -1.125-5.375t-3.50-5.875t-4.50-5.625t-5.625-6.00t-5.375-5.125t-5.375-4.75t-4.25-3.50q-18.50-16.25 -32.25-25.00q-5.25-3.25 -15.50-8.25t-18.00-9.25t-15.75-10.125t-12.375-13.75t-4.375-17.375q0.00-31.25 16.75-51.625t 47.25-20.375q 17.00,0.00 32.00,5.50l0.00-93.50 q0.00-26.00 19.00-45.00t 44.75-19.00 q 26.25,0.00 45.25,18.875t 19.00,45.125l0.00,42.25 q 15.50,1.00 29.75,9.25q 5.25-0.75 10.75-0.75q 25.25,0.00 44.50,15.00q 34.75-0.25 54.875,21.25t 20.125,56.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"hand-left, point, left\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 344.00,352.00l 8.00,0.00 l0.00-160.00 l-8.00,0.00 q-8.75,0.00 -16.75-2.875t-16.00-9.625t-12.00-11.00t-12.50-13.75q-0.50-0.75 -0.875-1.125t-1.00-1.125t-1.125-1.25q-18.00-20.25 -28.00-36.25q-3.50-5.50 -9.50-17.00q-0.25-0.75 -2.625-5.625t-4.625-9.00t-5.00-8.875t-5.375-7.625t-4.625-2.875q-17.75,0.00 -28.875,7.625t-11.125,24.375q0.00,10.75 3.75,21.125t 8.25,17.00t 8.25,13.75t 3.75,12.125l-144.00,0.00 q-12.50,0.00 -22.25,9.625t-9.75,22.375q0.00,13.00 9.50,22.50t 22.50,9.50l 82.75,0.00 q-3.75,4.25 -6.25,11.875t-2.50,13.875q0.00,17.25 13.25,29.75q-4.50,8.00 -4.50,17.25t 4.375,18.375t 11.875,13.125q-1.00,6.00 -1.00,14.00q0.00,21.25 12.125,31.50t 33.875,10.25q 21.00,0.00 45.75-8.00t 48.50-16.00t 41.75-8.00zM 416.00,336.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25 t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 448.00,192.00l0.00,160.00 q0.00,13.25 -9.375,22.625t-22.625,9.375l-72.00,0.00 q-14.75,0.00 -55.75,14.75q-47.50,17.25 -79.25,17.25q-35.50,0.00 -57.50-19.375t-21.75-54.375l 0.25-1.25q-15.25-19.00 -15.25-44.50q0.00-5.50 0.75-10.75q-8.25-14.25 -9.25-29.75l-42.25,0.00 q-26.25,0.00 -45.125-19.00t-18.875-45.25q0.00-25.75 19.00-44.75t 45.00-19.00l 93.50,0.00 q-5.50-15.00 -5.50-32.00 q0.00-30.50 20.375-47.25t 51.625-16.75q 9.50,0.00 17.375,4.375t 13.75,12.375t 10.125,15.75t 9.25,18.00t 8.25,15.50q 8.75,13.75 25.00,32.25q 0.50,0.75 3.50,4.25t 4.75,5.375t 5.125,5.375t 6.00,5.625t 5.625,4.50t 5.875,3.50t 5.375,1.125l 72.00,0.00 q 13.25,0.00 22.625,9.375t 9.375,22.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"hand-right, point, right\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 64.00,336.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 416.00,192.00q0.00-12.75 -9.75-22.375t-22.25-9.625l-144.00,0.00 q0.00-5.00 3.75-12.125t 8.25-13.75t 8.25-17.00t 3.75-21.125q0.00-16.75 -11.125-24.375t-28.875-7.625q-6.00,0.00 -22.50,34.75q-6.00,11.00 -9.25,16.25q-10.00,16.00 -28.00,36.25q-17.75,20.25 -25.25,26.50 q-17.25,14.25 -35.00,14.25l-8.00,0.00 l0.00,160.00 l 8.00,0.00 q 18.00,0.00 41.75,8.00t 48.375,16.00t 44.875,8.00q 47.25,0.00 47.25-41.75q0.00-6.50 -1.25-14.00q 7.50-4.00 11.875-13.125t 4.375-18.375t-4.50-17.25q 13.25-12.50 13.25-29.75q0.00-6.25 -2.50-13.875t-6.25-11.875l 82.75,0.00 q 13.00,0.00 22.50-9.50t 9.50-22.50zM 448.00,191.75q0.00,26.25 -18.875,45.25t-45.125,19.00l-42.25,0.00 q-1.00,15.50 -9.25,29.75q 0.75,5.25 0.75,10.75 q0.00,25.25 -15.00,44.50q 0.25,34.75 -21.25,54.875t-56.75,20.125q-33.25,0.00 -80.50-17.25q-41.00-14.75 -55.75-14.75l-72.00,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-160.00 q0.00-13.25 9.375-22.625t 22.625-9.375l 72.00,0.00 q 2.50,0.00 5.375-1.125t 5.875-3.50t 5.625-4.50t 6.00-5.625t 5.125-5.375t 4.75-5.375t 3.50-4.25q 16.25-18.50 25.00-32.25q 3.25-5.25 8.25-15.50t 9.25-18.00t 10.125-15.75t 13.75-12.375 t 17.375-4.375q 31.25,0.00 51.625,16.75t 20.375,47.25q0.00,17.00 -5.50,32.00l 93.50,0.00 q 26.00,0.00 45.00,19.00t 19.00,44.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"certificate, starburst\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 344.00,224.00l 34.50,33.75q 7.50,7.00 5.00,17.50q-3.00,10.25 -13.00,12.75l-47.00,12.00l 13.25,46.50q 3.00,10.25 -4.75,17.50q-7.25,7.75 -17.50,4.75l-46.50-13.25l-12.00,47.00q-2.50,10.00 -12.75,13.00q-3.00,0.50 -4.75,0.50q-7.75,0.00 -12.75-5.50l-33.75-34.50l-33.75,34.50q-7.00,7.50 -17.50,5.00q-10.25-2.75 -12.75-13.00l-12.00-47.00l-46.50,13.25q-10.25,3.00 -17.50-4.75q-7.75-7.25 -4.75-17.50 l 13.25-46.50l-47.00-12.00q-10.00-2.50 -13.00-12.75q-2.50-10.50 5.00-17.50l 34.50-33.75l-34.50-33.75q-7.50-7.00 -5.00-17.50q 3.00-10.25 13.00-12.75l 47.00-12.00l-13.25-46.50q-3.00-10.25 4.75-17.50q 7.25-7.75 17.50-4.75l 46.50,13.25l 12.00-47.00q 2.50-10.25 12.75-12.75q 10.25-3.00 17.50,4.75l 33.75,34.75l 33.75-34.75q 7.25-7.50 17.50-4.75q 10.25,2.50 12.75,12.75l 12.00,47.00l 46.50-13.25q 10.25-3.00 17.50,4.75q 7.75,7.25 4.75,17.50 l-13.25,46.50l 47.00,12.00q 10.00,2.50 13.00,12.75q 2.50,10.50 -5.00,17.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"bell, alarm, notification\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 212.00,424.00q0.00-4.00 -4.00-4.00q-14.75,0.00 -25.375-10.625t-10.625-25.375q0.00-4.00 -4.00-4.00t-4.00,4.00q0.00,18.25 12.875,31.125t 31.125,12.875q 4.00,0.00 4.00-4.00zM 45.75,352.00l 324.50,0.00 q-41.00-45.25 -61.625-102.875t-20.625-121.125q0.00-64.00 -80.00-64.00t-80.00,64.00q0.00,63.50 -20.625,121.125t-61.625,102.875zM 416.00,352.00q0.00,13.00 -9.50,22.50t-22.50,9.50 l-112.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-112.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50q 47.50-40.25 71.75-99.375t 24.25-124.625q0.00-41.25 24.00-65.50t 66.00-29.25q-2.00-4.50 -2.00-9.25q0.00-10.00 7.00-17.00t 17.00-7.00t 17.00,7.00t 7.00,17.00q0.00,4.75 -2.00,9.25q 42.00,5.00 66.00,29.25t 24.00,65.50q0.00,65.50 24.25,124.625t 71.75,99.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"bullhorn, megaphone, announcement, advertisement\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 416.00,160.00q 13.25,0.00 22.625,9.375t 9.375,22.625t-9.375,22.625t-22.625,9.375l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50q-104.25-86.75 -203.00-95.00q-14.50,4.75 -22.75,16.50t-7.75,25.125t 10.00,23.125q-5.00,8.25 -5.75,16.375t 1.50,14.50t 8.375,13.75t 12.00,12.50t 15.375,12.625q-7.25,14.50 -27.875,20.75t-42.125,2.875t-33.00-13.875q-1.75-5.75 -7.375-21.875 t-8.00-23.625t-5.75-22.25t-3.75-25.25t 0.875-24.625t 5.50-27.625l-30.50,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-48.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 120.00,0.00 q 108.75,0.00 224.00-96.00q 13.00,0.00 22.50,9.50t 9.50,22.50l0.00,96.00 zM 384.00,311.00l0.00-238.50 q-98.50,75.50 -192.00,85.75l0.00,67.50 q 94.25,10.50 192.00,85.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"hdd, drive, disk, storage, hard disk\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 260.00,304.00q0.00,8.25 -5.875,14.125t-14.125,5.875t-14.125-5.875t-5.875-14.125t 5.875-14.125t 14.125-5.875t 14.125,5.875t 5.875,14.125zM 324.00,304.00q0.00,8.25 -5.875,14.125t-14.125,5.875t-14.125-5.875t-5.875-14.125t 5.875-14.125t 14.125-5.875t 14.125,5.875t 5.875,14.125zM 352.00,344.00l0.00-80.00 q0.00-3.25 -2.375-5.625t-5.625-2.375 l-304.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,80.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 304.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 44.50,224.00l 295.00,0.00 l-39.25-120.50q-1.00-3.25 -4.00-5.375t-6.50-2.125l-195.50,0.00 q-3.50,0.00 -6.50,2.125t-4.00,5.375zM 384.00,264.00l0.00,80.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-304.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-80.00 q0.00-6.25 4.00-18.75 l 49.25-151.50q 4.25-13.25 15.75-21.50t 25.25-8.25l 195.50,0.00 q 13.75,0.00 25.25,8.25t 15.75,21.50l 49.25,151.50q 4.00,12.50 4.00,18.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"rss, atom, feed\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,336.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 224.00,366.75q 0.50,7.00 -4.25,12.00q-4.50,5.25 -11.75,5.25l-33.75,0.00 q-6.25,0.00 -10.75-4.125t-5.00-10.375q-5.50-57.25 -46.125-97.875t-97.875-46.125q-6.25-0.50 -10.375-5.00t-4.125-10.75l0.00-33.75 q0.00-7.25 5.25-11.75q 4.25-4.25 10.75-4.25l 1.25,0.00 q 40.00,3.25 76.50,20.125 t 64.75,45.375q 28.50,28.25 45.375,64.75t 20.125,76.50zM 352.00,367.25q 0.50,6.75 -4.50,11.75q-4.50,5.00 -11.50,5.00l-35.75,0.00 q-6.50,0.00 -11.125-4.375t-4.875-10.625q-3.00-53.75 -25.25-102.125t-57.875-84.00t-84.00-57.875t-102.125-25.50q-6.25-0.25 -10.625-4.875t-4.375-10.875l0.00-35.75 q0.00-7.00 5.00-11.50q 4.50-4.50 11.00-4.50l 0.75,0.00 q 65.50,3.25 125.375,30.00t 106.375,73.50 q 46.75,46.50 73.50,106.375t 30.00,125.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"credit, payment, card\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 440.00,32.00q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,304.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-400.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-304.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 zM 40.00,64.00q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,56.00 l 416.00,0.00 l0.00-56.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-400.00,0.00 zM 440.00,384.00q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-152.00 l-416.00,0.00 l0.00,152.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 400.00,0.00 zM 64.00,352.00l0.00-32.00 l 64.00,0.00 l0.00,32.00 l-64.00,0.00 zM 160.00,352.00l0.00-32.00 l 96.00,0.00 l0.00,32.00 l-96.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"unlock\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 176.00,344.00q0.00-1.50 -3.75-14.25t-8.75-28.875t-5.00-16.375q 8.00-4.00 12.75-11.75t 4.75-16.75q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625q0.00,9.00 4.75,16.625t 12.75,11.875q0.00,0.50 -5.00,16.50t-8.75,28.75t-3.75,14.25q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 416.00,144.00l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75 l-16.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-64.00 q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25l0.00,48.00 l 24.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,144.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-144.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 168.00,0.00 l0.00-48.00 q0.00-46.25 32.875-79.125t 79.125-32.875t 79.125,32.875t 32.875,79.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"github, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,224.00q0.00-32.50 -12.75-62.125t-34.125-51.00t-51.00-34.125t-62.125-12.75t-62.125,12.75t-51.00,34.125t-34.125,51.00t-12.75,62.125q0.00,52.25 31.125,94.625t 80.875,57.875l0.00-42.25 q-13.50,1.75 -17.25,1.75q-27.50,0.00 -38.25-25.00q-3.75-9.50 -9.00-15.75q-1.25-1.50 -5.25-4.75t-7.125-6.00t-3.125-4.00q0.00-3.00 7.00-3.00q 7.25,0.00 12.875,3.625t 9.50,8.75 t 7.875,10.375t 10.125,8.875t 14.125,3.625q 10.50,0.00 20.25-3.50q 4.00-14.25 15.75-22.25q-41.50-4.00 -61.50-20.875t-20.00-56.125q0.00-29.50 18.25-49.50q-3.50-10.50 -3.50-21.00q0.00-14.50 6.75-27.25q 14.25,0.00 25.25,4.875t 25.25,15.125q 19.00-4.50 42.25-4.50q 20.00,0.00 38.25,4.00q 14.25-10.00 25.125-14.75t 24.875-4.75q 6.75,12.75 6.75,27.25q0.00,10.75 -3.50,20.75q 18.25,20.50 18.25,49.75 q0.00,39.25 -20.00,56.375t-61.25,20.875q 17.25,11.75 17.25,32.75l0.00,56.50 q 49.75-15.50 80.875-57.875t 31.125-94.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"192\" height=\"448\" viewBox=\"0 0 192 448\" data-du=\"\" data-tags=\"facebook, social\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 140.00,102.75q-12.25,0.00 -15.50,3.875t-3.25,16.625l0.00,22.00 l 54.25,0.00 q 4.00,0.00 6.75,3.00q 2.75,3.25 2.50,7.25l-3.50,50.00q-0.50,3.75 -3.125,6.375t-6.375,2.625l-50.50,0.00 l0.00,192.00 q0.00,4.00 -2.75,6.75t-6.50,2.75l-62.50,0.00 q-4.00,0.00 -6.75-2.75t-2.75-6.75l0.00-192.00 l-30.50,0.00 q-4.00,0.00 -6.75-2.875t-2.75-6.875l0.00-50.00 q0.00-4.00 2.75-6.75t 6.75-2.75l 30.50,0.00 l0.00-25.75 q0.00-44.25 22.00-65.875 t 66.75-21.625q 30.00,0.00 56.25,7.50q 3.50,1.00 5.50,4.00t 1.50,6.50l-6.75,48.75q-0.50,4.00 -4.00,6.50q-3.50,2.25 -7.50,1.50q-19.00-4.00 -33.75-4.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"twitter, social\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 468.75,83.50q0.00,2.50 -1.25,4.50q-16.00,26.00 -44.75,47.50l0.00,8.25 q 1.00,56.75 -25.00,114.25q-33.50,74.25 -99.375,116.125t-147.875,41.875q-66.25,0.00 -125.00-30.50q-16.00-8.25 -21.75-12.50q-3.75-3.00 -3.75-6.75q0.00-3.25 2.375-5.625t 5.625-2.375q 3.50,0.00 11.00,0.625t 11.25,0.625q 51.00,0.00 93.75-26.50q-25.75-6.00 -45.25-24.00t-27.75-43.25q-0.50-2.00 -0.50-2.75q0.00-3.00 2.25-5.375 t 5.50-2.375q 1.25,0.00 3.50,0.50t 3.00,0.50q-22.25-13.75 -35.50-36.75t-13.25-49.00q0.00-3.75 2.875-6.375t 6.875-2.625q 2.50,0.00 8.75,2.875t 7.50,3.375q-23.00-27.50 -23.00-64.00q0.00-12.75 3.625-27.00t 10.125-23.75q 2.50-4.00 6.25-4.00q 4.00,0.00 6.75,3.00q 19.00,21.00 27.50,28.75q 30.75,27.75 69.00,44.375t 79.25,20.125q-1.00-5.25 -1.00-12.25q0.00-41.75 29.625-71.375t 71.375-29.625 q 40.75,0.00 70.50,28.50q 23.75-5.00 52.25-20.50q 2.00-1.25 4.00-1.25q 3.25,0.00 5.625,2.375t 2.375,5.625q0.00,6.00 -7.00,18.25t-12.75,19.00q 1.75-0.50 7.50-2.625t 10.75-4.00t 6.00-1.875q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"phone-sign, contact, talk, voice\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,298.25q0.00-2.75 -0.50-4.00q-0.75-2.00 -9.625-7.375t-22.125-12.375l-13.25-7.25q-1.25-0.75 -4.75-3.25t-6.25-3.75t-5.25-1.25q-4.50,0.00 -11.75,8.125t-14.25,16.375t-11.00,8.25q-1.75,0.00 -4.125-0.875t-3.875-1.625t-4.25-2.375t-3.50-2.125q-24.75-13.75 -42.625-31.625t-31.625-42.625q-0.50-0.75 -2.125-3.50t-2.375-4.25t-1.625-3.875t-0.875-4.125q0.00-3.25 5.125-8.375t 11.25-9.625 t 11.25-9.875t 5.125-9.125q0.00-2.50 -1.25-5.25t-3.75-6.25t-3.25-4.75q-0.75-1.50 -3.75-7.125t-6.25-11.375t-6.625-11.875t-6.25-10.125t-4.125-4.50t-4.00-0.50q-12.00,0.00 -25.25,5.50q-11.50,5.25 -20.00,23.625t-8.50,32.625q0.00,4.00 0.625,8.50t 1.25,7.625t 2.25,8.25t 2.50,7.375t 3.125,8.25t 2.75,7.50q 15.00,41.00 54.125,80.125t 80.125,54.125q 1.50,0.50 7.50,2.75t 8.25,3.125 t 7.375,2.50t 8.25,2.25t 7.625,1.25t 8.50,0.625q 14.25,0.00 32.625-8.50t 23.625-20.00q 5.50-13.25 5.50-25.25zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"320\" height=\"448\" viewBox=\"0 0 320 448\" data-du=\"\" data-tags=\"bookmark-empty\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 288.00,64.00l-256.00,0.00 l0.00,310.50 l 105.75-101.50l 22.25-21.25l 22.25,21.25l 105.75,101.50l0.00-310.50 zM 291.00,32.00q 5.75,0.00 11.00,2.25q 8.25,3.25 13.125,10.25t 4.875,15.50l0.00,322.25 q0.00,8.50 -4.875,15.50t-13.125,10.25q-4.75,2.00 -11.00,2.00q-12.00,0.00 -20.75-8.00l-110.25-106.00l-110.25,106.00q-9.00,8.25 -20.75,8.25q-5.75,0.00 -11.00-2.25q-8.25-3.25 -13.125-10.25t-4.875-15.50l0.00-322.25 q0.00-8.50 4.875-15.50t 13.125-10.25q 5.25-2.25 11.00-2.25l 262.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"check-empty, checkbox, square\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 280.00,64.00l-208.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-208.00 q0.00-16.50 -11.75-28.25t-28.25-11.75zM 352.00,104.00l0.00,208.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 208.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"phone, contact, talk, voice\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,310.00q0.00,6.75 -2.50,17.625t-5.25,17.125q-5.25,12.50 -30.50,26.50q-23.50,12.75 -46.50,12.75q-6.75,0.00 -13.125-0.875t-14.375-3.125t-11.875-3.625t-13.875-5.125t-12.25-4.50q-24.50-8.75 -43.75-20.75q-32.00-19.75 -66.125-53.875t-53.875-66.125q-12.00-19.25 -20.75-43.75q-0.75-2.25 -4.50-12.25t-5.125-13.875t-3.625-11.875t-3.125-14.375t-0.875-13.125 q0.00-23.00 12.75-46.50q 14.00-25.25 26.50-30.50q 6.25-2.75 17.125-5.25t 17.625-2.50q 3.50,0.00 5.25,0.75q 4.50,1.50 13.25,19.00q 2.75,4.75 7.50,13.50t 8.75,15.875t 7.75,13.375q 0.75,1.00 4.375,6.25t 5.375,8.875t 1.75,7.125q0.00,5.00 -7.125,12.50t-15.50,13.75t-15.50,13.25t-7.125,11.50q0.00,2.25 1.25,5.625t 2.125,5.125t 3.50,6.00t 2.875,4.75q 19.00,34.25 43.50,58.75t 58.75,43.50 q 0.50,0.25 4.75,2.875t 6.00,3.50t 5.125,2.125t 5.625,1.25q 4.50,0.00 11.50-7.125t 13.25-15.50t 13.75-15.50t 12.50-7.125q 3.50,0.00 7.125,1.75t 8.875,5.375t 6.25,4.375q 6.25,3.75 13.375,7.75t 15.875,8.75t 13.50,7.50q 17.50,8.75 19.00,13.25q 0.75,1.75 0.75,5.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"lemon, fruit, food\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 351.75,206.50q0.00-11.00 -1.75-28.375t-4.50-24.125q-3.00-7.50 -4.25-11.00t-2.25-9.125t-1.00-12.125q0.00-5.75 1.25-17.125t 1.25-16.875q0.00-9.25 -2.50-13.75q-1.00-0.25 -3.25-0.25q-4.75,0.00 -14.50,1.125t-14.75,1.125q-15.00,0.00 -44.00-6.00t-43.75-6.00q-10.75,0.00 -23.625,2.875t-21.25,5.875t-22.375,8.50q-34.25,13.50 -50.50,25.75q-24.00,18.25 -39.875,47.375t-22.00,59.00t-6.125,62.125 q0.00,10.00 3.125,30.00t 3.125,30.25q0.00,5.75 -2.75,16.625t-2.75,16.375t 3.00,9.125t 8.50,3.625q 6.00,0.00 18.125-2.75t 18.375-2.75q 14.25,0.00 42.375,3.875t 42.375,3.875q 45.25,0.00 71.00-9.00q 32.25-11.25 58.875-38.125t 41.50-61.375t 14.875-68.75zM 383.75,206.00q0.00,41.25 -17.50,81.875t-49.00,72.00t-70.25,45.125q-31.00,11.00 -81.50,11.00 q-14.25,0.00 -42.50-3.625t-42.25-3.625q-6.00,0.00 -18.125,3.625t-18.375,3.625q-18.25,0.00 -30.875-13.875t-12.625-32.125q0.00-6.00 2.75-17.00t 2.75-16.75q0.00-10.00 -3.125-30.125t-3.125-30.375q0.00-27.75 4.50-54.375t 13.625-52.375t 25.125-48.50t 37.50-39.00q 19.50-14.75 58.00-30.00q 48.50-19.50 79.00-19.50q 15.00,0.00 43.875,6.00t 43.375,6.00q 4.75,0.00 14.25-1.25t 14.50-1.25 q 20.25,0.00 29.50,12.625t 9.25,33.625q0.00,5.75 -1.25,17.00t-1.25,17.00q0.00,2.50 0.25,4.625t 0.75,4.25t 1.00,3.375t 1.625,4.00t 1.625,4.25q 4.00,10.00 6.25,29.625t 2.25,34.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"upload-alt, load, open\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 416.00,264.00l0.00,144.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-400.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-144.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,88.00 l 288.00,0.00 l0.00-88.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 336.00,176.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-64.00,0.00 l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-64.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 l-64.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"github-sign, git, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 145.50,327.00q0.00,16.50 -23.25,16.50q-26.75,0.00 -26.75-15.75q0.00-16.00 24.50-16.00q 25.50,0.00 25.50,15.25zM 136.50,210.50q0.00,21.25 -18.50,21.25q-19.25,0.00 -19.25-21.00q0.00-22.50 19.25-22.50q 9.00,0.00 13.75,6.50t 4.75,15.75zM 178.00,191.75l0.00-31.25 q-19.50,7.25 -33.75,7.25q-12.50-7.25 -27.50-7.25q-21.50,0.00 -36.25,14.25t-14.75,35.75q0.00,12.50 7.375,25.50t 18.375,16.75l0.00,0.75 q-9.50,4.25 -9.50,21.25 q0.00,13.00 10.25,19.25l0.00,0.75 q-28.25,9.25 -28.25,34.75q0.00,15.00 9.00,24.50t 21.00,12.75t 26.75,3.25q 56.00,0.00 56.00-46.75q0.00-12.00 -6.375-19.50t-15.625-10.625t-18.50-5.375t-15.625-5.875t-6.375-9.875q0.00-11.00 12.25-13.00q 19.25-3.75 30.50-17.50t 11.25-33.50q0.00-6.00 -2.50-13.00q 7.50-1.75 12.25-3.25zM 192.75,296.50l 34.25,0.00 q-0.50-5.00 -0.50-22.50l0.00-93.00 q0.00-14.75 0.50-19.00l-34.25,0.00 q 0.75,6.50 0.75,19.75l0.00,94.25 q0.00,13.75 -0.75,20.50zM 320.00,292.50l0.00-30.25 q-7.50,5.25 -17.00,5.25q-13.25,0.00 -13.25-20.50l0.00-56.25 l 13.00,0.00 q 2.25,0.00 6.625,0.25t 6.625,0.25l0.00-29.25 l-26.25,0.00 q0.00-20.50 0.75-25.50l-35.00,0.00 q 1.00,6.00 1.00,13.75l0.00,11.75 l-15.00,0.00 l0.00,29.25 q 9.00-0.75 9.25-0.75q 1.00,0.00 2.875,0.125t 2.875,0.125l0.00,0.50 l-0.50,0.00 l0.00,54.25 q0.00,9.25 0.625,16.00t 2.875,14.125t 6.125,12.125t 10.875,7.75t 16.50,3.00q 16.00,0.00 27.00-6.00zM 231.00,116.00 q0.00-9.00 -6.00-15.875t-15.00-6.875t-15.125,6.75t-6.125,16.00q0.00,9.00 6.25,15.625t 15.00,6.625t 14.875-6.75t 6.125-15.50zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"trophy, cup, prize, present, win, tournament\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 114.50,220.75q-18.50-40.50 -18.50-92.75l-64.00,0.00 l0.00,24.00 q0.00,19.50 23.625,40.50t 58.875,28.25zM 384.00,152.00l0.00-24.00 l-64.00,0.00 q0.00,52.25 -18.50,92.75q 35.25-7.25 58.875-28.25t 23.625-40.50zM 416.00,120.00l0.00,32.00 q0.00,17.75 -10.375,35.75t-28.00,32.50t-43.25,24.375t-53.875,11.125q-10.50,13.50 -23.75,23.75q-9.50,8.50 -13.125,18.125t-3.625,22.375q0.00,13.50 7.625,22.75 t 24.375,9.25q 18.75,0.00 33.375,11.375t 14.625,28.625l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-208.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-17.25 14.625-28.625t 33.375-11.375q 16.75,0.00 24.375-9.25t 7.625-22.75q0.00-12.75 -3.625-22.375t-13.125-18.125q-13.25-10.25 -23.75-23.75q-28.25-1.25 -53.875-11.125t-43.25-24.375t-28.00-32.50t-10.375-35.75l0.00-32.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 72.00,0.00 l0.00-24.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 144.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,24.00 l 72.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"signin, login, enter\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 296.00,224.00q0.00,6.50 -4.75,11.25l-136.00,136.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-72.00 l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 112.00,0.00 l0.00-72.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 136.00,136.00q 4.75,4.75 4.75,11.25zM 384.00,136.00l0.00,176.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-80.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625 q0.00-1.00 -0.25-5.00t-0.125-6.625t 0.75-5.875t 2.50-4.875t 5.125-1.625l 80.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-176.00 q0.00-16.50 -11.75-28.25t-28.25-11.75l-72.00,0.00 l-2.75,0.00 l-3.25,0.00 t-2.875-0.25t-2.875-0.75t-2.00-1.375t-1.75-2.25t-0.50-3.375q0.00-1.00 -0.25-5.00t-0.125-6.625t 0.75-5.875t 2.50-4.875t 5.125-1.625l 80.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"external-link, blank, out, popout\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 352.00,232.00l0.00,80.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 176.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-176.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-80.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 448.00,16.00l0.00,128.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-44.00-44.00l-163.00,163.00q-2.50,2.50 -5.75,2.50t-5.75-2.50l-28.50-28.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 163.00-163.00l-44.00-44.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 128.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"pushpin, pin, needle\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 120.00,216.00l0.00-112.00 q0.00-3.50 -2.25-5.75t-5.75-2.25t-5.75,2.25t-2.25,5.75l0.00,112.00 q0.00,3.50 2.25,5.75t 5.75,2.25t 5.75-2.25t 2.25-5.75zM 288.00,304.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-107.25,0.00 l-12.75,120.75q-0.50,3.00 -2.625,5.125t-5.125,2.125l-0.25,0.00 q-6.75,0.00 -8.00-6.75l-19.00-121.25l-101.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25q0.00-30.75 19.625-55.375t 44.375-24.625l0.00-128.00 q-13.00,0.00 -22.50-9.50 t-9.50-22.50t 9.50-22.50t 22.50-9.50l 160.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50t-9.50,22.50t-22.50,9.50l0.00,128.00 q 24.75,0.00 44.375,24.625t 19.625,55.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"linkedin-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 128.00,344.00l0.00-160.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,160.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 125.75,127.00q0.00-12.75 -9.00-21.875t-22.00-9.125q-12.75,0.00 -21.75,9.125t-9.00,21.875t 9.00,21.875t 21.75,9.125q 13.00,0.00 22.00-9.125t 9.00-21.875zM 320.00,344.00l0.00-108.75 q0.00-31.75 -18.375-48.125t-50.625-16.375q-22.50,0.00 -39.50,11.25q-3.00,2.00 -3.50,3.00q0.00-9.00 -8.75-9.00l-44.00,0.00 q-3.50,0.00 -7.375,1.875t-3.875,5.125l0.00,161.00 q0.00,3.25 3.875,5.625t 7.375,2.375l 45.50,0.00 q 3.00,0.00 5.125-2.375t 2.125-5.625l0.00-87.25 q0.00-35.00 28.50-35.00q 12.25,0.00 15.875,5.625t 3.625,18.375l0.00,98.25 q0.00,3.25 3.00,5.625t 6.50,2.375l 46.50,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"signout, exit, quit, logout, log out, leave\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 160.00,360.00q0.00,1.00 0.25,5.00t 0.125,6.625t-0.75,5.875t-2.50,4.875t-5.125,1.625l-80.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-176.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 80.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625q0.00,1.00 0.25,5.00t 0.125,6.625t-0.75,5.875t-2.50,4.875t-5.125,1.625l-80.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,176.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 72.00,0.00 l 2.75,0.00 l 3.25,0.00 t 2.875,0.25t 2.875,0.75t 2.00,1.375t 1.75,2.25t 0.50,3.375zM 392.00,224.00q0.00,6.50 -4.75,11.25l-136.00,136.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-72.00 l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 112.00,0.00 l0.00-72.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 136.00,136.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"heart-empty, love, like\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 416.00,149.00q0.00-20.25 -5.375-35.75t-13.75-24.625t-20.375-14.875t-23.50-7.75t-24.50-2.00t-28.00,6.375t-27.625,16.00t-21.625,18.00t-15.00,15.375q-4.50,5.50 -12.25,5.50t-12.25-5.50q-6.00-7.00 -15.00-15.375t-21.625-18.00t-27.625-16.00t-28.00-6.375t-24.50,2.00t-23.50,7.75t-20.375,14.875t-13.75,24.625t-5.375,35.75q0.00,42.00 46.75,88.75l 145.25,140.00l 145.00-139.75 q 47.00-47.00 47.00-89.00zM 448.00,149.00q0.00,55.25 -57.25,112.50l-155.75,150.00q-4.50,4.50 -11.00,4.50t-11.00-4.50l-156.00-150.50q-2.50-2.00 -6.875-6.50t-13.875-16.375t-17.00-24.375t-13.375-30.25t-5.875-34.50q0.00-55.00 31.75-86.00t 87.75-31.00q 15.50,0.00 31.625,5.375t 30.00,14.50t 23.875,17.125t 19.00,17.00q 9.00-9.00 19.00-17.00t 23.875-17.125t 30.00-14.50t 31.625-5.375 q 56.00,0.00 87.75,31.00t 31.75,86.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"224\" height=\"448\" viewBox=\"0 0 224 448\" data-du=\"\" data-tags=\"star-half, rating\" style=\"margin-left: 12px; margin-top: 8px;\"><path d=\"M 208.00,8.00l0.00,334.75 l-112.25,59.00q-5.50,3.00 -10.00,3.00q-5.25,0.00 -7.875-3.625t-2.625-8.875q0.00-1.50 0.50-5.00l 21.50-125.00l-91.00-88.50q-6.25-6.75 -6.25-12.00q0.00-9.25 14.00-11.50l 125.50-18.25l 56.25-113.75q 4.75-10.25 12.25-10.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"thumbs-down, dislike\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 64.00,112.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 352.00,256.00q0.00-8.75 -5.375-20.25t-13.375-11.75q 3.75-4.25 6.25-11.875t 2.50-13.875q0.00-17.25 -13.25-29.75q 4.50-8.00 4.50-17.25t-4.375-18.375t-11.875-13.125q 1.25-7.50 1.25-14.00q0.00-21.25 -12.25-31.50t-34.00-10.25l-32.00,0.00 q-32.75,0.00 -85.50,18.25q-1.25,0.50 -7.25,2.625 t-8.875,3.125t-8.75,2.875t-9.50,2.75t-8.25,1.625t-7.875,0.75l-8.00,0.00 l0.00,160.00 l 8.00,0.00 q 4.00,0.00 8.875,2.25t 10.00,6.75t 9.625,8.875t 10.00,11.00t 8.625,10.625t 7.875,10.25t 5.75,7.50q 13.75,17.00 19.25,22.75q 10.25,10.75 14.875,27.375t 7.625,31.375t 9.50,21.25q 24.00,0.00 32.00-11.75t 8.00-36.25q0.00-14.75 -12.00-40.125t-12.00-39.875l 88.00,0.00 q 12.50,0.00 22.25-9.625t 9.75-22.375z M 384.00,256.25q0.00,25.75 -19.00,44.75t-45.00,19.00l-44.00,0.00 q 12.00,24.75 12.00,48.00q0.00,29.50 -8.75,46.50q-8.75,17.25 -25.50,25.375t-37.75,8.125q-12.75,0.00 -22.50-9.25q-8.50-8.25 -13.50-20.50t-6.375-22.625t-4.375-21.125t-7.75-16.00q-12.00-12.50 -26.75-31.75q-25.25-32.75 -34.25-38.75l-68.50,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-160.00 q0.00-13.25 9.375-22.625t 22.625-9.375 l 72.00,0.00 q 5.50,0.00 34.50-10.00q 32.00-11.00 55.75-16.50t 50.00-5.50l 28.00,0.00 q 35.00,0.00 56.625,19.75t 21.375,54.00l0.00,1.25 q 15.00,19.25 15.00,44.50q0.00,5.50 -0.75,10.75q 9.50,16.75 9.50,36.00q0.00,9.00 -2.25,17.25q 12.25,18.50 12.25,40.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"thumbs-up, like\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 64.00,336.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 352.00,192.00q0.00-12.75 -9.75-22.375t-22.25-9.625l-88.00,0.00 q0.00-14.50 12.00-39.875t 12.00-40.125q0.00-24.50 -8.00-36.25t-32.00-11.75q-6.50,6.50 -9.50,21.25t-7.625,31.375t-14.875,27.375q-5.50,5.75 -19.25,22.75q-1.00,1.25 -5.75,7.50t-7.875,10.25t-8.625,10.625 t-10.00,11.00t-9.625,8.875t-10.00,6.75t-8.875,2.25l-8.00,0.00 l0.00,160.00 l 8.00,0.00 q 3.25,0.00 7.875,0.75t 8.25,1.625t 9.50,2.75t 8.75,2.875t 8.875,3.125t 7.25,2.625q 52.75,18.25 85.50,18.25l 30.25,0.00 q 48.00,0.00 48.00-41.75q0.00-6.50 -1.25-14.00q 7.50-4.00 11.875-13.125t 4.375-18.375t-4.50-17.25q 13.25-12.50 13.25-29.75q0.00-6.25 -2.50-13.875t-6.25-11.875q 8.00-0.25 13.375-11.75t 5.375-20.25zM 384.00,191.75 q0.00,22.25 -12.25,40.75q 2.25,8.25 2.25,17.25q0.00,19.25 -9.50,36.00q 0.75,5.25 0.75,10.75q0.00,25.25 -15.00,44.50q 0.25,34.75 -21.25,54.875t-56.75,20.125l-9.00,0.00 l-23.25,0.00 q-24.00,0.00 -47.375-5.625t-54.125-16.375q-29.00-10.00 -34.50-10.00l-72.00,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-160.00 q0.00-13.25 9.375-22.625t 22.625-9.375l 68.50,0.00 q 9.00-6.00 34.25-38.75q 14.50-18.75 26.75-32.00 q 6.00-6.25 8.875-21.375t 7.625-31.625t 15.50-27.00q 9.75-9.25 22.50-9.25q 21.00,0.00 37.75,8.125t 25.50,25.375t 8.75,46.50q0.00,23.25 -12.00,48.00l 44.00,0.00 q 26.00,0.00 45.00,19.00t 19.00,44.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"comments, chat, talk, bubbles\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 352.00,192.00q0.00,34.75 -23.50,64.25t-64.125,46.625t-88.375,17.125q-21.50,0.00 -44.00-4.00q-31.00,22.00 -69.50,32.00q-9.00,2.25 -21.50,4.00l-0.75,0.00 q-2.75,0.00 -5.125-2.00t-2.875-5.25q-0.25-0.75 -0.25-1.625t 0.125-1.625t 0.50-1.50l 0.625-1.25t 0.875-1.375t 1.00-1.25t 1.125-1.25t 1.00-1.125q 1.25-1.50 5.75-6.25t 6.50-7.375t 5.625-7.25t 6.25-9.625t 5.125-11.00q-31.00-18.00 -48.75-44.25t-17.75-56.00 q0.00-34.75 23.50-64.25t 64.125-46.625t 88.375-17.125t 88.375,17.125t 64.125,46.625t 23.50,64.25zM 448.00,256.00q0.00,30.00 -17.75,56.125t-48.75,44.125q 2.50,6.00 5.125,11.00t 6.25,9.625t 5.625,7.25t 6.50,7.375t 5.75,6.25q 0.25,0.25 1.00,1.125t 1.125,1.25t 1.00,1.25t 0.875,1.375l 0.625,1.25t 0.50,1.50t 0.125,1.625t-0.25,1.625q-0.75,3.50 -3.25,5.50t-5.50,1.75 q-12.50-1.75 -21.50-4.00q-38.50-10.00 -69.50-32.00q-22.50,4.00 -44.00,4.00q-67.75,0.00 -118.00-33.00q 14.50,1.00 22.00,1.00q 40.25,0.00 77.25-11.25t 66.00-32.25q 31.25-23.00 48.00-53.00t 16.75-63.50q0.00-19.25 -5.75-38.00q 32.25,17.75 51.00,44.50t 18.75,57.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"cogs, settings, options, preferences, gears\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 224.00,224.00q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25t 18.75,45.25t 45.25,18.75t 45.25-18.75t 18.75-45.25zM 416.00,352.00q0.00-13.00 -9.50-22.50t-22.50-9.50t-22.50,9.50t-9.50,22.50q0.00,13.25 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 416.00,96.00q0.00-13.00 -9.50-22.50t-22.50-9.50t-22.50,9.50t-9.50,22.50q0.00,13.25 9.375,22.625t 22.625,9.375 t 22.625-9.375t 9.375-22.625zM 320.00,201.25l0.00,46.25 q0.00,2.50 -1.75,4.875t-4.00,2.625l-38.75,6.00q-2.75,8.75 -8.00,19.00q 8.50,12.00 22.50,28.75q 1.75,2.50 1.75,5.00q0.00,3.00 -1.75,4.75q-5.75,7.50 -20.625,22.375t-19.625,14.875q-2.75,0.00 -5.25-1.75l-28.75-22.50q-9.25,4.75 -19.25,7.75q-2.75,27.00 -5.75,38.75q-1.75,6.00 -7.50,6.00l-46.50,0.00 q-2.75,0.00 -5.00-1.875t-2.50-4.375 l-5.75-38.25q-8.50-2.50 -18.75-7.75l-29.50,22.25q-1.75,1.75 -5.00,1.75q-2.75,0.00 -5.25-2.00q-36.00-33.25 -36.00-40.00q0.00-2.25 1.75-4.75q 2.50-3.50 10.25-13.25t 11.75-15.25q-5.75-11.00 -8.75-20.50l-38.00-6.00q-2.50-0.25 -4.25-2.375t-1.75-4.875l0.00-46.25 q0.00-2.50 1.75-4.875t 4.00-2.625l 38.75-6.00q 2.75-8.75 8.00-19.00q-8.50-12.00 -22.50-28.75q-1.75-2.75 -1.75-5.00q0.00-3.00 1.75-5.00q 5.50-7.50 20.50-22.25t 19.75-14.75q 2.75,0.00 5.25,1.75 l 28.75,22.50q 8.50-4.50 19.25-8.00q 2.75-27.00 5.75-38.50q 1.75-6.00 7.50-6.00l 46.50,0.00 q 2.75,0.00 5.00,1.875t 2.50,4.375l 5.75,38.25q 8.50,2.50 18.75,7.75l 29.50-22.25q 2.00-1.75 5.00-1.75q 2.75,0.00 5.25,2.00q 36.00,33.25 36.00,40.00q0.00,2.25 -1.75,4.75q-3.00,4.00 -10.50,13.50t-11.25,15.00q 5.75,12.00 8.50,20.50l 38.00,5.75q 2.50,0.50 4.25,2.625t 1.75,4.875zM 480.00,334.50l0.00,35.00 q0.00,4.00 -37.25,7.75 q-3.00,6.75 -7.50,13.00q 12.75,28.25 12.75,34.50q0.00,1.00 -1.00,1.75q-30.50,17.75 -31.00,17.75q-2.00,0.00 -11.50-11.75t-13.00-17.00q-5.00,0.50 -7.50,0.50t-7.50-0.50q-3.50,5.25 -13.00,17.00t-11.50,11.75q-0.50,0.00 -31.00-17.75q-1.00-0.75 -1.00-1.75q0.00-6.25 12.75-34.50q-4.50-6.25 -7.50-13.00q-37.25-3.75 -37.25-7.75l0.00-35.00 q0.00-4.00 37.25-7.75q 3.25-7.25 7.50-13.00q-12.75-28.25 -12.75-34.50q0.00-1.00 1.00-1.75q 1.00-0.50 8.75-5.00 t 14.75-8.50t 7.50-4.00q 2.00,0.00 11.50,11.625t 13.00,16.875q 5.00-0.50 7.50-0.50t 7.50,0.50q 12.75-17.75 23.00-28.00l 1.50-0.50q 1.00,0.00 31.00,17.50q 1.00,0.75 1.00,1.75q0.00,6.25 -12.75,34.50q 4.25,5.75 7.50,13.00q 37.25,3.75 37.25,7.75zM 480.00,78.50l0.00,35.00 q0.00,4.00 -37.25,7.75q-3.00,6.75 -7.50,13.00q 12.75,28.25 12.75,34.50q0.00,1.00 -1.00,1.75q-30.50,17.75 -31.00,17.75q-2.00,0.00 -11.50-11.75t-13.00-17.00 q-5.00,0.50 -7.50,0.50t-7.50-0.50q-3.50,5.25 -13.00,17.00t-11.50,11.75q-0.50,0.00 -31.00-17.75q-1.00-0.75 -1.00-1.75q0.00-6.25 12.75-34.50q-4.50-6.25 -7.50-13.00q-37.25-3.75 -37.25-7.75l0.00-35.00 q0.00-4.00 37.25-7.75q 3.25-7.25 7.50-13.00q-12.75-28.25 -12.75-34.50q0.00-1.00 1.00-1.75q 1.00-0.50 8.75-5.00t 14.75-8.50t 7.50-4.00q 2.00,0.00 11.50,11.625t 13.00,16.875q 5.00-0.50 7.50-0.50t 7.50,0.50q 12.75-17.75 23.00-28.00l 1.50-0.50q 1.00,0.00 31.00,17.50 q 1.00,0.75 1.00,1.75q0.00,6.25 -12.75,34.50q 4.25,5.75 7.50,13.00q 37.25,3.75 37.25,7.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"key, unlock, password\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 208.00,128.00q0.00-20.00 -14.00-34.00t-34.00-14.00t-34.00,14.00t-14.00,34.00q0.00,10.50 4.75,20.75q-10.25-4.75 -20.75-4.75q-20.00,0.00 -34.00,14.00t-14.00,34.00t 14.00,34.00t 34.00,14.00t 34.00-14.00t 14.00-34.00q0.00-10.50 -4.75-20.75q 10.25,4.75 20.75,4.75q 20.00,0.00 34.00-14.00t 14.00-34.00zM 420.75,304.00q0.00,4.25 -12.25,16.50t-16.50,12.25q-2.25,0.00 -7.125-4.00t-9.125-8.25t-9.625-10.00t-6.125-6.50 l-24.00,24.00l 55.00,55.00q 7.00,7.00 7.00,17.00q0.00,10.50 -9.75,20.25t-20.25,9.75q-10.00,0.00 -17.00-7.00l-167.75-167.75q-44.00,32.75 -91.25,32.75q-40.75,0.00 -66.375-25.625t-25.625-66.375q0.00-40.00 23.75-78.25t 62.00-62.00t 78.25-23.75q 40.75,0.00 66.375,25.625t 25.625,66.375q0.00,47.25 -32.75,91.25l 88.75,88.75l 24.00-24.00q-0.75-0.75 -6.50-6.125t-10.00-9.625t-8.25-9.125 t-4.00-7.125q0.00-4.25 12.25-16.50t 16.50-12.25q 3.25,0.00 5.75,2.50q 1.50,1.50 11.50,11.125t 20.50,19.875t 21.625,21.50t 18.25,19.50t 7.125,10.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"camera-retro, image, picture, photo\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 232.00,208.00q0.00-3.50 -2.25-5.75t-5.75-2.25q-16.50,0.00 -28.25,11.75t-11.75,28.25q0.00,3.50 2.25,5.75t 5.75,2.25t 5.75-2.25t 2.25-5.75q0.00-10.00 7.00-17.00t 17.00-7.00q 3.50,0.00 5.75-2.25t 2.25-5.75zM 288.00,240.50q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25t 18.75-45.25t 45.25-18.75t 45.25,18.75t 18.75,45.25zM 32.00,384.00l 384.00,0.00 l0.00-32.00 l-384.00,0.00 l0.00,32.00 zM 320.00,240.50q0.00-39.75 -28.125-67.875 t-67.875-28.125t-67.875,28.125t-28.125,67.875t 28.125,67.875t 67.875,28.125t 67.875-28.125t 28.125-67.875zM 64.00,80.00l 96.00,0.00 l0.00-32.00 l-96.00,0.00 l0.00,32.00 zM 32.00,128.00l 384.00,0.00 l0.00-29.50 l0.00-34.50 l-207.00,0.00 l-16.00,32.00l-161.00,0.00 l0.00,32.00 zM 448.00,64.00l0.00,320.00 q0.00,13.25 -9.375,22.625t-22.625,9.375l-384.00,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-320.00 q0.00-13.25 9.375-22.625t 22.625-9.375l 384.00,0.00 q 13.25,0.00 22.625,9.375t 9.375,22.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"facebook-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 312.00,32.00q 29.75,0.00 50.875,21.125t 21.125,50.875l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-87.50,0.00 q-0.50,0.00 -0.50-0.25l0.00-167.75 l 44.25,0.00 q 7.75,0.00 8.00-5.75l 3.00-41.00q 0.50-3.75 -2.00-6.25q-2.50-3.00 -6.00-3.00l-47.25,0.00 l0.00-18.00 q0.00-11.00 2.875-14.25t 13.625-3.25q 14.25,0.00 29.25,3.25q 3.25,0.75 6.50-1.25q 2.75-2.00 3.25-5.50l 5.75-41.50q 0.50-3.00 -1.375-5.625t-4.875-3.375 q-23.25-6.50 -49.25-6.50q-77.75,0.00 -77.75,74.75l0.00,21.25 l-23.75,0.00 q-3.25,0.00 -5.75,2.625t-2.50,6.125l0.00,43.00 q0.00,2.00 1.375,3.00t 2.50,1.125t 4.375,0.125l 23.75,0.00 l0.00,167.75 l 2.50,0.25l-82.50,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"twitter-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,144.50q0.00-3.25 -2.375-5.625t-5.625-2.375q-1.25,0.00 -3.75,1.00q 5.00-8.50 5.00-13.75q0.00-3.25 -2.375-5.625t-5.625-2.375q-1.75,0.00 -4.25,1.25q-15.00,8.50 -24.25,10.75q-16.25-15.75 -38.50-15.75q-24.50,0.00 -41.125,18.125t-16.125,42.375l0.00,3.00 q-26.75-3.50 -46.875-16.00t-39.125-34.75q-2.50-3.00 -7.00-3.00q-6.50,0.00 -10.25,12.625t-3.75,21.625q0.00,15.50 7.25,29.25 q-3.25,0.50 -5.375,2.875t-2.125,5.625q0.00,28.00 20.25,46.25q-3.00,2.00 -3.00,6.25q0.00,1.50 0.25,2.25q 3.75,12.75 12.625,22.875t 21.125,15.125q-19.25,10.75 -41.25,10.75q-2.00,0.00 -6.00-0.375t-5.75-0.375q-3.25,0.00 -5.625,2.375t-2.375,5.625q0.00,4.25 3.50,6.50q 15.75,11.75 37.50,18.375t 42.50,6.625q 32.50,0.00 62.00-14.50q 41.50-19.75 64.00-58.125t 22.00-84.875l0.00-3.00 q 6.75-5.50 15.625-15.75t 8.875-15.25zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"bar-chart, chart, graph, plot\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 128.00,256.00l0.00,96.00 l-64.00,0.00 l0.00-96.00 l 64.00,0.00 zM 224.00,128.00l0.00,224.00 l-64.00,0.00 l0.00-224.00 l 64.00,0.00 zM 320.00,192.00l0.00,160.00 l-64.00,0.00 l0.00-160.00 l 64.00,0.00 zM 416.00,96.00l0.00,256.00 l-64.00,0.00 l0.00-256.00 l 64.00,0.00 zM 448.00,376.00l0.00-304.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-400.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,304.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 400.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625z M 480.00,72.00l0.00,304.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-400.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-304.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"resize-horizontal, arrow\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,224.00q0.00,6.50 -4.75,11.25l-64.00,64.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-32.00 l-256.00,0.00 l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25t 4.75-11.25l 64.00-64.00q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,32.00 l 256.00,0.00 l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 64.00,64.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"192\" height=\"448\" viewBox=\"0 0 192 448\" data-du=\"\" data-tags=\"resize-vertical, arrow\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 176.00,80.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 l0.00,256.00 l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25l-64.00,64.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 32.00,0.00 l0.00-256.00 l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 64.00-64.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 64.00,64.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"folder-open, category, directory\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 469.75,238.00q0.00,7.75 -7.75,16.50l-84.00,99.00q-10.75,12.75 -30.125,21.625t-35.875,8.875l-272.00,0.00 q-8.50,0.00 -15.125-3.25t-6.625-10.75q0.00-7.75 7.75-16.50l 84.00-99.00q 10.75-12.75 30.125-21.625t 35.875-8.875l 272.00,0.00 q 8.50,0.00 15.125,3.25t 6.625,10.75zM 384.00,152.00l0.00,40.00 l-208.00,0.00 q-23.50,0.00 -49.25,11.875t-41.00,29.875l-84.25,99.00l-1.25,1.50q0.00-1.00 -0.125-3.125 t-0.125-3.125l0.00-240.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 80.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,8.00 l 136.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"folder-close, category, directory\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 416.00,152.00l0.00,176.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-304.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-240.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 80.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,8.00 l 168.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"shopping-cart, cart, ecommerce, store\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 160.00,384.00q0.00,13.25 -9.375,22.625t-22.625,9.375t-22.625-9.375t-9.375-22.625t 9.375-22.625t 22.625-9.375t 22.625,9.375t 9.375,22.625zM 384.00,384.00q0.00,13.25 -9.375,22.625t-22.625,9.375t-22.625-9.375t-9.375-22.625t 9.375-22.625t 22.625-9.375t 22.625,9.375t 9.375,22.625zM 416.00,112.00l0.00,128.00 q0.00,6.00 -4.00,10.625t-10.25,5.375 l-261.00,30.50q 0.25,1.75 1.125,5.375t 1.50,6.625t 0.625,5.50q0.00,4.00 -6.00,16.00l 230.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25t-11.25,4.75l-256.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25q0.00-3.50 2.75-9.875t 7.375-14.875t 5.125-9.50l-44.25-205.75l-51.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75l 64.00,0.00 q 4.00,0.00 7.125,1.625t 5.00,3.875t 3.25,6.125t 1.875,6.625 t 1.375,7.375t 1.125,6.375l 300.25,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"retweet, loop, arrows\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 320.00,376.00q0.00,3.25 -2.375,5.625t-5.625,2.375l-240.00,0.00 q-2.00,0.00 -3.375-0.50t-2.25-1.75t-1.375-2.00t-0.75-2.875t-0.25-2.875l0.00-3.25 l0.00-2.75 l0.00-40.00 l0.00-104.00 l-48.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25q0.00-6.00 3.75-10.25l 80.00-96.00q 4.75-5.50 12.25-5.50t 12.25,5.50l 80.00,96.00q 3.75,4.25 3.75,10.25q0.00,6.50 -4.75,11.25t-11.25,4.75l-48.00,0.00 l0.00,96.00 l 144.00,0.00 q 4.00,0.00 6.25,2.75l 40.00,48.00q 1.75,2.75 1.75,5.25 zM 480.00,272.00q0.00,6.00 -3.75,10.25l-80.00,96.00q-5.00,5.75 -12.25,5.75t-12.25-5.75l-80.00-96.00q-3.75-4.25 -3.75-10.25q0.00-6.50 4.75-11.25t 11.25-4.75l 48.00,0.00 l0.00-96.00 l-144.00,0.00 q-4.00,0.00 -6.25-3.00l-40.00-48.00q-1.75-2.25 -1.75-5.00q0.00-3.25 2.375-5.625t 5.625-2.375l 240.00,0.00 q 2.00,0.00 3.375,0.50t 2.25,1.75t 1.375,2.00t 0.75,2.875t 0.25,2.875l0.00,3.25 l0.00,2.75 l0.00,40.00 l0.00,104.00 l 48.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"chevron-down, download, bottom\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 402.75,176.00q0.00,13.25 -9.25,22.50l-162.75,162.75q-9.50,9.50 -22.75,9.50q-13.50,0.00 -22.50-9.50l-162.75-162.75q-9.50-9.00 -9.50-22.50q0.00-13.25 9.50-22.75l 18.50-18.75q 9.75-9.25 22.75-9.25q 13.25,0.00 22.50,9.25l 121.50,121.50l 121.50-121.50q 9.25-9.25 22.50-9.25q 13.00,0.00 22.75,9.25l 18.75,18.75q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"chevron-up, upload, top\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 402.75,304.00q0.00,13.25 -9.25,22.50l-18.75,18.75q-9.50,9.50 -22.75,9.50q-13.50,0.00 -22.50-9.50l-121.50-121.25l-121.50,121.25q-9.00,9.50 -22.50,9.50t-22.50-9.50l-18.75-18.75q-9.50-9.00 -9.50-22.50q0.00-13.25 9.50-22.75l 162.75-162.75q 9.25-9.25 22.50-9.25q 13.00,0.00 22.75,9.25l 162.50,162.75q 9.50,9.50 9.50,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"magnet\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,208.00l0.00,32.00 q0.00,50.25 -24.625,90.50t-68.50,62.875t-98.875,22.625t-98.875-22.625t-68.50-62.875t-24.625-90.50l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 96.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,32.00 q0.00,13.00 5.875,22.50t 13.375,14.25t 17.75,7.50t 16.00,3.25t 11.00,0.50t 11.00-0.50t 16.00-3.25t 17.75-7.50t 13.375-14.25t 5.875-22.50l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 96.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 128.00,48.00l0.00,96.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-96.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 96.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 384.00,48.00l0.00,96.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-96.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 96.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"comment, bubble, chat, talk\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,224.00q0.00,43.50 -30.00,80.375t-81.50,58.25t-112.50,21.375q-17.50,0.00 -36.25-2.00q-49.50,43.75 -115.00,60.50q-12.25,3.50 -28.50,5.50q-4.25,0.50 -7.625-2.25t-4.375-7.25l0.00-0.25 q-0.75-1.00 -0.125-3.00t 0.50-2.50t 1.125-2.375l 1.50-2.25t 1.75-2.125t 2.00-2.25q 1.75-2.00 7.75-8.625t 8.625-9.50t 7.75-9.875t 8.125-12.75t 6.75-14.75t 6.50-19.00q-39.25-22.25 -61.875-55.00t-22.625-70.25 q0.00-32.50 17.75-62.125t 47.75-51.125t 71.50-34.125t 87.00-12.625q 61.00,0.00 112.50,21.375t 81.50,58.25t 30.00,80.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"random, shuffle, order, media, control\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 166.50,120.25q-15.00,23.00 -34.25,68.25q-5.50-11.25 -9.25-18.125t-10.125-15.875t-12.75-14.125t-15.75-8.75t-20.375-3.625l-56.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 56.00,0.00 q 62.50,0.00 102.50,56.25zM 448.00,320.00q0.00,3.50 -2.25,5.75l-80.00,80.00q-2.25,2.25 -5.75,2.25q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q-8.00,0.00 -21.25,0.125t-20.25,0.25t-18.25-0.25 t-17.75-1.25t-16.00-2.625t-15.75-4.625t-14.50-7.125t-14.75-10.00t-13.75-13.375t-14.00-17.375q 14.75-23.25 34.00-68.25q 5.50,11.25 9.25,18.125t 10.125,15.875t 12.75,14.125t 15.75,8.75t 20.375,3.625l 64.00,0.00 l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25q 3.00,0.00 6.00,2.50l 79.75,79.75q 2.25,2.25 2.25,5.75zM 448.00,96.00q0.00,3.50 -2.25,5.75l-80.00,80.00q-2.25,2.25 -5.75,2.25q-3.25,0.00 -5.625-2.375t-2.375-5.625 l0.00-48.00 l-64.00,0.00 q-12.00,0.00 -21.75,3.75t-17.25,11.25t-12.75,15.375t-11.25,19.375q-8.00,15.50 -19.50,42.75q-7.25,16.50 -12.375,27.75t-13.50,26.25t-16.00,25.00t-18.50,20.75t-22.50,17.125t-26.625,10.50t-32.00,4.125l-56.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 56.00,0.00 q 12.00,0.00 21.75-3.75t 17.25-11.25t 12.75-15.375t 11.25-19.375q 8.00-15.50 19.50-42.75q 7.25-16.50 12.375-27.75 t 13.50-26.25t 16.00-25.00t 18.50-20.75t 22.50-17.125t 26.625-10.50t 32.00-4.125l 64.00,0.00 l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25q 3.00,0.00 6.00,2.50l 79.75,79.75q 2.25,2.25 2.25,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"calendar, date, schedule\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 32.00,416.00l 72.00,0.00 l0.00-72.00 l-72.00,0.00 l0.00,72.00 zM 120.00,416.00l 80.00,0.00 l0.00-72.00 l-80.00,0.00 l0.00,72.00 zM 32.00,328.00l 72.00,0.00 l0.00-80.00 l-72.00,0.00 l0.00,80.00 zM 120.00,328.00l 80.00,0.00 l0.00-80.00 l-80.00,0.00 l0.00,80.00 zM 32.00,232.00l 72.00,0.00 l0.00-72.00 l-72.00,0.00 l0.00,72.00 zM 216.00,416.00l 80.00,0.00 l0.00-72.00 l-80.00,0.00 l0.00,72.00 zM 120.00,232.00l 80.00,0.00 l0.00-72.00 l-80.00,0.00 l0.00,72.00 zM 312.00,416.00l 72.00,0.00 l0.00-72.00 l-72.00,0.00 l0.00,72.00 zM 216.00,328.00l 80.00,0.00 l0.00-80.00 l-80.00,0.00 l0.00,80.00 z M 128.00,112.00l0.00-72.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-16.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,72.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 16.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 312.00,328.00l 72.00,0.00 l0.00-80.00 l-72.00,0.00 l0.00,80.00 zM 216.00,232.00l 80.00,0.00 l0.00-72.00 l-80.00,0.00 l0.00,72.00 zM 312.00,232.00l 72.00,0.00 l0.00-72.00 l-72.00,0.00 l0.00,72.00 zM 320.00,112.00l0.00-72.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-16.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,72.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 16.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 416.00,96.00l0.00,320.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-352.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-320.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 32.00,0.00 l0.00-24.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 16.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,24.00 l 96.00,0.00 l0.00-24.00 q0.00-16.50 11.75-28.25t 28.25-11.75 l 16.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,24.00 l 32.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"plane, airplane, aircraft, flight, vacation, travel\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 349.25,53.00q0.00,21.75 -37.25,59.00l-60.00,60.00l 35.75,186.50l 0.25,1.50q0.00,3.50 -2.25,5.75l-16.00,16.00q-2.25,2.25 -5.75,2.25q-5.25,0.00 -7.25-4.50l-68.50-143.75l-61.25,61.25q 17.00,59.50 17.00,63.00t-2.25,5.75l-16.00,16.00q-2.25,2.25 -5.75,2.25q-4.50,0.00 -7.00-4.00l-38.75-70.00l-70.00-38.75q-4.25-2.25 -4.25-7.00q0.00-3.50 2.25-5.75l 16.00-16.25q 2.25-2.25 5.75-2.25t 63.00,17.00l 61.25-61.25 l-143.75-68.50q-4.50-2.00 -4.50-7.25q0.00-3.50 2.25-5.75l 16.00-16.00q 2.25-2.25 5.75-2.25q 1.00,0.00 1.50,0.25l 186.50,35.75l 60.00-60.00q 37.25-37.25 59.00-37.25q 8.00,0.00 13.125,5.125t 5.125,13.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"warning-sign, sign\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 256.00,343.75l0.00-47.50 q0.00-3.50 -2.375-5.875t-5.625-2.375l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.875l0.00,47.50 q0.00,3.50 2.375,5.875t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.875zM 255.50,250.25l 4.50-114.75q0.00-3.00 -2.50-4.75q-3.25-2.75 -6.00-2.75l-55.00,0.00 q-2.75,0.00 -6.00,2.75q-2.50,1.75 -2.50,5.25l 4.25,114.25q0.00,2.50 2.50,4.125t 6.00,1.625l 46.25,0.00 q 3.50,0.00 5.875-1.625t 2.625-4.125zM 252.00,16.75l 192.00,352.00q 8.75,15.75 -0.50,31.50q-4.25,7.25 -11.625,11.50t-15.875,4.25l-384.00,0.00 q-8.50,0.00 -15.875-4.25t-11.625-11.50q-9.25-15.75 -0.50-31.50l 192.00-352.00q 4.25-7.75 11.75-12.25t 16.25-4.50t 16.25,4.50t 11.75,12.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"eye-close, blocked, private\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 138.75,333.75l 19.50-35.25q-21.75-15.75 -34.00-39.75t-12.25-50.75q0.00-30.25 15.25-56.25q-57.25,29.25 -95.25,88.25q 41.75,64.50 106.75,93.75zM 236.00,144.00q0.00-5.00 -3.50-8.50t-8.50-3.50q-31.25,0.00 -53.625,22.375t-22.375,53.625q0.00,5.00 3.50,8.50t 8.50,3.50t 8.50-3.50t 3.50-8.50q0.00-21.50 15.25-36.75t 36.75-15.25q 5.00,0.00 8.50-3.50t 3.50-8.50zM 326.75,96.25q0.00,1.75 -0.25,2.25 q-26.25,47.00 -78.75,141.50t-79.00,141.75l-12.25,22.25q-2.50,4.00 -7.00,4.00q-3.00,0.00 -33.50-17.50q-4.00-2.50 -4.00-7.00q0.00-3.00 11.00-21.75q-35.75-16.25 -65.875-43.25t-52.125-61.25q-5.00-7.75 -5.00-17.25t 5.00-17.25q 38.25-58.75 95.00-92.75t 124.00-34.00q 22.25,0.00 45.00,4.25l 13.50-24.25q 2.50-4.00 7.00-4.00q 1.25,0.00 4.50,1.50t 7.75,3.875t 8.25,4.625t 7.875,4.625t 4.875,2.875 q 4.00,2.50 4.00,6.75zM 336.00,208.00q0.00,34.75 -19.75,63.375t-52.25,41.125l 70.00-125.50q 2.00,11.25 2.00,21.00zM 448.00,240.00q0.00,8.75 -5.00,17.25q-9.75,16.00 -27.25,36.25q-37.50,43.00 -86.875,66.75t-104.875,23.75l 18.50-33.00q 53.00-4.50 98.125-34.25t 75.375-76.75q-28.75-44.75 -70.50-73.50l 15.75-28.00q 23.75,16.00 45.625,38.25t 36.125,46.00q 5.00,8.50 5.00,17.25z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"eye-open, view, visit\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 416.00,240.00q-38.00-59.00 -95.25-88.25q 15.25,26.00 15.25,56.25q0.00,46.25 -32.875,79.125t-79.125,32.875t-79.125-32.875t-32.875-79.125q0.00-30.25 15.25-56.25q-57.25,29.25 -95.25,88.25q 33.25,51.25 83.375,81.625t 108.625,30.375t 108.625-30.375t 83.375-81.625zM 236.00,144.00q0.00-5.00 -3.50-8.50t-8.50-3.50q-31.25,0.00 -53.625,22.375 t-22.375,53.625q0.00,5.00 3.50,8.50t 8.50,3.50t 8.50-3.50t 3.50-8.50q0.00-21.50 15.25-36.75t 36.75-15.25q 5.00,0.00 8.50-3.50t 3.50-8.50zM 448.00,240.00q0.00,8.50 -5.00,17.25q-35.00,57.50 -94.125,92.125t-124.875,34.625t-124.875-34.75t-94.125-92.00q-5.00-8.75 -5.00-17.25t 5.00-17.25q 35.00-57.25 94.125-92.00t 124.875-34.75t 124.875,34.75t 94.125,92.00q 5.00,8.75 5.00,17.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"fire, hot\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,424.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,160.00q0.00,19.50 -6.125,36.00t-16.00,28.125t-21.875,22.00t-24.00,19.375t-21.875,18.00t-16.00,20.375t-6.125,24.125q0.00,24.00 16.75,56.00l-1.00-0.25l 0.25,0.25 q-22.50-10.25 -40.00-20.75t-34.625-25.00t-28.375-30.625t-18.125-37.625t-6.875-46.00q0.00-19.50 6.125-36.00t 16.00-28.125t 21.875-22.00t 24.00-19.375t 21.875-18.00t 16.00-20.375t 6.125-24.125q0.00-23.50 -16.50-56.00l 0.75,0.25l-0.25-0.25q 22.50,10.25 40.00,20.75t 34.625,25.00t 28.375,30.625t 18.125,37.625t 6.875,46.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"leaf, nature, green\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 320.00,176.00q0.00-6.50 -4.75-11.25t-11.25-4.75q-43.00,0.00 -79.50,12.375t-64.875,33.50t-58.875,54.875q-4.75,5.25 -4.75,11.25q0.00,6.50 4.75,11.25t 11.25,4.75q 6.00,0.00 11.25-4.75q 6.75-6.00 18.50-17.75t 16.75-16.50q 34.25-31.00 67.125-44.00t 78.375-13.00q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,126.50q0.00,23.75 -5.00,48.25q-11.50,56.00 -46.125,95.75t-89.375,67.00 q-53.50,27.00 -109.50,27.00q-37.00,0.00 -71.50-11.75q-3.75-1.25 -22.00-10.50t-24.00-9.25q-4.00,0.00 -9.875,8.00t-11.25,17.50t-13.125,17.50t-15.00,8.00q-7.50,0.00 -12.75-2.75t-7.75-6.00t-6.75-10.50q-0.50-1.00 -1.50-2.75t-1.375-2.50t-0.75-2.375t-0.375-3.375q0.00-8.75 7.75-18.375t 17.00-16.375t 17.00-14.00t 7.75-12.00q0.00-1.00 -3.50-9.50t-4.00-11.00q-2.25-12.75 -2.25-26.00q0.00-28.75 10.875-55.00t 29.75-46.125 t 42.625-34.75t 51.00-23.875q 13.75-4.50 36.25-6.375t 44.875-2.25t 44.625-1.50t 40.875-6.00t 28.375-14.125l 7.375-7.375t 7.375-7.00t 6.75-5.00t 9.125-4.00t 10.875-1.125q 9.75,0.00 17.625,11.50t 11.875,28.00t 6.00,31.00t 2.00,24.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"gift, present, birthday, holiday\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 232.00,339.00l0.00-179.00 l-80.00,0.00 l0.00,179.00 q0.00,6.25 4.625,9.625t 11.375,3.375l 48.00,0.00 q 6.75,0.00 11.375-3.375t 4.625-9.625zM 118.00,128.00l 48.75,0.00 l-31.50-40.25q-6.00-7.75 -17.25-7.75q-10.00,0.00 -17.00,7.00t-7.00,17.00t 7.00,17.00t 17.00,7.00zM 290.00,104.00q0.00-10.00 -7.00-17.00t-17.00-7.00q-11.25,0.00 -17.25,7.75l-31.25,40.25l 48.50,0.00 q 10.00,0.00 17.00-7.00t 7.00-17.00zM 384.00,168.00l0.00,80.00 q0.00,3.50 -2.50,5.50t-6.75,2.625t-8.00,0.625t-8.625-0.375t-6.125-0.375l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-272.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 q-1.25,0.00 -6.125,0.375t-8.625,0.375t-8.00-0.625t-6.75-2.625t-2.50-5.50l0.00-80.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 110.00,0.00 q-23.25,0.00 -39.625-16.375t-16.375-39.625t 16.375-39.625t 39.625-16.375 q 27.00,0.00 42.00,19.25l 32.00,41.25l 32.00-41.25q 15.00-19.25 42.00-19.25q 23.25,0.00 39.625,16.375t 16.375,39.625t-16.375,39.625t-39.625,16.375l 110.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"exclamation-sign, sign, notification, attention, warning\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,32.00q 52.25,0.00 96.375,25.75t 69.875,69.875t 25.75,96.375t-25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75zM 224.00,343.75l0.00-47.50 q0.00-3.50 -2.25-5.875t-5.50-2.375l-48.00,0.00 q-3.25,0.00 -5.75,2.50t-2.50,5.75l0.00,47.50 q0.00,3.25 2.50,5.75t 5.75,2.50l 48.00,0.00 q 3.25,0.00 5.50-2.375t 2.25-5.875zM 223.50,257.75l 4.50-155.25q0.00-3.00 -2.50-4.50q-2.50-2.00 -6.00-2.00l-55.00,0.00 q-3.50,0.00 -6.00,2.00q-2.50,1.50 -2.50,4.50l 4.25,155.25q0.00,2.50 2.50,4.375t 6.00,1.875l 46.25,0.00 q 3.50,0.00 5.875-1.875t 2.625-4.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"asterisk, star\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 370.50,262.50q 11.50,6.50 14.875,19.375t-3.125,24.375l-16.00,27.50q-6.50,11.50 -19.375,14.875t-24.375-3.125l-66.50-38.25l0.00,76.75 q0.00,13.00 -9.50,22.50t-22.50,9.50l-32.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-76.75 l-66.50,38.25q-11.50,6.50 -24.375,3.125t-19.375-14.875l-16.00-27.50q-6.50-11.50 -3.125-24.375t 14.875-19.375l 66.50-38.50l-66.50-38.50 q-11.50-6.50 -14.875-19.375t 3.125-24.375l 16.00-27.50q 6.50-11.50 19.375-14.875t 24.375,3.125l 66.50,38.25l0.00-76.75 q0.00-13.00 9.50-22.50t 22.50-9.50l 32.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50l0.00,76.75 l 66.50-38.25q 11.50-6.50 24.375-3.125t 19.375,14.875l 16.00,27.50q 6.50,11.50 3.125,24.375t-14.875,19.375l-66.50,38.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"minus, remove, delete, subtract\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-304.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 304.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"plus, add, sum\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-104.00,0.00 l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-48.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-104.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 104.00,0.00 l0.00-104.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 48.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,104.00 l 104.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"resize-small, contract, collapse\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,240.00l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-36.00-36.00l-83.00,83.00q-2.50,2.50 -5.75,2.50t-5.75-2.50l-28.50-28.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 83.00-83.00l-36.00-36.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 112.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 380.75,72.00q0.00,3.25 -2.50,5.75l-83.00,83.00l 36.00,36.00q 4.75,4.75 4.75,11.25t-4.75,11.25 t-11.25,4.75l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 36.00,36.00l 83.00-83.00q 2.50-2.50 5.75-2.50t 5.75,2.50l 28.50,28.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"resize-full, expand, enlarge\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 188.75,264.00q0.00,3.25 -2.50,5.75l-83.00,83.00l 36.00,36.00q 4.75,4.75 4.75,11.25t-4.75,11.25t-11.25,4.75l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 36.00,36.00l 83.00-83.00q 2.50-2.50 5.75-2.50t 5.75,2.50l 28.50,28.50q 2.50,2.50 2.50,5.75zM 384.00,48.00l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-36.00-36.00l-83.00,83.00 q-2.50,2.50 -5.75,2.50t-5.75-2.50l-28.50-28.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 83.00-83.00l-36.00-36.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 112.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"share-alt, arrow, forward\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,160.00q0.00,6.50 -4.75,11.25l-128.00,128.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-64.00 l-56.00,0.00 q-24.50,0.00 -43.875,1.50t-38.50,5.375t-33.25,10.625t-26.375,17.375t-20.00,25.25t-12.125,34.625t-4.375,45.25q0.00,13.75 1.25,30.75q0.00,1.50 0.625,5.875t 0.625,6.625q0.00,3.75 -2.125,6.25t-5.875,2.50q-4.00,0.00 -7.00-4.25q-1.75-2.25 -3.25-5.50 t-3.375-7.50t-2.625-6.00q-31.75-71.25 -31.75-112.75q0.00-49.75 13.25-83.25q 40.50-100.75 218.75-100.75l 56.00,0.00 l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 128.00,128.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"arrow-down, download, bottom\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 402.75,208.00q0.00,13.25 -9.25,22.50l-162.75,163.00q-9.75,9.25 -22.75,9.25q-13.25,0.00 -22.50-9.25l-162.75-163.00q-9.50-9.00 -9.50-22.50q0.00-13.25 9.50-22.75l 18.50-18.75q 9.75-9.25 22.75-9.25q 13.25,0.00 22.50,9.25l 73.50,73.50l0.00-176.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 32.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50l0.00,176.00 l 73.50-73.50q 9.25-9.25 22.50-9.25q 13.00,0.00 22.75,9.25l 18.75,18.75q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"arrow-up, upload, top\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 402.75,242.75q0.00,12.75 -9.25,22.50l-18.75,18.75q-9.50,9.50 -22.75,9.50q-13.50,0.00 -22.50-9.50l-73.50-73.25l0.00,176.00 q0.00,13.00 -9.375,21.125t-22.625,8.125l-32.00,0.00 q-13.25,0.00 -22.625-8.125t-9.375-21.125l0.00-176.00 l-73.50,73.25q-9.00,9.50 -22.50,9.50t-22.50-9.50l-18.75-18.75q-9.50-9.50 -9.50-22.50q0.00-13.25 9.50-22.75l 162.75-162.75q 8.75-9.25 22.50-9.25q 13.50,0.00 22.75,9.25l 162.75,162.75 q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"arrow-right, next, right\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 368.00,240.00q0.00,13.50 -9.25,22.75l-162.75,162.75q-9.75,9.25 -22.75,9.25q-12.75,0.00 -22.50-9.25l-18.75-18.75q-9.50-9.50 -9.50-22.75t 9.50-22.75l 73.25-73.25l-176.00,0.00 q-13.00,0.00 -21.125-9.375t-8.125-22.625l0.00-32.00 q0.00-13.25 8.125-22.625t 21.125-9.375l 176.00,0.00 l-73.25-73.50q-9.50-9.00 -9.50-22.50t 9.50-22.50l 18.75-18.75q 9.50-9.50 22.50-9.50q 13.25,0.00 22.75,9.50l 162.75,162.75q 9.25,8.75 9.25,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"arrow-left, previous, left\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00l0.00,32.00 q0.00,13.25 -8.125,22.625t-21.125,9.375l-176.00,0.00 l 73.25,73.50q 9.50,9.00 9.50,22.50t-9.50,22.50l-18.75,19.00q-9.25,9.25 -22.50,9.25q-13.00,0.00 -22.75-9.25l-162.75-163.00q-9.25-9.25 -9.25-22.50q0.00-13.00 9.25-22.75l 162.75-162.50q 9.50-9.50 22.75-9.50q 13.00,0.00 22.50,9.50l 18.75,18.50q 9.50,9.50 9.50,22.75t-9.50,22.75l-73.25,73.25l 176.00,0.00 q 13.00,0.00 21.125,9.375 t 8.125,22.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"ban-circle, block, forbidden\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,224.00q0.00-34.75 -17.75-65.00l-175.25,175.25q 30.25,17.75 65.00,17.75q 26.00,0.00 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 81.75,289.00l 175.25-175.25q-30.25-17.75 -65.00-17.75q-26.00,0.00 -49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625q0.00,34.75 17.75,65.00zM 384.00,224.00q0.00,52.25 -25.75,96.375 t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"ok-circle, correct, tick, checkmark\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 297.25,192.00q0.00,6.75 -4.50,11.25l-80.00,80.00l-25.50,25.50q-4.50,4.50 -11.25,4.50t-11.25-4.50l-25.50-25.50l-48.00-48.00q-4.50-4.50 -4.50-11.25t 4.50-11.25l 25.50-25.50q 4.50-4.50 11.25-4.50t 11.25,4.50l 36.75,36.75l 68.75-68.75q 4.50-4.50 11.25-4.50t 11.25,4.50l 25.50,25.50q 4.50,4.50 4.50,11.25zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375 t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375 t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"remove-circle, cancel, close, remove, delete\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 281.25,272.00q0.00,6.75 -4.50,11.25l-25.50,25.50q-4.50,4.50 -11.25,4.50t-11.25-4.50l-36.75-36.75l-36.75,36.75q-4.50,4.50 -11.25,4.50t-11.25-4.50l-25.50-25.50q-4.50-4.50 -4.50-11.25t 4.50-11.25l 36.75-36.75l-36.75-36.75q-4.50-4.50 -4.50-11.25t 4.50-11.25l 25.50-25.50q 4.50-4.50 11.25-4.50t 11.25,4.50l 36.75,36.75l 36.75-36.75q 4.50-4.50 11.25-4.50t 11.25,4.50l 25.50,25.50q 4.50,4.50 4.50,11.25 t-4.50,11.25l-36.75,36.75l 36.75,36.75q 4.50,4.50 4.50,11.25zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875 t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"screenshot, target, goal, spot\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 299.25,256.00l-27.25,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 27.25,0.00 q-8.00-27.00 -28.125-47.125t-47.125-28.125l0.00,27.25 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-27.25 q-27.00,8.00 -47.125,28.125t-28.125,47.125l 27.25,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-27.25,0.00 q 8.00,27.00 28.125,47.125t 47.125,28.125l0.00-27.25 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,27.25 q 27.00-8.00 47.125-28.125t 28.125-47.125zM 384.00,208.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-35.75,0.00 q-9.25,40.25 -38.625,69.625t-69.625,38.625l0.00,35.75 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-35.75 q-40.25-9.25 -69.625-38.625t-38.625-69.625l-35.75,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 35.75,0.00 q 9.25-40.25 38.625-69.625t 69.625-38.625l0.00-35.75 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,35.75 q 40.25,9.25 69.625,38.625t 38.625,69.625l 35.75,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"info-sign, information, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 256.00,344.00l0.00-16.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-24.00,0.00 l0.00-120.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,16.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 24.00,0.00 l0.00,96.00 l-24.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,16.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 112.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 224.00,152.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-48.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75 t 5.75,2.25l 48.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"question-sign, help, support, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 224.00,344.00l0.00-48.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,48.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 288.00,176.00q0.00-24.25 -14.625-43.00t-36.125-27.875t-45.25-9.125t-45.25,9.125t-36.125,27.875t-14.625,43.00l0.00,2.75 l0.00,3.25 t 0.25,2.875t 0.75,2.875t 1.375,2.00t 2.25,1.75 t 3.375,0.50l 48.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75q0.00-3.00 2.75-6.75q 4.75-7.75 12.625-12.50t 16.625-4.75q 9.75,0.00 20.75,5.375t 11.00,14.375q0.00,8.25 -6.625,14.50t-15.875,11.00t-18.625,10.375t-16.00,15.875t-6.625,24.50l0.00,2.75 l0.00,3.25 t 0.25,2.875t 0.75,2.875t 1.375,2.00t 2.25,1.75t 3.375,0.50l 48.00,0.00 q 4.25,0.00 6.00-2.625t 2.00-6.125t 3.375-8.25t 9.375-8.00q 15.00-8.25 17.50-9.75q 15.50-11.00 24.625-27.00 t 9.125-34.25zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"ok-sign, checkmark, tick, correct, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 321.00,183.50q0.00-7.00 -4.50-11.50l-22.75-22.50q-4.75-4.75 -11.25-4.75t-11.25,4.75l-102.00,101.75l-56.50-56.50q-4.75-4.75 -11.25-4.75t-11.25,4.75l-22.75,22.50q-4.50,4.50 -4.50,11.50q0.00,6.75 4.50,11.25l 90.50,90.50q 4.75,4.75 11.25,4.75q 6.75,0.00 11.50-4.75l 135.75-135.75q 4.50-4.50 4.50-11.25zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75 t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"remove-sign, cancel, remove, delete, close, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 287.25,280.50q0.00-6.50 -4.75-11.25l-45.25-45.25l 45.25-45.25q 4.75-4.75 4.75-11.25q0.00-6.75 -4.75-11.50l-22.50-22.50q-4.75-4.75 -11.50-4.75q-6.50,0.00 -11.25,4.75l-45.25,45.25l-45.25-45.25q-4.75-4.75 -11.25-4.75q-6.75,0.00 -11.50,4.75l-22.50,22.50q-4.75,4.75 -4.75,11.50q0.00,6.50 4.75,11.25l 45.25,45.25l-45.25,45.25q-4.75,4.75 -4.75,11.25q0.00,6.75 4.75,11.50l 22.50,22.50q 4.75,4.75 11.50,4.75 q 6.50,0.00 11.25-4.75l 45.25-45.25l 45.25,45.25q 4.75,4.75 11.25,4.75q 6.75,0.00 11.50-4.75l 22.50-22.50q 4.75-4.75 4.75-11.50zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"minus-sign, remove, delete, subtract, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 304.00,240.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-192.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 192.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875 t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"plus-sign, add, sum, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 304.00,240.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-64.00,0.00 l0.00-64.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,64.00 l-64.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 64.00,0.00 l0.00,64.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-64.00 l 64.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,224.00q0.00,52.25 -25.75,96.375 t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"chevron-right, right, arrow-right, next\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 274.75,208.00q0.00,13.00 -9.25,22.75l-163.00,162.75q-9.25,9.25 -22.50,9.25t-22.50-9.25l-19.00-18.75q-9.25-9.75 -9.25-22.75q0.00-13.25 9.25-22.50l 121.50-121.50l-121.50-121.25q-9.25-9.75 -9.25-22.75q0.00-13.25 9.25-22.50l 19.00-18.75q 9.00-9.50 22.50-9.50t 22.50,9.50l 163.00,162.75q 9.25,9.25 9.25,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"chevron-left, arrow-left, left, previous\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 185.50,393.25l-163.00-162.75q-9.25-9.25 -9.25-22.625t 9.25-22.625l 163.00-162.75q 9.25-9.25 22.625-9.25t 22.625,9.25l 18.75,18.75q 9.25,9.25 9.25,22.625t-9.25,22.625l-121.50,121.50l 121.50,121.25q 9.25,9.50 9.25,22.75t-9.25,22.50l-18.75,18.75q-9.25,9.25 -22.625,9.25t-22.625-9.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"eject, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 3.50,244.75l 177.50-177.50q 4.75-4.75 11.25-4.75t 11.25,4.75l 177.50,177.50q 4.75,4.75 3.25,8.00t-8.00,3.25l-368.00,0.00 q-6.50,0.00 -8.00-3.25t 3.25-8.00zM 368.25,384.00l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"step-forward, forward, next, media, control\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 11.25,412.75q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-368.00 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 2.00,2.00 3.25,4.75l0.00-169.50 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-169.50 q-1.25,2.50 -3.25,4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"fast-forward, forward, next, media, control\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 11.25,412.75q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-368.00 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 2.00,2.00 3.25,4.75l0.00-177.50 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 2.00,2.00 3.25,4.75l0.00-169.50 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-169.50 q-1.25,2.50 -3.25,4.75l-177.50,177.50 q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-177.50 q-1.25,2.50 -3.25,4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"forward, next, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 11.25,412.75q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-368.00 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 2.00,2.00 3.25,4.75l0.00-177.50 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 4.75,4.75 4.75,11.25t-4.75,11.25l-177.50,177.50q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-177.50 q-1.25,2.50 -3.25,4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"stop, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,48.00l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"pause, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,48.00l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-128.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 128.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 160.00,48.00l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-128.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 128.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"play, media, control\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 346.00,231.75l-332.00,184.50q-5.75,3.25 -9.875,0.75t-4.125-9.00l0.00-368.00 q0.00-6.50 4.125-9.00t 9.875,0.75l 332.00,184.50q 5.75,3.25 5.75,7.75t-5.75,7.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"backward, previous, back, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 404.75,35.25q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,368.00 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-2.00-2.25 -3.25-4.75l0.00,177.50 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-4.75-4.75 -4.75-11.25t 4.75-11.25l 177.50-177.50q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,177.50 q 1.25-2.75 3.25-4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"fast-backward, first, previous, control\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 436.75,35.25q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,368.00 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-2.25-2.25 -3.25-4.75l0.00,177.50 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-2.25-2.25 -3.25-4.75l0.00,169.50 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,169.50 q 1.00-2.75 3.25-4.75l 177.50-177.50 q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,177.50 q 1.00-2.75 3.25-4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"step-backward, previous, control\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 244.75,35.25q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,368.00 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-2.25-2.25 -3.25-4.75l0.00,169.50 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,169.50 q 1.00-2.75 3.25-4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"move, arrows\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,224.00q0.00,6.50 -4.75,11.25l-64.00,64.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-32.00 l-96.00,0.00 l0.00,96.00 l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25l-64.00,64.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 32.00,0.00 l0.00-96.00 l-96.00,0.00 l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25 t 4.75-11.25l 64.00-64.00q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,32.00 l 96.00,0.00 l0.00-96.00 l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 64.00-64.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 64.00,64.00q 4.75,4.75 4.75,11.25t-4.75,11.25t-11.25,4.75l-32.00,0.00 l0.00,96.00 l 96.00,0.00 l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 64.00,64.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"check, checkbox, correct, tick\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,232.50l0.00,79.50 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 208.00,0.00 q 15.75,0.00 29.25,6.25q 3.75,1.75 4.50,5.75q 0.75,4.25 -2.25,7.25l-12.25,12.25q-2.50,2.50 -5.75,2.50q-0.75,0.00 -2.25-0.50q-5.75-1.50 -11.25-1.50l-208.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-63.50 q0.00-3.25 2.25-5.50l 16.00-16.00q 2.50-2.50 5.75-2.50q 1.50,0.00 3.00,0.75q 5.00,2.00 5.00,7.25zM 409.75,110.25l-203.50,203.50q-6.00,6.00 -14.25,6.00t-14.25-6.00l-107.50-107.50q-6.00-6.00 -6.00-14.25t 6.00-14.25l 27.50-27.50q 6.00-6.00 14.25-6.00t 14.25,6.00l 65.75,65.75l 161.75-161.75q 6.00-6.00 14.25-6.00t 14.25,6.00l 27.50,27.50 q 6.00,6.00 6.00,14.25t-6.00,14.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"share\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,247.25l0.00,64.75 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 63.75,0.00 l0.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625q0.00,6.75 -6.50,8.00q-19.25,6.50 -33.25,15.00q-2.50,1.00 -4.00,1.00l-28.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-53.50 q0.00-4.75 4.50-7.25q 7.00-3.25 13.50-9.25q 4.00-4.00 8.75-2.00q 5.25,2.25 5.25,7.25zM 411.25,123.25l-96.00,96.00q-4.50,4.75 -11.25,4.75q-3.00,0.00 -6.25-1.25q-9.75-4.25 -9.75-14.75l0.00-48.00 l-40.00,0.00 q-80.75,0.00 -109.50,32.75q-29.75,34.25 -18.50,118.25q 0.75,5.75 -5.00,8.50q-2.00,0.50 -3.00,0.50q-4.00,0.00 -6.50-3.25q-2.50-3.50 -5.25-7.75t-9.875-17.125t-12.375-24.875 t-9.625-28.50t-4.375-30.50q0.00-12.25 0.875-22.75t 3.50-22.50t 7.00-22.00t 11.75-20.375t 17.125-18.50t 23.625-15.375t 31.125-12.125t 39.875-7.625t 49.125-2.75l 40.00,0.00 l0.00-48.00 q0.00-10.50 9.75-14.75q 3.25-1.25 6.25-1.25q 6.50,0.00 11.25,4.75l 96.00,96.00q 4.75,4.75 4.75,11.25t-4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"edit, write, blog\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 222.00,296.00l 29.00-29.00l-38.00-38.00l-29.00,29.00l0.00,14.00 l 24.00,0.00 l0.00,24.00 l 14.00,0.00 zM 332.00,116.00q-4.00-4.00 -8.25,0.25l-87.50,87.50q-4.25,4.25 -0.25,8.25t 8.25-0.25l 87.50-87.50q 4.25-4.25 0.25-8.25zM 352.00,264.50l0.00,47.50 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 208.00,0.00 q 15.75,0.00 29.25,6.25q 3.75,1.75 4.50,5.75q 0.75,4.25 -2.25,7.25l-12.25,12.25q-3.50,3.50 -8.00,2.00q-5.75-1.50 -11.25-1.50l-208.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-31.50 q0.00-3.25 2.25-5.50l 16.00-16.00q 3.75-3.75 8.75-1.75t 5.00,7.25zM 328.00,80.00l 72.00,72.00l-168.00,168.00l-72.00,0.00 l0.00-72.00 zM 439.00,113.00l-23.00,23.00 l-72.00-72.00l 23.00-23.00q 7.00-7.00 17.00-7.00t 17.00,7.00l 38.00,38.00q 7.00,7.00 7.00,17.00t-7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"tint, droplet, water, color\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 128.00,288.00q0.00-9.00 -5.00-17.25q-0.25-0.25 -3.875-5.625t-6.375-9.50t-6.25-11.00t-5.25-12.625q-1.00-4.00 -5.25-4.00t-5.25,4.00q-1.75,5.75 -5.25,12.625t-6.25,11.00t-6.375,9.50t-3.875,5.625q-5.00,8.25 -5.00,17.25q0.00,13.25 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 256.00,256.00q0.00,53.00 -37.50,90.50t-90.50,37.50t-90.50-37.50t-37.50-90.50 q0.00-36.25 20.25-68.75q 1.50-2.25 15.625-22.625t 25.25-37.75t 24.875-44.50t 20.75-50.375q 2.25-7.50 8.50-11.75t 12.75-4.25t 12.875,4.25t 8.375,11.75q 7.00,23.25 20.75,50.375t 24.875,44.50t 25.25,37.75t 15.625,22.625q 20.25,31.75 20.25,68.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"adjust, contrast\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,32.00q 52.25,0.00 96.375,25.75t 69.875,69.875t 25.75,96.375t-25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75zM 64.00,224.00q0.00,26.00 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125l0.00-256.00 q-26.00,0.00 -49.625,10.125 t-40.875,27.375t-27.375,40.875t-10.125,49.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"map-marker, location, marker\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 192.00,160.00q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25t 18.75,45.25t 45.25,18.75t 45.25-18.75t 18.75-45.25zM 256.00,160.00q0.00,27.25 -8.25,44.75l-91.00,193.50q-4.00,8.25 -11.875,13.00t-16.875,4.75t-16.875-4.75t-11.625-13.00l-91.25-193.50q-8.25-17.50 -8.25-44.75q0.00-53.00 37.50-90.50t 90.50-37.50t 90.50,37.50t 37.50,90.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"pencil, write, edit, blog\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 90.75,384.00l 22.75-22.75l-58.75-58.75l-22.75,22.75l0.00,26.75 l 32.00,0.00 l0.00,32.00 l 26.75,0.00 zM 221.50,152.00q0.00-5.50 -5.50-5.50q-2.50,0.00 -4.25,1.75l-135.50,135.50q-1.75,1.75 -1.75,4.25q0.00,5.50 5.50,5.50q 2.50,0.00 4.25-1.75l 135.50-135.50q 1.75-1.75 1.75-4.25zM 208.00,104.00l 104.00,104.00l-208.00,208.00l-104.00,0.00 l0.00-104.00 zM 378.75,128.00q0.00,13.25 -9.25,22.50l-41.50,41.50l-104.00-104.00l 41.50-41.25q 9.00-9.50 22.50-9.50 q 13.25,0.00 22.75,9.50l 58.75,58.50q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"picture, image, photo\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 160.00,144.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 416.00,240.00l0.00,112.00 l-352.00,0.00 l0.00-48.00 l 80.00-80.00l 40.00,40.00l 128.00-128.00zM 440.00,64.00l-400.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,304.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 400.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-304.00 q0.00-3.25 -2.375-5.625t-5.625-2.375zM 480.00,72.00l0.00,304.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-400.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-304.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"facetime-video, video, movie, camera, film\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 475.00,64.50q 5.00,2.00 5.00,7.50l0.00,304.00 q0.00,5.50 -5.00,7.50q-2.00,0.50 -3.00,0.50q-3.00,0.00 -5.75-2.25l-146.25-146.50l0.00,76.75 q0.00,29.75 -21.125,50.875t-50.875,21.125l-176.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-176.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 176.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875l0.00,76.75 l 146.25-146.50q 4.00-3.75 8.75-1.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"indent-right\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 88.00,208.00q0.00,3.50 -2.25,5.75l-72.00,72.00q-2.25,2.25 -5.75,2.25q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-144.00 q0.00-3.25 2.375-5.625t 5.625-2.375q 3.50,0.00 5.75,2.25l 72.00,72.00q 2.25,2.25 2.25,5.75zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-432.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 432.00,0.00 q 3.25,0.00 5.625,2.375 t 2.375,5.625zM 448.00,232.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-272.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 272.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,136.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-272.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 272.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,40.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-432.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 432.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"indent-left\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 96.00,136.00l0.00,144.00 q0.00,3.25 -2.375,5.625t-5.625,2.375q-3.50,0.00 -5.75-2.25l-72.00-72.00q-2.25-2.25 -2.25-5.75t 2.25-5.75l 72.00-72.00q 2.25-2.25 5.75-2.25q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-432.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 432.00,0.00 q 3.25,0.00 5.625,2.375 t 2.375,5.625zM 448.00,232.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-272.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 272.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,136.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-272.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 272.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,40.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-432.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 432.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"list, menu\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 64.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 64.00,232.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375 t 2.375,5.625zM 64.00,136.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 64.00,40.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,232.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625 t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,136.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,40.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"align-justify, justify, paragraph, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,240.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,144.00l0.00,32.00 q0.00,6.50 -4.75,11.25 t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,48.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"align-right, paragraph, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,240.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-320.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 320.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,144.00l0.00,32.00 q0.00,6.50 -4.75,11.25 t-11.25,4.75l-384.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 384.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,48.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-288.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 288.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"align-center, paragraph, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 352.00,240.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 224.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 416.00,144.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75 l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 320.00,48.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-160.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 160.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"align-left, paragraph, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 352.00,240.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-320.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 320.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 416.00,144.00l0.00,32.00 q0.00,6.50 -4.75,11.25 t-11.25,4.75l-384.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 384.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 320.00,48.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-288.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 288.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"text-width, format, text\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 20.25,32.25l 13.50,6.75q 5.00,1.25 52.75,1.25l 32.50,0.00 l 4.75-0.75l 28.75-0.25l 111.50,0.25l 79.50,0.00 l 8.50,0.50q 3.50,0.25 7.00-1.75t 5.25-4.00l 1.75-2.00l 10.50-0.25q 3.75,0.00 7.00,0.25l0.00,26.125 t 0.25,32.875l 0.25,25.00l-0.25,14.50q0.00,8.00 -1.00,12.75q-9.75,3.75 -17.00,4.50q-6.25-10.75 -13.50-32.00q-2.00-6.00 -3.875-15.625t-2.875-16.375t-1.50-7.25q-3.25-3.75 -6.75-4.75q-1.75-0.50 -14.625-0.50t-34.625,0.25t-32.00,0.25 q-23.50,0.00 -31.75,1.25q-2.50,24.25 -2.00,34.00l 0.25,38.00l0.00-13.00 l 0.75,89.75l-0.25,36.75q-0.25,11.50 2.75,21.25q 12.25,6.25 22.25,8.00q 0.50,0.00 4.50,1.25t 11.00,3.25t 10.75,3.00q 7.50,2.00 12.50,4.50q 1.25,11.25 1.25,12.50q0.00,2.50 -0.75,7.25q-3.50,0.25 -8.50,0.25q-27.50,0.00 -46.75-2.50q-18.00-2.00 -59.50-2.00q-20.50,0.00 -58.25,3.25q-11.25,1.25 -17.50,1.25q-0.50-5.50 -0.50-6.50l-0.25-6.50l0.00-2.25 q 5.25-8.25 19.75-12.25 q 34.75-9.50 39.75-12.50q 2.25-5.25 3.00-14.00q 1.50-34.25 1.50-108.25l-1.25-11.00q0.00-66.25 -0.50-69.50q-0.50-2.75 -1.50-3.75q-1.50-1.25 -3.50-1.50q-9.50-1.50 -37.00-1.50q-12.50,0.00 -42.125,3.50t-33.125,6.00q-3.25,2.25 -5.50,8.25t-5.50,18.75t-6.00,21.00q-1.50,4.75 -4.875,8.00t-5.125,3.25q-11.00-6.75 -14.00-11.00l0.00-74.25 l0.00-21.50 zM 376.25,355.75q 6.50,5.00 6.50,12.25t-6.50,12.25l-40.50,31.50 q-6.50,5.00 -11.125,2.75t-4.625-10.50l0.00-20.00 l-256.00,0.00 l0.00,20.00 q0.00,8.25 -4.625,10.50t-11.125-2.75l-40.50-31.50q-6.50-5.00 -6.50-12.25t 6.50-12.25l 40.50-31.50q 6.50-5.00 11.125-2.75t 4.625,10.50l0.00,20.00 l 256.00,0.00 l0.00-20.00 q0.00-8.25 4.625-10.50t 11.125,2.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"text-height, format, editor\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 20.25,32.25l 13.50,6.75q 5.00,1.25 52.75,1.25l 32.50,0.00 l 4.75-0.75l 28.75-0.25l 53.75,0.25l 73.25,0.00 l 8.50,0.50q 3.50,0.25 7.00-1.75t 5.25-4.00l 1.75-2.00l 10.50-0.25q 3.75,0.00 7.00,0.25l0.00,26.125 t 0.25,32.875l 0.25,25.00l-0.25,14.50q0.00,8.00 -1.00,12.75q-9.75,3.75 -17.00,4.50q-6.25-10.75 -13.50-32.00q-2.00-6.00 -3.875-15.625t-2.875-16.375t-1.50-7.25q-3.25-3.75 -6.75-4.75q-1.75-0.50 -10.625-0.50t-25.875,0.25t-27.75,0.25 q-8.50,0.00 -16.75,1.25q-2.50,24.25 -2.00,34.00l 0.25,38.00l0.00,83.00 l 0.75,89.75l-0.25,36.75q-0.25,11.50 2.75,21.25q 12.25,6.25 22.25,8.00q 0.50,0.00 4.50,1.25t 11.00,3.25t 10.75,3.00q 7.50,2.00 12.50,4.50q 1.25,11.25 1.25,12.50q0.00,2.50 -0.75,7.25q-3.50,0.25 -8.50,0.25q-27.50,0.00 -46.75-2.50q-18.00-2.00 -59.50-2.00q-22.00,0.00 -58.25,3.50q-12.00,1.00 -17.50,1.00q-0.50-5.50 -0.50-6.50l-0.25-6.50l0.00-2.25 q 5.25-8.25 19.75-12.25 q 34.75-9.50 39.75-12.50q 2.25-5.25 3.00-14.00q 2.00-48.00 1.50-108.25l-1.25-107.00q-0.25-15.50 -0.125-29.625t 0.125-25.625t-0.50-14.25t-1.50-3.75q-1.50-1.25 -3.50-1.50q-9.50-1.50 -37.00-1.50q-10.75,0.00 -25.00,3.375t-18.25,6.125q-3.25,2.25 -5.50,8.25t-5.50,18.75t-6.00,21.00q-1.50,4.75 -4.875,8.00t-5.125,3.25q-11.00-6.75 -14.00-11.00l0.00-74.25 l0.00-21.50 zM 436.00,352.00q 8.25,0.00 10.50,4.625t-2.75,11.125 l-31.50,40.50q-5.00,6.50 -12.25,6.50t-12.25-6.50l-31.50-40.50q-5.00-6.50 -2.75-11.125t 10.50-4.625l 20.00,0.00 l0.00-256.00 l-20.00,0.00 q-8.25,0.00 -10.50-4.625t 2.75-11.125l 31.50-40.50q 5.00-6.50 12.25-6.50t 12.25,6.50l 31.50,40.50q 5.00,6.50 2.75,11.125t-10.50,4.625l-20.00,0.00 l0.00,256.00 l 20.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"italic, editor, format\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M0.00,415.50l 4.25-21.25q 1.00-0.25 19.25-5.00q 19.00-4.75 29.00-9.75q 7.25-9.25 10.25-25.25l 6.75-34.75l 14.00-67.00l 3.00-16.00q 2.00-11.00 4.25-21.125t 4.00-16.75t 3.125-11.625t 2.25-7.625t 0.875-2.875l 7.25-39.25l 4.00-15.75l 5.50-33.75l 2.00-12.50l0.00-9.50 q-10.25-5.50 -36.00-7.00q-7.00-0.50 -9.50-1.00l 4.75-25.75l 79.25,3.50q 9.75,0.50 18.25,0.50q 16.50,0.00 53.50-2.25q 8.25-0.50 17.00-1.125t 9.00-0.625q-0.50,4.75 -1.50,9.50 q-1.75,7.25 -3.25,12.75q-13.75,4.75 -27.25,7.75q-16.00,4.00 -25.25,7.75q-3.00,7.75 -6.00,22.00q-2.25,11.00 -3.25,20.50q-11.00,49.75 -16.50,76.50l-15.25,77.75l-9.50,39.50l-10.75,58.75l-3.00,11.25q-0.50,1.75 0.25,6.75q 16.00,3.75 29.75,5.25q 9.00,1.25 16.50,2.50q-0.25,7.25 -1.75,14.50q-1.75,7.75 -2.25,10.25q-4.50,0.00 -5.75,0.25q-6.00,0.50 -10.50,0.50q-2.25,0.00 -7.00-0.75q-4.75-1.00 -36.25-4.25 l-49.50-0.50q-10.25-0.25 -43.50,2.75q-18.50,1.75 -24.50,2.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"bold, editor, format\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 138.75,380.25q 19.00,8.00 35.00,8.00q 32.75,0.00 54.00-10.25t 30.50-28.25q 9.50-17.50 9.50-45.25q0.00-28.50 -10.25-45.00q-14.50-23.50 -35.25-31.50q-20.00-8.00 -61.75-8.00q-18.50,0.00 -25.25,2.50l0.00,36.00 l-0.25,43.25l 0.75,67.50q0.00,3.75 3.00,11.00zM 135.25,193.75q 10.75,1.75 27.25,1.75q 43.75,0.00 66.00-16.25t 22.25-56.00q0.00-28.00 -21.25-46.75q-21.00-18.75 -63.75-18.75q-13.00,0.00 -32.50,3.25q0.00,11.00 0.50,19.25 q 1.75,30.50 1.50,69.75l-0.25,24.50q0.00,10.75 0.25,19.25zM0.00,416.00l 0.50-23.50q 11.25-2.25 17.00-3.00q 19.25-3.00 30.75-7.75q 4.25-6.75 5.25-12.75q 2.25-16.50 2.25-48.50l-0.50-124.25q-1.25-64.00 -2.25-101.00q-0.25-21.75 -2.75-27.25q-0.25-1.00 -3.00-3.00q-4.50-3.00 -17.25-3.75q-7.50-0.50 -28.50-3.25l-1.00-20.75l 65.00-1.50l 95.00-3.25l 11.25-0.25q 1.25,0.00 3.50-0.125t 3.50-0.125q 0.25,0.00 5.375,0.125t 10.125,0.125l 18.50,0.00 q 22.00,0.00 47.75,6.75 q 10.75,3.25 24.00,9.75q 14.25,7.25 25.50,19.00q 11.00,11.75 16.25,26.00t 5.25,30.50q0.00,17.50 -8.00,32.00t-23.75,26.25q-6.50,5.00 -37.50,19.25q 44.25,10.25 66.75,36.50q 23.00,26.50 23.00,59.00q0.00,19.00 -7.25,40.25q-5.25,15.50 -17.75,29.25q-16.50,18.00 -35.00,27.00q-18.25,9.00 -50.75,15.00q-20.50,3.75 -49.50,2.75l-49.25-1.00q-21.00-0.50 -74.50,2.75q-8.25,0.75 -68.00,2.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"font, letter, glyph, editor\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 181.25,139.75l-42.50,112.50q 18.25,0.25 38.375,0.50t 29.75,0.375t 13.125,0.125l 7.25-0.50q-8.00-23.75 -23.00-60.25q-13.25-33.00 -23.00-52.75zM 5.25,416.00l-5.25,0.00 l 0.50-19.75q 5.50-1.75 20.00-4.50q 22.25-4.00 27.50-7.75q 5.00-4.00 12.00-17.00l 59.25-154.00l 70.00-181.00l 18.75,0.00 l 13.25,0.00 l 2.75,5.25l 51.25,120.00q 25.75,60.50 31.00,74.25q 9.75,25.50 24.00,58.75q 6.50,14.50 16.25,41.00q 6.00,16.75 16.25,37.25 q 5.50,12.25 8.75,14.25q 5.50,4.75 17.25,5.75q 11.75,1.50 25.75,6.75q 1.50,9.75 1.50,14.25q0.00,3.50 -0.25,6.50q-20.00,0.00 -48.00-2.00q-23.25-2.00 -47.25-2.00q-19.75,0.00 -33.75,0.50l-50.00,2.75l-14.50,0.50q0.00-11.25 1.00-19.50l 32.75-7.00q 14.00-3.25 17.00-5.75q 3.00-3.00 3.00-6.75t-1.50-8.00l-11.75-28.50l-23.00-57.00l-112.50-0.50q-7.25,16.25 -26.00,68.50q-5.75,16.00 -5.75,21.00q0.00,7.75 4.25,10.75 q 6.50,5.25 25.75,8.00q 0.75,0.00 3.375,0.50t 7.50,1.25t 10.125,1.50q 0.25,7.00 0.25,14.50q0.00,4.25 -0.50,6.75q-16.50,0.00 -87.25-5.00l-12.00,2.00q-20.25,3.50 -41.75,3.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"camera, photo, picture, image\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 240.00,168.00q 29.75,0.00 50.875,21.125t 21.125,50.875t-21.125,50.875t-50.875,21.125t-50.875-21.125t-21.125-50.875t 21.125-50.875t 50.875-21.125zM 416.00,64.00q 26.50,0.00 45.25,18.75t 18.75,45.25l0.00,224.00 q0.00,26.50 -18.75,45.25t-45.25,18.75l-352.00,0.00 q-26.50,0.00 -45.25-18.75t-18.75-45.25l0.00-224.00 q0.00-26.50 18.75-45.25t 45.25-18.75l 56.00,0.00 l 12.75-34.00 q 4.75-12.25 17.375-21.125t 25.875-8.875l 128.00,0.00 q 13.25,0.00 25.875,8.875t 17.375,21.125l 12.75,34.00l 56.00,0.00 zM 240.00,352.00q 46.25,0.00 79.125-32.875t 32.875-79.125t-32.875-79.125t-79.125-32.875t-79.125,32.875t-32.875,79.125t 32.875,79.125t 79.125,32.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"print\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 96.00,384.00l 224.00,0.00 l0.00-64.00 l-224.00,0.00 l0.00,64.00 zM 96.00,224.00l 224.00,0.00 l0.00-96.00 l-40.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-40.00 l-160.00,0.00 l0.00,160.00 zM 384.00,240.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 416.00,240.00l0.00,104.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-56.00,0.00 l0.00,40.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00 l0.00-40.00 l-56.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-104.00 q0.00-19.75 14.125-33.875t 33.875-14.125l 16.00,0.00 l0.00-136.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 168.00,0.00 q 10.00,0.00 22.00,5.00t 19.00,12.00l 38.00,38.00q 7.00,7.00 12.00,19.00t 5.00,22.00l0.00,64.00 l 16.00,0.00 q 19.75,0.00 33.875,14.125t 14.125,33.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"320\" height=\"448\" viewBox=\"0 0 320 448\" data-du=\"\" data-tags=\"bookmark, favorite, ribbon\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 291.00,32.00q 5.75,0.00 11.00,2.25q 8.25,3.25 13.125,10.25t 4.875,15.50l0.00,322.25 q0.00,8.50 -4.875,15.50t-13.125,10.25q-4.75,2.00 -11.00,2.00q-12.00,0.00 -20.75-8.00l-110.25-106.00l-110.25,106.00q-9.00,8.25 -20.75,8.25q-5.75,0.00 -11.00-2.25q-8.25-3.25 -13.125-10.25t-4.875-15.50l0.00-322.25 q0.00-8.50 4.875-15.50t 13.125-10.25q 5.25-2.25 11.00-2.25l 262.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"book, read, study, learn, education\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 409.75,119.50q 10.00,14.25 4.50,32.25l-68.75,226.50q-4.75,16.00 -19.125,26.875t-30.625,10.875l-230.75,0.00 q-19.25,0.00 -37.125-13.375t-24.875-32.875q-6.00-16.75 -0.50-31.75q0.00-1.00 0.75-6.75t 1.00-9.25q 0.25-2.00 -0.75-5.375t-0.75-4.875q 0.50-2.75 2.00-5.25t 4.125-5.875t 4.125-5.875q 5.75-9.50 11.25-22.875t 7.50-22.875q 0.75-2.50 0.125-7.50t-0.125-7.00q 0.75-2.75 4.25-7.00t 4.25-5.75 q 5.25-9.00 10.50-23.00t 6.25-22.50q 0.25-2.25 -0.625-8.00t 0.125-7.00q 1.00-3.25 5.50-7.625t 5.50-5.625q 4.75-6.50 10.625-21.125t 6.875-24.125q 0.25-2.00 -0.75-6.375t-0.50-6.625q 0.50-2.00 2.25-4.50t 4.50-5.75t 4.25-5.25q 2.00-3.00 4.125-7.625t 3.75-8.75t 4.00-9.00t 4.875-8.00t 6.625-5.875t 9.00-2.875t 11.875,1.375l-0.25,0.75q 9.50-2.25 12.75-2.25l 190.25,0.00 q 18.50,0.00 28.50,14.00t 4.50,32.50l-68.50,226.50 q-9.00,29.75 -17.875,38.375t-32.125,8.625l-217.25,0.00 q-6.75,0.00 -9.50,3.75q-2.75,4.00 -0.25,10.75q 6.00,17.50 36.00,17.50l 230.75,0.00 q 7.25,0.00 14.00-3.875t 8.75-10.375l 75.00-246.75q 1.75-5.50 1.25-14.25q 9.50,3.75 14.75,10.75zM 143.75,120.00q-1.00,3.25 0.50,5.625t 5.00,2.375l 152.00,0.00 q 3.25,0.00 6.375-2.375t 4.125-5.625l 5.25-16.00q 1.00-3.25 -0.50-5.625t-5.00-2.375l-152.00,0.00 q-3.25,0.00 -6.375,2.375 t-4.125,5.625zM 123.00,184.00q-1.00,3.25 0.50,5.625t 5.00,2.375l 152.00,0.00 q 3.25,0.00 6.375-2.375t 4.125-5.625l 5.25-16.00q 1.00-3.25 -0.50-5.625t-5.00-2.375l-152.00,0.00 q-3.25,0.00 -6.375,2.375t-4.125,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"tags, price, ecommerce\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 112.00,112.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 378.75,256.00q0.00,13.25 -9.25,22.50l-122.75,123.00q-9.75,9.25 -22.75,9.25q-13.25,0.00 -22.50-9.25l-178.75-179.00q-9.50-9.25 -16.125-25.25t-6.625-29.25l0.00-104.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 104.00,0.00 q 13.25,0.00 29.25,6.625t 25.50,16.125 l 178.75,178.50q 9.25,9.75 9.25,22.75zM 474.75,256.00q0.00,13.25 -9.25,22.50l-122.75,123.00q-9.75,9.25 -22.75,9.25q-9.00,0.00 -14.75-3.50t-13.25-11.25l 117.50-117.50q 9.25-9.25 9.25-22.50q0.00-13.00 -9.25-22.75l-178.75-178.50q-9.50-9.50 -25.50-16.125t-29.25-6.625l 56.00,0.00 q 13.25,0.00 29.25,6.625t 25.50,16.125l 178.75,178.50q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"tag, price, ecommerce\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 112.00,112.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 378.75,256.00q0.00,13.25 -9.25,22.50l-122.75,123.00q-9.75,9.25 -22.75,9.25q-13.25,0.00 -22.50-9.25l-178.75-179.00q-9.50-9.25 -16.125-25.25t-6.625-29.25l0.00-104.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 104.00,0.00 q 13.25,0.00 29.25,6.625t 25.50,16.125 l 178.75,178.50q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"barcode\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 168.00,32.00l0.00,384.00 l-16.00,0.00 l0.00-384.00 l 16.00,0.00 zM 352.00,32.00l0.00,384.00 l-16.00,0.00 l0.00-384.00 l 16.00,0.00 zM 392.00,32.00l0.00,384.00 l-16.00,0.00 l0.00-384.00 l 16.00,0.00 zM 144.00,32.00l0.00,384.00 l-16.00,0.00 l0.00-384.00 l 16.00,0.00 zM 320.00,32.00l0.00,384.00 l-64.00,0.00 l0.00-384.00 l 64.00,0.00 zM 224.00,32.00l0.00,384.00 l-32.00,0.00 l0.00-384.00 l 32.00,0.00 zM 112.00,32.00l0.00,384.00 l-32.00,0.00 l0.00-384.00 l 32.00,0.00 zM 448.00,32.00l0.00,384.00 l-32.00,0.00 l0.00-384.00 l 32.00,0.00 zM 64.00,32.00l0.00,384.00 l-64.00,0.00 l0.00-384.00 l 64.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"qrcode\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,288.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 96.00,96.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 288.00,96.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 32.00,351.75l 96.00,0.00 l0.00-95.75 l-96.00,0.00 l0.00,95.75 zM 32.00,160.00l 96.00,0.00 l0.00-96.00 l-96.00,0.00 l0.00,96.00 zM 224.00,160.00l 96.00,0.00 l0.00-96.00 l-96.00,0.00 l0.00,96.00 zM 160.00,224.00l0.00,160.00 l-160.00,0.00 l0.00-160.00 l 160.00,0.00 zM 288.00,352.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 352.00,352.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 z M 352.00,224.00l0.00,96.00 l-96.00,0.00 l0.00-32.00 l-32.00,0.00 l0.00,96.00 l-32.00,0.00 l0.00-160.00 l 96.00,0.00 l0.00,32.00 l 32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 160.00,32.00l0.00,160.00 l-160.00,0.00 l0.00-160.00 l 160.00,0.00 zM 352.00,32.00l0.00,160.00 l-160.00,0.00 l0.00-160.00 l 160.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"volume-up, speaker\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,88.00l0.00,272.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-83.25-83.25l-65.50,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 65.50,0.00 l 83.25-83.25q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25zM 288.00,224.00q0.00,19.00 -10.625,35.375t-28.125,23.375q-2.50,1.25 -6.25,1.25q-6.50,0.00 -11.25-4.625t-4.75-11.375q0.00-5.25 3.00-8.875t 7.25-6.25t 8.50-5.75t 7.25-8.875 t 3.00-14.25t-3.00-14.25t-7.25-8.875t-8.50-5.75t-7.25-6.25t-3.00-8.875q0.00-6.75 4.75-11.375t 11.25-4.625q 3.75,0.00 6.25,1.25q 17.50,6.75 28.125,23.25t 10.625,35.50zM 352.00,224.00q0.00,38.25 -21.25,70.625t-56.25,47.125q-3.25,1.25 -6.25,1.25q-6.75,0.00 -11.50-4.75t-4.75-11.25q0.00-9.75 9.75-14.75q 14.00-7.25 19.00-11.00q 18.50-13.50 28.875-33.875t 10.375-43.375t-10.375-43.375 t-28.875-33.875q-5.00-3.75 -19.00-11.00q-9.75-5.00 -9.75-14.75q0.00-6.50 4.75-11.25t 11.25-4.75q 3.25,0.00 6.50,1.25q 35.00,14.75 56.25,47.125t 21.25,70.625zM 416.00,224.00q0.00,57.50 -31.75,105.625t-84.50,70.875q-3.25,1.25 -6.50,1.25q-6.50,0.00 -11.25-4.75t-4.75-11.25q0.00-9.00 9.75-14.75q 1.75-1.00 5.625-2.625t 5.625-2.625q 11.50-6.25 20.50-12.75q 30.75-22.75 48.00-56.75t 17.25-72.25t-17.25-72.25 t-48.00-56.75q-9.00-6.50 -20.50-12.75q-1.75-1.00 -5.625-2.625t-5.625-2.625q-9.75-5.75 -9.75-14.75q0.00-6.50 4.75-11.25t 11.25-4.75q 3.25,0.00 6.50,1.25q 52.75,22.75 84.50,70.875t 31.75,105.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"volume-down, speaker\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 192.00,88.00l0.00,272.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-83.25-83.25l-65.50,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 65.50,0.00 l 83.25-83.25q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25zM 288.00,224.00q0.00,19.00 -10.625,35.375t-28.125,23.375q-2.50,1.25 -6.25,1.25q-6.50,0.00 -11.25-4.625t-4.75-11.375q0.00-5.25 3.00-8.875t 7.25-6.25t 8.50-5.75t 7.25-8.875 t 3.00-14.25t-3.00-14.25t-7.25-8.875t-8.50-5.75t-7.25-6.25t-3.00-8.875q0.00-6.75 4.75-11.375t 11.25-4.625q 3.75,0.00 6.25,1.25q 17.50,6.75 28.125,23.25t 10.625,35.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"192\" height=\"448\" viewBox=\"0 0 192 448\" data-du=\"\" data-tags=\"volume-off, speaker, mute\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 192.00,88.00l0.00,272.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-83.25-83.25l-65.50,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 65.50,0.00 l 83.25-83.25q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"headphones, listen, music\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 416.00,221.50q0.00,41.50 -15.00,78.50l-5.00,12.25l-46.25,8.25q-5.50,20.75 -22.625,34.125t-39.125,13.375l0.00,8.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,8.00 q 17.75,0.00 32.50,8.875t 23.25,23.875l 17.00-3.00q 7.25-23.75 7.25-48.25q0.00-37.00 -22.00-69.75t-59.125-52.25t-78.875-19.50 t-78.875,19.50t-59.125,52.25t-22.00,69.75q0.00,24.50 7.25,48.25l 17.00,3.00q 8.50-15.00 23.25-23.875t 32.50-8.875l0.00-8.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-8.00 q-22.00,0.00 -39.125-13.375t-22.625-34.125l-46.25-8.25l-5.00-12.25q-15.00-37.00 -15.00-78.50q0.00-37.75 16.75-72.75t 44.75-60.625 t 66.50-40.875t 80.00-15.25t 80.00,15.25t 66.50,40.875t 44.75,60.625t 16.75,72.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"flag, report\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 80.00,64.00q0.00,18.00 -16.00,27.50l0.00,316.50 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-316.50 q-16.00-9.50 -16.00-27.50q0.00-13.25 9.375-22.625t 22.625-9.375t 22.625,9.375t 9.375,22.625zM 448.00,80.00l0.00,190.75 q0.00,6.25 -3.125,9.625t-9.875,6.875q-53.75,29.00 -92.25,29.00q-15.25,0.00 -30.875-5.50t-27.125-12.00 t-28.875-12.00t-35.625-5.50q-48.00,0.00 -116.00,36.50q-4.25,2.25 -8.25,2.25q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-185.50 q0.00-8.00 7.75-13.75q 5.25-3.50 19.75-10.75q 59.00-30.00 105.25-30.00q 26.75,0.00 50.00,7.25t 54.75,22.00q 9.50,4.75 22.00,4.75q 13.50,0.00 29.375-5.25t 27.50-11.75t 22.00-11.75t 13.625-5.25q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"lock, password, secure, private, protected, encrypted\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 176.00,256.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625q0.00,9.25 4.75,16.75t 12.75,11.75l-17.25,57.25q-1.25,3.75 1.25,7.00t 6.50,3.25l 48.00,0.00 q 4.00,0.00 6.50-3.25t 1.25-7.00l-17.25-57.25q 8.00-4.25 12.75-11.75t 4.75-16.75zM 80.00,192.00l 128.00,0.00 l0.00-48.00 q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25l0.00,48.00 zM 288.00,216.00l0.00,144.00 q0.00,10.00 -7.00,17.00 t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-144.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 8.00,0.00 l0.00-48.00 q0.00-46.00 33.00-79.00t 79.00-33.00t 79.00,33.00t 33.00,79.00l0.00,48.00 l 8.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"list-alt\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 96.00,296.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,232.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 96.00,168.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 384.00,296.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-240.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 240.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 384.00,232.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-240.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 240.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 384.00,168.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-240.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 240.00,0.00 q 3.25,0.00 5.625,2.375 t 2.375,5.625zM 416.00,344.00l0.00-208.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-368.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,208.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 368.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 448.00,72.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-368.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 368.00,0.00 q 16.50,0.00 28.25,11.75 t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"refresh, synchronize\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 377.75,264.00q0.00,1.25 -0.25,1.75q-16.00,67.00 -67.00,108.625t-119.50,41.625q-36.50,0.00 -70.625-13.75t-60.875-39.25l-32.25,32.25q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 112.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25l-34.25,34.25q 17.75,16.50 40.25,25.50t 46.75,9.00q 33.50,0.00 62.50-16.25t 46.50-44.75q 2.75-4.25 13.25-29.25 q 2.00-5.75 7.50-5.75l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 384.00,64.00l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 34.50-34.50q-37.00-34.25 -87.25-34.25q-33.50,0.00 -62.50,16.25t-46.50,44.75q-2.75,4.25 -13.25,29.25q-2.00,5.75 -7.50,5.75l-49.75,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-1.75 q 16.25-67.00 67.50-108.625t 120.00-41.625 q 36.50,0.00 71.00,13.875t 61.25,39.125l 32.50-32.25q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"repeat, loop, reload, refresh, synchronize\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,64.00l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-112.00,0.00 q-10.50,0.00 -14.75-10.00q-4.25-9.75 3.50-17.25l 34.50-34.50q-37.00-34.25 -87.25-34.25q-26.00,0.00 -49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125q 42.25,0.00 76.00-24.875t 46.25-65.375q 1.75-5.75 7.50-5.75l 49.75,0.00 q 4.00,0.00 6.25,3.00q 2.50,3.25 1.75,6.75q-9.75,43.75 -36.875,78.00t-66.50,53.25t-84.125,19.00q-39.00,0.00 -74.50-15.25t-61.25-41.00t-41.00-61.25t-15.25-74.50t 15.25-74.50t 41.00-61.25t 61.25-41.00t 74.50-15.25q 36.75,0.00 71.125,13.875t 61.125,39.125l 32.50-32.25q 7.25-7.75 17.50-3.50q 9.75,4.25 9.75,14.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"play-circle, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 288.00,224.00q0.00,9.25 -8.25,14.00l-128.00,72.00q-3.50,2.00 -7.75,2.00t-8.00-2.25q-8.00-4.50 -8.00-13.75l0.00-144.00 q0.00-9.25 8.00-13.75q 7.75-5.00 15.75-0.25l 128.00,72.00q 8.25,4.75 8.25,14.00zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625 t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"inbox, drawer, storage, archive\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 255.75,240.00l 79.00,0.00 q-0.25-0.75 -0.625-2.00t-0.625-2.00l-53.00-124.00l-177.00,0.00 l-53.00,124.00q-0.25,0.50 -0.625,2.00t-0.625,2.00l 79.00,0.00 l 23.75,48.00l 80.00,0.00 zM 384.00,247.50l0.00,120.50 q0.00,6.50 -4.75,11.25t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-120.50 q0.00-15.50 6.25-30.75l 59.50-138.00q 2.50-6.25 9.125-10.50t 13.125-4.25l 208.00,0.00 q 6.50,0.00 13.125,4.25t 9.125,10.50l 59.50,138.00 q 6.25,15.25 6.25,30.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"upload, load, open\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 280.00,216.00q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 l0.00,88.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-88.00 l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75q0.00-3.00 2.50-6.00l 79.75-79.75q 2.25-2.25 5.75-2.25t 5.75,2.25l 80.00,80.00q 2.25,2.25 2.25,5.75zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375 t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375 t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"download, arrow, store, save\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 280.00,232.00q0.00,3.00 -2.50,6.00l-79.75,79.75q-2.25,2.25 -5.75,2.25t-5.75-2.25l-80.00-80.00q-2.25-2.25 -2.25-5.75q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 l0.00-88.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,88.00 l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125 t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375 t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"download-alt, arrow, store, save\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 334.75,201.75q 4.25,10.25 -3.50,17.50l-112.00,112.00q-4.50,4.75 -11.25,4.75t-11.25-4.75l-112.00-112.00q-7.75-7.25 -3.50-17.50q 4.25-9.75 14.75-9.75l 64.00,0.00 l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 64.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,112.00 l 64.00,0.00 q 10.50,0.00 14.75,9.75zM 408.00,256.00q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-400.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75 t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,88.00 l 288.00,0.00 l0.00-88.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"road, asphalt\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 277.75,249.00l0.00-1.00 l-6.00-80.00q-0.25-3.25 -2.75-5.625t-5.75-2.375l-46.50,0.00 q-3.25,0.00 -5.75,2.375t-2.75,5.625l-6.00,80.00l0.00,1.00 q-0.25,3.00 2.00,5.00t 5.25,2.00l 61.00,0.00 q 3.00,0.00 5.25-2.00t 2.00-5.00zM 467.50,365.75q0.00,18.25 -11.50,18.25l-176.00,0.00 q 3.25,0.00 5.50-2.375t 2.00-5.625l-5.00-64.00q-0.25-3.25 -2.75-5.625t-5.75-2.375l-68.00,0.00 q-3.25,0.00 -5.75,2.375t-2.75,5.625l-5.00,64.00 q-0.25,3.25 2.00,5.625t 5.50,2.375l-176.00,0.00 q-11.50,0.00 -11.50-18.25q0.00-13.50 6.50-29.00l 104.25-261.00q 2.00-4.75 6.50-8.25t 9.50-3.50l 84.75,0.00 q-3.25,0.00 -5.75,2.375t-2.75,5.625l-3.75,48.00q-0.25,3.50 2.00,5.75t 5.50,2.25l 41.50,0.00 q 3.25,0.00 5.50-2.25t 2.00-5.75l-3.75-48.00q-0.25-3.25 -2.75-5.625t-5.75-2.375l 84.75,0.00 q 5.00,0.00 9.50,3.50t 6.50,8.25l 104.25,261.00q 6.50,15.50 6.50,29.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"time, clock\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 272.00,232.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-96.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-112.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,88.00 l 72.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125t-49.625,10.125 t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875 t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"320\" height=\"448\" viewBox=\"0 0 320 448\" data-du=\"\" data-tags=\"file, paper, new, empty\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 32.00,384.00l 256.00,0.00 l0.00-192.00 l-104.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-128.00,0.00 l0.00,320.00 zM 192.00,160.00l 74.75,0.00 l-74.75-74.75l0.00,74.75 zM 320.00,192.00l0.00,200.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-272.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-336.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 136.00,0.00 q 10.00,0.00 22.00,5.00t 19.00,12.00l 102.00,102.00q 7.00,7.00 12.00,19.00t 5.00,22.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"home, house, building\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,248.00l0.00,120.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-96.00,0.00 l0.00-96.00 l-64.00,0.00 l0.00,96.00 l-96.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-120.00 q0.00-0.25 0.125-0.75t 0.125-0.75l 143.75-118.50l 143.75,118.50q 0.25,0.50 0.25,1.50zM 407.75,230.75l-15.50,18.50q-2.00,2.25 -5.25,2.75l-0.75,0.00 q-3.25,0.00 -5.25-1.75l-173.00-144.25l-173.00,144.25q-3.00,2.00 -6.00,1.75q-3.25-0.50 -5.25-2.75l-15.50-18.50q-2.00-2.50 -1.75-5.875t 2.75-5.375 l 179.75-149.75q 8.00-6.50 19.00-6.50t 19.00,6.50l 61.00,51.00l0.00-48.75 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,102.00 l 54.75,45.50q 2.50,2.00 2.75,5.375t-1.75,5.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"trash, remove, delete, bin\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 128.00,184.00l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 192.00,184.00l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 256.00,184.00l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 288.00,365.00l0.00-237.00 l-224.00,0.00 l0.00,237.00 q0.00,5.50 1.75,10.125t 3.625,6.75t 2.625,2.125l 208.00,0.00 q 0.75,0.00 2.625-2.125t 3.625-6.75t 1.75-10.125zM 120.00,96.00l 112.00,0.00 l-12.00-29.25q-1.75-2.25 -4.25-2.75l-79.25,0.00 q-2.50,0.50 -4.25,2.75zM 352.00,104.00l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-24.00,0.00 l0.00,237.00 q0.00,20.75 -11.75,35.875t-28.25,15.125l-208.00,0.00 q-16.50,0.00 -28.25-14.625t-11.75-35.375l0.00-238.00 l-24.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 77.25,0.00 l 17.50-41.75q 3.75-9.25 13.50-15.75t 19.75-6.50l 80.00,0.00 q 10.00,0.00 19.75,6.50t 13.50,15.75l 17.50,41.75l 77.25,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"cog, settings, options, gear, preferences\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 256.00,224.00q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25t 18.75,45.25t 45.25,18.75t 45.25-18.75t 18.75-45.25zM 384.00,196.75l0.00,55.50 q0.00,3.00 -2.00,5.75t-5.00,3.25l-46.25,7.00q-4.75,13.50 -9.75,22.75q 8.75,12.50 26.75,34.50q 2.50,3.00 2.50,6.25t-2.25,5.75q-6.75,9.25 -24.75,27.00t-23.50,17.75q-3.00,0.00 -6.50-2.25l-34.50-27.00q-11.00,5.75 -22.75,9.50 q-4.00,34.00 -7.25,46.50q-1.75,7.00 -9.00,7.00l-55.50,0.00 q-3.50,0.00 -6.125-2.125t-2.875-5.375l-7.00-46.00q-12.25-4.00 -22.50-9.25l-35.25,26.75q-2.50,2.25 -6.25,2.25q-3.50,0.00 -6.25-2.75q-31.50-28.50 -41.25-42.00q-1.75-2.50 -1.75-5.75q0.00-3.00 2.00-5.75q 3.75-5.25 12.75-16.625t 13.50-17.625q-6.75-12.50 -10.25-24.75l-45.75-6.75q-3.25-0.50 -5.25-3.125t-2.00-5.875l0.00-55.50 q0.00-3.00 2.00-5.75t 4.75-3.25 l 46.50-7.00q 3.50-11.50 9.75-23.00q-10.00-14.25 -26.75-34.50q-2.50-3.00 -2.50-6.00q0.00-2.50 2.25-5.75q 6.50-9.00 24.625-26.875t 23.625-17.875q 3.25,0.00 6.50,2.50l 34.50,26.75q 11.00-5.75 22.75-9.50q 4.00-34.00 7.25-46.50q 1.75-7.00 9.00-7.00l 55.50,0.00 q 3.50,0.00 6.125,2.125t 2.875,5.375l 7.00,46.00q 12.25,4.00 22.50,9.25l 35.50-26.75q 2.25-2.25 6.00-2.25q 3.25,0.00 6.25,2.50q 32.25,29.75 41.25,42.50q 1.75,2.00 1.75,5.50 q0.00,3.00 -2.00,5.75q-3.75,5.25 -12.75,16.625t-13.50,17.625q 6.50,12.50 10.25,24.50l 45.75,7.00q 3.25,0.50 5.25,3.125t 2.00,5.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"signal, bars, stats\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 64.00,360.00l0.00,48.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 160.00,328.00l0.00,80.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-80.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 256.00,264.00l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75 l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 352.00,168.00l0.00,240.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-240.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 448.00,40.00l0.00,368.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-368.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"off, switch, power\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00q0.00,39.00 -15.25,74.50t-41.00,61.25t-61.25,41.00t-74.50,15.25t-74.50-15.25t-61.25-41.00t-41.00-61.25t-15.25-74.50q0.00-45.50 20.125-85.75t 56.625-67.50q 10.75-8.00 23.875-6.25t 20.875,12.50q 8.00,10.50 6.125,23.625t-12.375,21.125q-24.50,18.50 -37.875,45.25t-13.375,57.00q0.00,26.00 10.125,49.625t 27.375,40.875t 40.875,27.375 t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625q0.00-30.25 -13.375-57.00t-37.875-45.25q-10.50-8.00 -12.375-21.125t 6.125-23.625q 7.75-10.75 21.00-12.50t 23.75,6.25q 36.50,27.25 56.625,67.50t 20.125,85.75zM 224.00,32.00l0.00,160.00 q0.00,13.00 -9.50,22.50t-22.50,9.50t-22.50-9.50t-9.50-22.50l0.00-160.00 q0.00-13.00 9.50-22.50t 22.50-9.50t 22.50,9.50t 9.50,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"zoom-out, magnifier\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 256.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-144.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 144.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,208.00q0.00-46.25 -32.875-79.125t-79.125-32.875t-79.125,32.875t-32.875,79.125t 32.875,79.125t 79.125,32.875t 79.125-32.875t 32.875-79.125z M 416.00,416.00q0.00,13.25 -9.375,22.625t-22.625,9.375q-13.50,0.00 -22.50-9.50l-85.75-85.50q-44.75,31.00 -99.75,31.00q-35.75,0.00 -68.375-13.875t-56.25-37.50t-37.50-56.25t-13.875-68.375t 13.875-68.375t 37.50-56.25t 56.25-37.50t 68.375-13.875t 68.375,13.875t 56.25,37.50t 37.50,56.25t 13.875,68.375q0.00,55.00 -31.00,99.75l 85.75,85.75q 9.25,9.25 9.25,22.50z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"zoom-in, magnifier, enlarge\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 256.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-56.00,0.00 l0.00,56.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-56.00 l-56.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 56.00,0.00 l0.00-56.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,56.00 l 56.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,208.00q0.00-46.25 -32.875-79.125t-79.125-32.875t-79.125,32.875t-32.875,79.125t 32.875,79.125t 79.125,32.875t 79.125-32.875t 32.875-79.125zM 416.00,416.00q0.00,13.25 -9.375,22.625t-22.625,9.375q-13.50,0.00 -22.50-9.50l-85.75-85.50q-44.75,31.00 -99.75,31.00q-35.75,0.00 -68.375-13.875 t-56.25-37.50t-37.50-56.25t-13.875-68.375t 13.875-68.375t 37.50-56.25t 56.25-37.50t 68.375-13.875t 68.375,13.875t 56.25,37.50t 37.50,56.25t 13.875,68.375q0.00,55.00 -31.00,99.75l 85.75,85.75q 9.25,9.25 9.25,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"remove, cancel, close, delete, mutiply\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 324.50,330.50q0.00,10.00 -7.00,17.00l-34.00,34.00q-7.00,7.00 -17.00,7.00t-17.00-7.00l-73.50-73.50l-73.50,73.50q-7.00,7.00 -17.00,7.00t-17.00-7.00l-34.00-34.00q-7.00-7.00 -7.00-17.00t 7.00-17.00l 73.50-73.50l-73.50-73.50q-7.00-7.00 -7.00-17.00t 7.00-17.00l 34.00-34.00q 7.00-7.00 17.00-7.00t 17.00,7.00l 73.50,73.50l 73.50-73.50q 7.00-7.00 17.00-7.00t 17.00,7.00l 34.00,34.00q 7.00,7.00 7.00,17.00 t-7.00,17.00l-73.50,73.50l 73.50,73.50q 7.00,7.00 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"ok, checkmark, tick, correct\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 417.75,141.50q0.00,10.00 -7.00,17.00l-181.00,181.00l-34.00,34.00q-7.00,7.00 -17.00,7.00t-17.00-7.00l-34.00-34.00l-90.50-90.50q-7.00-7.00 -7.00-17.00t 7.00-17.00l 34.00-34.00q 7.00-7.00 17.00-7.00t 17.00,7.00l 73.50,73.75l 164.00-164.25q 7.00-7.00 17.00-7.00t 17.00,7.00l 34.00,34.00q 7.00,7.00 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"th-list, list, ul\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 128.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 128.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 240.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 128.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00 l 240.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 240.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"th, grid\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 128.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 128.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 288.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 128.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 288.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00 l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 288.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"th-large, grid, icons\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,256.00l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-96.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50zM 192.00,64.00l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-96.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50zM 416.00,256.00l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50 l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-96.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50zM 416.00,64.00l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-96.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"film, movie, video\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 96.00,400.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 96.00,304.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 96.00,208.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 352.00,400.00l0.00-128.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-192.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,128.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 192.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 96.00,112.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25 t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,400.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 352.00,208.00l0.00-128.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-192.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,128.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 192.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,304.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,208.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,112.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75 t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 480.00,72.00l0.00,336.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-400.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-336.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"user, profile, member\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,351.25q0.00,30.00 -18.25,47.375t-48.50,17.375l-218.50,0.00 q-30.25,0.00 -48.50-17.375t-18.25-47.375q0.00-13.25 0.875-25.875t 3.50-27.25t 6.625-27.125t 10.75-24.375t 15.50-20.25t 21.375-13.375t 27.875-5.00q 2.25,0.00 10.50,5.375t 18.625,12.00t 27.00,12.00t 33.375,5.375t 33.375-5.375t 27.00-12.00t 18.625-12.00t 10.50-5.375q 15.25,0.00 27.875,5.00t 21.375,13.375t 15.50,20.25 t 10.75,24.375t 6.625,27.125t 3.50,27.25t 0.875,25.875zM 272.00,128.00q0.00,39.75 -28.125,67.875t-67.875,28.125t-67.875-28.125t-28.125-67.875t 28.125-67.875t 67.875-28.125t 67.875,28.125t 28.125,67.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"star-empty, favorite, rate\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 284.25,251.00l 76.50-74.25l-105.50-15.50l-47.25-95.50l-47.25,95.50l-105.50,15.50l 76.50,74.25l-18.25,105.25l 94.50-49.75l 94.25,49.75zM 416.00,161.75q0.00,5.50 -6.50,12.00l-90.75,88.50l 21.50,125.00q 0.25,1.75 0.25,5.00q0.00,12.50 -10.25,12.50q-4.75,0.00 -10.00-3.00l-112.25-59.00l-112.25,59.00q-5.50,3.00 -10.00,3.00q-5.25,0.00 -7.875-3.625t-2.625-8.875q0.00-1.50 0.50-5.00l 21.50-125.00 l-91.00-88.50q-6.25-6.75 -6.25-12.00q0.00-9.25 14.00-11.50l 125.50-18.25l 56.25-113.75q 4.75-10.25 12.25-10.25t 12.25,10.25l 56.25,113.75l 125.50,18.25q 14.00,2.25 14.00,11.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"star, favorite, rate\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 416.00,161.75q0.00,5.50 -6.50,12.00l-90.75,88.50l 21.50,125.00q 0.25,1.75 0.25,5.00q0.00,5.25 -2.625,8.875t-7.625,3.625q-4.75,0.00 -10.00-3.00l-112.25-59.00l-112.25,59.00q-5.50,3.00 -10.00,3.00q-5.25,0.00 -7.875-3.625t-2.625-8.875q0.00-1.50 0.50-5.00l 21.50-125.00l-91.00-88.50q-6.25-6.75 -6.25-12.00q0.00-9.25 14.00-11.50l 125.50-18.25l 56.25-113.75q 4.75-10.25 12.25-10.25t 12.25,10.25l 56.25,113.75 l 125.50,18.25q 14.00,2.25 14.00,11.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"heart, love, like\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 224.00,416.00q-6.50,0.00 -11.00-4.50l-156.00-150.50q-2.50-2.00 -6.875-6.50t-13.875-16.375t-17.00-24.375t-13.375-30.25t-5.875-34.50q0.00-55.00 31.75-86.00t 87.75-31.00q 15.50,0.00 31.625,5.375t 30.00,14.50t 23.875,17.125t 19.00,17.00q 9.00-9.00 19.00-17.00t 23.875-17.125t 30.00-14.50t 31.625-5.375q 56.00,0.00 87.75,31.00t 31.75,86.00q0.00,55.25 -57.25,112.50l-155.75,150.00 q-4.50,4.50 -11.00,4.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"envelope, letter, email, mail, contact\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 416.00,376.00l0.00-192.00 q-8.00,9.00 -17.25,16.50q-67.00,51.50 -106.50,84.50q-12.75,10.75 -20.75,16.75t-21.625,12.125t-25.625,6.125l-0.25,0.00 l-0.25,0.00 q-12.00,0.00 -25.625-6.125t-21.625-12.125t-20.75-16.75q-39.50-33.00 -106.50-84.50q-9.25-7.50 -17.25-16.50l0.00,192.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 368.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 416.00,113.25l0.00-2.75 l0.00-3.375 t-0.125-3.25 t-0.75-3.125t-1.375-2.25t-2.25-1.875t-3.50-0.625l-368.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625q0.00,42.00 36.75,71.00q 48.25,38.00 100.25,79.25q 1.50,1.25 8.75,7.375t 11.50,9.375t 11.125,7.875t 12.625,6.875t 10.75,2.25l 0.25,0.00 l 0.25,0.00 q 5.00,0.00 10.75-2.25t 12.625-6.875t 11.125-7.875t 11.50-9.375t 8.75-7.375q 52.00-41.25 100.25-79.25q 13.50-10.75 25.125-28.875t 11.625-32.875z M 448.00,104.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-368.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 368.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"search, magnifier, lookup, find\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 288.00,208.00q0.00-46.25 -32.875-79.125t-79.125-32.875t-79.125,32.875t-32.875,79.125t 32.875,79.125t 79.125,32.875t 79.125-32.875t 32.875-79.125zM 416.00,416.00q0.00,13.00 -9.50,22.50t-22.50,9.50q-13.50,0.00 -22.50-9.50l-85.75-85.50q-44.75,31.00 -99.75,31.00q-35.75,0.00 -68.375-13.875t-56.25-37.50t-37.50-56.25t-13.875-68.375 t 13.875-68.375t 37.50-56.25t 56.25-37.50t 68.375-13.875t 68.375,13.875t 56.25,37.50t 37.50,56.25t 13.875,68.375q0.00,55.00 -31.00,99.75l 85.75,85.75q 9.25,9.25 9.25,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"music, song, sound\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,56.00l0.00,280.00 q0.00,12.50 -8.50,22.25t-21.50,15.125t-25.875,8.00t-24.125,2.625t-24.125-2.625t-25.875-8.00t-21.50-15.125t-8.50-22.25t 8.50-22.25t 21.50-15.125t 25.875-8.00t 24.125-2.625q 26.25,0.00 48.00,9.75l0.00-134.25 l-192.00,59.25l0.00,177.25 q0.00,12.50 -8.50,22.25t-21.50,15.125t-25.875,8.00t-24.125,2.625t-24.125-2.625t-25.875-8.00t-21.50-15.125t-8.50-22.25 t 8.50-22.25t 21.50-15.125t 25.875-8.00t 24.125-2.625q 26.25,0.00 48.00,9.75l0.00-241.75 q0.00-7.75 4.75-14.125t 12.25-8.875l 208.00-64.00q 3.00-1.00 7.00-1.00q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"glass, drink\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 424.75,46.50q0.00,8.75 -10.75,19.50l-158.00,158.00l0.00,192.00 l 80.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75l 80.00,0.00 l0.00-192.00 l-158.00-158.00q-10.75-10.75 -10.75-19.50q0.00-5.75 4.50-9.125t 9.50-4.375t 10.75-1.00l 352.00,0.00 q 5.75,0.00 10.75,1.00t 9.50,4.375t 4.50,9.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>"]},"<svg width=\"97px\" height=\"96px\" viewBox=\"0 0 97 96\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\" data-tags=\"Slice 1\" style=\"margin-left: -16px; margin-top: -16px;\">\n \n \n \n \n\n \n <path d=\"M7.21875,24.78125 L36.609375,34.34375 L36.609375,0.453125 L60.9375,0.453125 L60.9375,34.34375 L90.328125,24.78125 L96.9375,45.734375 L66.984375,55.015625 L86.53125,83 L68.53125,95.796875 L48.984375,69.359375 L28.875,95.796875 L10.875,83 L30.5625,55.015625 L0.609375,45.734375 L0.609375,45.734375 L7.21875,24.78125 L7.21875,24.78125 Z M7.21875,24.78125\" transform=\"scale(0.6597938144329897 0.6597938144329897)\"></path></svg>"],"IDs":[778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,0],"user":{"email":"keyamoon@gmail.com","newsletter":true,"secret":"29769e48fe4bab8807b024a41d770900e18015c1af12cf4ad63d2d19009e6a90aead0d2885d7a32787d7336b442a44662cdfddfa2a2b0c74445becb1f50a8998","uid":4}},"inputCache":"{\"baseline\":\"14.285714285714286\",\"emSize\":\"448\",\"prev_size\":\"32\",\"hdr-imported\":\"checked\",\"iconAlignment\":\"0\",\"showGrid\":\"checked\",\"fi_name\":\"clipperz icons\",\"fi_id\":\"\",\"fi_link\":\"\",\"fi_author\":\"\",\"fi_authorLink\":\"\",\"fi_license\":\"\",\"fi_licenseLink\":\"\",\"include_metadata\":false,\"base64\":true,\"img-height\":\"32\",\"img-color\":\"000000\",\"include_png\":\"checked\",\"fi_class\":\"icon-\",\"showCloudLinks\":false,\"sprites-cols\":\"16\",\"ligatures\":true,\"include_sprites\":false,\"hdr-fontawesome\":true,\"designGrid\":\"\",\"whitespace\":\"50\",\"glyph_widths\":\"100\",\"manualMetrics\":false}"}
\ No newline at end of file diff --git a/frontend/delta/html/index_template.html b/frontend/delta/html/index_template.html new file mode 100644 index 0000000..0bd6fa8 --- a/dev/null +++ b/frontend/delta/html/index_template.html @@ -0,0 +1,130 @@ +<!-- + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +--> + +<html> +<head> + <title>@page.title@</title> + <meta http-equiv="content-type" content="text/html; charset=utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- user-scalable=no, maximum-scale=1.0 --> + + <meta name="apple-mobile-web-app-capable" content="yes" /> + <meta name="apple-mobile-web-app-status-bar-style" content="black" /> +<!-- +@copyright@ +--> + + <meta name="HandheldFriendly" content="True"> + <meta name="MobileOptimized" content="320"> + +<!-- link rel="apple-touch-icon-precomposed" ... --> + <link rel="apple-touch-icon" sizes="144x144" href="data:image/png;charset=utf-8;base64,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"> + <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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"> + <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,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"> + <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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"> + <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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"> + + <meta http-equiv="cleartype" content="on"> + <meta name="apple-mobile-web-app-capable" content="yes"> + <!-- link rel="apple-touch-startup-image" href="data:image/png;charset=utf-8;base64,iVBORw0K...ggo=" --> + +@css@ + + <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> + +<script> + Clipperz_IEisBroken = false; + Clipperz_normalizedNewLine = '\n'; + Clipperz_dumpUrl = "@dump.path@"; + Clipperz_version = "@application.version@"; + "use strict"; + + var addToHomeConfig = { + autostart: false, + startDelay: 0 + }; + +</script> + +<!--[if IE]><script> +Clipperz_IEisBroken = true; +Clipperz_normalizedNewLine = '\x0d\x0a'; +</script><![endif]--> + +</head> +<body> +<div id="mainDiv"> + <div class="page" id="loadingPage"> + <div> + <h1>clipperz</h1> + <h3 class="clipperzPayoff">keep it to yourself</h3> + </div> + </div> + <div class="page right" id="loginPage"></div> + <div class="page right" id="registrationPage"></div> + <div class="page right" id="cardListPage"></div> + <div class="page right" id="cardDetailPage"></div> + <div class="page right" id="accountPage"></div> + <div class="page right" id="preferencesPage"></div> + <div class="page right" id="errorPage"></div> +</div> +<div class="overlay" id="overlay"> + <div class="spinner"> + <div class="bar01"></div> + <div class="bar02"></div> + <div class="bar03"></div> + <div class="bar04"></div> + <div class="bar05"></div> + <div class="bar06"></div> + <div class="bar07"></div> + <div class="bar08"></div> + <div class="bar09"></div> + <div class="bar10"></div> + <div class="bar11"></div> + <div class="bar12"></div> + </div> + <span class="icon done" style="display:none">done</span> + <span class="icon failed" style="display:none">failed</span> + <span class="title">loading</span> +</div> + +@js_LINKED@ +@js_EMBEDDED@ + +<!-- div id="applicationVersionType" class="@application.version.type@"></div --> + +<script> + Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@}); + /*offline_data_placeholder*/ + +/* * / + MochiKit.DOM.addLoadEvent(function () { + Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); + }); + + // Live Reload hoock + document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>') +/ * */ +</script> +</body> +</html> diff --git a/frontend/delta/js/Clipperz/Async.js b/frontend/delta/js/Clipperz/Async.js new file mode 100644 index 0000000..971fde5 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Async.js @@ -0,0 +1,707 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +//Clipperz.Async = MochiKit.Async; + + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Async) == 'undefined') { Clipperz.Async = {}; } + +Clipperz.Async.VERSION = "0.1"; +Clipperz.Async.NAME = "Clipperz.Async"; + +Clipperz.Async.Deferred = function(aName, args) { + args = args || {}; + + Clipperz.Async.Deferred.superclass.constructor.call(this, args.canceller); + + this._args = args; + this._name = aName || "Anonymous deferred"; + this._count = 0; + this._shouldTrace = ((CLIPPERZ_DEFERRED_TRACING_ENABLED === true) || (args.trace === true)); + this._vars = null; + + return this; +} + +//============================================================================= + +Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, { + + 'name': function () { + return this._name; + }, + + 'args': function () { + return this._args; + }, + + //----------------------------------------------------------------------------- + + 'callback': function (aValue) { + if (this._shouldTrace) { + Clipperz.log("CALLBACK " + this._name, aValue); + } + + if (this.chained == false) { + var message; + + message = "ERROR [" + this._name + "]"; + this.addErrback(function(aResult) { + if (! (aResult instanceof MochiKit.Async.CancelledError)) { + Clipperz.log(message, aResult); + } + return aResult; + }); + + if (this._shouldTrace) { + var resultMessage; + + resultMessage = "RESULT " + this._name + " <=="; +// this.addCallback(function(aResult) { + Clipperz.Async.Deferred.superclass.addCallback.call(this, function(aResult) { + Clipperz.log(resultMessage, aResult); + return aResult; + }); + } + } + + if (CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED === true) { + Clipperz.log("callback " + this._name, this); + } + + return Clipperz.Async.Deferred.superclass.callback.apply(this, arguments); + }, + + //----------------------------------------------------------------------------- + + 'addCallback': function () { + var message; + + if (this._shouldTrace) { + this._count ++; + message = "[" + this._count + "] " + this._name + " "; +// this.addBoth(function(aResult) {Clipperz.log(message + "-->", aResult); return aResult;}); + this.addCallbacks( + function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;}, + function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;} + ); + } + + Clipperz.Async.Deferred.superclass.addCallback.apply(this, arguments); + + if (this._shouldTrace) { +// this.addBoth(function(aResult) {Clipperz.log(message + "<--", aResult); return aResult;}); + this.addCallbacks( + function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;}, + function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;} + ); + } + }, + + //============================================================================= + + 'addCallbackPass': function() { + var passFunction; + + passFunction = MochiKit.Base.partial.apply(null, arguments); + + this.addCallback(function() { + var result; + + result = arguments[arguments.length -1]; + passFunction(); + + return result; + }); + }, + + //----------------------------------------------------------------------------- + + 'addErrbackPass': function() { + var passFunction; + + passFunction = MochiKit.Base.partial.apply(null, arguments); + + this.addErrback(function() { + var result; + + result = arguments[arguments.length -1]; + passFunction(); + + return result; + }); + }, + + //----------------------------------------------------------------------------- + + 'addBothPass': function() { + var passFunction; + + passFunction = MochiKit.Base.partial.apply(null, arguments); + + this.addBoth(function() { + var result; + + result = arguments[arguments.length -1]; + passFunction(); + + return result; + }); + }, + + //----------------------------------------------------------------------------- + + 'addIf': function (aThenBlock, anElseBlock) { + this.addCallback(MochiKit.Base.bind(function (aValue) { + var deferredResult; + + if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) { + deferredResult = Clipperz.Async.callbacks(this._name + " <then>", aThenBlock, null, aValue); + } else { + deferredResult = Clipperz.Async.callbacks(this._name + " <else>", anElseBlock, null, aValue); + } + + return deferredResult; + })) + }, + + //----------------------------------------------------------------------------- + + 'addMethod': function () { + this.addCallback(MochiKit.Base.method.apply(this, arguments)); + }, + + //----------------------------------------------------------------------------- + + 'addMethodcaller': function () { + this.addCallback(MochiKit.Base.methodcaller.apply(this, arguments)); + }, + + //============================================================================= + + 'addLog': function (aLog) { + if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) { + this.addBothPass(function(res) {Clipperz.log(aLog + " ", res);}); + } + }, + + //============================================================================= + + 'acquireLock': function (aLock) { +// this.addCallback(function (aResult) { +// return Clipperz.Async.callbacks("Clipperz.Async.acquireLock", [ +// MochiKit.Base.method(aLock, 'acquire'), +// MochiKit.Base.partial(MochiKit.Async.succeed, aResult) +// ], {trace:false}); +// }); + + this.addCallback(MochiKit.Base.method(aLock, 'acquire')); + }, + + 'releaseLock': function (aLock) { +// this.addCallback(function (aResult) { +// return Clipperz.Async.callbacks("Clipperz.Async.release <ok>", [ +// MochiKit.Base.method(aLock, 'release'), +// MochiKit.Base.partial(MochiKit.Async.succeed, aResult) +// ], {trace:false}); +// }); +// this.addErrback(function (aResult) { +///Clipperz.log("releaseLock.addErrback:", aResult); +// return Clipperz.Async.callbacks("Clipperz.Async.release <fail>", [ +// MochiKit.Base.method(aLock, 'release'), +// MochiKit.Base.partial(MochiKit.Async.fail, aResult) +// ], {trace:false}); +// }); + +// this.addBothPass(MochiKit.Base.method(aLock, 'release')); + this.addCallbackPass(MochiKit.Base.method(aLock, 'release')); + this.addErrback(function (anError) { + aLock.release(); + + return anError; + }); + }, + + //============================================================================= + + 'collectResults': function (someRequests) { + this.addCallback(Clipperz.Async.collectResults(this._name + " <collect results>", someRequests, this._args)); + }, + + 'addCallbackList': function (aRequestList) { + this.addCallback(Clipperz.Async.callbacks, this._name + " <callback list>", aRequestList, this._args); + }, + + //============================================================================= + + 'vars': function () { + if (this._vars == null) { + this._vars = {} + } + + return this._vars; + }, + + 'setValue': function (aKey) { + this.addCallback(MochiKit.Base.bind(function (aValue) { + this.vars()[aKey] = aValue; + return aValue; + }, this)); + }, + + 'getValue': function (aKey) { + this.addCallback(MochiKit.Base.bind(function () { + return this.vars()[aKey]; + }, this)); + }, + + //============================================================================= + + 'wait': function (someSeconds) { + this.addCallback(MochiKit.Async.wait, someSeconds); + }, + + //============================================================================= + + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Async.DeferredSynchronizer = function(aName, someMethods) { + this._name = aName || "Anonymous deferred Synchronizer"; + this._methods = someMethods; + + this._numberOfMethodsDone = 0; + this._methodResults = []; + + this._result = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer # " + this.name(), {trace:false}); + this._result.addMethod(this, 'methodResults'); + this._result.addCallback(function(someResults) { + var cancels; + var errors; + var result; + + cancels = MochiKit.Base.filter(function(aResult) { return (aResult instanceof MochiKit.Async.CancelledError)}, someResults); + + if (cancels.length == 0) { + errors = MochiKit.Base.filter(function(aResult) { return (aResult instanceof Error)}, someResults); + + if (errors.length == 0) { +// result = MochiKit.Async.succeed(someResults); + result = someResults; + } else { + result = MochiKit.Async.fail(someResults); + } + } else { + result = MochiKit.Async.fail(cancels[0]); + } + + return result; + }/*, this._methodResults */); + + return this; +} + +MochiKit.Base.update(Clipperz.Async.DeferredSynchronizer.prototype, { + + //----------------------------------------------------------------------------- + + 'name': function() { + return this._name; + }, + + //----------------------------------------------------------------------------- + + 'methods': function() { + return this._methods; + }, + + 'methodResults': function() { + return this._methodResults; + }, + + //----------------------------------------------------------------------------- + + 'result': function() { + return this._result; + }, + + //----------------------------------------------------------------------------- + + 'numberOfMethodsDone':function() { + return this._numberOfMethodsDone; + }, + + 'incrementNumberOfMethodsDone': function() { + this._numberOfMethodsDone ++; + }, + + //----------------------------------------------------------------------------- + + 'run': function(args, aValue) { + var deferredResults; + var i, c; + + deferredResults = []; + args = args || {}; + + c = this.methods().length; + for (i=0; i<c; i++) { + var deferredResult; + var methodCalls; + var ii, cc; + +//Clipperz.log("TYPEOF", typeof(this.methods()[i])); + if (typeof(this.methods()[i]) == 'function') { + methodCalls = [ this.methods()[i] ]; + } else { + methodCalls = this.methods()[i]; + } + + cc = methodCalls.length; + deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer.run => " + this.name() + "[" + i + "]", args); + for (ii=0; ii<cc; ii++) { + deferredResult.addCallback(methodCalls[ii]); + } + deferredResult.addBoth(MochiKit.Base.method(this, 'handleMethodCallDone', i)); + + deferredResults.push(deferredResult); + } + + for (i=0; i<c; i++) { + deferredResults[i].callback(aValue); + } + + return this.result(); + }, + + //----------------------------------------------------------------------------- + + 'handleMethodCallDone': function(anIndexValue, aResult) { + this.incrementNumberOfMethodsDone(); + this.methodResults()[anIndexValue] = aResult; + + if (this.numberOfMethodsDone() < this.methods().length) { + // nothing to do here other than possibly log something + } else if (this.numberOfMethodsDone() == this.methods().length) { + this.result().callback(); + } else if (this.numberOfMethodsDone() > this.methods().length) { + alert("Clipperz.Async.Deferred.handleMethodCallDone -> WTF!"); + // WTF!!! :( + } + + }, + + //----------------------------------------------------------------------------- + + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +MochiKit.Base.update(Clipperz.Async, { + + 'callbacks': function (aName, someFunctions, someArguments, aCallbackValue) { + var deferredResult; + var i, c; + + deferredResult = new Clipperz.Async.Deferred(aName, someArguments); + c = someFunctions.length; + for (i=0; i<c; i++) { + deferredResult.addCallback(someFunctions[i]); + } + deferredResult.callback(aCallbackValue); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'forkAndJoin': function (aName, someMethods, args) { + return MochiKit.Base.partial(function (aName, someMethods, args, aValue) { + var synchronizer; + var result; + + args = args || {}; + synchronizer = new Clipperz.Async.DeferredSynchronizer(aName, someMethods); + result = synchronizer.run(args, aValue); + + return result; + }, aName, someMethods, args); + }, + + //------------------------------------------------------------------------- + + 'collectResults': function(aName, someRequests, args) { + return MochiKit.Base.partial(function(aName, someRequests, args, aValue) { + var deferredResult; + var requestKeys; + var methods; + + requestKeys = MochiKit.Base.keys(someRequests); + methods = MochiKit.Base.values(someRequests); + + deferredResult = new Clipperz.Async.Deferred(aName, args); + deferredResult.addCallback(Clipperz.Async.forkAndJoin(aName + " [inner forkAndJoin]", methods, args)); + deferredResult.addBoth(function(someResults) { + var returnFunction; + var results; + var i,c; + var result; + + if (someResults instanceof MochiKit.Async.CancelledError) { + returnFunction = MochiKit.Async.fail; + result = someResults; + } else { + if (someResults instanceof Error) { + returnFunction = MochiKit.Async.fail; + results = someResults['message']; + } else { + returnFunction = MochiKit.Async.succeed; + results = someResults; + } + + result = {}; + + c = requestKeys.length; + for (i=0; i<c; i++) { + result[requestKeys[i]] = results[i]; + } + } + + return returnFunction.call(null, result); + }); + deferredResult.callback(aValue); + + return deferredResult; + }, aName, someRequests, args); + }, + + //------------------------------------------------------------------------- + + 'collectAll': function (someDeferredObjects) { + var deferredResult; + + deferredResult = new MochiKit.Async.DeferredList(someDeferredObjects, false, false, false); + deferredResult.addCallback(function (aResultList) { + return MochiKit.Base.map(function (aResult) { + if (aResult[0]) { + return aResult[1]; + } else { + throw aResult[1]; + } + }, aResultList); + }); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setItem': function (anObject, aKey, aValue) { + anObject[aKey] = aValue; + + return anObject; + }, + + 'setItemOnObject': function (aKey, aValue, anObject) { + anObject[aKey] = aValue; + + return anObject; + }, + + 'setDeferredItemOnObject': function (aKey, aDeferredFunction, anObject) { + return Clipperz.Async.callbacks("Clipperz.Async.setDeferredItemOnObject", [ + aDeferredFunction, + MochiKit.Base.partial(Clipperz.Async.setItem, anObject, aKey) + ], {trace:false}, anObject); + }, + + //------------------------------------------------------------------------- + + 'deferredIf': function (aName, aThenBlock, anElseBlock) { + return function (aValue) { + var deferredResult; + + if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) { + deferredResult = Clipperz.Async.callbacks(aName + " <then>", aThenBlock, null, aValue); + } else { + deferredResult = Clipperz.Async.callbacks(aName + " <else>", anElseBlock, null, aValue); + } + + return deferredResult; + } + }, + + //------------------------------------------------------------------------- + + 'log': function(aMessage, aResult) { + if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) { + Clipperz.log(aMessage + " ", aResult); + } + + return aResult; + }, + + //========================================================================= + + 'deferredCompare': function (aComparator, aDeferred, bDeferred) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredCompare", {trace:false}); + deferredResult.addCallback(Clipperz.Async.collectAll, [aDeferred, bDeferred]); + deferredResult.addCallback(function (someResults) { + var result; + + if (aComparator(someResults[0], someResults[1]) > 0) { + result = MochiKit.Async.succeed(); + } else { + result = MochiKit.Async.fail(); + }; + + return result; + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'insertIntoSortedArray': function (anObject, aDeferredComparator, aSortedResult) { + var deferredResult; + var i, c; + + if (aSortedResult.length == 0) { + deferredResult = MochiKit.Async.succeed([anObject]); + } else { + deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray", {trace:false}); + c = aSortedResult.length + 1; + for (i=0; i<c; i++) { + deferredResult.addCallback(function (aDeferredComparator, aObject, bObject, aContext) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray <inner compare>", {trace:false}); + innerDeferredResult.addCallback(aDeferredComparator, aObject, bObject); + innerDeferredResult.addErrback(MochiKit.Async.fail, aContext); + innerDeferredResult.callback(); + + return innerDeferredResult; + }, aDeferredComparator, anObject, aSortedResult[i], i); + } + deferredResult.addMethod(aSortedResult, 'push', anObject); + deferredResult.addErrback(function (anError) { + aSortedResult.splice(anError.message, 0, anObject); + }) + deferredResult.addBoth(MochiKit.Async.succeed, aSortedResult); + deferredResult.callback(); + } + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredSort': function (aDeferredComparator, someObjects) { + var deferredResult; + var i, c; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredSort", {trace:false}); + c = someObjects.length; + for (i=0; i<c; i++) { + deferredResult.addCallback(Clipperz.Async.insertIntoSortedArray, someObjects[i], aDeferredComparator); + if ((i % 50) == 0) { +// Clipperz.log("######### sort wait ##########"); + deferredResult.addCallback(MochiKit.Async.wait, 0.5); + } + } + deferredResult.callback([]); + + return deferredResult; + }, + + //========================================================================= + + 'deferredFilter': function (aFunction, someObjects) { + var deferredResult; + var i, c; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter", {trace:false}); + c = someObjects.length; + for (i=0; i<c; i++) { + deferredResult.addCallback(function (aFunction, anObject, anIndex, aResult) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter <inner - " + anIndex + ">", {trace:false}); + innerDeferredResult.addCallback(aFunction, anObject); + innerDeferredResult.addCallback(function (aFilterResult) { + if (aFilterResult) { + aResult.push(anObject); + }; + }); + innerDeferredResult.addBoth(MochiKit.Async.succeed, aResult); + innerDeferredResult.callback(); + + return innerDeferredResult; + }, aFunction, someObjects[i], i); + } + deferredResult.callback([]); + + return deferredResult; + }, + + 'forEach': function (aFunction) { + return MochiKit.Base.partial(function (aFunction, anIterable) { + MochiKit.Iter.forEach(anIterable, aFunction); + }, aFunction); + }, + + //========================================================================= + + 'or': function (someValues) { + return Clipperz.Async.callbacks("Clipperz.Async.or", [ + MochiKit.Base.values, + MochiKit.Base.flattenArguments, +//function (aValue) { Clipperz.log("Record.hasAnyCleanTextData - flatten", aValue); return aValue; }, + function(someInnerValues) { + return MochiKit.Iter.some(someInnerValues, MochiKit.Base.operator.identity); + } + ], {trace:false}, someValues); + }, + + //========================================================================= + + 'clearResult': function () {}, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + +//############################################################################# + +CLIPPERZ_DEFERRED_LOGGING_ENABLED = true; +CLIPPERZ_DEFERRED_TRACING_ENABLED = false; +CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED = false; diff --git a/frontend/delta/js/Clipperz/Base.js b/frontend/delta/js/Clipperz/Base.js new file mode 100644 index 0000000..84b2172 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Base.js @@ -0,0 +1,514 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; } + +Clipperz.Base.VERSION = "0.2"; +Clipperz.Base.NAME = "Clipperz.Base"; + +MochiKit.Base.update(Clipperz.Base, { + + //------------------------------------------------------------------------- + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- + + 'itemgetter': function (aKeyPath) { +// return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]); + return MochiKit.Base.compose.apply(null, + MochiKit.Base.map( + MochiKit.Base.itemgetter, + MochiKit.Iter.reversed( + aKeyPath.split('.') + ) + ) + ); + }, + + //------------------------------------------------------------------------- + + 'isUrl': function (aValue) { + return (MochiKit.Base.urlRegExp.test(aValue)); + }, + + 'isEmail': function (aValue) { + return (MochiKit.Base.emailRegExp.test(aValue)); + }, + + //------------------------------------------------------------------------- + + 'caseInsensitiveCompare': function (a, b) { + return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase()); + }, + + 'reverseComparator': function (aComparator) { + return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator); + }, + + 'caseInsensitiveKeyComparator': function (aKey) { + return function (a, b) { + return MochiKit.Base.compare(a[aKey].toLowerCase(), b[aKey].toLowerCase()); + } + }, + //------------------------------------------------------------------------- +/* + 'dependsOn': function(module, deps) { + if (!(module in Clipperz)) { + MochiKit[module] = {}; + } + + if (typeof(dojo) != 'undefined') { + dojo.provide('Clipperz.' + module); + } + for (var i = 0; i < deps.length; i++) { + if (typeof(dojo) != 'undefined') { + dojo.require('Clipperz.' + deps[i]); + } + if (typeof(JSAN) != 'undefined') { + JSAN.use('Clipperz.' + deps[i], []); + } + if (!(deps[i] in Clipperz)) { + throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!' + } + } + }, +*/ + //------------------------------------------------------------------------- + + 'trim': function (aValue) { + return aValue.replace(/^\s+|\s+$/g, ""); + }, + + //------------------------------------------------------------------------- + + 'stringToByteArray': function (aValue) { + var result; + var i, c; + + result = []; + + c = aValue.length; + for (i=0; i<c; i++) { + result[i] = aValue.charCodeAt(i); + } + + return result; + }, + + //......................................................................... + + 'byteArrayToString': function (anArrayOfBytes) { + var result; + var i, c; + + result = ""; + + c = anArrayOfBytes.length; + for (i=0; i<c; i++) { + result += String.fromCharCode(anArrayOfBytes[i]); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'getValueForKeyInFormContent': function (aFormContent, aKey) { + return aFormContent[1][MochiKit.Base.find(aFormContent[0], aKey)]; + }, + + //------------------------------------------------------------------------- + + 'indexOfObjectInArray': function(anObject, anArray) { + var result; + var i, c; + + result = -1; + + c = anArray.length; + for (i=0; ((i<c) && (result < 0)); i++) { + if (anArray[i] === anObject) { + result = i; + } + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'removeObjectAtIndexFromArray': function(anIndex, anArray) { + anArray.splice(anIndex, 1); + }, + + //------------------------------------------------------------------------- + + 'removeObjectFromArray': function(anObject, anArray) { + var objectIndex; + + objectIndex = Clipperz.Base.indexOfObjectInArray(anObject, anArray); + if (objectIndex > -1) { + Clipperz.Base.removeObjectAtIndexFromArray(objectIndex, anArray); + } else { + Clipperz.log("Trying to remove an object not present in the array"); + throw Clipperz.Base.exception.ObjectNotFound; + } + }, + + 'removeFromArray': function(anArray, anObject) { + return Clipperz.Base.removeObjectFromArray(anObject, anArray); + }, + + //------------------------------------------------------------------------- + + 'splitStringAtFixedTokenSize': function(aString, aTokenSize) { + var result; + var stringToProcess; + + stringToProcess = aString; + result = []; + if (stringToProcess != null) { + while (stringToProcess.length > aTokenSize) { + result.push(stringToProcess.substring(0, aTokenSize)); + stringToProcess = stringToProcess.substring(aTokenSize); + } + + result.push(stringToProcess); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'objectType': function(anObject) { + var result; + + if (anObject == null) { + result = null; + } else { + result = typeof(anObject); + + if (result == "object") { + if (anObject instanceof Array) { + result = 'array' + } else if (anObject.constructor == Boolean) { + result = 'boolean' + } else if (anObject instanceof Date) { + result = 'date' + } else if (anObject instanceof Error) { + result = 'error' + } else if (anObject instanceof Function) { + result = 'function' + } else if (anObject.constructor == Number) { + result = 'number' + } else if (anObject.constructor == String) { + result = 'string' + } else if (anObject instanceof Object) { + result = 'object' + } else { + throw Clipperz.Base.exception.UnknownType; + } + } + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'escapeHTML': function(aValue) { + var result; + + result = aValue; + result = result.replace(/</g, "<"); + result = result.replace(/>/g, ">"); + + return result; + }, + + //------------------------------------------------------------------------- + + 'deepClone': function(anObject) { + var result; + + result = Clipperz.Base.evalJSON(Clipperz.Base.serializeJSON(anObject)); + + return result; + }, + + //------------------------------------------------------------------------- + +// 'deepCompare': function (aObject, bObject) { +// return (Clipperz.Base.serializeJSON(aObject) == Clipperz.Base.serializeJSON(bObject)); +// }, + + //------------------------------------------------------------------------- + + 'evalJSON': function(aString) { + return JSON.parse(aString); + }, + + 'serializeJSON': function(anObject) { + return JSON.stringify(anObject); + }, + + 'formatJSON': function (anObject, sIndent) { + var realTypeOf = function (v) { + if (typeof(v) == "object") { + if (v === null) return "null"; + if (v.constructor == (new Array).constructor) return "array"; + if (v.constructor == (new Date).constructor) return "date"; + if (v.constructor == (new RegExp).constructor) return "regex"; + return "object"; + } + return typeof(v); + }; + +// function FormatJSON(oData, sIndent) { + if (arguments.length < 2) { + var sIndent = ""; + } +// var sIndentStyle = " "; + var sIndentStyle = " "; + var sDataType = realTypeOf(anObject); + + // open object + if (sDataType == "array") { + if (anObject.length == 0) { + return "[]"; + } + var sHTML = "["; + } else if (sDataType == "object") { + var sHTML = "{"; + } else { + return "{}"; + } +// } else { +// var iCount = 0; +// $.each(anObject, function() { +// iCount++; +// return; +// }); +// if (iCount == 0) { // object is empty +// return "{}"; +// } +// var sHTML = "{"; +// } + + // loop through items + var iCount = 0; +// $.each(anObject, function(sKey, vValue) { + MochiKit.Iter.forEach(MochiKit.Base.keys(anObject), function(sKey) { + var vValue = anObject[sKey]; + + if (iCount > 0) { + sHTML += ","; + } + if (sDataType == "array") { + sHTML += ("\n" + sIndent + sIndentStyle); + } else { + sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": "); + } + + // display relevant data type + switch (realTypeOf(vValue)) { + case "array": + case "object": + sHTML += Clipperz.Base.formatJSON(vValue, (sIndent + sIndentStyle)); + break; + case "boolean": + case "number": + sHTML += vValue.toString(); + break; + case "null": + sHTML += "null"; + break; + case "string": + sHTML += ("\"" + vValue + "\""); + break; + default: + sHTML += ("TYPEOF: " + typeof(vValue)); + } + + // loop + iCount++; + }); + + // close object + if (sDataType == "array") { + sHTML += ("\n" + sIndent + "]"); + } else { + sHTML += ("\n" + sIndent + "}"); + } + + // return + return sHTML; + }, + + //------------------------------------------------------------------------- + + 'mergeItems': function (anArrayOfValues) { + var result; + var i, c; + + result = {}; + + c = anArrayOfValues.length; + for (i=0; i<c; i++) { + result[anArrayOfValues[i][0]] = anArrayOfValues[i][1]; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'map': function (fn, lstObj/*, lst... */) { + var result; + + if (MochiKit.Base.isArrayLike(lstObj)) { + result = MochiKit.Base.map.apply(this, arguments); + } else { + var keys; + var values; + var computedValues; + + keys = MochiKit.Base.keys(lstObj); + values = MochiKit.Base.values(lstObj); + computedValues = MochiKit.Base.map(fn, values); + + result = Clipperz.Base.mergeItems(MochiKit.Base.zip(keys, computedValues)); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'sanitizeString': function(aValue) { + var result; + + if (Clipperz.Base.objectType(aValue) == 'string') { + result = aValue; + result = result.replace(/</img,"<"); + result = result.replace(/>/img,">"); + } else { + result = aValue; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'module': function(aValue) { +// aValue = 'Clipperz.PM.Compact' +// +// if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +// if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +// if (typeof(Clipperz.PM.UI.Common.Components) == 'undefined') { Clipperz.PM.UI.Common.Components = {}; } + + var currentScope; + var pathElements; + var i,c; + + currentScope = window; + pathElements = aValue.split('.'); + c = pathElements.length; + for (i=0; i<c; i++) { + if (typeof(currentScope[pathElements[i]]) == 'undefined') { + currentScope[pathElements[i]] = {}; + } + + currentScope = currentScope[pathElements[i]]; + } + }, + + //------------------------------------------------------------------------- + + 'exception': { + 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"), + 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType"), + 'VulnerabilityIssue': new MochiKit.Base.NamedError("Clipperz.Base.exception.VulnerabilityIssue"), + 'MandatoryParameter': new MochiKit.Base.NamedError("Clipperz.Base.exception.MandatoryParameter"), + 'ObjectNotFound': new MochiKit.Base.NamedError("Clipperz.Base.exception.ObjectNotFound"), + 'raise': function (aName) { + throw Clipperz.Base.exception[aName]; + } + }, + + //------------------------------------------------------------------------- + + 'extend': YAHOO.extendX, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +// Original regExp courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls +// Updated to match Clipperz usage pattern. +//MochiKit.Base.urlRegExp = new RegExp(/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/); +MochiKit.Base.urlRegExp = new RegExp(/^((([\w-]+:\/\/?)|(www\.))[^\s()<>]+((?:\([\w\d]+\)|([^[:punct:]\s]|\/)))?)/); + +// RegExp found here: http://www.tipsntracks.com/117/validate-an-email-address-using-regular-expressions.html +MochiKit.Base.emailRegExp = new RegExp(/^([a-zA-Z0-9_\-\.]+)@(([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3}))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d))$/); + + +MochiKit.Base.registerComparator('Object dummy comparator', + function(a, b) { + return ((a.constructor == Object) && (b.constructor == Object)); + }, + function(a, b) { + var result; + var aKeys; + var bKeys; + + aKeys = MochiKit.Base.keys(a).sort(); + bKeys = MochiKit.Base.keys(b).sort(); + result = MochiKit.Base.compare(aKeys, bKeys); + + if (result == 0) { + var i, c; + + c = aKeys.length; + for (i=0; (i<c) && (result == 0); i++) { + result = MochiKit.Base.compare(a[aKeys[i]], b[bKeys[i]]); + } + } + + return result; + }, + true +); diff --git a/frontend/delta/js/Clipperz/ByteArray.js b/frontend/delta/js/Clipperz/ByteArray.js new file mode 100644 index 0000000..22c7c6e --- a/dev/null +++ b/frontend/delta/js/Clipperz/ByteArray.js @@ -0,0 +1,1459 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } + +//============================================================================= + +Clipperz.ByteArray_abstract = function(args) { + return this; +} + +Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, { + + //------------------------------------------------------------------------- + + 'toString': function() { + return "Clipperz.ByteArray_abstract"; + }, + + //------------------------------------------------------------------------- + + 'equals': function(aValue) { + return (this.compare(aValue) == 0); + }, + + //------------------------------------------------------------------------- + + 'compare': function(aValue) { + var result; + var i; + + result = MochiKit.Base.compare(this.length(), aValue.length()); + i = this.length(); + + while ((result == 0) && (i>0)) { + i--; + result = MochiKit.Base.compare(this.byteAtIndex(i), aValue.byteAtIndex(i)); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'clone': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'newInstance': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'reset': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'length': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'checkByteValue': function(aValue) { + if ((aValue & 0xff) != aValue) { + Clipperz.logError("Clipperz.ByteArray.appendByte: the provided value (0x" + aValue.toString(16) + ") is not a byte value."); + throw Clipperz.ByteArray.exception.InvalidValue; + } + }, + + //------------------------------------------------------------------------- + + 'xorMergeWithBlock': function(aBlock, anAllignment, paddingMode) { + var result; + var a, b; + var aLength; + var bLength; + var i, c; + + if (this.length() > aBlock.length()) { + a = this; + b = aBlock; + } else { + a = aBlock; + b = this; + } + + aLength = a.length(); + bLength = b.length(); + + if (aLength != bLength) { + if (paddingMode == 'truncate') { + if (anAllignment == 'left') { + a = a.split(0, bLength); + } else { + a = a.split(aLength - bLength); + } + } else { + var ii, cc; + var padding; + +// padding = new Clipperz.ByteArray(); + padding = this.newInstance(); + cc = aLength - bLength; + for (ii=0; ii<cc; ii++) { + padding.appendByte(0); + } + + if (anAllignment == 'left') { + b = b.appendBlock(padding); + } else { + b = padding.appendBlock(b); + } + } + } + + result = this.newInstance(); + c = a.length(); + for (i=0; i<c; i++) { + result.appendByte(a.byteAtIndex(i) ^ b.byteAtIndex(i)); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'appendBlock': function(aBlock) { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'appendByte': function(aValue) { + throw Clipperz.Base.exception.AbstractMethod; + }, + + 'appendBytes': function(args) { + var values; + var i,c; + + if (args.constructor == Array) { + values = args; + } else { + values = arguments; + } + + c = values.length; + for (i=0; i<c; i++) { + this.appendByte(values[i]); + } + + return this; + }, + + //------------------------------------------------------------------------- + + 'appendWord': function(aValue, isLittleEndian) { + var result; + var processAsLittleEndian; + + processAsLittleEndian = isLittleEndian === true ? true : false; + + if (processAsLittleEndian) { + result = this.appendBytes( (aValue) & 0xff, (aValue >> 8) & 0xff, (aValue >> 16) & 0xff, (aValue >> 24) & 0xff ); // little endian + } else { + result = this.appendBytes( (aValue >> 24) & 0xff, (aValue >> 16) & 0xff, (aValue >> 8) & 0xff, (aValue) & 0xff ); // big endian - DEFAULT + } + + return result; + }, + + 'appendWords': function(args) { + var values; + var i,c; + + if (args.constructor == Array) { + values = args; + } else { + values = arguments; + } + + c = values.length; + for (i=0; i<c; i++) { + this.appendWord(values[i], false); + } + + return this; + }, + + //------------------------------------------------------------------------- + + 'appendBigEndianWords': function(args) { + var values; + var i,c; + + if (args.constructor == Array) { + values = args; + } else { + values = arguments; + } + + c = values.length; + for (i=0; i<c; i++) { + this.appendWord(values[i], true); + } + + return this; + }, + + //------------------------------------------------------------------------- + + 'appendBinaryString': function (aBinaryString) { + var i,c; + + c = aBinaryString.length; + for (i=0; i<c; i++) { + this.appendByte(aBinaryString.charCodeAt(i)); + }; + + return this; + }, + + //------------------------------------------------------------------------- + + 'byteAtIndex': function(anIndex) { + throw Clipperz.Base.exception.AbstractMethod; + }, + + 'setByteAtIndex': function(aValue, anIndex) { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'bitAtIndex': function(aBitPosition) { + var result; + var bytePosition; + var bitPositionInSelectedByte; + var selectedByte; + var selectedByteMask; + + bytePosition = this.length() - Math.ceil((aBitPosition + 1)/ 8); + bitPositionInSelectedByte = aBitPosition % 8; + selectedByte = this.byteAtIndex(bytePosition); + + if (bitPositionInSelectedByte > 0) { + selectedByteMask = (1 << bitPositionInSelectedByte); + } else { + selectedByteMask = 1; + } + result = selectedByte & selectedByteMask ? 1 : 0; + + return result; + }, + + //------------------------------------------------------------------------- + + 'bitBlockAtIndexWithSize': function(aBitPosition, aSize) { + var result; + var bitValue; + var i,c; + + result = 0; + c = aSize; + for (i=0; i<c; i++) { + bitValue = this.bitAtIndex(aBitPosition + i); + result = result | bitValue << i; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'asString': function() { + var result; + var length; + var i; + + result = []; + + i = 0; + length = this.length(); + + while (i < length) { + var currentCharacter; + var currentByte; + var unicode; + + currentByte = this.byteAtIndex(i); + + if ((currentByte & 0x80) == 0x00 ) { // 0xxxxxxx + unicode = currentByte; + currentCharacter = String.fromCharCode(unicode); + } else if ((currentByte & 0xe0) == 0xc0 ) { // 110xxxxx 10xxxxxx + unicode = (currentByte & 0x1f) << 6; + i++; currentByte = this.byteAtIndex(i); + unicode = unicode | (currentByte & 0x3f); + + currentCharacter = String.fromCharCode(unicode); + } else if ((currentByte & 0xf0) == 0xe0 ) { // 1110xxxx 10xxxxxx 10xxxxxx + unicode = (currentByte & 0x0f) << (6+6); + i++; currentByte = this.byteAtIndex(i); + unicode = unicode | ((currentByte & 0x3f) << 6); + i++; currentByte = this.byteAtIndex(i); + unicode = unicode | (currentByte & 0x3f); + + currentCharacter = String.fromCharCode(unicode); + } else { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + unicode = (currentByte & 0x07) << (6+6+6); + i++; currentByte = this.byteAtIndex(i); + unicode = unicode | ((currentByte & 0x3f) << (6+6)); + i++; currentByte = this.byteAtIndex(i); + unicode = unicode | ((currentByte & 0x3f) << 6); + i++; currentByte = this.byteAtIndex(i); + unicode = unicode | (currentByte & 0x3f); + + currentCharacter = String.fromCharCode(unicode); + } + + result.push(currentCharacter); + i++; + } + + return result.join(""); + }, + + //------------------------------------------------------------------------- + + 'toHexString': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'base64map': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", + 'base64mapIndex': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''), + + //------------------------------------------------------------------------- + + 'appendBase64String': function(aValue) { + var i; + var length; + + length = aValue.length; + + if ((length % 4) != 0) { + Clipperz.logError("the value passed to the 'ByteArray.setBase64Value' is not correct"); + throw Clipperz.ByteArray.exception.InvalidValue; + } + + i = 0; + while (i<length) { + var value1, value2, value3, value4; + var byte1, byte2, byte3; + + value1 = this.base64map.indexOf(aValue.charAt(i)); + value2 = this.base64map.indexOf(aValue.charAt(i+1)); + value3 = this.base64map.indexOf(aValue.charAt(i+2)); + value4 = this.base64map.indexOf(aValue.charAt(i+3)); + + byte1 = (value1 << 2) | ((value2 & 0x30) >> 4); + if (value3 != -1) { + byte2 = ((value2 & 0x0f) << 4) | ((value3 & 0x3c) >> 2); + + if (value4 != -1) { + byte3 = ((value3 & 0x03) << 6) | (value4); + } else { + byte3 = null; + } + } else { + byte2 = null; + byte3 = null; + } + + this.appendByte(byte1); + this.appendByte(byte2); + this.appendByte(byte3); + + i += 4; + } + + return this; + }, + + //------------------------------------------------------------------------- + + 'toBase64String': function() { + var result; + var length; + var i; + var byte1, byte2, byte3; + var char1, char2, char3, char4; + + i = 0; + length = this.length(); + result = new Array(Math.ceil(length/3)); + + while (i < length) { + byte1 = this.byteAtIndex(i); + if ((i+2) < length) { + byte2 = this.byteAtIndex(i+1); + byte3 = this.byteAtIndex(i+2); + } else if ((i+2) == length) { + byte2 = this.byteAtIndex(i+1); + byte3 = null; + } else { + byte2 = null; + byte3 = null; + } + + char1 = this.base64mapIndex[byte1 >> 2]; + if (byte2 != null) { + char2 = this.base64mapIndex[((byte1 & 0x03) << 4) | ((byte2 & 0xf0) >> 4)]; + if (byte3 != null) { + char3 = this.base64mapIndex[((byte2 & 0x0f) << 2) | ((byte3 & 0xc0) >> 6)]; + char4 = this.base64mapIndex[(byte3 & 0x3f)]; + } else { + char3 = this.base64mapIndex[(byte2 & 0x0f) << 2]; + char4 = "="; + } + } else { + char2 = this.base64mapIndex[(byte1 & 0x03) << 4]; + char3 = "="; + char4 = "="; + } + + result.push(char1 + char2 + char3 + char4); + + i += 3; + } + + return result.join(""); + }, + + //------------------------------------------------------------------------- + + 'base32map': "0123456789abcdefghjkmnpqrstvwxyz", + 'base32mapIndex': "0123456789abcdefghjkmnpqrstvwxyz".split(''), + + //------------------------------------------------------------------------- + + 'appendBase32String': function(aValue) { + var value; + var i; + var length; + var value1, value2, value3, value4, value5, value6, value7, value8; + var byte1, byte2, byte3, byte4, byte5; + + value = aValue.toLowerCase(); + value = value.replace(/[\s\-]/g, ''); + value = value.replace(/[0o]/g, '0'); + value = value.replace(/[1il]/g, '1'); + + length = value.length; + + if ((length % 8) != 0) { + Clipperz.logError("the value passed to the 'ByteArray.setBase32Value' is not correct"); + throw Clipperz.ByteArray.exception.InvalidValue; + } + + i = 0; + while (i<length) { + value1 = this.base32map.indexOf(value.charAt(i)); + value2 = this.base32map.indexOf(value.charAt(i+1)); + value3 = this.base32map.indexOf(value.charAt(i+2)); + value4 = this.base32map.indexOf(value.charAt(i+3)); + value5 = this.base32map.indexOf(value.charAt(i+4)); + value6 = this.base32map.indexOf(value.charAt(i+5)); + value7 = this.base32map.indexOf(value.charAt(i+6)); + value8 = this.base32map.indexOf(value.charAt(i+7)); + + byte1 = byte2 = byte3 = byte4 = byte5 = null; + + byte1 = (value1 << 3) | ((value2 & 0x1c) >> 2); + if (value3 != -1) { + byte2 = ((value2 & 0x03) << 6) | (value3 << 1) | ((value4 & 0x10) >> 4); + if (value5 != -1) { + byte3 = ((value4 & 0x0f) << 4) | ((value5 & 0x1e) >> 1); + if (value6 != -1) { + byte4 = ((value5 & 0x01) << 7) | (value6 << 2) | ((value7 & 0x18) >> 3); + if (value8 != -1) { + byte5 = ((value7 & 0x07) << 5) | (value8); + } + } + } + } + + this.appendByte(byte1); + this.appendByte(byte2); + this.appendByte(byte3); + this.appendByte(byte4); + this.appendByte(byte5); + + i += 8; + } + + return this; + }, + + //------------------------------------------------------------------------- + + 'toBase32String': function() { + var result; + var length; + var i; + var byte1, byte2, byte3, byte4, byte5; + var char1, char2, char3, char4, char5, char6, char7, char8; + + i = 0; + length = this.length(); + result = new Array(Math.ceil(length/5)); + + while (i < length) { + byte1 = this.byteAtIndex(i); + + if ((i+4) < length) { + byte2 = this.byteAtIndex(i+1); + byte3 = this.byteAtIndex(i+2); + byte4 = this.byteAtIndex(i+3); + byte5 = this.byteAtIndex(i+4); + } else if ((i+4) == length) { + byte2 = this.byteAtIndex(i+1); + byte3 = this.byteAtIndex(i+2); + byte4 = this.byteAtIndex(i+3); + byte5 = null; + } else if ((i+3) == length) { + byte2 = this.byteAtIndex(i+1); + byte3 = this.byteAtIndex(i+2); + byte4 = null; + byte5 = null; + } else if ((i+2) == length) { + byte2 = this.byteAtIndex(i+1); + byte3 = null; + byte4 = null; + byte5 = null; + } else { + byte2 = null; + byte3 = null; + byte4 = null; + byte5 = null; + } + + + char1 = this.base32mapIndex[byte1 >> 3]; + char2 = char3 = char4 = char5 = char6 = char7 = char8 = "="; + + if (byte2 != null) { + char2 = this.base32mapIndex[((byte1 & 0x07) << 2) | ((byte2 & 0xc0) >> 6)]; + char3 = this.base32mapIndex[((byte2 & 0x3e) >> 1)]; + if (byte3 != null) { + char4 = this.base32mapIndex[((byte2 & 0x01) << 4) | ((byte3 & 0xf0) >> 4)]; + if (byte4 != null) { + char5 = this.base32mapIndex[((byte3 & 0x0f) << 1) | ((byte4 & 0x80) >> 7)]; + char6 = this.base32mapIndex[(byte4 & 0x7c) >> 2]; + if (byte5 != null) { + char7 = this.base32mapIndex[((byte4 & 0x03) << 3) | ((byte5 & 0xe0) >> 5)]; + char8 = this.base32mapIndex[(byte5 & 0x1f)]; + } else { + char7 = this.base32mapIndex[(byte4 & 0x03) << 3]; + } + } else { + char5 = this.base32mapIndex[(byte3 & 0x0f) << 1]; + } + + } else { + char4 = this.base32mapIndex[(byte2 & 0x01) << 4]; + } + } else { + char2 = this.base32mapIndex[(byte1 & 0x07) << 2]; + } + + result.push(char1 + char2 + char3 + char4 + char5 + char6 + char7 + char8); + i += 5; + } + + return result.join(""); + }, + + //------------------------------------------------------------------------- + + 'toBinaryString': function () { + var i, c; + var result; + + result = ''; + + c = this.length(); + for (i=0; i<c; i++) { + result += String.fromCharCode(this.byteAtIndex(i)); + } + + return result; + }, + + + //------------------------------------------------------------------------- + + 'split': function(aStartingIndex, anEndingIndex) { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'increment': function() { + var i; + var done; + + done = false; + i = this.length() - 1; + + while ((i>=0) && (done == false)) { + var currentByteValue; + + currentByteValue = this.byteAtIndex(i); + + if (currentByteValue == 0xff) { + this.setByteAtIndex(0, i); + if (i>= 0) { + i --; + } else { + done = true; + } + } else { + this.setByteAtIndex(currentByteValue + 1, i); + done = true; + } + } + }, + + //------------------------------------------------------------------------- + + 'arrayValues': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//============================================================================= +// +// Clipperz.ByteArray_hex +// +//============================================================================= +/* +Clipperz.ByteArray_hex = function (args) { + this._value = ""; + + if (typeof(args) != 'undefined') { + if (args.constructor == Array) { + this.appendBytes(args); + } else if (args.constructor == String) { + if (args.indexOf("0x") == 0) { + var value; + + value = args.substring(2).toLowerCase(); + if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activate + if ((value.length % 2) == 0) { + this._value = value; + } else { + this._value = "0" + value; + } + } else { +Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string."); + throw Clipperz.ByteArray.exception.InvalidValue; + } + } else { + var value; + var i,c; + + c = args.length; + value = new Array(c); + for (i=0; i<c; i++) { + value.push(Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i))); + } + + this._value = value.join(""); + } + } else { + this.appendBytes(MochiKit.Base.extend(null, arguments)); + } + } + return this; +} + +Clipperz.ByteArray_hex.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), { + + //------------------------------------------------------------------------- + + 'toString': function() { + return "Clipperz.ByteArray_hex"; + }, + + //------------------------------------------------------------------------- + + 'clone': function() { + var result; + + result = this.newInstance(); + result._value = this._value; + + return result; + }, + + //------------------------------------------------------------------------- + + 'newInstance': function() { + return new Clipperz.ByteArray_hex(); + }, + + //------------------------------------------------------------------------- + + 'reset': function() { + this._value = ""; + }, + + //------------------------------------------------------------------------- + + 'length': function() { + return (this._value.length / 2); + }, + + //------------------------------------------------------------------------- + + 'appendBlock': function(aBlock) { + this._value = this._value += aBlock.toHexString().substring(2); + + return this; + }, + + //------------------------------------------------------------------------- + + 'appendByte': function(aValue) { + if (aValue != null) { + this.checkByteValue(aValue); + this._value += Clipperz.ByteArray.byteToHex(aValue); + } + + return this; + }, + + //------------------------------------------------------------------------- + + 'byteAtIndex': function(anIndex) { + return parseInt(this._value.substr(anIndex*2, 2), 16); + }, + + 'setByteAtIndex': function(aValue, anIndex) { + var missingBytes; + + this.checkByteValue(aValue); + + missingBytes = anIndex - this.length(); + + if (missingBytes < 0) { + var currentValue; + var firstCutIndex; + var secondCutIndex; + + firstCutIndex = anIndex * 2; + secondCutIndex = firstCutIndex + 2; + currentValue = this._value; + this._value = currentValue.substring(0, firstCutIndex) + + Clipperz.ByteArray.byteToHex(aValue) + + currentValue.substring(secondCutIndex); + } else if (missingBytes == 0) { + this.appendByte(aValue); + } else { + var i,c; + + c = missingBytes; + for (i=0; i<c; i++) { + this.appendByte(0); + } + + this.appendByte(aValue); + } + }, + + //------------------------------------------------------------------------- + + 'toHexString': function() { + return "0x" + this._value; + }, + + //------------------------------------------------------------------------- + + 'split': function(aStartingIndex, anEndingIndex) { + var result; + var startingIndex; + var endingIndex; + + result = this.newInstance(); + + startingIndex = aStartingIndex * 2; + if (typeof(anEndingIndex) != 'undefined') { + endingIndex = anEndingIndex * 2; + result._value = this._value.substring(startingIndex, endingIndex); + } else { + result._value = this._value.substring(startingIndex); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'arrayValues': function() { + var result; + var i,c; + + c = this.length(); + + result = new Array(c); + for (i=0; i<c; i++) { + result[i] = this.byteAtIndex(i); + } + + return result; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); +*/ + +//============================================================================= +// +// Clipperz.ByteArray_array +// +//============================================================================= + +Clipperz.ByteArray_array = function (args) { + if (typeof(args) != 'undefined') { + if (args.constructor == Array) { + this._value = args.slice(0); + } else if (args.constructor == String) { + var result; + var value; + var i, c; + + if (args.indexOf("0x") == 0) { + + value = args.substring(2).toLowerCase(); + if (/[0123456789abcdef]*/.test(value)) { + if ((value.length % 2) != 0) { + value = "0" + value; + } + } else { + Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string."); + throw Clipperz.ByteArray.exception.InvalidValue; + } + + c = value.length / 2 + result = new Array(c); + for (i=0; i<c; i++) { + result[i] = parseInt(value.substr(i*2, 2), 16); + } + + } else { + var unicode; + result = []; + c = args.length; + for (i=0; i<c; i++) { +// Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar(result, args.charCodeAt(i)); + + unicode = args.charCodeAt(i); + if (unicode <= 0x7f) { // 0x00000000 - 0x0000007f -> 0xxxxxxx + result.push(unicode); + // } else if ((unicode >= 0x80) && (unicode <= 0x7ff)) { // 0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx + } else if (unicode <= 0x7ff) { // 0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx + result.push((unicode >> 6) | 0xc0); + result.push((unicode & 0x3F) | 0x80); + // } else if ((unicode >= 0x0800) && (unicode <= 0xffff)) { // 0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx + } else if (unicode <= 0xffff) { // 0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx + result.push((unicode >> 12) | 0xe0); + result.push(((unicode >> 6) & 0x3f) | 0x80); + result.push((unicode & 0x3f) | 0x80); + } else { // 0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + result.push((unicode >> 18) | 0xf0); + result.push(((unicode >> 12) & 0x3f) | 0x80); + result.push(((unicode >> 6) & 0x3f) | 0x80); + result.push((unicode & 0x3f) | 0x80); + } + } + } + + + this._value = result; + } else { + this._value = []; + this.appendBytes(MochiKit.Base.extend(null, arguments)); + } + } else { + this._value = []; + } + + return this; +} + +Clipperz.ByteArray_array.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), { + + //------------------------------------------------------------------------- + + 'toString': function() { + return "Clipperz.ByteArray_array"; + }, + + //------------------------------------------------------------------------- + + 'clone': function() { + var result; + + result = this.newInstance(); + result.appendBytes(this._value); + + return result; + }, + + //------------------------------------------------------------------------- + + 'newInstance': function() { + return new Clipperz.ByteArray_array(); + }, + + //------------------------------------------------------------------------- + + 'reset': function() { + this._value = []; + }, + + //------------------------------------------------------------------------- + + 'length': function() { + return (this._value.length); + }, + + //------------------------------------------------------------------------- + + 'appendBlock': function(aBlock) { + MochiKit.Base.extend(this._value, aBlock._value); + + return this; + }, + + //------------------------------------------------------------------------- + + 'appendByte': function(aValue) { + if (aValue != null) { + this.checkByteValue(aValue); + this._value.push(aValue); + } + + return this; + }, + + //------------------------------------------------------------------------- + + 'byteAtIndex': function(anIndex) { + return this._value[anIndex]; + }, + + 'setByteAtIndex': function(aValue, anIndex) { + var missingBytes; + + this.checkByteValue(aValue); + + missingBytes = anIndex - this.length(); + + if (missingBytes < 0) { + this._value[anIndex] = aValue; + } else if (missingBytes == 0) { + this._value.push(aValue); + } else { + var i,c; + + c = missingBytes; + for (i=0; i<c; i++) { + this._value.push(0); + } + + this._value.push(aValue); + } + }, + + //------------------------------------------------------------------------- + + 'toHexString': function() { + var result; + var i, c; + + result = "0x"; + c = this.length(); + for (i=0; i<c; i++) { + result += Clipperz.ByteArray.byteToHex(this._value[i]); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'split': function(aStartingIndex, anEndingIndex) { + var result; + + result = this.newInstance(); + result._value = this._value.slice(aStartingIndex, anEndingIndex ? anEndingIndex : this.length()); + + return result; + }, + + //------------------------------------------------------------------------- + + 'arrayValues': function() { + return this._value.slice(0); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + + + + + +//============================================================================= +// +// Clipperz.ByteArray_string +// +//============================================================================= +/* +Clipperz.ByteArray_string = function (args) { + this._value = ""; + + if (typeof(args) != 'undefined') { + if (args.constructor == Array) { + this.appendBytes(args); + } else if (args.constructor == String) { + var result; + var value; + var i, c; + + if (args.indexOf("0x") == 0) { + + value = args.substring(2).toLowerCase(); + if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activated + if ((value.length % 2) != 0) { + value = "0" + value; + } + } else { +Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string."); + throw Clipperz.ByteArray.exception.InvalidValue; + } + } else { + value = ""; + c = args.length; + for (i=0; i<c; i++) { + value += Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i)); + } + } + + c = value.length / 2 + for (i=0; i<c; i++) { + this.appendByte(parseInt(value.substr(i*2, 2), 16)); + } + } else { + this.appendBytes(MochiKit.Base.extend(null, arguments)); + } + } + + return this; +} + +Clipperz.ByteArray_string.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), { + + //------------------------------------------------------------------------- + + 'toString': function() { + return "Clipperz.ByteArray_string"; + }, + + //------------------------------------------------------------------------- + + 'clone': function() { + var result; + + result = this.newInstance(); + result._value = this._value; + + return result; + }, + + //------------------------------------------------------------------------- + + 'newInstance': function() { + return new Clipperz.ByteArray_string(); + }, + + //------------------------------------------------------------------------- + + 'reset': function() { + this._value = ""; + }, + + //------------------------------------------------------------------------- + + 'length': function() { + return (this._value.length); + }, + + //------------------------------------------------------------------------- + + 'appendBlock': function(aBlock) { + this._value += aBlock._value; + + return this; + }, + + //------------------------------------------------------------------------- + + 'appendByte': function(aValue) { + if (aValue != null) { + this.checkByteValue(aValue); + this._value += String.fromCharCode(aValue); + } + + return this; + }, + + //------------------------------------------------------------------------- + + 'byteAtIndex': function(anIndex) { + return this._value.charCodeAt(anIndex); + }, + + 'setByteAtIndex': function(aValue, anIndex) { + var missingBytes; + + this.checkByteValue(aValue); + + missingBytes = anIndex - this.length(); + + if (missingBytes < 0) { + this._value = this._value.substring(0, anIndex) + String.fromCharCode(aValue) + this._value.substring(anIndex + 1); + } else if (missingBytes == 0) { + this.appendByte(aValue); + } else { + var i,c; + + c = missingBytes; + for (i=0; i<c; i++) { + this.appendByte(0); + } + + this.appendByte(aValue); + } + }, + + //------------------------------------------------------------------------- + + 'toHexString': function() { + var result; + var i, c; + + result = "0x"; + c = this.length(); + for (i=0; i<c; i++) { + result += Clipperz.ByteArray.byteToHex(this.byteAtIndex(i)); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'split': function(aStartingIndex, anEndingIndex) { + var result; + result = this.newInstance(); + result._value = this._value.substring(aStartingIndex, anEndingIndex ? anEndingIndex : this.length()); + + return result; + }, + + //------------------------------------------------------------------------- + + 'arrayValues': function() { + var result; + var i,c; + + c = this.length(); + + result = new Array(c); + for (i=0; i<c; i++) { + result[i] = this.byteAtIndex(i); + } + + return result; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); +*/ + +//============================================================================= +// +// Clipperz.ByteArray +// +//============================================================================= + +Clipperz.ByteArray = Clipperz.ByteArray_array; +//Clipperz.ByteArray = Clipperz.ByteArray_string; +//Clipperz.ByteArray = Clipperz.ByteArray_hex; + +//############################################################################# + +Clipperz.ByteArray.byteToHex = function(aByte) { + return ((aByte < 16) ? "0" : "") + aByte.toString(16); +} + + +Clipperz.ByteArray.unicodeToUtf8HexString = function(aUnicode) { + var result; + var self; + + self = Clipperz.ByteArray; + + if (aUnicode <= 0x7f) { // 0x00000000 - 0x0000007f -> 0xxxxxxx + result = self.byteToHex(aUnicode); +// } else if ((aUnicode >= 0x80) && (aUnicode <= 0x7ff)) { // 0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx + } else if (aUnicode <= 0x7ff) { // 0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx + result = self.byteToHex((aUnicode >> 6) | 0xc0); + result += self.byteToHex((aUnicode & 0x3F) | 0x80); +// } else if ((aUnicode >= 0x0800) && (aUnicode <= 0xffff)) { // 0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx + } else if (aUnicode <= 0xffff) { // 0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx + result = self.byteToHex((aUnicode >> 12) | 0xe0); + result += self.byteToHex(((aUnicode >> 6) & 0x3f) | 0x80); + result += self.byteToHex((aUnicode & 0x3f) | 0x80); + } else { // 0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + result = self.byteToHex((aUnicode >> 18) | 0xf0); + result += self.byteToHex(((aUnicode >> 12) & 0x3f) | 0x80); + result += self.byteToHex(((aUnicode >> 6) & 0x3f) | 0x80); + result += self.byteToHex((aUnicode & 0x3f) | 0x80); + } + + return result; +} + +Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar = function(anArray, aUnicode) { + var self; + + self = Clipperz.ByteArray; + + if (aUnicode <= 0x7f) { // 0x00000000 - 0x0000007f -> 0xxxxxxx + anArray.push(aUnicode); +// } else if ((aUnicode >= 0x80) && (aUnicode <= 0x7ff)) { // 0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx + } else if (aUnicode <= 0x7ff) { // 0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx + anArray.push((aUnicode >> 6) | 0xc0); + anArray.push((aUnicode & 0x3F) | 0x80); +// } else if ((aUnicode >= 0x0800) && (aUnicode <= 0xffff)) { // 0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx + } else if (aUnicode <= 0xffff) { // 0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx + anArray.push((aUnicode >> 12) | 0xe0); + anArray.push(((aUnicode >> 6) & 0x3f) | 0x80); + anArray.push((aUnicode & 0x3f) | 0x80); + } else { // 0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + anArray.push((aUnicode >> 18) | 0xf0); + anArray.push(((aUnicode >> 12) & 0x3f) | 0x80); + anArray.push(((aUnicode >> 6) & 0x3f) | 0x80); + anArray.push((aUnicode & 0x3f) | 0x80); + } +} + +Clipperz.ByteArray.prefixMatchingBits = function (aValue, bValue) { + var result; + var i,c; + + result = 0; + + c = Math.min(aValue.length(), bValue.length()); + i = 0; + while (i<c && (aValue.byteAtIndex(i) == bValue.byteAtIndex(i))) { + result += 8; + i++; + } + + if (i<c) { + var xorValue; + + xorValue = (aValue.byteAtIndex(i) ^ bValue.byteAtIndex(i)); + + if (xorValue >= 128) { + result += 0; + } else if (xorValue >= 64) { + result += 1; + } else if (xorValue >= 32) { + result += 2; + } else if (xorValue >= 16) { + result += 3; + } else if (xorValue >= 8) { + result += 4; + } else if (xorValue >= 4) { + result += 5; + } else if (xorValue >= 2) { + result += 6; + } else if (xorValue >= 1) { + result += 7; + } + } + + return result; +}; + +Clipperz.ByteArray.exception = { + InvalidValue: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue") +}; + +//############################################################################# + +Clipperz.ByteArrayIterator = function(args) { + args = args || {}; + + this._byteArray = args.byteArray; + this._blockSize = args.blockSize; + this._finalPadding = args.finalPadding || false; + + this._currentPosition = 0; + + return this; +} + +Clipperz.ByteArrayIterator.prototype = MochiKit.Base.update(null, { + + //------------------------------------------------------------------------- + + 'toString': function() { + return "Clipperz.ByteArrayIterator"; + }, + + //------------------------------------------------------------------------- + + 'blockSize': function() { + var result; + + result = this._blockSize; + + return result; + }, + + //------------------------------------------------------------------------- + + 'currentPosition': function() { + var result; + + result = this._currentPosition; + + return result; + }, + + //------------------------------------------------------------------------- + + 'byteArray': function() { + var result; + + result = this._byteArray; + + return result; + }, + + //------------------------------------------------------------------------- + + 'finalPadding': function() { + var result; + + result = this._finalPadding; + + return result; + }, + + //------------------------------------------------------------------------- + + 'nextBlock': function() { + var result; + var currentPosition; + var byteArrayLength; + + currentPosition = this._currentPosition; + byteArrayLength = this.byteArray().length(); + + if (currentPosition < byteArrayLength) { + var i,c; + + c = this.blockSize(); + result = new Array(c); + for (i=0; i<c; i++) { + if (currentPosition < byteArrayLength) { + result[i] = this.byteArray().byteAtIndex(currentPosition); + currentPosition++; + } else if (this.finalPadding() == true) { + result[i] = 0; + } + } + + this._currentPosition = currentPosition; + } else { + result = null; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'nextBlockArray': function() { + var result; + var nextBlock; + + nextBlock = this.nextBlock(); + + if (nextBlock != null) { + result = new Clipperz.ByteArray(nextBlock); + } else { + result = null; + } + + return result; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); diff --git a/frontend/delta/js/Clipperz/CSVProcessor.js b/frontend/delta/js/Clipperz/CSVProcessor.js new file mode 100644 index 0000000..1288ed7 --- a/dev/null +++ b/frontend/delta/js/Clipperz/CSVProcessor.js @@ -0,0 +1,344 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } + + +Clipperz.CSVProcessor = function(args) { + args = args || {}; + +// this._status = undefined; +// this._error_input = undefined; +// this._string = undefined; +// this._fields = undefined; + + this._quoteChar = args['quoteChar'] || "\042"; + this._eol = args['eol'] || ""; + this._escapeChar = args['escapeChar'] || "\042"; + this._separatorChar = args['separatorChar'] || ","; + this._binary = args['binary'] || false; + this._alwaysQuote = args['alwaysQuote'] || false; + + return this; +} + +//============================================================================= + +Clipperz.CSVProcessor.prototype = MochiKit.Base.update(null, { + + //------------------------------------------------------------------------- + + 'quoteChar': function() { + return this._quoteChar; + }, + + //------------------------------------------------------------------------- + + 'eol': function() { + return this._eol; + }, + + //------------------------------------------------------------------------- + + 'escapeChar': function() { + return this._escapeChar; + }, + + //------------------------------------------------------------------------- + + 'separatorChar': function() { + return this._separatorChar; + }, + + 'setSeparatorChar': function(aValue) { + this._separatorChar = aValue; + }, + + //------------------------------------------------------------------------- + + 'binary': function() { + return this._binary; + }, + + //------------------------------------------------------------------------- + + 'alwaysQuote': function() { + return this._alwaysQuote; + }, + + //------------------------------------------------------------------------- +/* + 'parse': function(aValue) { + var result; + var lines; + var parameter; + +//Clipperz.logDebug(">>> CSVProcessor.parse"); + result = []; + + lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n* /g, "").replace(/\n$/g, "");; + parameter = { + line: lines + } + + do { + var fields; + + fields = this.parseLine(parameter); + + if (fields != null) { + result.push(fields); + } + + parameter.line = parameter.line.replace(/^\n* /g, "").replace(/\n$/g, ""); + +//Clipperz.logDebug("line: '" + parameter.line + "'"); + } while (parameter.line != ""); +//Clipperz.logDebug("--- CSVProcessor.parse - result: " + Clipperz.Base.serializeJSON(result)); +//Clipperz.logDebug("<<< CSVProcessor.parse"); + + return result; + }, +*/ + //------------------------------------------------------------------------- + + 'deferredParse_core': function(aContext) { + var deferredResult; + + if (aContext.line == "") { + deferredResult = MochiKit.Async.succeed(aContext.result); + } else { + var fields; + + fields = this.parseLine(aContext); + if (fields != null) { + aContext.result.push(fields); + } + + aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, ""); + + deferredResult = new Clipperz.Async.Deferred("CVSProcessor.deferredParse_core"); +// deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)}); + deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)}); + deferredResult.addCallback(MochiKit.Async.wait, 0.2); + deferredResult.addMethod(this, 'deferredParse_core') + deferredResult.callback(aContext); + } + + return deferredResult; + }, + + //......................................................................... + + 'deferredParse': function(aValue) { + var deferredResult; + var lines; + var context; + + lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n*/g, "").replace(/\n$/g, ""); + + context = { + line: lines, + size: lines.length, + result: [] + } + + deferredResult = new Clipperz.Async.Deferred("CSVProcessor.deferredParse"); + deferredResult.addMethod(this, 'deferredParse_core'); + deferredResult.callback(context); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'parseLine': function(aParameter) { + var result; + var palatable; + var line; + var processedField; + + result = []; + + do { + processedField = this.parseField(aParameter); + if (processedField != null) { + result.push(processedField) + }; + } while (processedField != null); + + return result; + }, + + //------------------------------------------------------------------------- + + 'parseField': function(aParameter) { + var result; + + var inQuotes; + var validRegExp; + var singleQuoteBeginRegexp; + var escapedQuoteBeginRegexp; + var singleQuoteCommaEndRegexp; + var singleQuoteNewLineEndRegexp; + var commaBeginRegexp; + var newlineRegexp; + + + singleQuoteBeginRegexp = new RegExp("^" + '\\' + this.quoteChar()); + escapedQuoteBeginRegexp = new RegExp("^" + '\\' + this.escapeChar() + '\\' + this.quoteChar()); + singleQuoteCommaEndRegexp = new RegExp("^" + '\\' + this.quoteChar() + '\\' + this.separatorChar()); + singleQuoteNewLineEndRegexp = new RegExp("^" + '\\' + this.quoteChar() + "\n"); + commaBeginRegexp = new RegExp("^" + '\\' + this.separatorChar()); + newlineRegexp = new RegExp("^\n"); + + inQuotes = false; + +//Clipperz.logDebug("#################################### '" + aParameter.line + "'"); + if (aParameter.line == "") { + if (aParameter.isThereAnEmptyFinalField == true) { + aParameter.isThereAnEmptyFinalField = false; + result = ""; + } else { + result = null; + } + } else { + if (this.binary()) { + validRegexp = /^./; +// validRegexp = /^[^\\]/; + } else { + validRegexp = /^[\t\040-\176]/; + } + + try { + var done; + + done = false; + result = ""; + + while (!done) { + if (aParameter.line.length < 1) { +//Clipperz.logDebug("---> 1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + if (inQuotes == true) { +//Clipperz.logDebug("---> 1.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + throw new Error("CSV Parsing error; end of string, missing closing double-quote..."); + } else { +//Clipperz.logDebug("---> 1.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + done = true; + } + } else if (escapedQuoteBeginRegexp.test(aParameter.line)) { +//Clipperz.logDebug("---> 2.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + result += this.quoteChar(); + aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1); +//Clipperz.logDebug("<--- 2.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + } else if (singleQuoteBeginRegexp.test(aParameter.line)) { +//Clipperz.logDebug("---> 3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + if (inQuotes == true) { + if (aParameter.line.length == 1) { +//Clipperz.logDebug("---> 3.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + aParameter.line = ''; + done = true; + } else if (singleQuoteCommaEndRegexp.test(aParameter.line)) { +//Clipperz.logDebug("---> 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1); + done = true; +//Clipperz.logDebug("<--- 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + } else if (singleQuoteNewLineEndRegexp.test(aParameter.line)) { + aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); + done = true; + } else { + throw new Error("CSV Parsing error; double-quote, followed by undesirable character (bad character sequence)... " + aParameter.line); + } + } else { +//Clipperz.logDebug("---> 4: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + if (result == "") { +//Clipperz.logDebug("---> 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + inQuotes = true; + aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); +//Clipperz.logDebug("<--- 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + } else { + throw new Error("CSV Parsing error; double-quote, outside of double-quotes (bad character sequence)..."); + } + } + } else if (commaBeginRegexp.test(aParameter.line)) { +//Clipperz.logDebug("---> 5: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + if (inQuotes) { +//Clipperz.logDebug("---> 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + result += aParameter.line.substr(0 ,1); + aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); +//Clipperz.logDebug("<--- 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + } else { +//Clipperz.logDebug("---> 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); + if (newlineRegexp.test(aParameter.line) || aParameter.line == "") { +//Clipperz.logDebug("######"); + aParameter.isThereAnEmptyFinalField = true; + }; + done = true; +//Clipperz.logDebug("<--- 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + } + } else if (validRegexp.test(aParameter.line)) { +//Clipperz.logDebug("---> 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + result += aParameter.line.substr(0, 1); + aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); +//Clipperz.logDebug("<--- 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); + } else if (newlineRegexp.test(aParameter.line)) { + if (inQuotes == true) { + result += aParameter.line.substr(0 ,1); + aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); + } else { + if (result == "") { + if (aParameter.isThereAnEmptyFinalField == true) { + aParameter.isThereAnEmptyFinalField = false; + } else { + result = null; + } + } + + done = true; + } + } else { + throw new Error("CSV Parsing error; an undesirable character... '" + aParameter.line.substr(0,1) + "'"); + } + } + } catch(exception) { + Clipperz.logError(exception.message); +// result = null; + throw exception; + } + } + +//if (result != null) { +// Clipperz.logDebug("<=== result: '" + result.replace(/\n/g, "\\n") + "'"); +//} else { +// Clipperz.logDebug("<=== result: NULL"); +//} + + return result; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + + diff --git a/frontend/delta/js/Clipperz/Crypto/AES.js b/frontend/delta/js/Clipperz/Crypto/AES.js new file mode 100644 index 0000000..cb56f11 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/AES.js @@ -0,0 +1,859 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!"; +} + +// Dependency commented to avoid a circular reference +//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { +// throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!"; +//} + +if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; } + +//############################################################################# + +Clipperz.Crypto.AES.DeferredExecutionContext = function(args) { + args = args || {}; + + this._key = args.key; + this._message = args.message; + this._result = args.message.clone(); + this._nonce = args.nonce; + this._messageLength = this._message.length(); + + this._messageArray = this._message.arrayValues(); + this._resultArray = this._result.arrayValues(); + this._nonceArray = this._nonce.arrayValues(); + + this._executionStep = 0; + +// this._elaborationChunkSize = 1024; // 4096; // 16384; // 4096; + this._elaborationChunks = 10; + this._pauseTime = 0.02; // 0.02 // 0.2; + + return this; +} + +Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, { + + 'key': function() { + return this._key; + }, + + 'message': function() { + return this._message; + }, + + 'messageLength': function() { + return this._messageLength; + }, + + 'result': function() { + return new Clipperz.ByteArray(this.resultArray()); + }, + + 'nonce': function() { + return this._nonce; + }, + + 'messageArray': function() { + return this._messageArray; + }, + + 'resultArray': function() { + return this._resultArray; + }, + + 'nonceArray': function() { + return this._nonceArray; + }, + + 'elaborationChunkSize': function() { +// return Clipperz.Crypto.AES.DeferredExecution.chunkSize; +// return this._elaborationChunkSize; + return (this._elaborationChunks * 1024); + }, + + 'executionStep': function() { + return this._executionStep; + }, + + 'setExecutionStep': function(aValue) { + this._executionStep = aValue; + }, + + 'tuneExecutionParameters': function (anElapsedTime) { +//var originalChunks = this._elaborationChunks; + if (anElapsedTime > 0) { + this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2))); + } +//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]"); + }, + + 'pause': function(aValue) { +// return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue); + return MochiKit.Async.wait(this._pauseTime, aValue); + }, + + 'isDone': function () { + return (this._executionStep >= this._messageLength); + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# + +Clipperz.Crypto.AES.Key = function(args) { + args = args || {}; + + this._key = args.key; + this._keySize = args.keySize || this.key().length(); + + if (this.keySize() == 128/8) { + this._b = 176; + this._numberOfRounds = 10; + } else if (this.keySize() == 256/8) { + this._b = 240; + this._numberOfRounds = 14; + } else { + Clipperz.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits"); + throw Clipperz.Crypto.AES.exception.UnsupportedKeySize; + } + + this._stretchedKey = null; + + return this; +} + +Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, { + + 'asString': function() { + return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")"; + }, + + //----------------------------------------------------------------------------- + + 'key': function() { + return this._key; + }, + + 'keySize': function() { + return this._keySize; + }, + + 'b': function() { + return this._b; + }, + + 'numberOfRounds': function() { + return this._numberOfRounds; + }, + //========================================================================= + + 'keyScheduleCore': function(aWord, aRoundConstantsIndex) { + var result; + var sbox; + + sbox = Clipperz.Crypto.AES.sbox(); + + result = [ sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex], + sbox[aWord[2]], + sbox[aWord[3]], + sbox[aWord[0]] ]; + + return result; + }, + + //----------------------------------------------------------------------------- + + 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) { + var result; + var i,c; + + result = []; + c = 4; + for (i=0; i<c; i++) { + result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i); + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'sboxShakeup': function(aWord) { + var result; + var sbox; + var i,c; + + result = []; + sbox = Clipperz.Crypto.AES.sbox(); + c =4; + for (i=0; i<c; i++) { + result[i] = sbox[aWord[i]]; + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'stretchKey': function(aKey) { + var currentWord; + var keyLength; + var previousStretchIndex; + var i,c; + + keyLength = aKey.length(); + previousStretchIndex = keyLength - this.keySize(); + + currentWord = [ aKey.byteAtIndex(keyLength - 4), + aKey.byteAtIndex(keyLength - 3), + aKey.byteAtIndex(keyLength - 2), + aKey.byteAtIndex(keyLength - 1) ]; + currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize()); + + if (this.keySize() == 256/8) { + c = 8; + } else if (this.keySize() == 128/8){ + c = 4; + } + + for (i=0; i<c; i++) { + if (i == 4) { + // fifth streatch word + currentWord = this.sboxShakeup(currentWord); + } + + currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4)); + aKey.appendBytes(currentWord); + } + + return aKey; + }, + + //----------------------------------------------------------------------------- + + 'stretchedKey': function() { + if (this._stretchedKey == null) { + var stretchedKey; + + stretchedKey = this.key().clone(); + + while (stretchedKey.length() < this.keySize()) { + stretchedKey.appendByte(0); + } + + while (stretchedKey.length() < this.b()) { + stretchedKey = this.stretchKey(stretchedKey); + } + + this._stretchedKey = stretchedKey.split(0, this.b()); + } + + return this._stretchedKey; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Crypto.AES.State = function(args) { + args = args || {}; + + this._data = args.block; + this._key = args.key; + + return this; +} + +Clipperz.Crypto.AES.State.prototype = MochiKit.Base.update(null, { + + 'key': function() { + return this._key; + }, + + //----------------------------------------------------------------------------- + + 'data': function() { + return this._data; + }, + + 'setData': function(aValue) { + this._data = aValue; + }, + + //========================================================================= + + 'addRoundKey': function(aRoundNumber) { + // each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule. + var data; + var stretchedKey; + var firstStretchedKeyIndex; + var i,c; + + data = this.data(); + stretchedKey = this.key().stretchedKey(); + firstStretchedKeyIndex = aRoundNumber * (128/8); + c = 128/8; + for (i=0; i<c; i++) { + data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i); + } + }, + + //----------------------------------------------------------------------------- + + 'subBytes': function() { + // a non-linear substitution step where each byte is replaced with another according to a lookup table. + var i,c; + var data; + var sbox; + + data = this.data(); + sbox = Clipperz.Crypto.AES.sbox(); + + c = 16; + for (i=0; i<c; i++) { + data[i] = sbox[data[i]]; + } + }, + + //----------------------------------------------------------------------------- + + 'shiftRows': function() { + // a transposition step where each row of the state is shifted cyclically a certain number of steps. + var newValue; + var data; + var shiftMapping; + var i,c; + + newValue = new Array(16); + data = this.data(); + shiftMapping = Clipperz.Crypto.AES.shiftRowMapping(); +// [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; + c = 16; + for (i=0; i<c; i++) { + newValue[i] = data[shiftMapping[i]]; + } + for (i=0; i<c; i++) { + data[i] = newValue[i]; + } + }, + + //----------------------------------------------------------------------------- +/* + 'mixColumnsWithValues': function(someValues) { + var result; + var a; + var i,c; + + c = 4; + result = []; + a = []; + for (i=0; i<c; i++) { + a[i] = []; + a[i][1] = someValues[i] + if ((a[i][1] & 0x80) == 0x80) { + a[i][2] = (a[i][1] << 1) ^ 0x11b; + } else { + a[i][2] = a[i][1] << 1; + } + + a[i][3] = a[i][2] ^ a[i][1]; + } + + for (i=0; i<c; i++) { + var x; + + x = Clipperz.Crypto.AES.mixColumnsMatrix()[i]; + result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]]; + } + + return result; + }, + + 'mixColumns': function() { + // a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation. + var data; + var i, c; + + data = this.data(); + c = 4; + for(i=0; i<c; i++) { + var blockIndex; + var mixedValues; + + blockIndex = i * 4; + mixedValues = this.mixColumnsWithValues([ data[blockIndex + 0], + data[blockIndex + 1], + data[blockIndex + 2], + data[blockIndex + 3]]); + data[blockIndex + 0] = mixedValues[0]; + data[blockIndex + 1] = mixedValues[1]; + data[blockIndex + 2] = mixedValues[2]; + data[blockIndex + 3] = mixedValues[3]; + } + }, +*/ + + 'mixColumns': function() { + // a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation. + var data; + var i, c; + var a_1; + var a_2; + + a_1 = new Array(4); + a_2 = new Array(4); + + data = this.data(); + c = 4; + for(i=0; i<c; i++) { + var blockIndex; + var ii, cc; + + blockIndex = i * 4; + + cc = 4; + for (ii=0; ii<cc; ii++) { + var value; + + value = data[blockIndex + ii]; + a_1[ii] = value; + a_2[ii] = (value & 0x80) ? ((value << 1) ^ 0x011b) : (value << 1); + } + + data[blockIndex + 0] = a_2[0] ^ a_1[1] ^ a_2[1] ^ a_1[2] ^ a_1[3]; + data[blockIndex + 1] = a_1[0] ^ a_2[1] ^ a_1[2] ^ a_2[2] ^ a_1[3]; + data[blockIndex + 2] = a_1[0] ^ a_1[1] ^ a_2[2] ^ a_1[3] ^ a_2[3]; + data[blockIndex + 3] = a_1[0] ^ a_2[0] ^ a_1[1] ^ a_1[2] ^ a_2[3]; + } + }, + + //========================================================================= + + 'spinRound': function(aRoundNumber) { + this.addRoundKey(aRoundNumber); + this.subBytes(); + this.shiftRows(); + this.mixColumns(); + }, + + 'spinLastRound': function() { + this.addRoundKey(this.key().numberOfRounds() - 1); + this.subBytes(); + this.shiftRows(); + this.addRoundKey(this.key().numberOfRounds()); + }, + + //========================================================================= + + 'encrypt': function() { + var i,c; + + c = this.key().numberOfRounds() - 1; + for (i=0; i<c; i++) { + this.spinRound(i); + } + + this.spinLastRound(); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Crypto.AES.VERSION = "0.1"; +Clipperz.Crypto.AES.NAME = "Clipperz.Crypto.AES"; + +MochiKit.Base.update(Clipperz.Crypto.AES, { + +// http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-AES.html +// http://en.wikipedia.org/wiki/Advanced_Encryption_Standard +// http://en.wikipedia.org/wiki/Rijndael_key_schedule +// http://en.wikipedia.org/wiki/Rijndael_S-box + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + 'toString': function () { + return this.__repr__(); + }, + + //============================================================================= + + '_sbox': null, + 'sbox': function() { + if (Clipperz.Crypto.AES._sbox == null) { + Clipperz.Crypto.AES._sbox = [ +0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, +0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, +0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, +0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, +0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, +0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, +0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, +0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, +0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, +0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, +0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, +0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, +0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, +0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, +0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, +0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + ]; + } + + return Clipperz.Crypto.AES._sbox; + }, + + //----------------------------------------------------------------------------- + // + // 0 4 8 12 0 4 8 12 + // 1 5 9 13 => 5 9 13 1 + // 2 6 10 14 10 14 2 6 + // 3 7 11 15 15 3 7 11 + // + '_shiftRowMapping': null, + 'shiftRowMapping': function() { + if (Clipperz.Crypto.AES._shiftRowMapping == null) { + Clipperz.Crypto.AES._shiftRowMapping = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; + } + + return Clipperz.Crypto.AES._shiftRowMapping; + }, + + //----------------------------------------------------------------------------- + + '_mixColumnsMatrix': null, + 'mixColumnsMatrix': function() { + if (Clipperz.Crypto.AES._mixColumnsMatrix == null) { + Clipperz.Crypto.AES._mixColumnsMatrix = [ [2, 3, 1 ,1], + [1, 2, 3, 1], + [1, 1, 2, 3], + [3, 1, 1, 2] ]; + } + + return Clipperz.Crypto.AES._mixColumnsMatrix; + }, + + '_roundConstants': null, + 'roundConstants': function() { + if (Clipperz.Crypto.AES._roundConstants == null) { + Clipperz.Crypto.AES._roundConstants = [ , 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154]; +// Clipperz.Crypto.AES._roundConstants = [ , 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a]; + } + + return Clipperz.Crypto.AES._roundConstants; + }, + + //============================================================================= + + 'incrementNonce': function(aNonce) { +//Clipperz.Profile.start("Clipperz.Crypto.AES.incrementNonce"); + var i; + var done; + + done = false; + i = aNonce.length - 1; + + while ((i>=0) && (done == false)) { + var currentByteValue; + + currentByteValue = aNonce[i]; + + if (currentByteValue == 0xff) { + aNonce[i] = 0; + if (i>= 0) { + i --; + } else { + done = true; + } + } else { + aNonce[i] = currentByteValue + 1; + done = true; + } + } +//Clipperz.Profile.stop("Clipperz.Crypto.AES.incrementNonce"); + }, + + //----------------------------------------------------------------------------- + + 'encryptBlock': function(aKey, aBlock) { + var result; + var state; + + state = new Clipperz.Crypto.AES.State({block:aBlock, key:aKey}); +//is(state.data(), 'before'); + state.encrypt(); + result = state.data(); + + return result; + }, + + //----------------------------------------------------------------------------- + + 'encryptBlocks': function(aKey, aMessage, aNonce) { + var result; + var nonce; + var self; + var messageIndex; + var messageLength; + var blockSize; + + self = Clipperz.Crypto.AES; + blockSize = 128/8; + messageLength = aMessage.length; + nonce = aNonce; + + result = aMessage; + messageIndex = 0; + while (messageIndex < messageLength) { + var encryptedBlock; + var i,c; + + self.incrementNonce(nonce); + encryptedBlock = self.encryptBlock(aKey, nonce); + + if ((messageLength - messageIndex) > blockSize) { + c = blockSize; + } else { + c = messageLength - messageIndex; + } + + for (i=0; i<c; i++) { + result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i]; + } + + messageIndex += blockSize; + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'encrypt': function(aKey, someData, aNonce) { + var result; + var nonce; + var encryptedData; + var key; + + key = new Clipperz.Crypto.AES.Key({key:aKey}); + nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8); + + encryptedData = Clipperz.Crypto.AES.encryptBlocks(key, someData.arrayValues(), nonce.arrayValues()); + + result = nonce.appendBytes(encryptedData); + + return result; + }, + + //----------------------------------------------------------------------------- + + 'decrypt': function(aKey, someData) { + var result; + var nonce; + var encryptedData; + var decryptedData; + var dataIterator; + var key; + + key = new Clipperz.Crypto.AES.Key({key:aKey}); + + encryptedData = someData.arrayValues(); + nonce = encryptedData.slice(0, (128/8)); + encryptedData = encryptedData.slice(128/8); + decryptedData = Clipperz.Crypto.AES.encryptBlocks(key, encryptedData, nonce); + + result = new Clipperz.ByteArray(decryptedData); + + return result; + }, + + //============================================================================= + + 'deferredEncryptExecutionChunk': function(anExecutionContext) { + var result; + var nonce; + var self; + var messageIndex; + var messageLength; + var blockSize; + var executionLimit; + var startTime, endTime; + + self = Clipperz.Crypto.AES; + startTime = new Date(); + blockSize = 128/8; + messageLength = anExecutionContext.messageArray().length; + nonce = anExecutionContext.nonceArray(); + result = anExecutionContext.resultArray(); + + messageIndex = anExecutionContext.executionStep(); + executionLimit = messageIndex + anExecutionContext.elaborationChunkSize(); + executionLimit = Math.min(executionLimit, messageLength); + + while (messageIndex < executionLimit) { + var encryptedBlock; + var i,c; + + self.incrementNonce(nonce); + encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce); + + if ((executionLimit - messageIndex) > blockSize) { + c = blockSize; + } else { + c = executionLimit - messageIndex; + } + + for (i=0; i<c; i++) { + result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i]; + } + + messageIndex += blockSize; + } + anExecutionContext.setExecutionStep(messageIndex); + endTime = new Date(); + anExecutionContext.tuneExecutionParameters(endTime - startTime); + + return anExecutionContext; + }, + + //----------------------------------------------------------------------------- +/* + 'deferredEncryptBlocks': function(anExecutionContext) { + var deferredResult; + var messageSize; + var i,c; + + messageSize = anExecutionContext.messageLength(); + + deferredResult = new Clipperz.Async.Deferred("AES.deferredEncryptBloks"); + + c = Math.ceil(messageSize / anExecutionContext.elaborationChunkSize()); + for (i=0; i<c; i++) { + deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptExecutionChunk); + deferredResult.addMethod(anExecutionContext, 'pause'); + } + + deferredResult.callback(anExecutionContext); + + return deferredResult; + }, +*/ + + 'deferredEncryptBlocks': function(anExecutionContext) { + var deferredResult; + + if (! anExecutionContext.isDone()) { + deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES.deferredEncryptBloks", [ + Clipperz.Crypto.AES.deferredEncryptExecutionChunk, + MochiKit.Base.method(anExecutionContext, 'pause'), + Clipperz.Crypto.AES.deferredEncryptBlocks + ], {trace:false}, anExecutionContext); + } else { + deferredResult = MochiKit.Async.succeed(anExecutionContext); + } + + return deferredResult; + }, + + //----------------------------------------------------------------------------- + + 'deferredEncrypt': function(aKey, someData, aNonce) { + var deferredResult; + var executionContext; + var result; + var nonce; + var key; + + key = new Clipperz.Crypto.AES.Key({key:aKey}); + nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8); + + executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:someData, nonce:nonce}); + + deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt"); + deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks); + deferredResult.addCallback(function(anExecutionContext) { + var result; + + result = anExecutionContext.nonce().clone(); + result.appendBytes(anExecutionContext.resultArray()); + + return result; + }); + deferredResult.callback(executionContext) + + return deferredResult; + }, + + //----------------------------------------------------------------------------- + + 'deferredDecrypt': function(aKey, someData) { + var deferredResult + var nonce; + var message; + var key; + + key = new Clipperz.Crypto.AES.Key({key:aKey}); + nonce = someData.split(0, (128/8)); + message = someData.split(128/8); + executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:message, nonce:nonce}); + + deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt"); + deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks); + deferredResult.addCallback(function(anExecutionContext) { + return anExecutionContext.result(); + }); + deferredResult.callback(executionContext); + + return deferredResult; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# + +//Clipperz.Crypto.AES.DeferredExecution = { +// 'chunkSize': 16384, // 4096, // 1024 4096 8192 16384 32768; +// 'pauseTime': 0.02 // 0.2 +//} + +Clipperz.Crypto.AES.exception = { + 'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES.exception.UnsupportedKeySize") +}; diff --git a/frontend/delta/js/Clipperz/Crypto/AES_2.js b/frontend/delta/js/Clipperz/Crypto/AES_2.js new file mode 100644 index 0000000..1627f39 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/AES_2.js @@ -0,0 +1,843 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.AES_2 depends on Clipperz.ByteArray!"; +} + +// Dependency commented to avoid a circular reference +//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { +// throw "Clipperz.Crypto.AES_2 depends on Clipperz.Crypto.PRNG!"; +//} + +if (typeof(Clipperz.Crypto.AES_2) == 'undefined') { Clipperz.Crypto.AES_2 = {}; } + +//############################################################################# + +Clipperz.Crypto.AES_2.DeferredExecutionContext = function(args) { + args = args || {}; + + this._key = args.key; + this._message = args.message; + this._result = args.message.clone(); + this._nonce = args.nonce; + this._messageLength = this._message.length(); + + this._messageArray = this._message.arrayValues(); + this._resultArray = this._result.arrayValues(); + this._nonceArray = this._nonce.arrayValues(); + + this._executionStep = 0; + +// this._elaborationChunkSize = 1024; // 4096; // 16384; // 4096; + this._elaborationChunks = 10; + this._pauseTime = 0.02; // 0.02 // 0.2; + + return this; +} + +Clipperz.Crypto.AES_2.DeferredExecutionContext.prototype = MochiKit.Base.update(null, { + + 'key': function() { + return this._key; + }, + + 'message': function() { + return this._message; + }, + + 'messageLength': function() { + return this._messageLength; + }, + + 'result': function() { + return new Clipperz.ByteArray(this.resultArray()); + }, + + 'nonce': function() { + return this._nonce; + }, + + 'messageArray': function() { + return this._messageArray; + }, + + 'resultArray': function() { + return this._resultArray; + }, + + 'nonceArray': function() { + return this._nonceArray; + }, + + 'elaborationChunkSize': function() { +// return Clipperz.Crypto.AES_2.DeferredExecution.chunkSize; +// return this._elaborationChunkSize; + return (this._elaborationChunks * 1024); + }, + + 'executionStep': function() { + return this._executionStep; + }, + + 'setExecutionStep': function(aValue) { + this._executionStep = aValue; + }, + + 'tuneExecutionParameters': function (anElapsedTime) { +//var originalChunks = this._elaborationChunks; + if (anElapsedTime > 0) { + this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2))); + } +//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]"); + }, + + 'pause': function(aValue) { +// return MochiKit.Async.wait(Clipperz.Crypto.AES_2.DeferredExecution.pauseTime, aValue); + return MochiKit.Async.wait(this._pauseTime, aValue); + }, + + 'isDone': function () { + return (this._executionStep >= this._messageLength); + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# + +Clipperz.Crypto.AES_2.Key = function(args) { + args = args || {}; + + this._key = args.key; + this._keySize = args.keySize || this.key().length(); + + if (this.keySize() == 128/8) { + this._b = 176; + this._numberOfRounds = 10; + } else if (this.keySize() == 256/8) { + this._b = 240; + this._numberOfRounds = 14; + } else { + Clipperz.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits"); + throw Clipperz.Crypto.AES_2.exception.UnsupportedKeySize; + } + + this._stretchedKey = null; + + return this; +} + +Clipperz.Crypto.AES_2.Key.prototype = MochiKit.Base.update(null, { + + 'asString': function() { + return "Clipperz.Crypto.AES_2.Key (" + this.key().toHexString() + ")"; + }, + + //----------------------------------------------------------------------------- + + 'key': function() { + return this._key; + }, + + 'keySize': function() { + return this._keySize; + }, + + 'b': function() { + return this._b; + }, + + 'numberOfRounds': function() { + return this._numberOfRounds; + }, + //========================================================================= + + 'keyScheduleCore': function(aWord, aRoundConstantsIndex) { + var result; + var sbox; + + sbox = Clipperz.Crypto.AES_2.sbox(); + + result = [ sbox[aWord[1]] ^ Clipperz.Crypto.AES_2.roundConstants()[aRoundConstantsIndex], + sbox[aWord[2]], + sbox[aWord[3]], + sbox[aWord[0]] ]; + + return result; + }, + + //----------------------------------------------------------------------------- + + 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) { + var result; + var i,c; + + result = []; + c = 4; + for (i=0; i<c; i++) { + result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i); + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'sboxShakeup': function(aWord) { + var result; + var sbox; + var i,c; + + result = []; + sbox = Clipperz.Crypto.AES_2.sbox(); + c =4; + for (i=0; i<c; i++) { + result[i] = sbox[aWord[i]]; + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'stretchKey': function(aKey) { + var currentWord; + var keyLength; + var previousStretchIndex; + var i,c; + + keyLength = aKey.length(); + previousStretchIndex = keyLength - this.keySize(); + + currentWord = [ aKey.byteAtIndex(keyLength - 4), + aKey.byteAtIndex(keyLength - 3), + aKey.byteAtIndex(keyLength - 2), + aKey.byteAtIndex(keyLength - 1) ]; + currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize()); + + if (this.keySize() == 256/8) { + c = 8; + } else if (this.keySize() == 128/8){ + c = 4; + } + + for (i=0; i<c; i++) { + if (i == 4) { + // fifth streatch word + currentWord = this.sboxShakeup(currentWord); + } + + currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4)); + aKey.appendBytes(currentWord); + } + + return aKey; + }, + + //----------------------------------------------------------------------------- + + 'stretchedKey': function() { + if (this._stretchedKey == null) { + var stretchedKey; + + stretchedKey = this.key().clone(); + + while (stretchedKey.length() < this.keySize()) { + stretchedKey.appendByte(0); + } + + while (stretchedKey.length() < this.b()) { + stretchedKey = this.stretchKey(stretchedKey); + } + + this._stretchedKey = stretchedKey.split(0, this.b()); + } + + return this._stretchedKey; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Crypto.AES_2.State = function(args) { + args = args || {}; + + this._data = args.block.slice(0); + this._key = args.key; + + return this; +} + +Clipperz.Crypto.AES_2.State.prototype = MochiKit.Base.update(null, { + + 'key': function() { + return this._key; + }, + + //----------------------------------------------------------------------------- + + 'data': function() { + return this._data; + }, + + 'setData': function(aValue) { + this._data = aValue; + }, + + //========================================================================= + + 'addRoundKey': function(aRoundNumber) { + // each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule. + var data; + var stretchedKey; + var firstStretchedKeyIndex; + var i,c; + + data = this.data(); + stretchedKey = this.key().stretchedKey(); + firstStretchedKeyIndex = aRoundNumber * (128/8); + c = 128/8; + for (i=0; i<c; i++) { + data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i); + } + }, + + //----------------------------------------------------------------------------- + + 'subBytes': function() { + // a non-linear substitution step where each byte is replaced with another according to a lookup table. + var i,c; + var data; + var sbox; + + data = this.data(); + sbox = Clipperz.Crypto.AES_2.sbox(); + + c = 16; + for (i=0; i<c; i++) { + data[i] = sbox[data[i]]; + } + }, + + //----------------------------------------------------------------------------- + + 'shiftRows': function() { + // a transposition step where each row of the state is shifted cyclically a certain number of steps. + var newValue; + var data; + var shiftMapping; + var i,c; + + newValue = new Array(16); + data = this.data(); + shiftMapping = Clipperz.Crypto.AES_2.shiftRowMapping(); +// [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; + c = 16; + for (i=0; i<c; i++) { + newValue[i] = data[shiftMapping[i]]; + } + for (i=0; i<c; i++) { + data[i] = newValue[i]; + } + }, + + //----------------------------------------------------------------------------- +/* + 'mixColumnsWithValues': function(someValues) { + var result; + var a; + var i,c; + + c = 4; + result = []; + a = []; + for (i=0; i<c; i++) { + a[i] = []; + a[i][1] = someValues[i] + if ((a[i][1] & 0x80) == 0x80) { + a[i][2] = (a[i][1] << 1) ^ 0x11b; + } else { + a[i][2] = a[i][1] << 1; + } + + a[i][3] = a[i][2] ^ a[i][1]; + } + + for (i=0; i<c; i++) { + var x; + + x = Clipperz.Crypto.AES_2.mixColumnsMatrix()[i]; + result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]]; + } + + return result; + }, + + 'mixColumns': function() { + // a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation. + var data; + var i, c; + + data = this.data(); + c = 4; + for(i=0; i<c; i++) { + var blockIndex; + var mixedValues; + + blockIndex = i * 4; + mixedValues = this.mixColumnsWithValues([ data[blockIndex + 0], + data[blockIndex + 1], + data[blockIndex + 2], + data[blockIndex + 3]]); + data[blockIndex + 0] = mixedValues[0]; + data[blockIndex + 1] = mixedValues[1]; + data[blockIndex + 2] = mixedValues[2]; + data[blockIndex + 3] = mixedValues[3]; + } + }, +*/ + + 'mixColumns': function() { + // a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation. + var data; + var i, c; + var a_1; + var a_2; + + a_1 = new Array(4); + a_2 = new Array(4); + + data = this.data(); + c = 4; + for(i=0; i<c; i++) { + var blockIndex; + var ii, cc; + + blockIndex = i * 4; + + cc = 4; + for (ii=0; ii<cc; ii++) { + var value; + + value = data[blockIndex + ii]; + a_1[ii] = value; + a_2[ii] = (value & 0x80) ? ((value << 1) ^ 0x011b) : (value << 1); + } + + data[blockIndex + 0] = a_2[0] ^ a_1[1] ^ a_2[1] ^ a_1[2] ^ a_1[3]; + data[blockIndex + 1] = a_1[0] ^ a_2[1] ^ a_1[2] ^ a_2[2] ^ a_1[3]; + data[blockIndex + 2] = a_1[0] ^ a_1[1] ^ a_2[2] ^ a_1[3] ^ a_2[3]; + data[blockIndex + 3] = a_1[0] ^ a_2[0] ^ a_1[1] ^ a_1[2] ^ a_2[3]; + } + }, + + //========================================================================= + + 'spinRound': function(aRoundNumber) { + this.addRoundKey(aRoundNumber); + this.subBytes(); + this.shiftRows(); + this.mixColumns(); + }, + + 'spinLastRound': function() { + this.addRoundKey(this.key().numberOfRounds() - 1); + this.subBytes(); + this.shiftRows(); + this.addRoundKey(this.key().numberOfRounds()); + }, + + //========================================================================= + + 'encrypt': function() { + var i,c; + + c = this.key().numberOfRounds() - 1; + for (i=0; i<c; i++) { + this.spinRound(i); + } + + this.spinLastRound(); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Crypto.AES_2.VERSION = "0.1"; +Clipperz.Crypto.AES_2.NAME = "Clipperz.Crypto.AES_2"; + +MochiKit.Base.update(Clipperz.Crypto.AES_2, { + +// http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-AES.html +// http://en.wikipedia.org/wiki/Advanced_Encryption_Standard +// http://en.wikipedia.org/wiki/Rijndael_key_schedule +// http://en.wikipedia.org/wiki/Rijndael_S-box + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + 'toString': function () { + return this.__repr__(); + }, + + //============================================================================= + + '_sbox': null, + 'sbox': function() { + if (Clipperz.Crypto.AES_2._sbox == null) { + Clipperz.Crypto.AES_2._sbox = [ +0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, +0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, +0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, +0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, +0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, +0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, +0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, +0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, +0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, +0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, +0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, +0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, +0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, +0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, +0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, +0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + ]; + } + + return Clipperz.Crypto.AES_2._sbox; + }, + + //----------------------------------------------------------------------------- + // + // 0 4 8 12 0 4 8 12 + // 1 5 9 13 => 5 9 13 1 + // 2 6 10 14 10 14 2 6 + // 3 7 11 15 15 3 7 11 + // + '_shiftRowMapping': null, + 'shiftRowMapping': function() { + if (Clipperz.Crypto.AES_2._shiftRowMapping == null) { + Clipperz.Crypto.AES_2._shiftRowMapping = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; + } + + return Clipperz.Crypto.AES_2._shiftRowMapping; + }, + + //----------------------------------------------------------------------------- + + '_mixColumnsMatrix': null, + 'mixColumnsMatrix': function() { + if (Clipperz.Crypto.AES_2._mixColumnsMatrix == null) { + Clipperz.Crypto.AES_2._mixColumnsMatrix = [ [2, 3, 1 ,1], + [1, 2, 3, 1], + [1, 1, 2, 3], + [3, 1, 1, 2] ]; + } + + return Clipperz.Crypto.AES_2._mixColumnsMatrix; + }, + + '_roundConstants': null, + 'roundConstants': function() { + if (Clipperz.Crypto.AES_2._roundConstants == null) { + Clipperz.Crypto.AES_2._roundConstants = [ , 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154]; +// Clipperz.Crypto.AES_2._roundConstants = [ , 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a]; + } + + return Clipperz.Crypto.AES_2._roundConstants; + }, + + //============================================================================= + + 'incrementNonce': function(nonce) { + var i; + var done; + + done = false; + i = nonce.length - 1; + + while ((i>=0) && (done == false)) { + var currentByteValue; + + currentByteValue = nonce[i]; + + if (currentByteValue == 0xff) { + nonce[i] = 0; + if (i>= 0) { + i --; + } else { + done = true; + } + } else { + nonce[i] = currentByteValue + 1; + done = true; + } + } + }, + + //----------------------------------------------------------------------------- + + 'encryptBlock': function(aKey, aBlock) { + var result; + var state; + + state = new Clipperz.Crypto.AES_2.State({block:aBlock, key:aKey}); +//is(state.data(), 'before'); + state.encrypt(); + result = state.data(); + + return result; + }, + + //----------------------------------------------------------------------------- + + 'encryptBlocks': function(aKey, aMessage, aNonce) { + var result; + var nonce; + var self; + var messageIndex; + var messageLength; + var blockSize; + + self = Clipperz.Crypto.AES_2; + blockSize = 128/8; + messageLength = aMessage.length; + nonce = aNonce; + + result = aMessage; + messageIndex = 0; + while (messageIndex < messageLength) { + var encryptedBlock; + var i,c; + + encryptedBlock = self.encryptBlock(aKey, nonce); + + if ((messageLength - messageIndex) > blockSize) { + c = blockSize; + } else { + c = messageLength - messageIndex; + } + + for (i=0; i<c; i++) { + result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i]; + } + + messageIndex += blockSize; +// nonce = self.incrementNonce(nonce); + self.incrementNonce(nonce) + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'encrypt': function(aKey, someData, aNonce) { + var result; + var nonce; + var encryptedData; + var key; + + key = new Clipperz.Crypto.AES_2.Key({key:aKey}); + nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8); + + encryptedData = Clipperz.Crypto.AES_2.encryptBlocks(key, someData.arrayValues(), nonce.arrayValues()); + + result = nonce.appendBytes(encryptedData); + + return result; + }, + + //----------------------------------------------------------------------------- + + 'decrypt': function(aKey, someData) { + var result; + var nonce; + var encryptedData; + var decryptedData; + var dataIterator; + var key; + + key = new Clipperz.Crypto.AES_2.Key({key:aKey}); + + encryptedData = someData.arrayValues(); + nonce = encryptedData.slice(0, (128/8)); + encryptedData = encryptedData.slice(128/8); + decryptedData = Clipperz.Crypto.AES_2.encryptBlocks(key, encryptedData, nonce); + + result = new Clipperz.ByteArray(decryptedData); + + return result; + }, + + //============================================================================= + + 'deferredEncryptExecutionChunk': function(anExecutionContext) { + var result; + var nonce; + var self; + var messageIndex; + var messageLength; + var blockSize; + var executionLimit; + var startTime, endTime; + + self = Clipperz.Crypto.AES_2; + startTime = new Date(); + blockSize = 128/8; + messageLength = anExecutionContext.messageArray().length; + nonce = anExecutionContext.nonceArray(); + result = anExecutionContext.resultArray(); + + messageIndex = anExecutionContext.executionStep(); + executionLimit = messageIndex + anExecutionContext.elaborationChunkSize(); + executionLimit = Math.min(executionLimit, messageLength); + + while (messageIndex < executionLimit) { + var encryptedBlock; + var i,c; + +//console.log("+++ nonce: [" + nonce + "]") + encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce); + + if ((executionLimit - messageIndex) > blockSize) { + c = blockSize; + } else { + c = executionLimit - messageIndex; + } + + for (i=0; i<c; i++) { + result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i]; + } + + messageIndex += blockSize; +// nonce = self.incrementNonce(nonce); + self.incrementNonce(nonce); + } + anExecutionContext.setExecutionStep(messageIndex); + endTime = new Date(); + anExecutionContext.tuneExecutionParameters(endTime - startTime); + + return anExecutionContext; + }, + + //----------------------------------------------------------------------------- + + 'deferredEncryptBlocks': function(anExecutionContext) { + var deferredResult; + +//console.log("executionContext", anExecutionContext) +//console.log(" --- nonce: " + anExecutionContext.nonceArray()) + if (! anExecutionContext.isDone()) { + deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES_2.deferredEncryptBloks", [ + Clipperz.Crypto.AES_2.deferredEncryptExecutionChunk, + MochiKit.Base.method(anExecutionContext, 'pause'), + Clipperz.Crypto.AES_2.deferredEncryptBlocks + ], {trace:false}, anExecutionContext); + } else { + deferredResult = MochiKit.Async.succeed(anExecutionContext); + } + + return deferredResult; + }, + + //----------------------------------------------------------------------------- + + 'deferredEncrypt': function(aKey, someData, aNonce) { + var deferredResult; + var executionContext; + var result; + var nonce; + var key; + + key = new Clipperz.Crypto.AES_2.Key({key:aKey}); + nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8); + + executionContext = new Clipperz.Crypto.AES_2.DeferredExecutionContext({key:key, message:someData, nonce:nonce}); + + deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt"); + deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredEncryptBlocks); + deferredResult.addCallback(function(anExecutionContext) { + var result; + + result = anExecutionContext.nonce().clone(); + result.appendBytes(anExecutionContext.resultArray()); + + return result; + }); + deferredResult.callback(executionContext) + + return deferredResult; + }, + + //----------------------------------------------------------------------------- + + 'deferredDecrypt': function(aKey, someData) { + var deferredResult + var nonce; + var message; + var key; + + key = new Clipperz.Crypto.AES_2.Key({key:aKey}); + nonce = someData.split(0, (128/8)); +//console.log("nonce: [" + nonce.arrayValues() + "]") + message = someData.split(128/8); +//console.log("message: [" + message.arrayValues() + "]") + executionContext = new Clipperz.Crypto.AES_2.DeferredExecutionContext({key:key, message:message, nonce:nonce}); + + deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt"); + deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredEncryptBlocks); + deferredResult.addCallback(function(anExecutionContext) { + return anExecutionContext.result(); + }); + deferredResult.callback(executionContext); + + return deferredResult; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# + +//Clipperz.Crypto.AES_2.DeferredExecution = { +// 'chunkSize': 16384, // 4096, // 1024 4096 8192 16384 32768; +// 'pauseTime': 0.02 // 0.2 +//} + +Clipperz.Crypto.AES_2.exception = { + 'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES_2.exception.UnsupportedKeySize") +}; diff --git a/frontend/delta/js/Clipperz/Crypto/Base.js b/frontend/delta/js/Clipperz/Crypto/Base.js new file mode 100644 index 0000000..9acfc49 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/Base.js @@ -0,0 +1,1847 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.Base) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.Base depends on Clipperz.Base!"; +} + +if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } +if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; } + +Clipperz.Crypto.Base.VERSION = "0.1"; +Clipperz.Crypto.Base.NAME = "Clipperz.Crypto.Base"; + +//############################################################################# +// Downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip (jsSha2/sha256.js) +//############################################################################# + +/* A JavaScript implementation of the Secure Hash Algorithm, SHA-256 + * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/ + * Distributed under the BSD License + * Some bits taken from Paul Johnston's SHA-1 implementation + */ +var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ +function safe_add (x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} +function S (X, n) {return ( X >>> n ) | (X << (32 - n));} +function R (X, n) {return ( X >>> n );} +function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));} +function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));} +function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));} +function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));} +function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));} +function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));} +function core_sha256 (m, l) { + var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2); + var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19); + var W = new Array(64); + var a, b, c, d, e, f, g, h, i, j; + var T1, T2; + /* append padding */ + m[l >> 5] |= 0x80 << (24 - l % 32); + m[((l + 64 >> 9) << 4) + 15] = l; + for ( var i = 0; i<m.length; i+=16 ) { + a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7]; + for ( var j = 0; j<64; j++) { + if (j < 16) W[j] = m[j + i]; + else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]); + T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]); + T2 = safe_add(Sigma0256(a), Maj(a, b, c)); + h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2); + } + HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]); + } + return HASH; +} +function str2binb (str) { + var bin = Array(); + var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32); + return bin; +} +function binb2hex (binarray) { + var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for (var i = 0; i < binarray.length * 4; i++) { + str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF); + } + return str; +} +function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));} + + + +//############################################################################# +// Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (entropy.js) +//############################################################################# + + // Entropy collection utilities + + /* Start by declaring static storage and initialise + the entropy vector from the time we come through + here. */ + + var entropyData = new Array(); // Collected entropy data + var edlen = 0; // Keyboard array data length + + addEntropyTime(); // Start entropy collection with page load time + ce(); // Roll milliseconds into initial entropy + + // Add a byte to the entropy vector + + function addEntropyByte(b) { + entropyData[edlen++] = b; + } + + /* Capture entropy. When the user presses a key or performs + various other events for which we can request + notification, add the time in 255ths of a second to the + entropyData array. The name of the function is short + so it doesn't bloat the form object declarations in + which it appears in various "onXXX" events. */ + + function ce() { + addEntropyByte(Math.floor((((new Date).getMilliseconds()) * 255) / 999)); + } + + // Add a 32 bit quantity to the entropy vector + + function addEntropy32(w) { + var i; + + for (i = 0; i < 4; i++) { + addEntropyByte(w & 0xFF); + w >>= 8; + } + } + + /* Add the current time and date (milliseconds since the epoch, + truncated to 32 bits) to the entropy vector. */ + + function addEntropyTime() { + addEntropy32((new Date()).getTime()); + } + + /* Start collection of entropy from mouse movements. The + argument specifies the number of entropy items to be + obtained from mouse motion, after which mouse motion + will be ignored. Note that you can re-enable mouse + motion collection at any time if not already underway. */ + + var mouseMotionCollect = 0; + var oldMoveHandler; // For saving and restoring mouse move handler in IE4 + + function mouseMotionEntropy(maxsamp) { + if (mouseMotionCollect <= 0) { + mouseMotionCollect = maxsamp; + if ((document.implementation.hasFeature("Events", "2.0")) && + document.addEventListener) { + // Browser supports Document Object Model (DOM) 2 events + document.addEventListener("mousemove", mouseMoveEntropy, false); + } else { + if (document.attachEvent) { + // Internet Explorer 5 and above event model + document.attachEvent("onmousemove", mouseMoveEntropy); + } else { + // Internet Explorer 4 event model + oldMoveHandler = document.onmousemove; + document.onmousemove = mouseMoveEntropy; + } + } +//dump("Mouse enable", mouseMotionCollect); + } + } + + /* Collect entropy from mouse motion events. Note that + this is craftily coded to work with either DOM2 or Internet + Explorer style events. Note that we don't use every successive + mouse movement event. Instead, we XOR the three bytes collected + from the mouse and use that to determine how many subsequent + mouse movements we ignore before capturing the next one. */ + + var mouseEntropyTime = 0; // Delay counter for mouse entropy collection + + function mouseMoveEntropy(e) { + if (!e) { + e = window.event; // Internet Explorer event model + } + if (mouseMotionCollect > 0) { + if (mouseEntropyTime-- <= 0) { + addEntropyByte(e.screenX & 0xFF); + addEntropyByte(e.screenY & 0xFF); + ce(); + mouseMotionCollect--; + mouseEntropyTime = (entropyData[edlen - 3] ^ entropyData[edlen - 2] ^ + entropyData[edlen - 1]) % 19; +//dump("Mouse Move", byteArrayToHex(entropyData.slice(-3))); + } + if (mouseMotionCollect <= 0) { + if (document.removeEventListener) { + document.removeEventListener("mousemove", mouseMoveEntropy, false); + } else if (document.detachEvent) { + document.detachEvent("onmousemove", mouseMoveEntropy); + } else { + document.onmousemove = oldMoveHandler; + } +//dump("Spung!", 0); + } + } + } + + /* Compute a 32 byte key value from the entropy vector. + We compute the value by taking the MD5 sum of the even + and odd bytes respectively of the entropy vector, then + concatenating the two MD5 sums. */ + + function keyFromEntropy() { + var i, k = new Array(32); + + if (edlen == 0) { + alert("Blooie! Entropy vector void at call to keyFromEntropy."); + } +//dump("Entropy bytes", edlen); + + md5_init(); + for (i = 0; i < edlen; i += 2) { + md5_update(entropyData[i]); + } + md5_finish(); + for (i = 0; i < 16; i++) { + k[i] = digestBits[i]; + } + + md5_init(); + for (i = 1; i < edlen; i += 2) { + md5_update(entropyData[i]); + } + md5_finish(); + for (i = 0; i < 16; i++) { + k[i + 16] = digestBits[i]; + } + +//dump("keyFromEntropy", byteArrayToHex(k)); + return k; + } + +//############################################################################# +// Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aesprng.js) +//############################################################################# + + + // AES based pseudorandom number generator + + /* Constructor. Called with an array of 32 byte (0-255) values + containing the initial seed. */ + + function AESprng(seed) { + this.key = new Array(); + this.key = seed; + this.itext = hexToByteArray("9F489613248148F9C27945C6AE62EECA3E3367BB14064E4E6DC67A9F28AB3BD1"); + this.nbytes = 0; // Bytes left in buffer + + this.next = AESprng_next; + this.nextbits = AESprng_nextbits; + this.nextInt = AESprng_nextInt; + this.round = AESprng_round; + + /* Encrypt the initial text with the seed key + three times, feeding the output of the encryption + back into the key for the next round. */ + + bsb = blockSizeInBits; + blockSizeInBits = 256; + var i, ct; + for (i = 0; i < 3; i++) { + this.key = rijndaelEncrypt(this.itext, this.key, "ECB"); + } + + /* Now make between one and four additional + key-feedback rounds, with the number determined + by bits from the result of the first three + rounds. */ + + var n = 1 + (this.key[3] & 2) + (this.key[9] & 1); + for (i = 0; i < n; i++) { + this.key = rijndaelEncrypt(this.itext, this.key, "ECB"); + } + blockSizeInBits = bsb; + } + + function AESprng_round() { + bsb = blockSizeInBits; + blockSizeInBits = 256; + this.key = rijndaelEncrypt(this.itext, this.key, "ECB"); + this.nbytes = 32; + blockSizeInBits = bsb; + } + + // Return next byte from the generator + + function AESprng_next() { + if (this.nbytes <= 0) { + this.round(); + } + return(this.key[--this.nbytes]); + } + + // Return n bit integer value (up to maximum integer size) + + function AESprng_nextbits(n) { + var i, w = 0, nbytes = Math.floor((n + 7) / 8); + + for (i = 0; i < nbytes; i++) { + w = (w << 8) | this.next(); + } + return w & ((1 << n) - 1); + } + + // Return integer between 0 and n inclusive + + function AESprng_nextInt(n) { + var p = 1, nb = 0; + + // Determine smallest p, 2^p > n + // nb = log_2 p + + while (n >= p) { + p <<= 1; + nb++; + } + p--; + + /* Generate values from 0 through n by first generating + values v from 0 to (2^p)-1, then discarding any results v > n. + For the rationale behind this (and why taking + values mod (n + 1) is biased toward smaller values, see + Ferguson and Schneier, "Practical Cryptography", + ISBN 0-471-22357-3, section 10.8). */ + + while (true) { + var v = this.nextbits(nb) & p; + + if (v <= n) { + return v; + } + } + } + +//############################################################################# +// Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (md5.js) +//############################################################################# + +/* + * md5.jvs 1.0b 27/06/96 + * + * Javascript implementation of the RSA Data Security, Inc. MD5 + * Message-Digest Algorithm. + * + * Copyright (c) 1996 Henri Torgemane. All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this software + * and its documentation for any purposes and without + * fee is hereby granted provided that this copyright notice + * appears in all copies. + * + * Of course, this soft is provided "as is" without express or implied + * warranty of any kind. + + This version contains some trivial reformatting modifications + by John Walker. + + */ + +function array(n) { + for (i = 0; i < n; i++) { + this[i] = 0; + } + this.length = n; +} + +/* Some basic logical functions had to be rewritten because of a bug in + * Javascript.. Just try to compute 0xffffffff >> 4 with it.. + * Of course, these functions are slower than the original would be, but + * at least, they work! + */ + +function integer(n) { + return n % (0xffffffff + 1); +} + +function shr(a, b) { + a = integer(a); + b = integer(b); + if (a - 0x80000000 >= 0) { + a = a % 0x80000000; + a >>= b; + a += 0x40000000 >> (b - 1); + } else { + a >>= b; + } + return a; +} + +function shl1(a) { + a = a % 0x80000000; + if (a & 0x40000000 == 0x40000000) { + a -= 0x40000000; + a *= 2; + a += 0x80000000; + } else { + a *= 2; + } + return a; +} + +function shl(a, b) { + a = integer(a); + b = integer(b); + for (var i = 0; i < b; i++) { + a = shl1(a); + } + return a; +} + +function and(a, b) { + a = integer(a); + b = integer(b); + var t1 = a - 0x80000000; + var t2 = b - 0x80000000; + if (t1 >= 0) { + if (t2 >= 0) { + return ((t1 & t2) + 0x80000000); + } else { + return (t1 & b); + } + } else { + if (t2 >= 0) { + return (a & t2); + } else { + return (a & b); + } + } +} + +function or(a, b) { + a = integer(a); + b = integer(b); + var t1 = a - 0x80000000; + var t2 = b - 0x80000000; + if (t1 >= 0) { + if (t2 >= 0) { + return ((t1 | t2) + 0x80000000); + } else { + return ((t1 | b) + 0x80000000); + } + } else { + if (t2 >= 0) { + return ((a | t2) + 0x80000000); + } else { + return (a | b); + } + } +} + +function xor(a, b) { + a = integer(a); + b = integer(b); + var t1 = a - 0x80000000; + var t2 = b - 0x80000000; + if (t1 >= 0) { + if (t2 >= 0) { + return (t1 ^ t2); + } else { + return ((t1 ^ b) + 0x80000000); + } + } else { + if (t2 >= 0) { + return ((a ^ t2) + 0x80000000); + } else { + return (a ^ b); + } + } +} + +function not(a) { + a = integer(a); + return 0xffffffff - a; +} + +/* Here begin the real algorithm */ + +var state = new array(4); +var count = new array(2); + count[0] = 0; + count[1] = 0; +var buffer = new array(64); +var transformBuffer = new array(16); +var digestBits = new array(16); + +var S11 = 7; +var S12 = 12; +var S13 = 17; +var S14 = 22; +var S21 = 5; +var S22 = 9; +var S23 = 14; +var S24 = 20; +var S31 = 4; +var S32 = 11; +var S33 = 16; +var S34 = 23; +var S41 = 6; +var S42 = 10; +var S43 = 15; +var S44 = 21; + +function F(x, y, z) { + return or(and(x, y), and(not(x), z)); +} + +function G(x, y, z) { + return or(and(x, z), and(y, not(z))); +} + +function H(x, y, z) { + return xor(xor(x, y), z); +} + +function I(x, y, z) { + return xor(y ,or(x , not(z))); +} + +function rotateLeft(a, n) { + return or(shl(a, n), (shr(a, (32 - n)))); +} + +function FF(a, b, c, d, x, s, ac) { + a = a + F(b, c, d) + x + ac; + a = rotateLeft(a, s); + a = a + b; + return a; +} + +function GG(a, b, c, d, x, s, ac) { + a = a + G(b, c, d) + x + ac; + a = rotateLeft(a, s); + a = a + b; + return a; +} + +function HH(a, b, c, d, x, s, ac) { + a = a + H(b, c, d) + x + ac; + a = rotateLeft(a, s); + a = a + b; + return a; +} + +function II(a, b, c, d, x, s, ac) { + a = a + I(b, c, d) + x + ac; + a = rotateLeft(a, s); + a = a + b; + return a; +} + +function transform(buf, offset) { + var a = 0, b = 0, c = 0, d = 0; + var x = transformBuffer; + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + + for (i = 0; i < 16; i++) { + x[i] = and(buf[i * 4 + offset], 0xFF); + for (j = 1; j < 4; j++) { + x[i] += shl(and(buf[i * 4 + j + offset] ,0xFF), j * 8); + } + } + + /* Round 1 */ + a = FF( a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + d = FF( d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + c = FF( c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + b = FF( b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + a = FF( a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + d = FF( d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + c = FF( c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + b = FF( b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + a = FF( a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + d = FF( d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + c = FF( c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + b = FF( b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + a = FF( a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + d = FF( d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + c = FF( c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + b = FF( b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + a = GG( a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + d = GG( d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + c = GG( c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + b = GG( b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + a = GG( a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + d = GG( d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + c = GG( c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + b = GG( b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + a = GG( a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + d = GG( d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + c = GG( c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + b = GG( b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + a = GG( a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + d = GG( d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + c = GG( c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + b = GG( b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + a = HH( a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + d = HH( d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + c = HH( c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + b = HH( b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + a = HH( a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + d = HH( d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + c = HH( c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + b = HH( b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + a = HH( a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + d = HH( d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + c = HH( c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + b = HH( b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + a = HH( a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + d = HH( d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + c = HH( c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + b = HH( b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + a = II( a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + d = II( d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + c = II( c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + b = II( b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + a = II( a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + d = II( d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + c = II( c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + b = II( b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + a = II( a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + d = II( d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + c = II( c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + b = II( b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + a = II( a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + d = II( d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + c = II( c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + b = II( b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + +} + +function md5_init() { + count[0] = count[1] = 0; + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; + for (i = 0; i < digestBits.length; i++) { + digestBits[i] = 0; + } +} + +function md5_update(b) { + var index, i; + + index = and(shr(count[0],3) , 0x3F); + if (count[0] < 0xFFFFFFFF - 7) { + count[0] += 8; + } else { + count[1]++; + count[0] -= 0xFFFFFFFF + 1; + count[0] += 8; + } + buffer[index] = and(b, 0xff); + if (index >= 63) { + transform(buffer, 0); + } +} + +function md5_finish() { + var bits = new array(8); + var padding; + var i = 0, index = 0, padLen = 0; + + for (i = 0; i < 4; i++) { + bits[i] = and(shr(count[0], (i * 8)), 0xFF); + } + for (i = 0; i < 4; i++) { + bits[i + 4] = and(shr(count[1], (i * 8)), 0xFF); + } + index = and(shr(count[0], 3), 0x3F); + padLen = (index < 56) ? (56 - index) : (120 - index); + padding = new array(64); + padding[0] = 0x80; + for (i = 0; i < padLen; i++) { + md5_update(padding[i]); + } + for (i = 0; i < 8; i++) { + md5_update(bits[i]); + } + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + digestBits[i * 4 + j] = and(shr(state[i], (j * 8)) , 0xFF); + } + } +} + +/* End of the MD5 algorithm */ + +//############################################################################# +// Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aes.js) +//############################################################################# + + +/* rijndael.js Rijndael Reference Implementation + + This is a modified version of the software described below, + produced in September 2003 by John Walker for use in the + JavsScrypt browser-based encryption package. The principal + changes are replacing the original getRandomBytes function with + one which calls our pseudorandom generator (which must + be instantiated and seeded before the first call on getRandomBytes), + and changing keySizeInBits to 256. Some code not required by the + JavsScrypt application has been commented out. Please see + http://www.fourmilab.ch/javascrypt/ for further information on + JavaScrypt. + + The following is the original copyright and application + information. + + Copyright (c) 2001 Fritz Schneider + + This software is provided as-is, without express or implied warranty. + Permission to use, copy, modify, distribute or sell this software, with or + without fee, for any purpose and by any individual or organization, is hereby + granted, provided that the above copyright notice and this paragraph appear + in all copies. Distribution as a part of an application or binary must + include the above copyright notice in the documentation and/or other materials + provided with the application or distribution. + + As the above disclaimer notes, you are free to use this code however you + want. However, I would request that you send me an email + (fritz /at/ cs /dot/ ucsd /dot/ edu) to say hi if you find this code useful + or instructional. Seeing that people are using the code acts as + encouragement for me to continue development. If you *really* want to thank + me you can buy the book I wrote with Thomas Powell, _JavaScript: + _The_Complete_Reference_ :) + + This code is an UNOPTIMIZED REFERENCE implementation of Rijndael. + If there is sufficient interest I can write an optimized (word-based, + table-driven) version, although you might want to consider using a + compiled language if speed is critical to your application. As it stands, + one run of the monte carlo test (10,000 encryptions) can take up to + several minutes, depending upon your processor. You shouldn't expect more + than a few kilobytes per second in throughput. + + Also note that there is very little error checking in these functions. + Doing proper error checking is always a good idea, but the ideal + implementation (using the instanceof operator and exceptions) requires + IE5+/NS6+, and I've chosen to implement this code so that it is compatible + with IE4/NS4. + + And finally, because JavaScript doesn't have an explicit byte/char data + type (although JavaScript 2.0 most likely will), when I refer to "byte" + in this code I generally mean "32 bit integer with value in the interval + [0,255]" which I treat as a byte. + + See http://www-cse.ucsd.edu/~fritz/rijndael.html for more documentation + of the (very simple) API provided by this code. + + Fritz Schneider + fritz at cs.ucsd.edu + +*/ + + +// Rijndael parameters -- Valid values are 128, 192, or 256 + +var keySizeInBits = 256; +var blockSizeInBits = 128; + +// +// Note: in the following code the two dimensional arrays are indexed as +// you would probably expect, as array[row][column]. The state arrays +// are 2d arrays of the form state[4][Nb]. + + +// The number of rounds for the cipher, indexed by [Nk][Nb] +var roundsArray = [ ,,,,[,,,,10,, 12,, 14],, + [,,,,12,, 12,, 14],, + [,,,,14,, 14,, 14] ]; + +// The number of bytes to shift by in shiftRow, indexed by [Nb][row] +var shiftOffsets = [ ,,,,[,1, 2, 3],,[,1, 2, 3],,[,1, 3, 4] ]; + +// The round constants used in subkey expansion +var Rcon = [ +0x01, 0x02, 0x04, 0x08, 0x10, 0x20, +0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, +0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, +0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, +0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ]; + +// Precomputed lookup table for the SBox +var SBox = [ + 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, +118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, +114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, +216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, +235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, +179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, +190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, +249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, +188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, +23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, +144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, + 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, +141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, + 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, +181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, +248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, +140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, + 22 ]; + +// Precomputed lookup table for the inverse SBox +var SBoxInverse = [ + 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, +251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, +233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, +250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, +109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, +204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, + 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, +228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, +193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, +234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, + 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, + 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, +198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, + 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, +127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, +224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, + 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, +125 ]; + +// This method circularly shifts the array left by the number of elements +// given in its parameter. It returns the resulting array and is used for +// the ShiftRow step. Note that shift() and push() could be used for a more +// elegant solution, but they require IE5.5+, so I chose to do it manually. + +function cyclicShiftLeft(theArray, positions) { + var temp = theArray.slice(0, positions); + theArray = theArray.slice(positions).concat(temp); + return theArray; +} + +// Cipher parameters ... do not change these +var Nk = keySizeInBits / 32; +var Nb = blockSizeInBits / 32; +var Nr = roundsArray[Nk][Nb]; + +// Multiplies the element "poly" of GF(2^8) by x. See the Rijndael spec. + +function xtime(poly) { + poly <<= 1; + return ((poly & 0x100) ? (poly ^ 0x11B) : (poly)); +} + +// Multiplies the two elements of GF(2^8) together and returns the result. +// See the Rijndael spec, but should be straightforward: for each power of +// the indeterminant that has a 1 coefficient in x, add y times that power +// to the result. x and y should be bytes representing elements of GF(2^8) + +function mult_GF256(x, y) { + var bit, result = 0; + + for (bit = 1; bit < 256; bit *= 2, y = xtime(y)) { + if (x & bit) + result ^= y; + } + return result; +} + +// Performs the substitution step of the cipher. State is the 2d array of +// state information (see spec) and direction is string indicating whether +// we are performing the forward substitution ("encrypt") or inverse +// substitution (anything else) + +function byteSub(state, direction) { + var S; + if (direction == "encrypt") // Point S to the SBox we're using + S = SBox; + else + S = SBoxInverse; + for (var i = 0; i < 4; i++) // Substitute for every byte in state + for (var j = 0; j < Nb; j++) + state[i][j] = S[state[i][j]]; +} + +// Performs the row shifting step of the cipher. + +function shiftRow(state, direction) { + for (var i=1; i<4; i++) // Row 0 never shifts + if (direction == "encrypt") + state[i] = cyclicShiftLeft(state[i], shiftOffsets[Nb][i]); + else + state[i] = cyclicShiftLeft(state[i], Nb - shiftOffsets[Nb][i]); + +} + +// Performs the column mixing step of the cipher. Most of these steps can +// be combined into table lookups on 32bit values (at least for encryption) +// to greatly increase the speed. + +function mixColumn(state, direction) { + var b = []; // Result of matrix multiplications + for (var j = 0; j < Nb; j++) { // Go through each column... + for (var i = 0; i < 4; i++) { // and for each row in the column... + if (direction == "encrypt") + b[i] = mult_GF256(state[i][j], 2) ^ // perform mixing + mult_GF256(state[(i+1)%4][j], 3) ^ + state[(i+2)%4][j] ^ + state[(i+3)%4][j]; + else + b[i] = mult_GF256(state[i][j], 0xE) ^ + mult_GF256(state[(i+1)%4][j], 0xB) ^ + mult_GF256(state[(i+2)%4][j], 0xD) ^ + mult_GF256(state[(i+3)%4][j], 9); + } + for (var i = 0; i < 4; i++) // Place result back into column + state[i][j] = b[i]; + } +} + +// Adds the current round key to the state information. Straightforward. + +function addRoundKey(state, roundKey) { + for (var j = 0; j < Nb; j++) { // Step through columns... + state[0][j] ^= (roundKey[j] & 0xFF); // and XOR + state[1][j] ^= ((roundKey[j]>>8) & 0xFF); + state[2][j] ^= ((roundKey[j]>>16) & 0xFF); + state[3][j] ^= ((roundKey[j]>>24) & 0xFF); + } +} + +// This function creates the expanded key from the input (128/192/256-bit) +// key. The parameter key is an array of bytes holding the value of the key. +// The returned value is an array whose elements are the 32-bit words that +// make up the expanded key. + +function keyExpansion(key) { + var expandedKey = new Array(); + var temp; + + // in case the key size or parameters were changed... + Nk = keySizeInBits / 32; + Nb = blockSizeInBits / 32; + Nr = roundsArray[Nk][Nb]; + + for (var j=0; j < Nk; j++) // Fill in input key first + expandedKey[j] = + (key[4*j]) | (key[4*j+1]<<8) | (key[4*j+2]<<16) | (key[4*j+3]<<24); + + // Now walk down the rest of the array filling in expanded key bytes as + // per Rijndael's spec + for (j = Nk; j < Nb * (Nr + 1); j++) { // For each word of expanded key + temp = expandedKey[j - 1]; + if (j % Nk == 0) + temp = ( (SBox[(temp>>8) & 0xFF]) | + (SBox[(temp>>16) & 0xFF]<<8) | + (SBox[(temp>>24) & 0xFF]<<16) | + (SBox[temp & 0xFF]<<24) ) ^ Rcon[Math.floor(j / Nk) - 1]; + else if (Nk > 6 && j % Nk == 4) + temp = (SBox[(temp>>24) & 0xFF]<<24) | + (SBox[(temp>>16) & 0xFF]<<16) | + (SBox[(temp>>8) & 0xFF]<<8) | + (SBox[temp & 0xFF]); + expandedKey[j] = expandedKey[j-Nk] ^ temp; + } + return expandedKey; +} + +// Rijndael's round functions... + +function Round(state, roundKey) { + byteSub(state, "encrypt"); + shiftRow(state, "encrypt"); + mixColumn(state, "encrypt"); + addRoundKey(state, roundKey); +} + +function InverseRound(state, roundKey) { + addRoundKey(state, roundKey); + mixColumn(state, "decrypt"); + shiftRow(state, "decrypt"); + byteSub(state, "decrypt"); +} + +function FinalRound(state, roundKey) { + byteSub(state, "encrypt"); + shiftRow(state, "encrypt"); + addRoundKey(state, roundKey); +} + +function InverseFinalRound(state, roundKey){ + addRoundKey(state, roundKey); + shiftRow(state, "decrypt"); + byteSub(state, "decrypt"); +} + +// encrypt is the basic encryption function. It takes parameters +// block, an array of bytes representing a plaintext block, and expandedKey, +// an array of words representing the expanded key previously returned by +// keyExpansion(). The ciphertext block is returned as an array of bytes. + +function encrypt(block, expandedKey) { + var i; + if (!block || block.length*8 != blockSizeInBits) + return; + if (!expandedKey) + return; + + block = packBytes(block); + addRoundKey(block, expandedKey); + for (i=1; i<Nr; i++) + Round(block, expandedKey.slice(Nb*i, Nb*(i+1))); + FinalRound(block, expandedKey.slice(Nb*Nr)); + return unpackBytes(block); +} + +// decrypt is the basic decryption function. It takes parameters +// block, an array of bytes representing a ciphertext block, and expandedKey, +// an array of words representing the expanded key previously returned by +// keyExpansion(). The decrypted block is returned as an array of bytes. + +function decrypt(block, expandedKey) { + var i; + if (!block || block.length*8 != blockSizeInBits) + return; + if (!expandedKey) + return; + + block = packBytes(block); + InverseFinalRound(block, expandedKey.slice(Nb*Nr)); + for (i = Nr - 1; i>0; i--) + InverseRound(block, expandedKey.slice(Nb*i, Nb*(i+1))); + addRoundKey(block, expandedKey); + return unpackBytes(block); +} + +/* !NEEDED +// This method takes a byte array (byteArray) and converts it to a string by +// applying String.fromCharCode() to each value and concatenating the result. +// The resulting string is returned. Note that this function SKIPS zero bytes +// under the assumption that they are padding added in formatPlaintext(). +// Obviously, do not invoke this method on raw data that can contain zero +// bytes. It is really only appropriate for printable ASCII/Latin-1 +// values. Roll your own function for more robust functionality :) + +function byteArrayToString(byteArray) { + var result = ""; + for(var i=0; i<byteArray.length; i++) + if (byteArray[i] != 0) + result += String.fromCharCode(byteArray[i]); + return result; +} +*/ + +// This function takes an array of bytes (byteArray) and converts them +// to a hexadecimal string. Array element 0 is found at the beginning of +// the resulting string, high nibble first. Consecutive elements follow +// similarly, for example [16, 255] --> "10ff". The function returns a +// string. + +function byteArrayToHex(byteArray) { + var result = ""; + if (!byteArray) + return; + for (var i=0; i<byteArray.length; i++) + result += ((byteArray[i]<16) ? "0" : "") + byteArray[i].toString(16); + + return result; +} + +// This function converts a string containing hexadecimal digits to an +// array of bytes. The resulting byte array is filled in the order the +// values occur in the string, for example "10FF" --> [16, 255]. This +// function returns an array. + +function hexToByteArray(hexString) { + var byteArray = []; + if (hexString.length % 2) // must have even length + return; + if (hexString.indexOf("0x") == 0 || hexString.indexOf("0X") == 0) + hexString = hexString.substring(2); + for (var i = 0; i<hexString.length; i += 2) + byteArray[Math.floor(i/2)] = parseInt(hexString.slice(i, i+2), 16); + return byteArray; +} + +// This function packs an array of bytes into the four row form defined by +// Rijndael. It assumes the length of the array of bytes is divisible by +// four. Bytes are filled in according to the Rijndael spec (starting with +// column 0, row 0 to 3). This function returns a 2d array. + +function packBytes(octets) { + var state = new Array(); + if (!octets || octets.length % 4) + return; + + state[0] = new Array(); state[1] = new Array(); + state[2] = new Array(); state[3] = new Array(); + for (var j=0; j<octets.length; j+= 4) { + state[0][j/4] = octets[j]; + state[1][j/4] = octets[j+1]; + state[2][j/4] = octets[j+2]; + state[3][j/4] = octets[j+3]; + } + return state; +} + +// This function unpacks an array of bytes from the four row format preferred +// by Rijndael into a single 1d array of bytes. It assumes the input "packed" +// is a packed array. Bytes are filled in according to the Rijndael spec. +// This function returns a 1d array of bytes. + +function unpackBytes(packed) { + var result = new Array(); + for (var j=0; j<packed[0].length; j++) { + result[result.length] = packed[0][j]; + result[result.length] = packed[1][j]; + result[result.length] = packed[2][j]; + result[result.length] = packed[3][j]; + } + return result; +} + +// This function takes a prospective plaintext (string or array of bytes) +// and pads it with pseudorandom bytes if its length is not a multiple of the block +// size. If plaintext is a string, it is converted to an array of bytes +// in the process. The type checking can be made much nicer using the +// instanceof operator, but this operator is not available until IE5.0 so I +// chose to use the heuristic below. + +function formatPlaintext(plaintext) { + var bpb = blockSizeInBits / 8; // bytes per block + var fillWithRandomBits; + var i; + + // if primitive string or String instance + if ((!((typeof plaintext == "object") && + ((typeof (plaintext[0])) == "number"))) && + ((typeof plaintext == "string") || plaintext.indexOf)) + { + plaintext = plaintext.split(""); + // Unicode issues here (ignoring high byte) + for (i=0; i<plaintext.length; i++) { + plaintext[i] = plaintext[i].charCodeAt(0) & 0xFF; + } + } + + i = plaintext.length % bpb; + if (i > 0) { +//alert("adding " + (bpb - 1) + " bytes"); +// plaintext = plaintext.concat(getRandomBytes(bpb - i)); + { + var paddingBytes; + var ii,cc; + + paddingBytes = new Array(); + cc = bpb - i; + for (ii=0; ii<cc; ii++) { + paddingBytes[ii] = cc; + } + +//is("cc", cc); +//is(getRandomBytes(bpb - i) + "", paddingBytes + ""); + plaintext = plaintext.concat(paddingBytes); + } + } + + return plaintext; +} + +// Returns an array containing "howMany" random bytes. + +function getRandomBytes(howMany) { + var i, bytes = new Array(); + +//alert("getting some random bytes"); + for (i = 0; i < howMany; i++) { + bytes[i] = prng.nextInt(255); + } + return bytes; +} + +// rijndaelEncrypt(plaintext, key, mode) +// Encrypts the plaintext using the given key and in the given mode. +// The parameter "plaintext" can either be a string or an array of bytes. +// The parameter "key" must be an array of key bytes. If you have a hex +// string representing the key, invoke hexToByteArray() on it to convert it +// to an array of bytes. The third parameter "mode" is a string indicating +// the encryption mode to use, either "ECB" or "CBC". If the parameter is +// omitted, ECB is assumed. +// +// An array of bytes representing the cihpertext is returned. To convert +// this array to hex, invoke byteArrayToHex() on it. + +function rijndaelEncrypt(plaintext, key, mode) { + var expandedKey, i, aBlock; + var bpb = blockSizeInBits / 8; // bytes per block + var ct; // ciphertext + + if (!plaintext || !key) + return; + if (key.length*8 != keySizeInBits) + return; + if (mode == "CBC") { + ct = getRandomBytes(bpb); // get IV +//dump("IV", byteArrayToHex(ct)); + } else { + mode = "ECB"; + ct = new Array(); + } + + // convert plaintext to byte array and pad with zeros if necessary. + plaintext = formatPlaintext(plaintext); + + expandedKey = keyExpansion(key); + + for (var block = 0; block < plaintext.length / bpb; block++) { + aBlock = plaintext.slice(block * bpb, (block + 1) * bpb); + if (mode == "CBC") { + for (var i = 0; i < bpb; i++) { + aBlock[i] ^= ct[(block * bpb) + i]; + } + } + ct = ct.concat(encrypt(aBlock, expandedKey)); + } + + return ct; +} + +// rijndaelDecrypt(ciphertext, key, mode) +// Decrypts the using the given key and mode. The parameter "ciphertext" +// must be an array of bytes. The parameter "key" must be an array of key +// bytes. If you have a hex string representing the ciphertext or key, +// invoke hexToByteArray() on it to convert it to an array of bytes. The +// parameter "mode" is a string, either "CBC" or "ECB". +// +// An array of bytes representing the plaintext is returned. To convert +// this array to a hex string, invoke byteArrayToHex() on it. To convert it +// to a string of characters, you can use byteArrayToString(). + +function rijndaelDecrypt(ciphertext, key, mode) { + var expandedKey; + var bpb = blockSizeInBits / 8; // bytes per block + var pt = new Array(); // plaintext array + var aBlock; // a decrypted block + var block; // current block number + + if (!ciphertext || !key || typeof ciphertext == "string") + return; + if (key.length*8 != keySizeInBits) + return; + if (!mode) { + mode = "ECB"; // assume ECB if mode omitted + } + + expandedKey = keyExpansion(key); + + // work backwards to accomodate CBC mode + for (block=(ciphertext.length / bpb)-1; block>0; block--) { + aBlock = + decrypt(ciphertext.slice(block*bpb,(block+1)*bpb), expandedKey); + if (mode == "CBC") + for (var i=0; i<bpb; i++) + pt[(block-1)*bpb + i] = aBlock[i] ^ ciphertext[(block-1)*bpb + i]; + else + pt = aBlock.concat(pt); + } + + // do last block if ECB (skips the IV in CBC) + if (mode == "ECB") + pt = decrypt(ciphertext.slice(0, bpb), expandedKey).concat(pt); + + return pt; +} + +//############################################################################# +// Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (utf-8.js) +//############################################################################# + + + /* Encoding and decoding of Unicode character strings as + UTF-8 byte streams. */ + + // UNICODE_TO_UTF8 -- Encode Unicode argument string as UTF-8 return value + + function unicode_to_utf8(s) { + var utf8 = ""; + + for (var n = 0; n < s.length; n++) { + var c = s.charCodeAt(n); + + if (c <= 0x7F) { + // 0x00 - 0x7F: Emit as single byte, unchanged + utf8 += String.fromCharCode(c); + } else if ((c >= 0x80) && (c <= 0x7FF)) { + // 0x80 - 0x7FF: Output as two byte code, 0xC0 in first byte + // 0x80 in second byte + utf8 += String.fromCharCode((c >> 6) | 0xC0); + utf8 += String.fromCharCode((c & 0x3F) | 0x80); + } else { + // 0x800 - 0xFFFF: Output as three bytes, 0xE0 in first byte + // 0x80 in second byte + // 0x80 in third byte + utf8 += String.fromCharCode((c >> 12) | 0xE0); + utf8 += String.fromCharCode(((c >> 6) & 0x3F) | 0x80); + utf8 += String.fromCharCode((c & 0x3F) | 0x80); + } + } + return utf8; + } + + // UTF8_TO_UNICODE -- Decode UTF-8 argument into Unicode string return value + + function utf8_to_unicode(utf8) { + var s = "", i = 0, b1, b2, b2; + + while (i < utf8.length) { + b1 = utf8.charCodeAt(i); + if (b1 < 0x80) { // One byte code: 0x00 0x7F + s += String.fromCharCode(b1); + i++; + } else if((b1 >= 0xC0) && (b1 < 0xE0)) { // Two byte code: 0x80 - 0x7FF + b2 = utf8.charCodeAt(i + 1); + s += String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F)); + i += 2; + } else { // Three byte code: 0x800 - 0xFFFF + b2 = utf8.charCodeAt(i + 1); + b3 = utf8.charCodeAt(i + 2); + s += String.fromCharCode(((b1 & 0xF) << 12) | + ((b2 & 0x3F) << 6) | + (b3 & 0x3F)); + i += 3; + } + } + return s; + } + + /* ENCODE_UTF8 -- Encode string as UTF8 only if it contains + a character of 0x9D (Unicode OPERATING + SYSTEM COMMAND) or a character greater + than 0xFF. This permits all strings + consisting exclusively of 8 bit + graphic characters to be encoded as + themselves. We choose 0x9D as the sentinel + character as opposed to one of the more + logical PRIVATE USE characters because 0x9D + is not overloaded by the regrettable + "Windows-1252" character set. Now such characters + don't belong in JavaScript strings, but you never + know what somebody is going to paste into a + text box, so this choice keeps Windows-encoded + strings from bloating to UTF-8 encoding. */ + + function encode_utf8(s) { + var i, necessary = false; + + for (i = 0; i < s.length; i++) { + if ((s.charCodeAt(i) == 0x9D) || + (s.charCodeAt(i) > 0xFF)) { + necessary = true; + break; + } + } + if (!necessary) { + return s; + } + return String.fromCharCode(0x9D) + unicode_to_utf8(s); + } + + /* DECODE_UTF8 -- Decode a string encoded with encode_utf8 + above. If the string begins with the + sentinel character 0x9D (OPERATING + SYSTEM COMMAND), then we decode the + balance as a UTF-8 stream. Otherwise, + the string is output unchanged, as + it's guaranteed to contain only 8 bit + characters excluding 0x9D. */ + + function decode_utf8(s) { + if ((s.length > 0) && (s.charCodeAt(0) == 0x9D)) { + return utf8_to_unicode(s.substring(1)); + } + return s; + } + + +//############################################################################# +// Downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js +//############################################################################# + +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +/* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ +var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ +var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ + +/* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ +function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} +function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} +function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));} +function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } +function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } +function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); } + +/* + * Perform a simple self-test to see if the VM is working + */ +function md5_vm_test() +{ + return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; +} + +/* + * Calculate the MD5 of an array of little-endian words, and a bit length + */ +function core_md5(x, len) +{ + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for(var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); + d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); + d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); + d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i+10], 17, -42063); + b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); + d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); + d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); + c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); + d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); + c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); + d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); + c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); + d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); + c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); + d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); + d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); + d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); + d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); + d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); + d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); + d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); + d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); + +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function md5_cmn(q, a, b, x, s, t) +{ + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); +} +function md5_ff(a, b, c, d, x, s, t) +{ + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5_gg(a, b, c, d, x, s, t) +{ + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5_hh(a, b, c, d, x, s, t) +{ + return md5_cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5_ii(a, b, c, d, x, s, t) +{ + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +/* + * Calculate the HMAC-MD5, of a key and some data + */ +function core_hmac_md5(key, data) +{ + var bkey = str2binl(key); + if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); + return core_md5(opad.concat(hash), 512 + 128); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) +{ + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function bit_rol(num, cnt) +{ + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* + * Convert a string to an array of little-endian words + * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. + */ +function str2binl(str) +{ + var bin = Array(); + var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); + return bin; +} + +/* + * Convert an array of little-endian words to a string + */ +function binl2str(bin) +{ + var str = ""; + var mask = (1 << chrsz) - 1; + for(var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); + return str; +} + +/* + * Convert an array of little-endian words to a hex string. + */ +function binl2hex(binarray) +{ + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i++) + { + str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); + } + return str; +} + +/* + * Convert an array of little-endian words to a base-64 string + */ +function binl2b64(binarray) +{ + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i += 3) + { + var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) + | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) + | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; + else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); + } + } + return str; +} + + +//############################################################################# +//############################################################################# +//############################################################################# + + + +MochiKit.Base.update(Clipperz.Crypto.Base, { + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + 'toString': function () { + return this.__repr__(); + }, + + //----------------------------------------------------------------------------- + + 'encryptUsingSecretKey': function (aKey, aMessage) { +//Clipperz.Profile.start("Clipperz.Crypto.Base.encryptUsingSecretKey"); + var result; + var plaintext; + var header; + var key; + + key = hexToByteArray(Clipperz.Crypto.Base.computeHashValue(aKey)); + + addEntropyTime(); + prng = new AESprng(keyFromEntropy()); + + plaintext = encode_utf8(aMessage); + + header = Clipperz.Base.byteArrayToString(hexToByteArray(Clipperz.Crypto.Base.computeMD5HashValue(plaintext))); + + // Add message length in bytes to header + i = plaintext.length; + header += String.fromCharCode(i >>> 24); + header += String.fromCharCode(i >>> 16); + header += String.fromCharCode(i >>> 8); + header += String.fromCharCode(i & 0xFF); + + // The format of the actual message passed to rijndaelEncrypt + // is: + // + // Bytes Content + // 0-15 MD5 signature of plaintext + // 16-19 Length of plaintext, big-endian order + // 20-end Plaintext + // + // Note that this message will be padded with zero bytes + // to an integral number of AES blocks (blockSizeInBits / 8). + // This does not include the initial vector for CBC + // encryption, which is added internally by rijndaelEncrypt. + result = byteArrayToHex(rijndaelEncrypt(header + plaintext, key, "CBC")); + + delete prng; + +//Clipperz.Profile.stop("Clipperz.Crypto.Base.encryptUsingSecretKey"); + return result; + }, + + //............................................................................. + + 'decryptUsingSecretKey': function (aKey, aMessage) { +//Clipperz.Profile.start("Clipperz.Crypto.Base.decryptUsingSecretKey"); + var key; + var decryptedText; + var textLength; + var header; + var headerDigest; + var plaintext; + var i; + + key = hexToByteArray(Clipperz.Crypto.Base.computeHashValue(aKey)); + + decryptedText = rijndaelDecrypt(hexToByteArray(aMessage), key, "CBC"); + + header = decryptedText.slice(0, 20); + decryptedText = decryptedText.slice(20); + + headerDigest = byteArrayToHex(header.slice(0,16)); + textLength = (header[16] << 24) | (header[17] << 16) | (header[18] << 8) | header[19]; + + if ((textLength < 0) || (textLength > decryptedText.length)) { +// jslog.warning("Message (length " + decryptedText.length + ") truncated. " + textLength + " characters expected."); + // Try to sauve qui peut by setting length to entire message + textLength = decryptedText.length; + } + + plainText = ""; + + for (i=0; i<textLength; i++) { + plainText += String.fromCharCode(decryptedText[i]); + } + + if (Clipperz.Crypto.Base.computeMD5HashValue(plainText) != headerDigest) { +// jslog.warning("Message corrupted. Checksum of decrypted message does not match."); + throw Clipperz.Crypto.Base.exception.CorruptedMessage; +// throw new Error("Message corrupted. Checksum of decrypted message does not match. Parsed result: " + decode_utf8(plainText)); + } + + // That's it; plug plaintext into the result field + + result = decode_utf8(plainText); + +//Clipperz.Profile.stop("Clipperz.Crypto.Base.decryptUsingSecretKey"); + return result; + }, + + //----------------------------------------------------------------------------- + + 'computeHashValue': function (aMessage) { +//Clipperz.Profile.start("Clipperz.Crypto.Base.computeHashValue"); + var result; + + result = hex_sha256(aMessage); +//Clipperz.Profile.stop("Clipperz.Crypto.Base.computeHashValue"); + + return result; + }, + + //......................................................................... + + 'computeMD5HashValue': function (aMessage) { + var result; +//Clipperz.Profile.start("Clipperz.Crypto.Base.computeMD5HashValue"); + result = hex_md5(aMessage); +//Clipperz.Profile.stop("Clipperz.Crypto.Base.computeMD5HashValue"); + + return result; + }, + + //----------------------------------------------------------------------------- + + 'generateRandomSeed': function () { +//Clipperz.Profile.start("Clipperz.Crypto.Base.generateRandomSeed"); + var result; + var seed; + var prng; + var charA; + var i; + + addEntropyTime(); + + seed = keyFromEntropy(); + prng = new AESprng(seed); + + result = ""; + charA = ("A").charCodeAt(0); + + for (i = 0; i < 64; i++) { + result += String.fromCharCode(charA + prng.nextInt(25)); + } + + delete prng; + + result = Clipperz.Crypto.Base.computeHashValue(result); + +//Clipperz.Profile.stop("Clipperz.Crypto.Base.generateRandomSeed"); + return result; + }, + + //----------------------------------------------------------------------------- + + 'exception': { + 'CorruptedMessage': new MochiKit.Base.NamedError("Clipperz.Crypto.Base.exception.CorruptedMessage") + }, + + //......................................................................... + __syntaxFix__: "syntax fix" +}); + diff --git a/frontend/delta/js/Clipperz/Crypto/BigInt.js b/frontend/delta/js/Clipperz/Crypto/BigInt.js new file mode 100644 index 0000000..031ed30 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/BigInt.js @@ -0,0 +1,1754 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } + +//############################################################################# +// Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js +//############################################################################# + + +//////////////////////////////////////////////////////////////////////////////////////// +// Big Integer Library v. 5.0 +// Created 2000, last modified 2006 +// Leemon Baird +// www.leemon.com +// +// This file is public domain. You can use it for any purpose without restriction. +// I do not guarantee that it is correct, so use it at your own risk. If you use +// it for something interesting, I'd appreciate hearing about it. If you find +// any bugs or make any improvements, I'd appreciate hearing about those too. +// It would also be nice if my name and address were left in the comments. +// But none of that is required. +// +// This code defines a bigInt library for arbitrary-precision integers. +// A bigInt is an array of integers storing the value in chunks of bpe bits, +// little endian (buff[0] is the least significant word). +// Negative bigInts are stored two's complement. +// Some functions assume their parameters have at least one leading zero element. +// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow, +// so the caller must make sure overflow won't happen. +// For each function where a parameter is modified, that same +// variable must not be used as another argument too. +// So, you cannot square x by doing multMod_(x,x,n). +// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n). +// +// These functions are designed to avoid frequent dynamic memory allocation in the inner loop. +// For most functions, if it needs a BigInt as a local variable it will actually use +// a global, and will only allocate to it when it's not the right size. This ensures +// that when a function is called repeatedly with same-sized parameters, it only allocates +// memory on the first call. +// +// Note that for cryptographic purposes, the calls to Math.random() must +// be replaced with calls to a better pseudorandom number generator. +// +// In the following, "bigInt" means a bigInt with at least one leading zero element, +// and "integer" means a nonnegative integer less than radix. In some cases, integer +// can be negative. Negative bigInts are 2s complement. +// +// The following functions do not modify their inputs, but dynamically allocate memory every time they are called: +// +// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95 +// function dup(x) //returns a copy of bigInt x +// function findPrimes(n) //return array of all primes less than integer n +// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements +// function int2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements +// function trim(x,k) //return a copy of x with exactly k leading zero elements +// +// The following functions do not modify their inputs, so there is never a problem with the result being too big: +// +// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros +// function equals(x,y) //is the bigInt x equal to the bigint y? +// function equalsInt(x,y) //is bigint x equal to integer y? +// function greater(x,y) //is x>y? (x and y are nonnegative bigInts) +// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y? +// function isZero(x) //is the bigInt x equal to zero? +// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)? +// function modInt(x,n) //return x mod n for bigInt x and integer n. +// function negative(x) //is bigInt x negative? +// +// The following functions do not modify their inputs, but allocate memory and call functions with underscores +// +// function add(x,y) //return (x+y) for bigInts x and y. +// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer. +// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed +// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null +// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n. +// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x. +// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. +// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n. +// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm. +// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement +// +// The following functions write a bigInt result to one of the parameters, but +// the result is never bigger than the original, so there can't be overflow problems: +// +// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder +// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). +// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement +// function mod_(x,n) //do x=x mod n for bigInts x and n. +// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. +// +// The following functions write a bigInt result to one of the parameters. The caller is responsible for +// ensuring it is large enough to hold the result. +// +// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer +// function add_(x,y) //do x=x+y for bigInts x and y +// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe)) +// function copy_(x,y) //do x=y on bigInts x and y +// function copyInt_(x,n) //do x=n on bigInt x and integer n +// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits. +// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r +// function eGCD_(x,y,d,a,b) //sets a,b,d to positive big integers such that d = GCD_(x,y) = a*x-b*y +// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist +// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse +// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe. +// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b +// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys +// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined) +// function mult_(x,y) //do x=x*y for bigInts x and y. +// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer. +// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n. +// function powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1. +// function randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1. +// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb. +// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n +// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement. +// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement. +// +// The following functions are based on algorithms from the _Handbook of Applied Cryptography_ +// powMod_() = algorithm 14.94, Montgomery exponentiation +// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_ +// GCD_() = algorothm 14.57, Lehmer's algorithm +// mont_() = algorithm 14.36, Montgomery multiplication +// divide_() = algorithm 14.20 Multiple-precision division +// squareMod_() = algorithm 14.16 Multiple-precision squaring +// randTruePrime_() = algorithm 4.62, Maurer's algorithm +// millerRabin() = algorithm 4.24, Miller-Rabin algorithm +// +// Profiling shows: +// randTruePrime_() spends: +// 10% of its time in calls to powMod_() +// 85% of its time in calls to millerRabin() +// millerRabin() spends: +// 99% of its time in calls to powMod_() (always with a base of 2) +// powMod_() spends: +// 94% of its time in calls to mont_() (almost always with x==y) +// +// This suggests there are several ways to speed up this library slightly: +// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window) +// -- this should especially focus on being fast when raising 2 to a power mod n +// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test +// - tune the parameters in randTruePrime_(), including c, m, and recLimit +// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking +// within the loop when all the parameters are the same length. +// +// There are several ideas that look like they wouldn't help much at all: +// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway) +// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32) +// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square +// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that +// method would be slower. This is unfortunate because the code currently spends almost all of its time +// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring +// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded +// sentences that seem to imply it's faster to do a non-modular square followed by a single +// Montgomery reduction, but that's obviously wrong. +//////////////////////////////////////////////////////////////////////////////////////// + +//globals +bpe=0; //bits stored per array element +mask=0; //AND this with an array element to chop it down to bpe bits +radix=mask+1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask. + +//the digits for converting to different bases +digitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-'; + +//initialize the global variables +for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform +bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt +mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits +radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask +one=int2bigInt(1,1,1); //constant used in powMod_() + +//the following global variables are scratchpad memory to +//reduce dynamic memory allocation in the inner loop +t=new Array(0); +ss=t; //used in mult_() +s0=t; //used in multMod_(), squareMod_() +s1=t; //used in powMod_(), multMod_(), squareMod_() +s2=t; //used in powMod_(), multMod_() +s3=t; //used in powMod_() +s4=t; s5=t; //used in mod_() +s6=t; //used in bigInt2str() +s7=t; //used in powMod_() +T=t; //used in GCD_() +sa=t; //used in mont_() +mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin() +eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_() +md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_() + +primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t; + s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_() + +//////////////////////////////////////////////////////////////////////////////////////// + +//return array of all primes less than integer n +function findPrimes(n) { + var i,s,p,ans; + s=new Array(n); + for (i=0;i<n;i++) + s[i]=0; + s[0]=2; + p=0; //first p elements of s are primes, the rest are a sieve + for(;s[p]<n;) { //s[p] is the pth prime + for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p] + s[i]=1; + p++; + s[p]=s[p-1]+1; + for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0) + } + ans=new Array(p); + for(i=0;i<p;i++) + ans[i]=s[i]; + return ans; +} + +//does a single round of Miller-Rabin base b consider x to be a possible prime? +//x is a bigInt, and b is an integer +function millerRabin(x,b) { + var i,j,k,s; + + if (mr_x1.length!=x.length) { + mr_x1=dup(x); + mr_r=dup(x); + mr_a=dup(x); + } + + copyInt_(mr_a,b); + copy_(mr_r,x); + copy_(mr_x1,x); + + addInt_(mr_r,-1); + addInt_(mr_x1,-1); + + //s=the highest power of two that divides mr_r + k=0; + for (i=0;i<mr_r.length;i++) + for (j=1;j<mask;j<<=1) + if (x[i] & j) { + s=(k<mr_r.length+bpe ? k : 0); + i=mr_r.length; + j=mask; + } else + k++; + + if (s) + rightShift_(mr_r,s); + + powMod_(mr_a,mr_r,x); + + if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) { + j=1; + while (j<=s-1 && !equals(mr_a,mr_x1)) { + squareMod_(mr_a,x); + if (equalsInt(mr_a,1)) { + return 0; + } + j++; + } + if (!equals(mr_a,mr_x1)) { + return 0; + } + } + return 1; +} + +//returns how many bits long the bigInt is, not counting leading zeros. +function bitSize(x) { + var j,z,w; + for (j=x.length-1; (x[j]==0) && (j>0); j--); + for (z=0,w=x[j]; w; (w>>=1),z++); + z+=bpe*j; + return z; +} + +//return a copy of x with at least n elements, adding leading zeros if needed +function expand(x,n) { + var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0); + copy_(ans,x); + return ans; +} + +//return a k-bit true random prime using Maurer's algorithm. +function randTruePrime(k) { + var ans=int2bigInt(0,k,0); + randTruePrime_(ans,k); + return trim(ans,1); +} + +//return a new bigInt equal to (x mod n) for bigInts x and n. +function mod(x,n) { + var ans=dup(x); + mod_(ans,n); + return trim(ans,1); +} + +//return (x+n) where x is a bigInt and n is an integer. +function addInt(x,n) { + var ans=expand(x,x.length+1); + addInt_(ans,n); + return trim(ans,1); +} + +//return x*y for bigInts x and y. This is faster when y<x. +function mult(x,y) { + var ans=expand(x,x.length+y.length); + mult_(ans,y); + return trim(ans,1); +} + +//return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n. +function powMod(x,y,n) { + var ans=expand(x,n.length); + powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't + return trim(ans,1); +} + +//return (x-y) for bigInts x and y. Negative answers will be 2s complement +function sub(x,y) { + var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); + sub_(ans,y); + return trim(ans,1); +} + +//return (x+y) for bigInts x and y. +function add(x,y) { + var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); + add_(ans,y); + return trim(ans,1); +} + +//return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null +function inverseMod(x,n) { + var ans=expand(x,n.length); + var s; + s=inverseMod_(ans,n); + return s ? trim(ans,1) : null; +} + +//return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. +function multMod(x,y,n) { + var ans=expand(x,n.length); + multMod_(ans,y,n); + return trim(ans,1); +} + +//generate a k-bit true random prime using Maurer's algorithm, +//and put it into ans. The bigInt ans must be large enough to hold it. +function randTruePrime_(ans,k) { + var c,m,pm,dd,j,r,B,divisible,z,zz,recSize; + + if (primes.length==0) + primes=findPrimes(30000); //check for divisibility by primes <=30000 + + if (pows.length==0) { + pows=new Array(512); + for (j=0;j<512;j++) { + pows[j]=Math.pow(2,j/511.-1.); + } + } + + //c and m should be tuned for a particular machine and value of k, to maximize speed + //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC) + c=0.1; + m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits + recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit + + if (s_i2.length!=ans.length) { + s_i2=dup(ans); + s_R =dup(ans); + s_n1=dup(ans); + s_r2=dup(ans); + s_d =dup(ans); + s_x1=dup(ans); + s_x2=dup(ans); + s_b =dup(ans); + s_n =dup(ans); + s_i =dup(ans); + s_rm=dup(ans); + s_q =dup(ans); + s_a =dup(ans); + s_aa=dup(ans); + } + + if (k <= recLimit) { //generate small random primes by trial division up to its square root + pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k) + copyInt_(ans,0); + for (dd=1;dd;) { + dd=0; + ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k)); //random, k-bit, odd integer, with msb 1 + for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k) + if (0==(ans[0]%primes[j])) { + dd=1; + break; + } + } + } + carry_(ans); + return; + } + + B=c*k*k; //try small primes up to B (or all the primes[] array if the largest is less than B). + if (k>2*m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits + for (r=1; k-k*r<=m; ) + r=pows[Math.floor(Math.random()*512)]; //r=Math.pow(2,Math.random()-1); + else + r=.5; + + //simulation suggests the more complex algorithm using r=.333 is only slightly faster. + + recSize=Math.floor(r*k)+1; + + randTruePrime_(s_q,recSize); + copyInt_(s_i2,0); + s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe)); //s_i2=2^(k-2) + divide_(s_i2,s_q,s_i,s_rm); //s_i=floor((2^(k-1))/(2q)) + + z=bitSize(s_i); + + for (;;) { + for (;;) { //generate z-bit numbers until one falls in the range [0,s_i-1] + randBigInt_(s_R,z,0); + if (greater(s_i,s_R)) + break; + } //now s_R is in the range [0,s_i-1] + addInt_(s_R,1); //now s_R is in the range [1,s_i] + add_(s_R,s_i); //now s_R is in the range [s_i+1,2*s_i] + + copy_(s_n,s_q); + mult_(s_n,s_R); + multInt_(s_n,2); + addInt_(s_n,1); //s_n=2*s_R*s_q+1 + + copy_(s_r2,s_R); + multInt_(s_r2,2); //s_r2=2*s_R + + //check s_n for divisibility by small primes up to B + for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++) + if (modInt(s_n,primes[j])==0) { + divisible=1; + break; + } + + if (!divisible) //if it passes small primes check, then try a single Miller-Rabin base 2 + if (!millerRabin(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_ + divisible=1; + + if (!divisible) { //if it passes that test, continue checking s_n + addInt_(s_n,-3); + for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--); //strip leading zeros + for (zz=0,w=s_n[j]; w; (w>>=1),zz++); + zz+=bpe*j; //zz=number of bits in s_n, ignoring leading zeros + for (;;) { //generate z-bit numbers until one falls in the range [0,s_n-1] + randBigInt_(s_a,zz,0); + if (greater(s_n,s_a)) + break; + } //now s_a is in the range [0,s_n-1] + addInt_(s_n,3); //now s_a is in the range [0,s_n-4] + addInt_(s_a,2); //now s_a is in the range [2,s_n-2] + copy_(s_b,s_a); + copy_(s_n1,s_n); + addInt_(s_n1,-1); + powMod_(s_b,s_n1,s_n); //s_b=s_a^(s_n-1) modulo s_n + addInt_(s_b,-1); + if (isZero(s_b)) { + copy_(s_b,s_a); + powMod_(s_b,s_r2,s_n); + addInt_(s_b,-1); + copy_(s_aa,s_n); + copy_(s_d,s_b); + GCD_(s_d,s_n); //if s_b and s_n are relatively prime, then s_n is a prime + if (equalsInt(s_d,1)) { + copy_(ans,s_aa); + return; //if we've made it this far, then s_n is absolutely guaranteed to be prime + } + } + } + } +} + +//set b to an n-bit random BigInt. If s=1, then nth bit (most significant bit) is set to 1. +//array b must be big enough to hold the result. Must have n>=1 +function randBigInt_(b,n,s) { + var i,a; + for (i=0;i<b.length;i++) + b[i]=0; + a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt + for (i=0;i<a;i++) { + b[i]=Math.floor(Math.random()*(1<<(bpe-1))); + } + b[a-1] &= (2<<((n-1)%bpe))-1; + if (s) + b[a-1] |= (1<<((n-1)%bpe)); +} + +//set x to the greatest common divisor of x and y. +//x,y are bigInts with the same number of elements. y is destroyed. +function GCD_(x,y) { + var i,xp,yp,A,B,C,D,q,sing; + if (T.length!=x.length) + T=dup(x); + + sing=1; + while (sing) { //while y has nonzero elements other than y[0] + sing=0; + for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0 + if (y[i]) { + sing=1; + break; + } + if (!sing) break; //quit when y all zero elements except possibly y[0] + + for (i=x.length;!x[i] && i>=0;i--); //find most significant element of x + xp=x[i]; + yp=y[i]; + A=1; B=0; C=0; D=1; + while ((yp+C) && (yp+D)) { + q =Math.floor((xp+A)/(yp+C)); + qp=Math.floor((xp+B)/(yp+D)); + if (q!=qp) + break; + t= A-q*C; A=C; C=t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp) + t= B-q*D; B=D; D=t; + t=xp-q*yp; xp=yp; yp=t; + } + if (B) { + copy_(T,x); + linComb_(x,y,A,B); //x=A*x+B*y + linComb_(y,T,D,C); //y=D*y+C*T + } else { + mod_(x,y); + copy_(T,x); + copy_(x,y); + copy_(y,T); + } + } + if (y[0]==0) + return; + t=modInt(x,y[0]); + copyInt_(x,y[0]); + y[0]=t; + while (y[0]) { + x[0]%=y[0]; + t=x[0]; x[0]=y[0]; y[0]=t; + } +} + +//do x=x**(-1) mod n, for bigInts x and n. +//If no inverse exists, it sets x to zero and returns 0, else it returns 1. +//The x array must be at least as large as the n array. +function inverseMod_(x,n) { + var k=1+2*Math.max(x.length,n.length); + + if(!(x[0]&1) && !(n[0]&1)) { //if both inputs are even, then inverse doesn't exist + copyInt_(x,0); + return 0; + } + + if (eg_u.length!=k) { + eg_u=new Array(k); + eg_v=new Array(k); + eg_A=new Array(k); + eg_B=new Array(k); + eg_C=new Array(k); + eg_D=new Array(k); + } + + copy_(eg_u,x); + copy_(eg_v,n); + copyInt_(eg_A,1); + copyInt_(eg_B,0); + copyInt_(eg_C,0); + copyInt_(eg_D,1); + for (;;) { + while(!(eg_u[0]&1)) { //while eg_u is even + halve_(eg_u); + if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2 + halve_(eg_A); + halve_(eg_B); + } else { + add_(eg_A,n); halve_(eg_A); + sub_(eg_B,x); halve_(eg_B); + } + } + + while (!(eg_v[0]&1)) { //while eg_v is even + halve_(eg_v); + if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2 + halve_(eg_C); + halve_(eg_D); + } else { + add_(eg_C,n); halve_(eg_C); + sub_(eg_D,x); halve_(eg_D); + } + } + + if (!greater(eg_v,eg_u)) { //eg_v <= eg_u + sub_(eg_u,eg_v); + sub_(eg_A,eg_C); + sub_(eg_B,eg_D); + } else { //eg_v > eg_u + sub_(eg_v,eg_u); + sub_(eg_C,eg_A); + sub_(eg_D,eg_B); + } + + if (equalsInt(eg_u,0)) { + if (negative(eg_C)) //make sure answer is nonnegative + add_(eg_C,n); + copy_(x,eg_C); + + if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse + copyInt_(x,0); + return 0; + } + return 1; + } + } +} + +//return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse +function inverseModInt_(x,n) { + var a=1,b=0,t; + for (;;) { + if (x==1) return a; + if (x==0) return 0; + b-=a*Math.floor(n/x); + n%=x; + + if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to += + if (n==0) return 0; + a-=b*Math.floor(x/n); + x%=n; + } +} + +//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that: +// v = GCD_(x,y) = a*x-b*y +//The bigInts v, a, b, must have exactly as many elements as the larger of x and y. +function eGCD_(x,y,v,a,b) { + var g=0; + var k=Math.max(x.length,y.length); + if (eg_u.length!=k) { + eg_u=new Array(k); + eg_A=new Array(k); + eg_B=new Array(k); + eg_C=new Array(k); + eg_D=new Array(k); + } + while(!(x[0]&1) && !(y[0]&1)) { //while x and y both even + halve_(x); + halve_(y); + g++; + } + copy_(eg_u,x); + copy_(v,y); + copyInt_(eg_A,1); + copyInt_(eg_B,0); + copyInt_(eg_C,0); + copyInt_(eg_D,1); + for (;;) { + while(!(eg_u[0]&1)) { //while u is even + halve_(eg_u); + if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2 + halve_(eg_A); + halve_(eg_B); + } else { + add_(eg_A,y); halve_(eg_A); + sub_(eg_B,x); halve_(eg_B); + } + } + + while (!(v[0]&1)) { //while v is even + halve_(v); + if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2 + halve_(eg_C); + halve_(eg_D); + } else { + add_(eg_C,y); halve_(eg_C); + sub_(eg_D,x); halve_(eg_D); + } + } + + if (!greater(v,eg_u)) { //v<=u + sub_(eg_u,v); + sub_(eg_A,eg_C); + sub_(eg_B,eg_D); + } else { //v>u + sub_(v,eg_u); + sub_(eg_C,eg_A); + sub_(eg_D,eg_B); + } + if (equalsInt(eg_u,0)) { + if (negative(eg_C)) { //make sure a (C)is nonnegative + add_(eg_C,y); + sub_(eg_D,x); + } + multInt_(eg_D,-1); ///make sure b (D) is nonnegative + copy_(a,eg_C); + copy_(b,eg_D); + leftShift_(v,g); + return; + } + } +} + + +//is bigInt x negative? +function negative(x) { + return ((x[x.length-1]>>(bpe-1))&1); +} + + +//is (x << (shift*bpe)) > y? +//x and y are nonnegative bigInts +//shift is a nonnegative integer +function greaterShift(x,y,shift) { + var kx=x.length, ky=y.length; + k=((kx+shift)<ky) ? (kx+shift) : ky; + for (i=ky-1-shift; i<kx && i>=0; i++) + if (x[i]>0) + return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger + for (i=kx-1+shift; i<ky; i++) + if (y[i]>0) + return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger + for (i=k-1; i>=shift; i--) + if (x[i-shift]>y[i]) return 1; + else if (x[i-shift]<y[i]) return 0; + return 0; +} + +//is x > y? (x and y both nonnegative) +function greater(x,y) { + var i; + var k=(x.length<y.length) ? x.length : y.length; + + for (i=x.length;i<y.length;i++) + if (y[i]) + return 0; //y has more digits + + for (i=y.length;i<x.length;i++) + if (x[i]) + return 1; //x has more digits + + for (i=k-1;i>=0;i--) + if (x[i]>y[i]) + return 1; + else if (x[i]<y[i]) + return 0; + return 0; +} + +//divide_ x by y giving quotient q and remainder r. (q=floor(x/y), r=x mod y). All 4 are bigints. +//x must have at least one leading zero element. +//y must be nonzero. +//q and r must be arrays that are exactly the same length as x. +//the x array must have at least as many elements as y. +function divide_(x,y,q,r) { + var kx, ky; + var i,j,y1,y2,c,a,b; + copy_(r,x); + for (ky=y.length;y[ky-1]==0;ky--); //kx,ky is number of elements in x,y, not including leading zeros + for (kx=r.length;r[kx-1]==0 && kx>ky;kx--); + + //normalize: ensure the most significant element of y has its highest bit set + b=y[ky-1]; + for (a=0; b; a++) + b>>=1; + a=bpe-a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element + leftShift_(y,a); //multiply both by 1<<a now, then divide_ both by that at the end + leftShift_(r,a); + + copyInt_(q,0); // q=0 + while (!greaterShift(y,r,kx-ky)) { // while (leftShift_(y,kx-ky) <= r) { + subShift_(r,y,kx-ky); // r=r-leftShift_(y,kx-ky) + q[kx-ky]++; // q[kx-ky]++; + } // } + + for (i=kx-1; i>=ky; i--) { + if (r[i]==y[ky-1]) + q[i-ky]=mask; + else + q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]); + + //The following for(;;) loop is equivalent to the commented while loop, + //except that the uncommented version avoids overflow. + //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0 + // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2]) + // q[i-ky]--; + for (;;) { + y2=(ky>1 ? y[ky-2] : 0)*q[i-ky]; + c=y2>>bpe; + y2=y2 & mask; + y1=c+q[i-ky]*y[ky-1]; + c=y1>>bpe; + y1=y1 & mask; + + if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i]) + q[i-ky]--; + else + break; + } + + linCombShift_(r,y,-q[i-ky],i-ky); //r=r-q[i-ky]*leftShift_(y,i-ky) + if (negative(r)) { + addShift_(r,y,i-ky); //r=r+leftShift_(y,i-ky) + q[i-ky]--; + } + } + + rightShift_(y,a); //undo the normalization step + rightShift_(r,a); //undo the normalization step +} + +//do carries and borrows so each element of the bigInt x fits in bpe bits. +function carry_(x) { + var i,k,c,b; + k=x.length; + c=0; + for (i=0;i<k;i++) { + c+=x[i]; + b=0; + if (c<0) { + b=-(c>>bpe); + c+=b*radix; + } + x[i]=c & mask; + c=(c>>bpe)-b; + } +} + +//return x mod n for bigInt x and integer n. +function modInt(x,n) { + var i,c=0; + for (i=x.length-1; i>=0; i--) + c=(c*radix+x[i])%n; + return c; +} + +//convert the integer t into a bigInt with at least the given number of bits. +//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word) +//Pad the array with leading zeros so that it has at least minSize elements. +//There will always be at least one leading 0 element. +function int2bigInt(t,bits,minSize) { + var i,k; + k=Math.ceil(bits/bpe)+1; + k=minSize>k ? minSize : k; + buff=new Array(k); + copyInt_(buff,t); + return buff; +} + +//return the bigInt given a string representation in a given base. +//Pad the array with leading zeros so that it has at least minSize elements. +//If base=-1, then it reads in a space-separated list of array elements in decimal. +//The array will always have at least one leading zero, unless base=-1. +function str2bigInt(s,base,minSize) { + var d, i, j, x, y, kk; + var k=s.length; + if (base==-1) { //comma-separated list of array elements in decimal + x=new Array(0); + for (;;) { + y=new Array(x.length+1); + for (i=0;i<x.length;i++) + y[i+1]=x[i]; + y[0]=parseInt(s,10); + x=y; + d=s.indexOf(',',0); + if (d<1) + break; + s=s.substring(d+1); + if (s.length==0) + break; + } + if (x.length<minSize) { + y=new Array(minSize); + copy_(y,x); + return y; + } + return x; + } + + x=int2bigInt(0,base*k,0); + for (i=0;i<k;i++) { + d=digitsStr.indexOf(s.substring(i,i+1),0); + if (base<=36 && d>=36) //convert lowercase to uppercase if base<=36 + d-=26; + if (d<base && d>=0) { //ignore illegal characters + multInt_(x,base); + addInt_(x,d); + } + } + + for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros + k=minSize>k+1 ? minSize : k+1; + y=new Array(k); + kk=k<x.length ? k : x.length; + for (i=0;i<kk;i++) + y[i]=x[i]; + for (;i<k;i++) + y[i]=0; + return y; +} + +//is bigint x equal to integer y? +//y must have less than bpe bits +function equalsInt(x,y) { + var i; + if (x[0]!=y) + return 0; + for (i=1;i<x.length;i++) + if (x[i]) + return 0; + return 1; +} + +//are bigints x and y equal? +//this works even if x and y are different lengths and have arbitrarily many leading zeros +function equals(x,y) { + var i; + var k=x.length<y.length ? x.length : y.length; + for (i=0;i<k;i++) + if (x[i]!=y[i]) + return 0; + if (x.length>y.length) { + for (;i<x.length;i++) + if (x[i]) + return 0; + } else { + for (;i<y.length;i++) + if (y[i]) + return 0; + } + return 1; +} + +//is the bigInt x equal to zero? +function isZero(x) { + var i; + for (i=0;i<x.length;i++) + if (x[i]) + return 0; + return 1; +} + +//convert a bigInt into a string in a given base, from base 2 up to base 95. +//Base -1 prints the contents of the array representing the number. +function bigInt2str(x,base) { + var i,t,s=""; + + if (s6.length!=x.length) + s6=dup(x); + else + copy_(s6,x); + + if (base==-1) { //return the list of array contents + for (i=x.length-1;i>0;i--) + s+=x[i]+','; + s+=x[0]; + } + else { //return it in the given base + while (!isZero(s6)) { + t=divInt_(s6,base); //t=s6 % base; s6=floor(s6/base); + s=digitsStr.substring(t,t+1)+s; + } + } + if (s.length==0) + s="0"; + return s; +} + +//returns a duplicate of bigInt x +function dup(x) { + var i; + buff=new Array(x.length); + copy_(buff,x); + return buff; +} + +//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y). +function copy_(x,y) { + var i; + var k=x.length<y.length ? x.length : y.length; + for (i=0;i<k;i++) + x[i]=y[i]; + for (i=k;i<x.length;i++) + x[i]=0; +} + +//do x=y on bigInt x and integer y. +function copyInt_(x,n) { + var i,c; + for (c=n,i=0;i<x.length;i++) { + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x+n where x is a bigInt and n is an integer. +//x must be large enough to hold the result. +function addInt_(x,n) { + var i,k,c,b; + x[0]+=n; + k=x.length; + c=0; + for (i=0;i<k;i++) { + c+=x[i]; + b=0; + if (c<0) { + b=-(c>>bpe); + c+=b*radix; + } + x[i]=c & mask; + c=(c>>bpe)-b; + if (!c) return; //stop carrying as soon as the carry_ is zero + } +} + +//right shift bigInt x by n bits. 0 <= n < bpe. +function rightShift_(x,n) { + var i; + var k=Math.floor(n/bpe); + if (k) { + for (i=0;i<x.length-k;i++) //right shift x by k elements + x[i]=x[i+k]; + for (;i<x.length;i++) + x[i]=0; + n%=bpe; + } + for (i=0;i<x.length-1;i++) { + x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n)); + } + x[i]>>=n; +} + +//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement +function halve_(x) { + var i; + for (i=0;i<x.length-1;i++) { + x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1)); + } + x[i]=(x[i]>>1) | (x[i] & (radix>>1)); //most significant bit stays the same +} + +//left shift bigInt x by n bits. +function leftShift_(x,n) { + var i; + var k=Math.floor(n/bpe); + if (k) { + for (i=x.length; i>=k; i--) //left shift x by k elements + x[i]=x[i-k]; + for (;i>=0;i--) + x[i]=0; + n%=bpe; + } + if (!n) + return; + for (i=x.length-1;i>0;i--) { + x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n))); + } + x[i]=mask & (x[i]<<n); +} + +//do x=x*n where x is a bigInt and n is an integer. +//x must be large enough to hold the result. +function multInt_(x,n) { + var i,k,c,b; + if (!n) + return; + k=x.length; + c=0; + for (i=0;i<k;i++) { + c+=x[i]*n; + b=0; + if (c<0) { + b=-(c>>bpe); + c+=b*radix; + } + x[i]=c & mask; + c=(c>>bpe)-b; + } +} + +//do x=floor(x/n) for bigInt x and integer n, and return the remainder +function divInt_(x,n) { + var i,r=0,s; + for (i=x.length-1;i>=0;i--) { + s=r*radix+x[i]; + x[i]=Math.floor(s/n); + r=s%n; + } + return r; +} + +//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b. +//x must be large enough to hold the answer. +function linComb_(x,y,a,b) { + var i,c,k,kk; + k=x.length<y.length ? x.length : y.length; + kk=x.length; + for (c=0,i=0;i<k;i++) { + c+=a*x[i]+b*y[i]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;i<kk;i++) { + c+=a*x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys. +//x must be large enough to hold the answer. +function linCombShift_(x,y,b,ys) { + var i,c,k,kk; + k=x.length<ys+y.length ? x.length : ys+y.length; + kk=x.length; + for (c=0,i=ys;i<k;i++) { + c+=x[i]+b*y[i-ys]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<kk;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys. +//x must be large enough to hold the answer. +function addShift_(x,y,ys) { + var i,c,k,kk; + k=x.length<ys+y.length ? x.length : ys+y.length; + kk=x.length; + for (c=0,i=ys;i<k;i++) { + c+=x[i]+y[i-ys]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<kk;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys. +//x must be large enough to hold the answer. +function subShift_(x,y,ys) { + var i,c,k,kk; + k=x.length<ys+y.length ? x.length : ys+y.length; + kk=x.length; + for (c=0,i=ys;i<k;i++) { + c+=x[i]-y[i-ys]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<kk;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x-y for bigInts x and y. +//x must be large enough to hold the answer. +//negative answers will be 2s complement +function sub_(x,y) { + var i,c,k,kk; + k=x.length<y.length ? x.length : y.length; + for (c=0,i=0;i<k;i++) { + c+=x[i]-y[i]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<x.length;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x+y for bigInts x and y. +//x must be large enough to hold the answer. +function add_(x,y) { + var i,c,k,kk; + k=x.length<y.length ? x.length : y.length; + for (c=0,i=0;i<k;i++) { + c+=x[i]+y[i]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<x.length;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x*y for bigInts x and y. This is faster when y<x. +function mult_(x,y) { + var i; + if (ss.length!=2*x.length) + ss=new Array(2*x.length); + copyInt_(ss,0); + for (i=0;i<y.length;i++) + if (y[i]) + linCombShift_(ss,x,y[i],i); //ss=1*ss+y[i]*(x<<(i*bpe)) + copy_(x,ss); +} + +//do x=x mod n for bigInts x and n. +function mod_(x,n) { + if (s4.length!=x.length) + s4=dup(x); + else + copy_(s4,x); + if (s5.length!=x.length) + s5=dup(x); + divide_(s4,n,s5,x); //x = remainder of s4 / n +} + +//do x=x*y mod n for bigInts x,y,n. +//for greater speed, let y<x. +function multMod_(x,y,n) { + var i; + if (s0.length!=2*x.length) + s0=new Array(2*x.length); + copyInt_(s0,0); + for (i=0;i<y.length;i++) + if (y[i]) + linCombShift_(s0,x,y[i],i); //s0=1*s0+y[i]*(x<<(i*bpe)) + mod_(s0,n); + copy_(x,s0); +} + +//do x=x*x mod n for bigInts x,n. +function squareMod_(x,n) { + var i,j,d,c,kx,kn,k; + for (kx=x.length; kx>0 && !x[kx-1]; kx--); //ignore leading zeros in x + k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n + if (s0.length!=k) + s0=new Array(k); + copyInt_(s0,0); + for (i=0;i<kx;i++) { + c=s0[2*i]+x[i]*x[i]; + s0[2*i]=c & mask; + c>>=bpe; + for (j=i+1;j<kx;j++) { + c=s0[i+j]+2*x[i]*x[j]+c; + s0[i+j]=(c & mask); + c>>=bpe; + } + s0[i+kx]=c; + } + mod_(s0,n); + copy_(x,s0); +} + +//return x with exactly k leading zero elements +function trim(x,k) { + var i,y; + for (i=x.length; i>0 && !x[i-1]; i--); + y=new Array(i+k); + copy_(y,x); + return y; +} + +//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation. 0**0=1. +//this is faster when n is odd. x usually needs to have as many elements as n. +function powMod_(x,y,n) { + var k1,k2,kn,np; + if(s7.length!=n.length) + s7=dup(n); + + //for even modulus, use a simple square-and-multiply algorithm, + //rather than using the more complex Montgomery algorithm. + if ((n[0]&1)==0) { + copy_(s7,x); + copyInt_(x,1); + while(!equalsInt(y,0)) { + if (y[0]&1) + multMod_(x,s7,n); + divInt_(y,2); + squareMod_(s7,n); + } + return; + } + + //calculate np from n for the Montgomery multiplications + copyInt_(s7,0); + for (kn=n.length;kn>0 && !n[kn-1];kn--); + np=radix-inverseModInt_(modInt(n,radix),radix); + s7[kn]=1; + multMod_(x ,s7,n); // x = x * 2**(kn*bp) mod n + + if (s3.length!=x.length) + s3=dup(x); + else + copy_(s3,x); + + for (k1=y.length-1;k1>0 & !y[k1]; k1--); //k1=first nonzero element of y + if (y[k1]==0) { //anything to the 0th power is 1 + copyInt_(x,1); + return; + } + for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1); //k2=position of first 1 bit in y[k1] + for (;;) { + if (!(k2>>=1)) { //look at next bit of y + k1--; + if (k1<0) { + mont_(x,one,n,np); + return; + } + k2=1<<(bpe-1); + } + mont_(x,x,n,np); + + if (k2 & y[k1]) //if next bit is a 1 + mont_(x,s3,n,np); + } +} + +//do x=x*y*Ri mod n for bigInts x,y,n, +// where Ri = 2**(-kn*bpe) mod n, and kn is the +// number of elements in the n array, not +// counting leading zeros. +//x must be large enough to hold the answer. +//It's OK if x and y are the same variable. +//must have: +// x,y < n +// n is odd +// np = -(n^(-1)) mod radix +function mont_(x,y,n,np) { + var i,j,c,ui,t; + var kn=n.length; + var ky=y.length; + + if (sa.length!=kn) + sa=new Array(kn); + + for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n + //this function sometimes gives wrong answers when the next line is uncommented + //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y + + copyInt_(sa,0); + + //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys + for (i=0; i<kn; i++) { + t=sa[0]+x[i]*y[0]; + ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE + c=(t+ui*n[0]) >> bpe; + t=x[i]; + + //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe + for (j=1;j<ky;j++) { + c+=sa[j]+t*y[j]+ui*n[j]; + sa[j-1]=c & mask; + c>>=bpe; + } + for (;j<kn;j++) { + c+=sa[j]+ui*n[j]; + sa[j-1]=c & mask; + c>>=bpe; + } + sa[j-1]=c & mask; + } + + if (!greater(n,sa)) + sub_(sa,n); + copy_(x,sa); +} + + + + +//############################################################################# +//############################################################################# +//############################################################################# +//############################################################################# +//############################################################################# +//############################################################################# +//############################################################################# + + + + + +//############################################################################# + +Clipperz.Crypto.BigInt = function (aValue, aBase) { + var base; + var value; + + if (typeof(aValue) == 'object') { + this._internalValue = aValue; + } else { + if (typeof(aValue) == 'undefined') { + value = "0"; + } else { + value = aValue + ""; + } + + if (typeof(aBase) == 'undefined') { + base = 10; + } else { + base = aBase; + } + + this._internalValue = str2bigInt(value, base, 1, 1); + } + + return this; +} + +//============================================================================= + +MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, { + + 'clone': function() { + return new Clipperz.Crypto.BigInt(this.internalValue()); + }, + + //------------------------------------------------------------------------- + + 'internalValue': function () { + return this._internalValue; + }, + + //------------------------------------------------------------------------- + + 'isBigInt': true, + + //------------------------------------------------------------------------- + + 'toString': function(aBase) { + return this.asString(aBase); + }, + + //------------------------------------------------------------------------- + + 'asString': function (aBase, minimumLength) { + var result; + var base; + + if (typeof(aBase) == 'undefined') { + base = 10; + } else { + base = aBase; + } + + result = bigInt2str(this.internalValue(), base).toLowerCase(); + + if ((typeof(minimumLength) != 'undefined') && (result.length < minimumLength)) { + var i, c; + c = (minimumLength - result.length); + for (i=0; i<c; i++) { + result = '0' + result; + } + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'asByteArray': function() { + return new Clipperz.ByteArray("0x" + this.asString(16), 16); + }, + + //------------------------------------------------------------------------- + + 'equals': function (aValue) { + var result; + + if (aValue.isBigInt) { + result = equals(this.internalValue(), aValue.internalValue()); + } else if (typeof(aValue) == "number") { + result = equalsInt(this.internalValue(), aValue); + } else { + throw Clipperz.Crypt.BigInt.exception.UnknownType; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'compare': function(aValue) { +/* + var result; + var thisAsString; + var aValueAsString; + + thisAsString = this.asString(10); + aValueAsString = aValue.asString(10); + + result = MochiKit.Base.compare(thisAsString.length, aValueAsString.length); + if (result == 0) { + result = MochiKit.Base.compare(thisAsString, aValueAsString); + } + + return result; +*/ + var result; + + if (equals(this.internalValue(), aValue.internalValue())) { + result = 0; + } else if (greater(this.internalValue(), aValue.internalValue())) { + result = 1; + } else { + result = -1; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'add': function (aValue) { + var result; + + if (aValue.isBigInt) { + result = add(this.internalValue(), aValue.internalValue()); + } else { + result = addInt(this.internalValue(), aValue); + } + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'subtract': function (aValue) { + var result; + var value; + + if (aValue.isBigInt) { + value = aValue; + } else { + value = new Clipperz.Crypto.BigInt(aValue); + } + + result = sub(this.internalValue(), value.internalValue()); + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'multiply': function (aValue, aModule) { + var result; + var value; + + if (aValue.isBigInt) { + value = aValue; + } else { + value = new Clipperz.Crypto.BigInt(aValue); + } + + if (typeof(aModule) == 'undefined') { + result = mult(this.internalValue(), value.internalValue()); + } else { + if (greater(this.internalValue(), value.internalValue())) { + result = multMod(this.internalValue(), value.internalValue(), aModule); + } else { + result = multMod(value.internalValue(), this.internalValue(), aModule); + } + } + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'module': function (aModule) { + var result; + var module; + + if (aModule.isBigInt) { + module = aModule; + } else { + module = new Clipperz.Crypto.BigInt(aModule); + } + + result = mod(this.internalValue(), module.internalValue()); + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'powerModule': function(aValue, aModule) { + var result; + var value; + var module; + + if (aValue.isBigInt) { + value = aValue; + } else { + value = new Clipperz.Crypto.BigInt(aValue); + } + + if (aModule.isBigInt) { + module = aModule; + } else { + module = new Clipperz.Crypto.BigInt(aModule); + } + + if (aValue == -1) { + result = inverseMod(this.internalValue(), module.internalValue()); + } else { + result = powMod(this.internalValue(), value.internalValue(), module.internalValue()); + } + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'xor': function(aValue) { + var result; + var thisByteArray; + var aValueByteArray; + var xorArray; + + thisByteArray = new Clipperz.ByteArray("0x" + this.asString(16), 16); + aValueByteArray = new Clipperz.ByteArray("0x" + aValue.asString(16), 16); + xorArray = thisByteArray.xorMergeWithBlock(aValueByteArray, 'right'); + result = new Clipperz.Crypto.BigInt(xorArray.toHexString(), 16); + + return result; + }, + + //------------------------------------------------------------------------- + + 'shiftLeft': function(aNumberOfBitsToShift) { + var result; + var internalResult; + var wholeByteToShift; + var bitsLeftToShift; + + wholeByteToShift = Math.floor(aNumberOfBitsToShift / 8); + bitsLeftToShift = aNumberOfBitsToShift % 8; + + if (wholeByteToShift == 0) { + internalResult = this.internalValue(); + } else { + var hexValue; + var i,c; + + hexValue = this.asString(16); + c = wholeByteToShift; + for (i=0; i<c; i++) { + hexValue += "00"; + } + internalResult = str2bigInt(hexValue, 16, 1, 1); + } + + if (bitsLeftToShift > 0) { + leftShift_(internalResult, bitsLeftToShift); + } + result = new Clipperz.Crypto.BigInt(internalResult); + + return result; + }, + + //------------------------------------------------------------------------- + + 'bitSize': function() { + return bitSize(this.internalValue()); + }, + + //------------------------------------------------------------------------- + + 'isBitSet': function(aBitPosition) { + var result; + + if (this.asByteArray().bitAtIndex(aBitPosition) == 0) { + result = false; + } else { + result = true; + }; + + return result; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# + +Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) { + return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize)); +} + +//############################################################################# +//############################################################################# + +Clipperz.Crypto.BigInt.ZERO = new Clipperz.Crypto.BigInt(0); + +//############################################################################# + +Clipperz.Crypto.BigInt.equals = function(a, b) { + return a.equals(b); +} + +Clipperz.Crypto.BigInt.add = function(a, b) { + return a.add(b); +} + +Clipperz.Crypto.BigInt.subtract = function(a, b) { + return a.subtract(b); +} + +Clipperz.Crypto.BigInt.multiply = function(a, b, module) { + return a.multiply(b, module); +} + +Clipperz.Crypto.BigInt.module = function(a, module) { + return a.module(module); +} + +Clipperz.Crypto.BigInt.powerModule = function(a, b, module) { + return a.powerModule(b, module); +} + +Clipperz.Crypto.BigInt.exception = { + UnknownType: new MochiKit.Base.NamedError("Clipperz.Crypto.BigInt.exception.UnknownType") +} diff --git a/frontend/delta/js/Clipperz/Crypto/BigInt_scoped.js b/frontend/delta/js/Clipperz/Crypto/BigInt_scoped.js new file mode 100644 index 0000000..bc60330 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/BigInt_scoped.js @@ -0,0 +1,1644 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } + +if (typeof(Leemon) == 'undefined') { Leemon = {}; } +if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; } +if (typeof(Baird.Crypto.BigInt) == 'undefined') { Baird.Crypto.BigInt = {}; } + + +//############################################################################# +// Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js +//############################################################################# + +//////////////////////////////////////////////////////////////////////////////////////// +// Big Integer Library v. 5.0 +// Created 2000, last modified 2006 +// Leemon Baird +// www.leemon.com +// +// This file is public domain. You can use it for any purpose without restriction. +// I do not guarantee that it is correct, so use it at your own risk. If you use +// it for something interesting, I'd appreciate hearing about it. If you find +// any bugs or make any improvements, I'd appreciate hearing about those too. +// It would also be nice if my name and address were left in the comments. +// But none of that is required. +// +// This code defines a bigInt library for arbitrary-precision integers. +// A bigInt is an array of integers storing the value in chunks of bpe bits, +// little endian (buff[0] is the least significant word). +// Negative bigInts are stored two's complement. +// Some functions assume their parameters have at least one leading zero element. +// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow, +// so the caller must make sure overflow won't happen. +// For each function where a parameter is modified, that same +// variable must not be used as another argument too. +// So, you cannot square x by doing multMod_(x,x,n). +// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n). +// +// These functions are designed to avoid frequent dynamic memory allocation in the inner loop. +// For most functions, if it needs a BigInt as a local variable it will actually use +// a global, and will only allocate to it when it's not the right size. This ensures +// that when a function is called repeatedly with same-sized parameters, it only allocates +// memory on the first call. +// +// Note that for cryptographic purposes, the calls to Math.random() must +// be replaced with calls to a better pseudorandom number generator. +// +// In the following, "bigInt" means a bigInt with at least one leading zero element, +// and "integer" means a nonnegative integer less than radix. In some cases, integer +// can be negative. Negative bigInts are 2s complement. +// +// The following functions do not modify their inputs, but dynamically allocate memory every time they are called: +// +// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95 +// function dup(x) //returns a copy of bigInt x +// function findPrimes(n) //return array of all primes less than integer n +// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements +// function str2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements +// function trim(x,k) //return a copy of x with exactly k leading zero elements +// +// The following functions do not modify their inputs, so there is never a problem with the result being too big: +// +// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros +// function equals(x,y) //is the bigInt x equal to the bigint y? +// function equalsInt(x,y) //is bigint x equal to integer y? +// function greater(x,y) //is x>y? (x and y are nonnegative bigInts) +// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y? +// function isZero(x) //is the bigInt x equal to zero? +// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)? +// function modInt(x,n) //return x mod n for bigInt x and integer n. +// function negative(x) //is bigInt x negative? +// +// The following functions do not modify their inputs, but allocate memory and call functions with underscores +// +// function add(x,y) //return (x+y) for bigInts x and y. +// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer. +// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed +// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null +// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n. +// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x. +// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. +// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n. +// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm. +// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement +// +// The following functions write a bigInt result to one of the parameters, but +// the result is never bigger than the original, so there can't be overflow problems: +// +// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder +// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). +// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement +// function mod_(x,n) //do x=x mod n for bigInts x and n. +// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. +// +// The following functions write a bigInt result to one of the parameters. The caller is responsible for +// ensuring it is large enough to hold the result. +// +// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer +// function add_(x,y) //do x=x+y for bigInts x and y +// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe)) +// function copy_(x,y) //do x=y on bigInts x and y +// function copyInt_(x,n) //do x=n on bigInt x and integer n +// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits. +// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r +// function eGCD_(x,y,d,a,b) //sets a,b,d to positive big integers such that d = GCD_(x,y) = a*x-b*y +// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist +// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse +// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe. +// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b +// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys +// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined) +// function mult_(x,y) //do x=x*y for bigInts x and y. +// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer. +// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n. +// function powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1. +// function randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1. +// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb. +// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n +// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement. +// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement. +// +// The following functions are based on algorithms from the _Handbook of Applied Cryptography_ +// powMod_() = algorithm 14.94, Montgomery exponentiation +// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_ +// GCD_() = algorothm 14.57, Lehmer's algorithm +// mont_() = algorithm 14.36, Montgomery multiplication +// divide_() = algorithm 14.20 Multiple-precision division +// squareMod_() = algorithm 14.16 Multiple-precision squaring +// randTruePrime_() = algorithm 4.62, Maurer's algorithm +// millerRabin() = algorithm 4.24, Miller-Rabin algorithm +// +// Profiling shows: +// randTruePrime_() spends: +// 10% of its time in calls to powMod_() +// 85% of its time in calls to millerRabin() +// millerRabin() spends: +// 99% of its time in calls to powMod_() (always with a base of 2) +// powMod_() spends: +// 94% of its time in calls to mont_() (almost always with x==y) +// +// This suggests there are several ways to speed up this library slightly: +// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window) +// -- this should especially focus on being fast when raising 2 to a power mod n +// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test +// - tune the parameters in randTruePrime_(), including c, m, and recLimit +// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking +// within the loop when all the parameters are the same length. +// +// There are several ideas that look like they wouldn't help much at all: +// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway) +// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32) +// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square +// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that +// method would be slower. This is unfortunate because the code currently spends almost all of its time +// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring +// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded +// sentences that seem to imply it's faster to do a non-modular square followed by a single +// Montgomery reduction, but that's obviously wrong. +//////////////////////////////////////////////////////////////////////////////////////// + +// +// The whole library has been moved into the Baird.Crypto.BigInt scope by Giulio Cesare Solaroli <giulio.cesare@clipperz.com> +// +Baird.Crypto.BigInt.VERSION = "5.0"; +Baird.Crypto.BigInt.NAME = "Baird.Crypto.BigInt"; + +MochiKit.Base.update(Baird.Crypto.BigInt, { + //globals + 'bpe': 0, //bits stored per array element + 'mask': 0, //AND this with an array element to chop it down to bpe bits + 'radix': Baird.Crypto.BigInt.mask + 1, //equals 2^bpe. A single 1 bit to the left of the last bit of mask. + + //the digits for converting to different bases + 'digitsStr': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-', + +//initialize the global variables +for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform +bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt +mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits +radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask +one=int2bigInt(1,1,1); //constant used in powMod_() + +//the following global variables are scratchpad memory to +//reduce dynamic memory allocation in the inner loop +t=new Array(0); +ss=t; //used in mult_() +s0=t; //used in multMod_(), squareMod_() +s1=t; //used in powMod_(), multMod_(), squareMod_() +s2=t; //used in powMod_(), multMod_() +s3=t; //used in powMod_() +s4=t; s5=t; //used in mod_() +s6=t; //used in bigInt2str() +s7=t; //used in powMod_() +T=t; //used in GCD_() +sa=t; //used in mont_() +mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin() +eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_() +md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_() + +primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t; + s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_() + +//////////////////////////////////////////////////////////////////////////////////////// + + //return array of all primes less than integer n + 'findPrimes': function(n) { + var i,s,p,ans; + s=new Array(n); + for (i=0;i<n;i++) + s[i]=0; + s[0]=2; + p=0; //first p elements of s are primes, the rest are a sieve + for(;s[p]<n;) { //s[p] is the pth prime + for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p] + s[i]=1; + p++; + s[p]=s[p-1]+1; + for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0) + } + ans=new Array(p); + for(i=0;i<p;i++) + ans[i]=s[i]; + return ans; + }, + + //does a single round of Miller-Rabin base b consider x to be a possible prime? + //x is a bigInt, and b is an integer + 'millerRabin': function(x,b) { + var i,j,k,s; + + if (mr_x1.length!=x.length) { + mr_x1=dup(x); + mr_r=dup(x); + mr_a=dup(x); + } + + copyInt_(mr_a,b); + copy_(mr_r,x); + copy_(mr_x1,x); + + addInt_(mr_r,-1); + addInt_(mr_x1,-1); + + //s=the highest power of two that divides mr_r + k=0; + for (i=0;i<mr_r.length;i++) + for (j=1;j<mask;j<<=1) + if (x[i] & j) { + s=(k<mr_r.length+bpe ? k : 0); + i=mr_r.length; + j=mask; + } else + k++; + + if (s) + rightShift_(mr_r,s); + + powMod_(mr_a,mr_r,x); + + if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) { + j=1; + while (j<=s-1 && !equals(mr_a,mr_x1)) { + squareMod_(mr_a,x); + if (equalsInt(mr_a,1)) { + return 0; + } + j++; + } + if (!equals(mr_a,mr_x1)) { + return 0; + } + } + + return 1; + }, + + //returns how many bits long the bigInt is, not counting leading zeros. + 'bitSize': function(x) { + var j,z,w; + for (j=x.length-1; (x[j]==0) && (j>0); j--); + for (z=0,w=x[j]; w; (w>>=1),z++); + z+=bpe*j; + return z; + }, + + //return a copy of x with at least n elements, adding leading zeros if needed + 'expand': function(x,n) { + var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0); + copy_(ans,x); + return ans; + }, + + //return a k-bit true random prime using Maurer's algorithm. + 'randTruePrime': function(k) { + var ans=int2bigInt(0,k,0); + randTruePrime_(ans,k); + return trim(ans,1); + }, + + //return a new bigInt equal to (x mod n) for bigInts x and n. + 'mod': function(x,n) { + var ans=dup(x); + mod_(ans,n); + return trim(ans,1); + }, + + //return (x+n) where x is a bigInt and n is an integer. + 'addInt': function(x,n) { + var ans=expand(x,x.length+1); + addInt_(ans,n); + return trim(ans,1); + }, + + //return x*y for bigInts x and y. This is faster when y<x. + 'mult': function(x,y) { + var ans=expand(x,x.length+y.length); + mult_(ans,y); + return trim(ans,1); + }, + + //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n. + 'powMod': function(x,y,n) { + var ans=expand(x,n.length); + powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't + return trim(ans,1); + }, + + //return (x-y) for bigInts x and y. Negative answers will be 2s complement + 'sub': function(x,y) { + var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); + sub_(ans,y); + return trim(ans,1); + }, + + //return (x+y) for bigInts x and y. + 'add': function(x,y) { + var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1)); + add_(ans,y); + return trim(ans,1); + }, + + //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null + 'inverseMod': function(x,n) { + var ans=expand(x,n.length); + var s; + s=inverseMod_(ans,n); + return s ? trim(ans,1) : null; + }, + + //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. + 'multMod': function(x,y,n) { + var ans=expand(x,n.length); + multMod_(ans,y,n); + return trim(ans,1); + }, + + //generate a k-bit true random prime using Maurer's algorithm, + //and put it into ans. The bigInt ans must be large enough to hold it. + 'randTruePrime_': function(ans,k) { + var c,m,pm,dd,j,r,B,divisible,z,zz,recSize; + + if (primes.length==0) + primes=findPrimes(30000); //check for divisibility by primes <=30000 + + if (pows.length==0) { + pows=new Array(512); + for (j=0;j<512;j++) { + pows[j]=Math.pow(2,j/511.-1.); + } + } + + //c and m should be tuned for a particular machine and value of k, to maximize speed + //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC) + c=0.1; + m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits + recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit + + if (s_i2.length!=ans.length) { + s_i2=dup(ans); + s_R =dup(ans); + s_n1=dup(ans); + s_r2=dup(ans); + s_d =dup(ans); + s_x1=dup(ans); + s_x2=dup(ans); + s_b =dup(ans); + s_n =dup(ans); + s_i =dup(ans); + s_rm=dup(ans); + s_q =dup(ans); + s_a =dup(ans); + s_aa=dup(ans); + } + + if (k <= recLimit) { //generate small random primes by trial division up to its square root + pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k) + copyInt_(ans,0); + for (dd=1;dd;) { + dd=0; + ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k)); //random, k-bit, odd integer, with msb 1 + for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k) + if (0==(ans[0]%primes[j])) { + dd=1; + break; + } + } + } + carry_(ans); + return; + } + + B=c*k*k; //try small primes up to B (or all the primes[] array if the largest is less than B). + if (k>2*m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits + for (r=1; k-k*r<=m; ) + r=pows[Math.floor(Math.random()*512)]; //r=Math.pow(2,Math.random()-1); + else + r=.5; + + //simulation suggests the more complex algorithm using r=.333 is only slightly faster. + + recSize=Math.floor(r*k)+1; + + randTruePrime_(s_q,recSize); + copyInt_(s_i2,0); + s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe)); //s_i2=2^(k-2) + divide_(s_i2,s_q,s_i,s_rm); //s_i=floor((2^(k-1))/(2q)) + + z=bitSize(s_i); + + for (;;) { + for (;;) { //generate z-bit numbers until one falls in the range [0,s_i-1] + randBigInt_(s_R,z,0); + if (greater(s_i,s_R)) + break; + } //now s_R is in the range [0,s_i-1] + addInt_(s_R,1); //now s_R is in the range [1,s_i] + add_(s_R,s_i); //now s_R is in the range [s_i+1,2*s_i] + + copy_(s_n,s_q); + mult_(s_n,s_R); + multInt_(s_n,2); + addInt_(s_n,1); //s_n=2*s_R*s_q+1 + + copy_(s_r2,s_R); + multInt_(s_r2,2); //s_r2=2*s_R + + //check s_n for divisibility by small primes up to B + for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++) + if (modInt(s_n,primes[j])==0) { + divisible=1; + break; + } + + if (!divisible) //if it passes small primes check, then try a single Miller-Rabin base 2 + if (!millerRabin(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_ + divisible=1; + + if (!divisible) { //if it passes that test, continue checking s_n + addInt_(s_n,-3); + for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--); //strip leading zeros + for (zz=0,w=s_n[j]; w; (w>>=1),zz++); + zz+=bpe*j; //zz=number of bits in s_n, ignoring leading zeros + for (;;) { //generate z-bit numbers until one falls in the range [0,s_n-1] + randBigInt_(s_a,zz,0); + if (greater(s_n,s_a)) + break; + } //now s_a is in the range [0,s_n-1] + addInt_(s_n,3); //now s_a is in the range [0,s_n-4] + addInt_(s_a,2); //now s_a is in the range [2,s_n-2] + copy_(s_b,s_a); + copy_(s_n1,s_n); + addInt_(s_n1,-1); + powMod_(s_b,s_n1,s_n); //s_b=s_a^(s_n-1) modulo s_n + addInt_(s_b,-1); + if (isZero(s_b)) { + copy_(s_b,s_a); + powMod_(s_b,s_r2,s_n); + addInt_(s_b,-1); + copy_(s_aa,s_n); + copy_(s_d,s_b); + GCD_(s_d,s_n); //if s_b and s_n are relatively prime, then s_n is a prime + if (equalsInt(s_d,1)) { + copy_(ans,s_aa); + return; //if we've made it this far, then s_n is absolutely guaranteed to be prime + } + } + } + } + }, + + //set b to an n-bit random BigInt. If s=1, then nth bit (most significant bit) is set to 1. + //array b must be big enough to hold the result. Must have n>=1 + 'randBigInt_': function(b,n,s) { + var i,a; + for (i=0;i<b.length;i++) + b[i]=0; + a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt + for (i=0;i<a;i++) { + b[i]=Math.floor(Math.random()*(1<<(bpe-1))); + } + b[a-1] &= (2<<((n-1)%bpe))-1; + if (s) + b[a-1] |= (1<<((n-1)%bpe)); + }, + + //set x to the greatest common divisor of x and y. + //x,y are bigInts with the same number of elements. y is destroyed. + 'GCD_': function(x,y) { + var i,xp,yp,A,B,C,D,q,sing; + if (T.length!=x.length) + T=dup(x); + + sing=1; + while (sing) { //while y has nonzero elements other than y[0] + sing=0; + for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0 + if (y[i]) { + sing=1; + break; + } + if (!sing) break; //quit when y all zero elements except possibly y[0] + + for (i=x.length;!x[i] && i>=0;i--); //find most significant element of x + xp=x[i]; + yp=y[i]; + A=1; B=0; C=0; D=1; + while ((yp+C) && (yp+D)) { + q =Math.floor((xp+A)/(yp+C)); + qp=Math.floor((xp+B)/(yp+D)); + if (q!=qp) + break; + t= A-q*C; A=C; C=t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp) + t= B-q*D; B=D; D=t; + t=xp-q*yp; xp=yp; yp=t; + } + if (B) { + copy_(T,x); + linComb_(x,y,A,B); //x=A*x+B*y + linComb_(y,T,D,C); //y=D*y+C*T + } else { + mod_(x,y); + copy_(T,x); + copy_(x,y); + copy_(y,T); + } + } + if (y[0]==0) + return; + t=modInt(x,y[0]); + copyInt_(x,y[0]); + y[0]=t; + while (y[0]) { + x[0]%=y[0]; + t=x[0]; x[0]=y[0]; y[0]=t; + } + }, + +//do x=x**(-1) mod n, for bigInts x and n. +//If no inverse exists, it sets x to zero and returns 0, else it returns 1. +//The x array must be at least as large as the n array. +function inverseMod_(x,n) { + var k=1+2*Math.max(x.length,n.length); + + if(!(x[0]&1) && !(n[0]&1)) { //if both inputs are even, then inverse doesn't exist + copyInt_(x,0); + return 0; + } + + if (eg_u.length!=k) { + eg_u=new Array(k); + eg_v=new Array(k); + eg_A=new Array(k); + eg_B=new Array(k); + eg_C=new Array(k); + eg_D=new Array(k); + } + + copy_(eg_u,x); + copy_(eg_v,n); + copyInt_(eg_A,1); + copyInt_(eg_B,0); + copyInt_(eg_C,0); + copyInt_(eg_D,1); + for (;;) { + while(!(eg_u[0]&1)) { //while eg_u is even + halve_(eg_u); + if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2 + halve_(eg_A); + halve_(eg_B); + } else { + add_(eg_A,n); halve_(eg_A); + sub_(eg_B,x); halve_(eg_B); + } + } + + while (!(eg_v[0]&1)) { //while eg_v is even + halve_(eg_v); + if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2 + halve_(eg_C); + halve_(eg_D); + } else { + add_(eg_C,n); halve_(eg_C); + sub_(eg_D,x); halve_(eg_D); + } + } + + if (!greater(eg_v,eg_u)) { //eg_v <= eg_u + sub_(eg_u,eg_v); + sub_(eg_A,eg_C); + sub_(eg_B,eg_D); + } else { //eg_v > eg_u + sub_(eg_v,eg_u); + sub_(eg_C,eg_A); + sub_(eg_D,eg_B); + } + + if (equalsInt(eg_u,0)) { + if (negative(eg_C)) //make sure answer is nonnegative + add_(eg_C,n); + copy_(x,eg_C); + + if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse + copyInt_(x,0); + return 0; + } + return 1; + } + } +} + +//return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse +function inverseModInt_(x,n) { + var a=1,b=0,t; + for (;;) { + if (x==1) return a; + if (x==0) return 0; + b-=a*Math.floor(n/x); + n%=x; + + if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to += + if (n==0) return 0; + a-=b*Math.floor(x/n); + x%=n; + } +} + +//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that: +// v = GCD_(x,y) = a*x-b*y +//The bigInts v, a, b, must have exactly as many elements as the larger of x and y. +function eGCD_(x,y,v,a,b) { + var g=0; + var k=Math.max(x.length,y.length); + if (eg_u.length!=k) { + eg_u=new Array(k); + eg_A=new Array(k); + eg_B=new Array(k); + eg_C=new Array(k); + eg_D=new Array(k); + } + while(!(x[0]&1) && !(y[0]&1)) { //while x and y both even + halve_(x); + halve_(y); + g++; + } + copy_(eg_u,x); + copy_(v,y); + copyInt_(eg_A,1); + copyInt_(eg_B,0); + copyInt_(eg_C,0); + copyInt_(eg_D,1); + for (;;) { + while(!(eg_u[0]&1)) { //while u is even + halve_(eg_u); + if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2 + halve_(eg_A); + halve_(eg_B); + } else { + add_(eg_A,y); halve_(eg_A); + sub_(eg_B,x); halve_(eg_B); + } + } + + while (!(v[0]&1)) { //while v is even + halve_(v); + if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2 + halve_(eg_C); + halve_(eg_D); + } else { + add_(eg_C,y); halve_(eg_C); + sub_(eg_D,x); halve_(eg_D); + } + } + + if (!greater(v,eg_u)) { //v<=u + sub_(eg_u,v); + sub_(eg_A,eg_C); + sub_(eg_B,eg_D); + } else { //v>u + sub_(v,eg_u); + sub_(eg_C,eg_A); + sub_(eg_D,eg_B); + } + if (equalsInt(eg_u,0)) { + if (negative(eg_C)) { //make sure a (C)is nonnegative + add_(eg_C,y); + sub_(eg_D,x); + } + multInt_(eg_D,-1); ///make sure b (D) is nonnegative + copy_(a,eg_C); + copy_(b,eg_D); + leftShift_(v,g); + return; + } + } +} + + +//is bigInt x negative? +function negative(x) { + return ((x[x.length-1]>>(bpe-1))&1); +} + + +//is (x << (shift*bpe)) > y? +//x and y are nonnegative bigInts +//shift is a nonnegative integer +function greaterShift(x,y,shift) { + var kx=x.length, ky=y.length; + k=((kx+shift)<ky) ? (kx+shift) : ky; + for (i=ky-1-shift; i<kx && i>=0; i++) + if (x[i]>0) + return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger + for (i=kx-1+shift; i<ky; i++) + if (y[i]>0) + return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger + for (i=k-1; i>=shift; i--) + if (x[i-shift]>y[i]) return 1; + else if (x[i-shift]<y[i]) return 0; + return 0; +} + +//is x > y? (x and y both nonnegative) +function greater(x,y) { + var i; + var k=(x.length<y.length) ? x.length : y.length; + + for (i=x.length;i<y.length;i++) + if (y[i]) + return 0; //y has more digits + + for (i=y.length;i<x.length;i++) + if (x[i]) + return 1; //x has more digits + + for (i=k-1;i>=0;i--) + if (x[i]>y[i]) + return 1; + else if (x[i]<y[i]) + return 0; + return 0; +} + +//divide_ x by y giving quotient q and remainder r. (q=floor(x/y), r=x mod y). All 4 are bigints. +//x must have at least one leading zero element. +//y must be nonzero. +//q and r must be arrays that are exactly the same length as x. +//the x array must have at least as many elements as y. +function divide_(x,y,q,r) { + var kx, ky; + var i,j,y1,y2,c,a,b; + copy_(r,x); + for (ky=y.length;y[ky-1]==0;ky--); //kx,ky is number of elements in x,y, not including leading zeros + for (kx=r.length;r[kx-1]==0 && kx>ky;kx--); + + //normalize: ensure the most significant element of y has its highest bit set + b=y[ky-1]; + for (a=0; b; a++) + b>>=1; + a=bpe-a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element + leftShift_(y,a); //multiply both by 1<<a now, then divide_ both by that at the end + leftShift_(r,a); + + copyInt_(q,0); // q=0 + while (!greaterShift(y,r,kx-ky)) { // while (leftShift_(y,kx-ky) <= r) { + subShift_(r,y,kx-ky); // r=r-leftShift_(y,kx-ky) + q[kx-ky]++; // q[kx-ky]++; + } // } + + for (i=kx-1; i>=ky; i--) { + if (r[i]==y[ky-1]) + q[i-ky]=mask; + else + q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]); + + //The following for(;;) loop is equivalent to the commented while loop, + //except that the uncommented version avoids overflow. + //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0 + // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2]) + // q[i-ky]--; + for (;;) { + y2=(ky>1 ? y[ky-2] : 0)*q[i-ky]; + c=y2>>bpe; + y2=y2 & mask; + y1=c+q[i-ky]*y[ky-1]; + c=y1>>bpe; + y1=y1 & mask; + + if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i]) + q[i-ky]--; + else + break; + } + + linCombShift_(r,y,-q[i-ky],i-ky); //r=r-q[i-ky]*leftShift_(y,i-ky) + if (negative(r)) { + addShift_(r,y,i-ky); //r=r+leftShift_(y,i-ky) + q[i-ky]--; + } + } + + rightShift_(y,a); //undo the normalization step + rightShift_(r,a); //undo the normalization step +} + +//do carries and borrows so each element of the bigInt x fits in bpe bits. +function carry_(x) { + var i,k,c,b; + k=x.length; + c=0; + for (i=0;i<k;i++) { + c+=x[i]; + b=0; + if (c<0) { + b=-(c>>bpe); + c+=b*radix; + } + x[i]=c & mask; + c=(c>>bpe)-b; + } +} + +//return x mod n for bigInt x and integer n. +function modInt(x,n) { + var i,c=0; + for (i=x.length-1; i>=0; i--) + c=(c*radix+x[i])%n; + return c; +} + +//convert the integer t into a bigInt with at least the given number of bits. +//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word) +//Pad the array with leading zeros so that it has at least minSize elements. +//There will always be at least one leading 0 element. +function int2bigInt(t,bits,minSize) { + var i,k; + k=Math.ceil(bits/bpe)+1; + k=minSize>k ? minSize : k; + buff=new Array(k); + copyInt_(buff,t); + return buff; +} + +//return the bigInt given a string representation in a given base. +//Pad the array with leading zeros so that it has at least minSize elements. +//If base=-1, then it reads in a space-separated list of array elements in decimal. +//The array will always have at least one leading zero, unless base=-1. +function str2bigInt(s,base,minSize) { + var d, i, j, x, y, kk; + var k=s.length; + if (base==-1) { //comma-separated list of array elements in decimal + x=new Array(0); + for (;;) { + y=new Array(x.length+1); + for (i=0;i<x.length;i++) + y[i+1]=x[i]; + y[0]=parseInt(s,10); + x=y; + d=s.indexOf(',',0); + if (d<1) + break; + s=s.substring(d+1); + if (s.length==0) + break; + } + if (x.length<minSize) { + y=new Array(minSize); + copy_(y,x); + return y; + } + return x; + } + + x=int2bigInt(0,base*k,0); + for (i=0;i<k;i++) { + d=digitsStr.indexOf(s.substring(i,i+1),0); + if (base<=36 && d>=36) //convert lowercase to uppercase if base<=36 + d-=26; + if (d<base && d>=0) { //ignore illegal characters + multInt_(x,base); + addInt_(x,d); + } + } + + for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros + k=minSize>k+1 ? minSize : k+1; + y=new Array(k); + kk=k<x.length ? k : x.length; + for (i=0;i<kk;i++) + y[i]=x[i]; + for (;i<k;i++) + y[i]=0; + return y; +} + +//is bigint x equal to integer y? +//y must have less than bpe bits +function equalsInt(x,y) { + var i; + if (x[0]!=y) + return 0; + for (i=1;i<x.length;i++) + if (x[i]) + return 0; + return 1; +} + +//are bigints x and y equal? +//this works even if x and y are different lengths and have arbitrarily many leading zeros +function equals(x,y) { + var i; + var k=x.length<y.length ? x.length : y.length; + for (i=0;i<k;i++) + if (x[i]!=y[i]) + return 0; + if (x.length>y.length) { + for (;i<x.length;i++) + if (x[i]) + return 0; + } else { + for (;i<y.length;i++) + if (y[i]) + return 0; + } + return 1; +} + +//is the bigInt x equal to zero? +function isZero(x) { + var i; + for (i=0;i<x.length;i++) + if (x[i]) + return 0; + return 1; +} + +//convert a bigInt into a string in a given base, from base 2 up to base 95. +//Base -1 prints the contents of the array representing the number. +function bigInt2str(x,base) { + var i,t,s=""; + + if (s6.length!=x.length) + s6=dup(x); + else + copy_(s6,x); + + if (base==-1) { //return the list of array contents + for (i=x.length-1;i>0;i--) + s+=x[i]+','; + s+=x[0]; + } + else { //return it in the given base + while (!isZero(s6)) { + t=divInt_(s6,base); //t=s6 % base; s6=floor(s6/base); + s=digitsStr.substring(t,t+1)+s; + } + } + if (s.length==0) + s="0"; + return s; +} + +//returns a duplicate of bigInt x +function dup(x) { + var i; + buff=new Array(x.length); + copy_(buff,x); + return buff; +} + +//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y). +function copy_(x,y) { + var i; + var k=x.length<y.length ? x.length : y.length; + for (i=0;i<k;i++) + x[i]=y[i]; + for (i=k;i<x.length;i++) + x[i]=0; +} + +//do x=y on bigInt x and integer y. +function copyInt_(x,n) { + var i,c; + for (c=n,i=0;i<x.length;i++) { + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x+n where x is a bigInt and n is an integer. +//x must be large enough to hold the result. +function addInt_(x,n) { + var i,k,c,b; + x[0]+=n; + k=x.length; + c=0; + for (i=0;i<k;i++) { + c+=x[i]; + b=0; + if (c<0) { + b=-(c>>bpe); + c+=b*radix; + } + x[i]=c & mask; + c=(c>>bpe)-b; + if (!c) return; //stop carrying as soon as the carry_ is zero + } +} + +//right shift bigInt x by n bits. 0 <= n < bpe. +function rightShift_(x,n) { + var i; + var k=Math.floor(n/bpe); + if (k) { + for (i=0;i<x.length-k;i++) //right shift x by k elements + x[i]=x[i+k]; + for (;i<x.length;i++) + x[i]=0; + n%=bpe; + } + for (i=0;i<x.length-1;i++) { + x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n)); + } + x[i]>>=n; +} + +//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement +function halve_(x) { + var i; + for (i=0;i<x.length-1;i++) { + x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1)); + } + x[i]=(x[i]>>1) | (x[i] & (radix>>1)); //most significant bit stays the same +} + +//left shift bigInt x by n bits. +function leftShift_(x,n) { + var i; + var k=Math.floor(n/bpe); + if (k) { + for (i=x.length; i>=k; i--) //left shift x by k elements + x[i]=x[i-k]; + for (;i>=0;i--) + x[i]=0; + n%=bpe; + } + if (!n) + return; + for (i=x.length-1;i>0;i--) { + x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n))); + } + x[i]=mask & (x[i]<<n); +} + +//do x=x*n where x is a bigInt and n is an integer. +//x must be large enough to hold the result. +function multInt_(x,n) { + var i,k,c,b; + if (!n) + return; + k=x.length; + c=0; + for (i=0;i<k;i++) { + c+=x[i]*n; + b=0; + if (c<0) { + b=-(c>>bpe); + c+=b*radix; + } + x[i]=c & mask; + c=(c>>bpe)-b; + } +} + +//do x=floor(x/n) for bigInt x and integer n, and return the remainder +function divInt_(x,n) { + var i,r=0,s; + for (i=x.length-1;i>=0;i--) { + s=r*radix+x[i]; + x[i]=Math.floor(s/n); + r=s%n; + } + return r; +} + +//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b. +//x must be large enough to hold the answer. +function linComb_(x,y,a,b) { + var i,c,k,kk; + k=x.length<y.length ? x.length : y.length; + kk=x.length; + for (c=0,i=0;i<k;i++) { + c+=a*x[i]+b*y[i]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;i<kk;i++) { + c+=a*x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys. +//x must be large enough to hold the answer. +function linCombShift_(x,y,b,ys) { + var i,c,k,kk; + k=x.length<ys+y.length ? x.length : ys+y.length; + kk=x.length; + for (c=0,i=ys;i<k;i++) { + c+=x[i]+b*y[i-ys]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<kk;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys. +//x must be large enough to hold the answer. +function addShift_(x,y,ys) { + var i,c,k,kk; + k=x.length<ys+y.length ? x.length : ys+y.length; + kk=x.length; + for (c=0,i=ys;i<k;i++) { + c+=x[i]+y[i-ys]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<kk;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys. +//x must be large enough to hold the answer. +function subShift_(x,y,ys) { + var i,c,k,kk; + k=x.length<ys+y.length ? x.length : ys+y.length; + kk=x.length; + for (c=0,i=ys;i<k;i++) { + c+=x[i]-y[i-ys]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<kk;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x-y for bigInts x and y. +//x must be large enough to hold the answer. +//negative answers will be 2s complement +function sub_(x,y) { + var i,c,k,kk; + k=x.length<y.length ? x.length : y.length; + for (c=0,i=0;i<k;i++) { + c+=x[i]-y[i]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<x.length;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x+y for bigInts x and y. +//x must be large enough to hold the answer. +function add_(x,y) { + var i,c,k,kk; + k=x.length<y.length ? x.length : y.length; + for (c=0,i=0;i<k;i++) { + c+=x[i]+y[i]; + x[i]=c & mask; + c>>=bpe; + } + for (i=k;c && i<x.length;i++) { + c+=x[i]; + x[i]=c & mask; + c>>=bpe; + } +} + +//do x=x*y for bigInts x and y. This is faster when y<x. +function mult_(x,y) { + var i; + if (ss.length!=2*x.length) + ss=new Array(2*x.length); + copyInt_(ss,0); + for (i=0;i<y.length;i++) + if (y[i]) + linCombShift_(ss,x,y[i],i); //ss=1*ss+y[i]*(x<<(i*bpe)) + copy_(x,ss); +} + +//do x=x mod n for bigInts x and n. +function mod_(x,n) { + if (s4.length!=x.length) + s4=dup(x); + else + copy_(s4,x); + if (s5.length!=x.length) + s5=dup(x); + divide_(s4,n,s5,x); //x = remainder of s4 / n +} + +//do x=x*y mod n for bigInts x,y,n. +//for greater speed, let y<x. +function multMod_(x,y,n) { + var i; + if (s0.length!=2*x.length) + s0=new Array(2*x.length); + copyInt_(s0,0); + for (i=0;i<y.length;i++) + if (y[i]) + linCombShift_(s0,x,y[i],i); //s0=1*s0+y[i]*(x<<(i*bpe)) + mod_(s0,n); + copy_(x,s0); +} + +//do x=x*x mod n for bigInts x,n. +function squareMod_(x,n) { + var i,j,d,c,kx,kn,k; + for (kx=x.length; kx>0 && !x[kx-1]; kx--); //ignore leading zeros in x + k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n + if (s0.length!=k) + s0=new Array(k); + copyInt_(s0,0); + for (i=0;i<kx;i++) { + c=s0[2*i]+x[i]*x[i]; + s0[2*i]=c & mask; + c>>=bpe; + for (j=i+1;j<kx;j++) { + c=s0[i+j]+2*x[i]*x[j]+c; + s0[i+j]=(c & mask); + c>>=bpe; + } + s0[i+kx]=c; + } + mod_(s0,n); + copy_(x,s0); +} + +//return x with exactly k leading zero elements +function trim(x,k) { + var i,y; + for (i=x.length; i>0 && !x[i-1]; i--); + y=new Array(i+k); + copy_(y,x); + return y; +} + +//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation. 0**0=1. +//this is faster when n is odd. x usually needs to have as many elements as n. +function powMod_(x,y,n) { + var k1,k2,kn,np; + if(s7.length!=n.length) + s7=dup(n); + + //for even modulus, use a simple square-and-multiply algorithm, + //rather than using the more complex Montgomery algorithm. + if ((n[0]&1)==0) { + copy_(s7,x); + copyInt_(x,1); + while(!equalsInt(y,0)) { + if (y[0]&1) + multMod_(x,s7,n); + divInt_(y,2); + squareMod_(s7,n); + } + return; + } + + //calculate np from n for the Montgomery multiplications + copyInt_(s7,0); + for (kn=n.length;kn>0 && !n[kn-1];kn--); + np=radix-inverseModInt_(modInt(n,radix),radix); + s7[kn]=1; + multMod_(x ,s7,n); // x = x * 2**(kn*bp) mod n + + if (s3.length!=x.length) + s3=dup(x); + else + copy_(s3,x); + + for (k1=y.length-1;k1>0 & !y[k1]; k1--); //k1=first nonzero element of y + if (y[k1]==0) { //anything to the 0th power is 1 + copyInt_(x,1); + return; + } + for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1); //k2=position of first 1 bit in y[k1] + for (;;) { + if (!(k2>>=1)) { //look at next bit of y + k1--; + if (k1<0) { + mont_(x,one,n,np); + return; + } + k2=1<<(bpe-1); + } + mont_(x,x,n,np); + + if (k2 & y[k1]) //if next bit is a 1 + mont_(x,s3,n,np); + } +} + +//do x=x*y*Ri mod n for bigInts x,y,n, +// where Ri = 2**(-kn*bpe) mod n, and kn is the +// number of elements in the n array, not +// counting leading zeros. +//x must be large enough to hold the answer. +//It's OK if x and y are the same variable. +//must have: +// x,y < n +// n is odd +// np = -(n^(-1)) mod radix +function mont_(x,y,n,np) { + var i,j,c,ui,t; + var kn=n.length; + var ky=y.length; + + if (sa.length!=kn) + sa=new Array(kn); + + for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n + //this function sometimes gives wrong answers when the next line is uncommented + //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y + + copyInt_(sa,0); + + //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys + for (i=0; i<kn; i++) { + t=sa[0]+x[i]*y[0]; + ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE + c=(t+ui*n[0]) >> bpe; + t=x[i]; + + //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe + for (j=1;j<ky;j++) { + c+=sa[j]+t*y[j]+ui*n[j]; + sa[j-1]=c & mask; + c>>=bpe; + } + for (;j<kn;j++) { + c+=sa[j]+ui*n[j]; + sa[j-1]=c & mask; + c>>=bpe; + } + sa[j-1]=c & mask; + } + + if (!greater(n,sa)) + sub_(sa,n); + copy_(x,sa); +} + + + + +//############################################################################# +//############################################################################# +//############################################################################# +//############################################################################# +//############################################################################# +//############################################################################# +//############################################################################# + + + + + +//############################################################################# + +Clipperz.Crypto.BigInt = function (aValue, aBase) { + var base; + var value; + + if (typeof(aValue) == 'object') { + this._internalValue = aValue; + } else { + if (typeof(aValue) == 'undefined') { + value = "0"; + } else { + value = aValue + ""; + } + + if (typeof(aBase) == 'undefined') { + base = 10; + } else { + base = aBase; + } + + this._internalValue = str2bigInt(value, base, 1, 1); + } + + return this; +} + +//============================================================================= + +MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, { + + //------------------------------------------------------------------------- + + 'internalValue': function () { + return this._internalValue; + }, + + //------------------------------------------------------------------------- + + 'isBigInt': true, + + //------------------------------------------------------------------------- + + 'toString': function(aBase) { + return this.asString(aBase); + }, + + //------------------------------------------------------------------------- + + 'asString': function (aBase) { + var base; + + if (typeof(aBase) == 'undefined') { + base = 10; + } else { + base = aBase; + } + + return bigInt2str(this.internalValue(), base).toLowerCase(); + }, + + //------------------------------------------------------------------------- + + 'equals': function (aValue) { + var result; + + if (aValue.isBigInt) { + result = equals(this.internalValue(), aValue.internalValue()); + } else if (typeof(aValue) == "number") { + result = equalsInt(this.internalValue(), aValue); + } else { + throw Clipperz.Crypt.BigInt.exception.UnknownType; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'add': function (aValue) { + var result; + + if (aValue.isBigInt) { + result = add(this.internalValue(), aValue.internalValue()); + } else { + result = addInt(this.internalValue(), aValue); + } + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'subtract': function (aValue) { + var result; + var value; + + if (aValue.isBigInt) { + value = aValue; + } else { + value = new Clipperz.Crypto.BigInt(aValue); + } + + result = sub(this.internalValue(), value.internalValue()); + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'multiply': function (aValue, aModule) { + var result; + var value; + + if (aValue.isBigInt) { + value = aValue; + } else { + value = new Clipperz.Crypto.BigInt(aValue); + } + + if (typeof(aModule) == 'undefined') { + result = mult(this.internalValue(), value.internalValue()); + } else { + result = multMod(this.internalValue(), value.internalValue(), aModule); + } + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'module': function (aModule) { + var result; + var module; + + if (aModule.isBigInt) { + module = aModule; + } else { + module = new Clipperz.Crypto.BigInt(aModule); + } + + result = mod(this.internalValue(), module.internalValue()); + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'powerModule': function(aValue, aModule) { + var result; + var value; + var module; + + if (aValue.isBigInt) { + value = aValue; + } else { + value = new Clipperz.Crypto.BigInt(aValue); + } + + if (aModule.isBigInt) { + module = aModule; + } else { + module = new Clipperz.Crypto.BigInt(aModule); + } + + if (aValue == -1) { + result = inverseMod(this.internalValue(), module.internalValue()); + } else { + result = powMod(this.internalValue(), value.internalValue(), module.internalValue()); + } + + return new Clipperz.Crypto.BigInt(result); + }, + + //------------------------------------------------------------------------- + + 'bitSize': function() { + return bitSize(this.internalValue()); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# + +Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) { + return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize)); +} + +//############################################################################# +//############################################################################# +//############################################################################# + +Clipperz.Crypto.BigInt.equals = function(a, b) { + return a.equals(b); +} + +Clipperz.Crypto.BigInt.add = function(a, b) { + return a.add(b); +} + +Clipperz.Crypto.BigInt.subtract = function(a, b) { + return a.subtract(b); +} + +Clipperz.Crypto.BigInt.multiply = function(a, b, module) { + return a.multiply(b, module); +} + +Clipperz.Crypto.BigInt.module = function(a, module) { + return a.module(module); +} + +Clipperz.Crypto.BigInt.powerModule = function(a, b, module) { + return a.powerModule(b, module); +} + +Clipperz.Crypto.BigInt.exception = { + UnknownType: new MochiKit.Base.NamedError("Clipperz.Crypto.BigInt.exception.UnknownType") +} diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js new file mode 100644 index 0000000..0d76b9c --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js @@ -0,0 +1,500 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { +// throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; +//} +if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } +if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } + +Clipperz.Crypto.ECC.BinaryField.Curve = function(args) { + args = args || {}; + + this._modulus = args.modulus; + + this._a = args.a; + this._b = args.b; + this._G = args.G; + this._r = args.r; + this._h = args.h; + + this._finiteField = null; + + return this; +} + +Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, { + + 'asString': function() { + return "Clipperz.Crypto.ECC.BinaryField.Curve"; + }, + + //----------------------------------------------------------------------------- + + 'modulus': function() { + return this._modulus; + }, + + 'a': function() { + return this._a; + }, + + 'b': function() { + return this._b; + }, + + 'G': function() { + return this._G; + }, + + 'r': function() { + return this._r; + }, + + 'h': function() { + return this._h; + }, + + //----------------------------------------------------------------------------- + + 'finiteField': function() { + if (this._finiteField == null) { + this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()}) + } + + return this._finiteField; + }, + + //----------------------------------------------------------------------------- + + 'negate': function(aPointA) { + var result; + + result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())}) + + return result; + }, + + //----------------------------------------------------------------------------- + + 'add': function(aPointA, aPointB) { + var result; + + if (aPointA.isZero()) { + result = aPointB; + } else if (aPointB.isZero()) { + result = aPointA; + } else if ( (aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) { + result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); + } else { + var f2m; + var x, y; + var lambda; + var aX, aY, bX, bY; + + aX = aPointA.x()._value; + aY = aPointA.y()._value; + bX = aPointB.x()._value; + bY = aPointB.y()._value; + + f2m = this.finiteField(); + + if (aPointA.x().compare(aPointB.x()) != 0) { + lambda = f2m._fastMultiply( + f2m._add(aY, bY), + f2m._inverse(f2m._add(aX, bX)) + ); + x = f2m._add(this.a()._value, f2m._square(lambda)); + f2m._overwriteAdd(x, lambda); + f2m._overwriteAdd(x, aX); + f2m._overwriteAdd(x, bX); + } else { + lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX))); + x = f2m._add(this.a()._value, f2m._square(lambda)); + f2m._overwriteAdd(x, lambda); + } + + y = f2m._fastMultiply(f2m._add(bX, x), lambda); + f2m._overwriteAdd(y, x); + f2m._overwriteAdd(y, bY); + + result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)}) + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'addTwice': function(aPointA) { + return this.add(aPointA, aPointA); + }, + + //----------------------------------------------------------------------------- + + 'overwriteAdd': function(aPointA, aPointB) { + if (aPointA.isZero()) { +// result = aPointB; + aPointA._x._value = aPointB._x._value; + aPointA._y._value = aPointB._y._value; + } else if (aPointB.isZero()) { +// result = aPointA; + } else if ( (aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) { +// result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); + aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O; + aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O; + } else { + var f2m; + var x, y; + var lambda; + var aX, aY, bX, bY; + + aX = aPointA.x()._value; + aY = aPointA.y()._value; + bX = aPointB.x()._value; + bY = aPointB.y()._value; + + f2m = this.finiteField(); + + if (aPointA.x().compare(aPointB.x()) != 0) { + lambda = f2m._fastMultiply( + f2m._add(aY, bY), + f2m._inverse(f2m._add(aX, bX)) + ); + x = f2m._add(this.a()._value, f2m._square(lambda)); + f2m._overwriteAdd(x, lambda); + f2m._overwriteAdd(x, aX); + f2m._overwriteAdd(x, bX); + } else { + lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX))); + x = f2m._add(this.a()._value, f2m._square(lambda)); + f2m._overwriteAdd(x, lambda); + } + + y = f2m._fastMultiply(f2m._add(bX, x), lambda); + f2m._overwriteAdd(y, x); + f2m._overwriteAdd(y, bY); + +// result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)}) + aPointA._x._value = x; + aPointA._y._value = y; + + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'multiply': function(aValue, aPoint) { + var result; + +//console.profile(); + result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); + + if (aValue.isZero() == false) { + var k, Q; + var i; + var countIndex; countIndex = 0; + + if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) { + k = aValue; + Q = aPoint; + } else { + Clipperz.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!"); + k = aValue.negate(); + Q = this.negate(aPoint); + } + + for (i=k.bitSize()-1; i>=0; i--) { + result = this.add(result, result); +// this.overwriteAdd(result, result); + if (k.isBitSet(i)) { + result = this.add(result, Q); +// this.overwriteAdd(result, Q); + } + +// if (countIndex==100) {Clipperz.log("multiply.break"); break;} else countIndex++; + } + } +//console.profileEnd(); + + return result; + }, + + //----------------------------------------------------------------------------- + + 'deferredMultiply': function(aValue, aPoint) { + var deferredResult; + var result; + +Clipperz.log(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint); +//console.profile("ECC.Curve.multiply"); + deferredResult = new MochiKit.Async.Deferred(); +//deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} ); +//deferredResult.addBoth(function(res) {Clipperz.logDebug("# 1: " + res); return res;}); + + result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); +//deferredResult.addBoth(function(res) {Clipperz.logDebug("# 2: " + res); return res;}); + + if (aValue.isZero() == false) { + var k, Q; + var i; + var countIndex; countIndex = 0; + + if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) { + k = aValue; + Q = aPoint; + } else { + Clipperz.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!"); + k = aValue.negate(); + Q = this.negate(aPoint); + } + + + for (i=k.bitSize()-1; i>=0; i--) { + deferredResult.addMethod(this, "addTwice"); +//# result = this.add(result, result); +// this.overwriteAdd(result, result); + if (k.isBitSet(i)) { + deferredResult.addMethod(this, "add", Q); +//# result = this.add(result, Q); +// this.overwriteAdd(result, Q); + } + if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);} + } + } +//#console.profileEnd(); +//deferredResult.addBoth(function(res) {console.profileEnd(); return res;}); + deferredResult.callback(result); + +//# return result; + return deferredResult; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + + +//############################################################################# + +Clipperz.Crypto.ECC.StandardCurves = {}; + +MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, { +/* + '_K571': null, + 'K571': function() { + if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) { + Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ + modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), + a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16), + b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), + G: new Clipperz.Crypto.ECC.BinaryField.Point({ + x: new Clipperz.Crypto.ECC.BinaryField.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16), + y: new Clipperz.Crypto.ECC.BinaryField.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16) + }), + r: new Clipperz.Crypto.ECC.BinaryField.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16), + h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16) + }); + } + + return Clipperz.Crypto.ECC.StandardCurves._K571; + }, + + + + '_K283': null, + 'K283': function() { // f(z) = z^283 + z^12 + z^7 + z^5 + 1 + if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) { + Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ + modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), + a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16), + b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), + G: new Clipperz.Crypto.ECC.BinaryField.Point({ + x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16), + y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16) + }), + r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16), + h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16) + }); + } + + return Clipperz.Crypto.ECC.StandardCurves._K283; + }, +*/ + //----------------------------------------------------------------------------- + + '_B571': null, + 'B571': function() { // f(z) = z^571 + z^10 + z^5 + z^2 + 1 + if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) { + Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ + modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16), + a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), + b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16), + G: new Clipperz.Crypto.ECC.BinaryField.Point({ + x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16), + y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16) + }), + r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16), + h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) + +// S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), +// n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) + }); + + //----------------------------------------------------------------------------- + // + // Guide to Elliptic Curve Cryptography + // Darrel Hankerson, Alfred Menezes, Scott Vanstone + // - Pag: 56, Alorithm 2.45 (with a typo!!!) + // + //----------------------------------------------------------------------------- + // + // http://www.milw0rm.com/papers/136 + // + // ------------------------------------------------------------------------- + // Polynomial Reduction Algorithm Modulo f571 + // ------------------------------------------------------------------------- + // + // Input: Polynomial p(x) of degree 1140 or less, stored as + // an array of 2T machinewords. + // Output: p(x) mod f571(x) + // + // FOR i = T-1, ..., 0 DO + // SET X := P[i+T] + // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15) + // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27) + // + // SET X := P[T-1] >> 27 + // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10) + // P[T-1] := P[T-1] & 0x07ffffff + // + // RETURN P[T-1],...,P[0] + // + // ------------------------------------------------------------------------- + // + Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module; + Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) { + var result; + + if (aValue.bitSize() > 1140) { + Clipperz.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation"); + result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue); + } else { + var C, T; + var i; + + C = aValue._value.slice(0); + for (i=35; i>=18; i--) { + T = C[i]; + C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0); + C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0); + } + T = (C[17] >>> 27); + C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0); + C[17] = (C[17] & 0x07ffffff); + + for(i=18; i<=35; i++) { + C[i] = 0; + } + + result = new Clipperz.Crypto.ECC.BinaryField.Value(C); + } + + return result; + }; + } + + return Clipperz.Crypto.ECC.StandardCurves._B571; + }, + + //----------------------------------------------------------------------------- + + '_B283': null, + 'B283': function() { // f(z) = z^283 + z^12 + z^7 + z^5 + 1 + if (Clipperz.Crypto.ECC.StandardCurves._B283 == null) { + Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ +// modulus: new Clipperz.Crypto.ECC.BinaryField.Value('10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), + modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), + a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), + b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16), + G: new Clipperz.Crypto.ECC.BinaryField.Point({ + x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16), + y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16) + }), + r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16), + h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) + +// S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), +// n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) + }); + + //----------------------------------------------------------------------------- + // + // Guide to Elliptic Curve Cryptography + // Darrel Hankerson, Alfred Menezes, Scott Vanstone + // - Pag: 56, Alorithm 2.43 + // + //----------------------------------------------------------------------------- + Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module; + Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) { + var result; + + if (aValue.bitSize() > 564) { + Clipperz.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation"); + result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue); + } else { + var C, T; + var i; + + C = aValue._value.slice(0); + for (i=17; i>=9; i--) { + T = C[i]; + C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0); + C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0); + } + T = (C[8] >>> 27); + C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0); + C[8] = (C[8] & 0x07ffffff); + + for(i=9; i<=17; i++) { + C[i] = 0; + } + + result = new Clipperz.Crypto.ECC.BinaryField.Value(C); + } + + return result; + }; + } + + return Clipperz.Crypto.ECC.StandardCurves._B283; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js new file mode 100644 index 0000000..7b7c2c6 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js @@ -0,0 +1,519 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { +// throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; +//} +if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } +if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } + +Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) { + args = args || {}; + this._modulus = args.modulus; + + return this; +} + +Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, { + + 'asString': function() { + return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")"; + }, + + //----------------------------------------------------------------------------- + + 'modulus': function() { + return this._modulus; + }, + + //----------------------------------------------------------------------------- + + '_module': function(aValue) { + var result; + var modulusComparison; + + modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value); + + if (modulusComparison < 0) { + result = aValue; + } else if (modulusComparison == 0) { + result = [0]; + } else { + var modulusBitSize; + var resultBitSize; + + result = aValue; + + modulusBitSize = this.modulus().bitSize(); + resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result); + while (resultBitSize >= modulusBitSize) { + Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize)); + resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result); + } + } + + return result; + }, + + 'module': function(aValue) { + return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0))); + }, + + //----------------------------------------------------------------------------- + + '_add': function(a, b) { + return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b); + }, + + '_overwriteAdd': function(a, b) { + Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b); + }, + + 'add': function(a, b) { + return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value)); + }, + + //----------------------------------------------------------------------------- + + 'negate': function(aValue) { + return aValue.clone(); + }, + + //----------------------------------------------------------------------------- + + '_multiply': function(a, b) { + var result; + var valueToXor; + var i,c; + + result = [0]; + valueToXor = b; + c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a); + for (i=0; i<c; i++) { + if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) { + Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor); + } + valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1); + } + result = this._module(result); + + return result; + }, + + 'multiply': function(a, b) { + return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value)); + }, + + //----------------------------------------------------------------------------- + + '_fastMultiply': function(a, b) { + var result; + var B; + var i,c; + + result = [0]; + B = b.slice(0); // Is this array copy avoidable? + c = 32; + for (i=0; i<c; i++) { + var ii, cc; + + cc = a.length; + for (ii=0; ii<cc; ii++) { + if (((a[ii] >>> i) & 0x01) == 1) { + Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii); + } + } + + if (i < (c-1)) { + B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1); + } + } + result = this._module(result); + + return result; + }, + + 'fastMultiply': function(a, b) { + return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value)); + }, + + //----------------------------------------------------------------------------- + // + // Guide to Elliptic Curve Cryptography + // Darrel Hankerson, Alfred Menezes, Scott Vanstone + // - Pag: 49, Alorithm 2.34 + // + //----------------------------------------------------------------------------- + + '_square': function(aValue) { + var result; + var value; + var c,i; + var precomputedValues; + + value = aValue; + result = new Array(value.length * 2); + precomputedValues = Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes; + + c = value.length; + for (i=0; i<c; i++) { + result[i*2] = precomputedValues[(value[i] & 0x000000ff)]; + result[i*2] |= ((precomputedValues[(value[i] & 0x0000ff00) >>> 8]) << 16); + + result[i*2 + 1] = precomputedValues[(value[i] & 0x00ff0000) >>> 16]; + result[i*2 + 1] |= ((precomputedValues[(value[i] & 0xff000000) >>> 24]) << 16); + } + + return this._module(result); + }, + + 'square': function(aValue) { + return new Clipperz.Crypto.ECC.BinaryField.Value(this._square(aValue._value)); + }, + + //----------------------------------------------------------------------------- + + '_inverse': function(aValue) { + var result; + var b, c; + var u, v; + +// b = Clipperz.Crypto.ECC.BinaryField.Value.I._value; + b = [1]; +// c = Clipperz.Crypto.ECC.BinaryField.Value.O._value; + c = [0]; + u = this._module(aValue); + v = this.modulus()._value.slice(0); + + while (Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) > 1) { + var bitDifferenceSize; + + bitDifferenceSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) - Clipperz.Crypto.ECC.BinaryField.Value._bitSize(v); + if (bitDifferenceSize < 0) { + var swap; + + swap = u; + u = v; + v = swap; + + swap = c; + c = b; + b = swap; + + bitDifferenceSize = -bitDifferenceSize; + } + + u = this._add(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize)); + b = this._add(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize)); +// this._overwriteAdd(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize)); +// this._overwriteAdd(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize)); + } + + result = this._module(b); + + return result; + }, + + 'inverse': function(aValue) { + return new Clipperz.Crypto.ECC.BinaryField.Value(this._inverse(aValue._value)); + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + + +Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes = [ + 0x0000, // 0 = 0000 0000 -> 0000 0000 0000 0000 + 0x0001, // 1 = 0000 0001 -> 0000 0000 0000 0001 + 0x0004, // 2 = 0000 0010 -> 0000 0000 0000 0100 + 0x0005, // 3 = 0000 0011 -> 0000 0000 0000 0101 + 0x0010, // 4 = 0000 0100 -> 0000 0000 0001 0000 + 0x0011, // 5 = 0000 0101 -> 0000 0000 0001 0001 + 0x0014, // 6 = 0000 0110 -> 0000 0000 0001 0100 + 0x0015, // 7 = 0000 0111 -> 0000 0000 0001 0101 + 0x0040, // 8 = 0000 1000 -> 0000 0000 0100 0000 + 0x0041, // 9 = 0000 1001 -> 0000 0000 0100 0001 + 0x0044, // 10 = 0000 1010 -> 0000 0000 0100 0100 + 0x0045, // 11 = 0000 1011 -> 0000 0000 0100 0101 + 0x0050, // 12 = 0000 1100 -> 0000 0000 0101 0000 + 0x0051, // 13 = 0000 1101 -> 0000 0000 0101 0001 + 0x0054, // 14 = 0000 1110 -> 0000 0000 0101 0100 + 0x0055, // 15 = 0000 1111 -> 0000 0000 0101 0101 + + 0x0100, // 16 = 0001 0000 -> 0000 0001 0000 0000 + 0x0101, // 17 = 0001 0001 -> 0000 0001 0000 0001 + 0x0104, // 18 = 0001 0010 -> 0000 0001 0000 0100 + 0x0105, // 19 = 0001 0011 -> 0000 0001 0000 0101 + 0x0110, // 20 = 0001 0100 -> 0000 0001 0001 0000 + 0x0111, // 21 = 0001 0101 -> 0000 0001 0001 0001 + 0x0114, // 22 = 0001 0110 -> 0000 0001 0001 0100 + 0x0115, // 23 = 0001 0111 -> 0000 0001 0001 0101 + 0x0140, // 24 = 0001 1000 -> 0000 0001 0100 0000 + 0x0141, // 25 = 0001 1001 -> 0000 0001 0100 0001 + 0x0144, // 26 = 0001 1010 -> 0000 0001 0100 0100 + 0x0145, // 27 = 0001 1011 -> 0000 0001 0100 0101 + 0x0150, // 28 = 0001 1100 -> 0000 0001 0101 0000 + 0x0151, // 28 = 0001 1101 -> 0000 0001 0101 0001 + 0x0154, // 30 = 0001 1110 -> 0000 0001 0101 0100 + 0x0155, // 31 = 0001 1111 -> 0000 0001 0101 0101 + + 0x0400, // 32 = 0010 0000 -> 0000 0100 0000 0000 + 0x0401, // 33 = 0010 0001 -> 0000 0100 0000 0001 + 0x0404, // 34 = 0010 0010 -> 0000 0100 0000 0100 + 0x0405, // 35 = 0010 0011 -> 0000 0100 0000 0101 + 0x0410, // 36 = 0010 0100 -> 0000 0100 0001 0000 + 0x0411, // 37 = 0010 0101 -> 0000 0100 0001 0001 + 0x0414, // 38 = 0010 0110 -> 0000 0100 0001 0100 + 0x0415, // 39 = 0010 0111 -> 0000 0100 0001 0101 + 0x0440, // 40 = 0010 1000 -> 0000 0100 0100 0000 + 0x0441, // 41 = 0010 1001 -> 0000 0100 0100 0001 + 0x0444, // 42 = 0010 1010 -> 0000 0100 0100 0100 + 0x0445, // 43 = 0010 1011 -> 0000 0100 0100 0101 + 0x0450, // 44 = 0010 1100 -> 0000 0100 0101 0000 + 0x0451, // 45 = 0010 1101 -> 0000 0100 0101 0001 + 0x0454, // 46 = 0010 1110 -> 0000 0100 0101 0100 + 0x0455, // 47 = 0010 1111 -> 0000 0100 0101 0101 + + 0x0500, // 48 = 0011 0000 -> 0000 0101 0000 0000 + 0x0501, // 49 = 0011 0001 -> 0000 0101 0000 0001 + 0x0504, // 50 = 0011 0010 -> 0000 0101 0000 0100 + 0x0505, // 51 = 0011 0011 -> 0000 0101 0000 0101 + 0x0510, // 52 = 0011 0100 -> 0000 0101 0001 0000 + 0x0511, // 53 = 0011 0101 -> 0000 0101 0001 0001 + 0x0514, // 54 = 0011 0110 -> 0000 0101 0001 0100 + 0x0515, // 55 = 0011 0111 -> 0000 0101 0001 0101 + 0x0540, // 56 = 0011 1000 -> 0000 0101 0100 0000 + 0x0541, // 57 = 0011 1001 -> 0000 0101 0100 0001 + 0x0544, // 58 = 0011 1010 -> 0000 0101 0100 0100 + 0x0545, // 59 = 0011 1011 -> 0000 0101 0100 0101 + 0x0550, // 60 = 0011 1100 -> 0000 0101 0101 0000 + 0x0551, // 61 = 0011 1101 -> 0000 0101 0101 0001 + 0x0554, // 62 = 0011 1110 -> 0000 0101 0101 0100 + 0x0555, // 63 = 0011 1111 -> 0000 0101 0101 0101 + + 0x1000, // 64 = 0100 0000 -> 0001 0000 0000 0000 + 0x1001, // 65 = 0100 0001 -> 0001 0000 0000 0001 + 0x1004, // 66 = 0100 0010 -> 0001 0000 0000 0100 + 0x1005, // 67 = 0100 0011 -> 0001 0000 0000 0101 + 0x1010, // 68 = 0100 0100 -> 0001 0000 0001 0000 + 0x1011, // 69 = 0100 0101 -> 0001 0000 0001 0001 + 0x1014, // 70 = 0100 0110 -> 0001 0000 0001 0100 + 0x1015, // 71 = 0100 0111 -> 0001 0000 0001 0101 + 0x1040, // 72 = 0100 1000 -> 0001 0000 0100 0000 + 0x1041, // 73 = 0100 1001 -> 0001 0000 0100 0001 + 0x1044, // 74 = 0100 1010 -> 0001 0000 0100 0100 + 0x1045, // 75 = 0100 1011 -> 0001 0000 0100 0101 + 0x1050, // 76 = 0100 1100 -> 0001 0000 0101 0000 + 0x1051, // 77 = 0100 1101 -> 0001 0000 0101 0001 + 0x1054, // 78 = 0100 1110 -> 0001 0000 0101 0100 + 0x1055, // 79 = 0100 1111 -> 0001 0000 0101 0101 + + 0x1100, // 80 = 0101 0000 -> 0001 0001 0000 0000 + 0x1101, // 81 = 0101 0001 -> 0001 0001 0000 0001 + 0x1104, // 82 = 0101 0010 -> 0001 0001 0000 0100 + 0x1105, // 83 = 0101 0011 -> 0001 0001 0000 0101 + 0x1110, // 84 = 0101 0100 -> 0001 0001 0001 0000 + 0x1111, // 85 = 0101 0101 -> 0001 0001 0001 0001 + 0x1114, // 86 = 0101 0110 -> 0001 0001 0001 0100 + 0x1115, // 87 = 0101 0111 -> 0001 0001 0001 0101 + 0x1140, // 88 = 0101 1000 -> 0001 0001 0100 0000 + 0x1141, // 89 = 0101 1001 -> 0001 0001 0100 0001 + 0x1144, // 90 = 0101 1010 -> 0001 0001 0100 0100 + 0x1145, // 91 = 0101 1011 -> 0001 0001 0100 0101 + 0x1150, // 92 = 0101 1100 -> 0001 0001 0101 0000 + 0x1151, // 93 = 0101 1101 -> 0001 0001 0101 0001 + 0x1154, // 94 = 0101 1110 -> 0001 0001 0101 0100 + 0x1155, // 95 = 0101 1111 -> 0001 0001 0101 0101 + + 0x1400, // 96 = 0110 0000 -> 0001 0100 0000 0000 + 0x1401, // 97 = 0110 0001 -> 0001 0100 0000 0001 + 0x1404, // 98 = 0110 0010 -> 0001 0100 0000 0100 + 0x1405, // 99 = 0110 0011 -> 0001 0100 0000 0101 + 0x1410, // 100 = 0110 0100 -> 0001 0100 0001 0000 + 0x1411, // 101 = 0110 0101 -> 0001 0100 0001 0001 + 0x1414, // 102 = 0110 0110 -> 0001 0100 0001 0100 + 0x1415, // 103 = 0110 0111 -> 0001 0100 0001 0101 + 0x1440, // 104 = 0110 1000 -> 0001 0100 0100 0000 + 0x1441, // 105 = 0110 1001 -> 0001 0100 0100 0001 + 0x1444, // 106 = 0110 1010 -> 0001 0100 0100 0100 + 0x1445, // 107 = 0110 1011 -> 0001 0100 0100 0101 + 0x1450, // 108 = 0110 1100 -> 0001 0100 0101 0000 + 0x1451, // 109 = 0110 1101 -> 0001 0100 0101 0001 + 0x1454, // 110 = 0110 1110 -> 0001 0100 0101 0100 + 0x1455, // 111 = 0110 1111 -> 0001 0100 0101 0101 + + 0x1500, // 112 = 0111 0000 -> 0001 0101 0000 0000 + 0x1501, // 113 = 0111 0001 -> 0001 0101 0000 0001 + 0x1504, // 114 = 0111 0010 -> 0001 0101 0000 0100 + 0x1505, // 115 = 0111 0011 -> 0001 0101 0000 0101 + 0x1510, // 116 = 0111 0100 -> 0001 0101 0001 0000 + 0x1511, // 117 = 0111 0101 -> 0001 0101 0001 0001 + 0x1514, // 118 = 0111 0110 -> 0001 0101 0001 0100 + 0x1515, // 119 = 0111 0111 -> 0001 0101 0001 0101 + 0x1540, // 120 = 0111 1000 -> 0001 0101 0100 0000 + 0x1541, // 121 = 0111 1001 -> 0001 0101 0100 0001 + 0x1544, // 122 = 0111 1010 -> 0001 0101 0100 0100 + 0x1545, // 123 = 0111 1011 -> 0001 0101 0100 0101 + 0x1550, // 124 = 0111 1100 -> 0001 0101 0101 0000 + 0x1551, // 125 = 0111 1101 -> 0001 0101 0101 0001 + 0x1554, // 126 = 0111 1110 -> 0001 0101 0101 0100 + 0x1555, // 127 = 0111 1111 -> 0001 0101 0101 0101 + + 0x4000, // 128 = 1000 0000 -> 0100 0000 0000 0000 + 0x4001, // 129 = 1000 0001 -> 0100 0000 0000 0001 + 0x4004, // 130 = 1000 0010 -> 0100 0000 0000 0100 + 0x4005, // 131 = 1000 0011 -> 0100 0000 0000 0101 + 0x4010, // 132 = 1000 0100 -> 0100 0000 0001 0000 + 0x4011, // 133 = 1000 0101 -> 0100 0000 0001 0001 + 0x4014, // 134 = 1000 0110 -> 0100 0000 0001 0100 + 0x4015, // 135 = 1000 0111 -> 0100 0000 0001 0101 + 0x4040, // 136 = 1000 1000 -> 0100 0000 0100 0000 + 0x4041, // 137 = 1000 1001 -> 0100 0000 0100 0001 + 0x4044, // 138 = 1000 1010 -> 0100 0000 0100 0100 + 0x4045, // 139 = 1000 1011 -> 0100 0000 0100 0101 + 0x4050, // 140 = 1000 1100 -> 0100 0000 0101 0000 + 0x4051, // 141 = 1000 1101 -> 0100 0000 0101 0001 + 0x4054, // 142 = 1000 1110 -> 0100 0000 0101 0100 + 0x4055, // 143 = 1000 1111 -> 0100 0000 0101 0101 + + 0x4100, // 144 = 1001 0000 -> 0100 0001 0000 0000 + 0x4101, // 145 = 1001 0001 -> 0100 0001 0000 0001 + 0x4104, // 146 = 1001 0010 -> 0100 0001 0000 0100 + 0x4105, // 147 = 1001 0011 -> 0100 0001 0000 0101 + 0x4110, // 148 = 1001 0100 -> 0100 0001 0001 0000 + 0x4111, // 149 = 1001 0101 -> 0100 0001 0001 0001 + 0x4114, // 150 = 1001 0110 -> 0100 0001 0001 0100 + 0x4115, // 151 = 1001 0111 -> 0100 0001 0001 0101 + 0x4140, // 152 = 1001 1000 -> 0100 0001 0100 0000 + 0x4141, // 153 = 1001 1001 -> 0100 0001 0100 0001 + 0x4144, // 154 = 1001 1010 -> 0100 0001 0100 0100 + 0x4145, // 155 = 1001 1011 -> 0100 0001 0100 0101 + 0x4150, // 156 = 1001 1100 -> 0100 0001 0101 0000 + 0x4151, // 157 = 1001 1101 -> 0100 0001 0101 0001 + 0x4154, // 158 = 1001 1110 -> 0100 0001 0101 0100 + 0x4155, // 159 = 1001 1111 -> 0100 0001 0101 0101 + + 0x4400, // 160 = 1010 0000 -> 0100 0100 0000 0000 + 0x4401, // 161 = 1010 0001 -> 0100 0100 0000 0001 + 0x4404, // 162 = 1010 0010 -> 0100 0100 0000 0100 + 0x4405, // 163 = 1010 0011 -> 0100 0100 0000 0101 + 0x4410, // 164 = 1010 0100 -> 0100 0100 0001 0000 + 0x4411, // 165 = 1010 0101 -> 0100 0100 0001 0001 + 0x4414, // 166 = 1010 0110 -> 0100 0100 0001 0100 + 0x4415, // 167 = 1010 0111 -> 0100 0100 0001 0101 + 0x4440, // 168 = 1010 1000 -> 0100 0100 0100 0000 + 0x4441, // 169 = 1010 1001 -> 0100 0100 0100 0001 + 0x4444, // 170 = 1010 1010 -> 0100 0100 0100 0100 + 0x4445, // 171 = 1010 1011 -> 0100 0100 0100 0101 + 0x4450, // 172 = 1010 1100 -> 0100 0100 0101 0000 + 0x4451, // 173 = 1010 1101 -> 0100 0100 0101 0001 + 0x4454, // 174 = 1010 1110 -> 0100 0100 0101 0100 + 0x4455, // 175 = 1010 1111 -> 0100 0100 0101 0101 + + 0x4500, // 176 = 1011 0000 -> 0100 0101 0000 0000 + 0x4501, // 177 = 1011 0001 -> 0100 0101 0000 0001 + 0x4504, // 178 = 1011 0010 -> 0100 0101 0000 0100 + 0x4505, // 179 = 1011 0011 -> 0100 0101 0000 0101 + 0x4510, // 180 = 1011 0100 -> 0100 0101 0001 0000 + 0x4511, // 181 = 1011 0101 -> 0100 0101 0001 0001 + 0x4514, // 182 = 1011 0110 -> 0100 0101 0001 0100 + 0x4515, // 183 = 1011 0111 -> 0100 0101 0001 0101 + 0x4540, // 184 = 1011 1000 -> 0100 0101 0100 0000 + 0x4541, // 185 = 1011 1001 -> 0100 0101 0100 0001 + 0x4544, // 186 = 1011 1010 -> 0100 0101 0100 0100 + 0x4545, // 187 = 1011 1011 -> 0100 0101 0100 0101 + 0x4550, // 188 = 1011 1100 -> 0100 0101 0101 0000 + 0x4551, // 189 = 1011 1101 -> 0100 0101 0101 0001 + 0x4554, // 190 = 1011 1110 -> 0100 0101 0101 0100 + 0x4555, // 191 = 1011 1111 -> 0100 0101 0101 0101 + + 0x5000, // 192 = 1100 0000 -> 0101 0000 0000 0000 + 0x5001, // 193 = 1100 0001 -> 0101 0000 0000 0001 + 0x5004, // 194 = 1100 0010 -> 0101 0000 0000 0100 + 0x5005, // 195 = 1100 0011 -> 0101 0000 0000 0101 + 0x5010, // 196 = 1100 0100 -> 0101 0000 0001 0000 + 0x5011, // 197 = 1100 0101 -> 0101 0000 0001 0001 + 0x5014, // 198 = 1100 0110 -> 0101 0000 0001 0100 + 0x5015, // 199 = 1100 0111 -> 0101 0000 0001 0101 + 0x5040, // 200 = 1100 1000 -> 0101 0000 0100 0000 + 0x5041, // 201 = 1100 1001 -> 0101 0000 0100 0001 + 0x5044, // 202 = 1100 1010 -> 0101 0000 0100 0100 + 0x5045, // 203 = 1100 1011 -> 0101 0000 0100 0101 + 0x5050, // 204 = 1100 1100 -> 0101 0000 0101 0000 + 0x5051, // 205 = 1100 1101 -> 0101 0000 0101 0001 + 0x5054, // 206 = 1100 1110 -> 0101 0000 0101 0100 + 0x5055, // 207 = 1100 1111 -> 0101 0000 0101 0101 + + 0x5100, // 208 = 1101 0000 -> 0101 0001 0000 0000 + 0x5101, // 209 = 1101 0001 -> 0101 0001 0000 0001 + 0x5104, // 210 = 1101 0010 -> 0101 0001 0000 0100 + 0x5105, // 211 = 1101 0011 -> 0101 0001 0000 0101 + 0x5110, // 212 = 1101 0100 -> 0101 0001 0001 0000 + 0x5111, // 213 = 1101 0101 -> 0101 0001 0001 0001 + 0x5114, // 214 = 1101 0110 -> 0101 0001 0001 0100 + 0x5115, // 215 = 1101 0111 -> 0101 0001 0001 0101 + 0x5140, // 216 = 1101 1000 -> 0101 0001 0100 0000 + 0x5141, // 217 = 1101 1001 -> 0101 0001 0100 0001 + 0x5144, // 218 = 1101 1010 -> 0101 0001 0100 0100 + 0x5145, // 219 = 1101 1011 -> 0101 0001 0100 0101 + 0x5150, // 220 = 1101 1100 -> 0101 0001 0101 0000 + 0x5151, // 221 = 1101 1101 -> 0101 0001 0101 0001 + 0x5154, // 222 = 1101 1110 -> 0101 0001 0101 0100 + 0x5155, // 223 = 1101 1111 -> 0101 0001 0101 0101 + + 0x5400, // 224 = 1110 0000 -> 0101 0100 0000 0000 + 0x5401, // 225 = 1110 0001 -> 0101 0100 0000 0001 + 0x5404, // 226 = 1110 0010 -> 0101 0100 0000 0100 + 0x5405, // 227 = 1110 0011 -> 0101 0100 0000 0101 + 0x5410, // 228 = 1110 0100 -> 0101 0100 0001 0000 + 0x5411, // 229 = 1110 0101 -> 0101 0100 0001 0001 + 0x5414, // 230 = 1110 0110 -> 0101 0100 0001 0100 + 0x5415, // 231 = 1110 0111 -> 0101 0100 0001 0101 + 0x5440, // 232 = 1110 1000 -> 0101 0100 0100 0000 + 0x5441, // 233 = 1110 1001 -> 0101 0100 0100 0001 + 0x5444, // 234 = 1110 1010 -> 0101 0100 0100 0100 + 0x5445, // 235 = 1110 1011 -> 0101 0100 0100 0101 + 0x5450, // 236 = 1110 1100 -> 0101 0100 0101 0000 + 0x5451, // 237 = 1110 1101 -> 0101 0100 0101 0001 + 0x5454, // 238 = 1110 1110 -> 0101 0100 0101 0100 + 0x5455, // 239 = 1110 1111 -> 0101 0100 0101 0101 + + 0x5500, // 240 = 1111 0000 -> 0101 0101 0000 0000 + 0x5501, // 241 = 1111 0001 -> 0101 0101 0000 0001 + 0x5504, // 242 = 1111 0010 -> 0101 0101 0000 0100 + 0x5505, // 243 = 1111 0011 -> 0101 0101 0000 0101 + 0x5510, // 244 = 1111 0100 -> 0101 0101 0001 0000 + 0x5511, // 245 = 1111 0101 -> 0101 0101 0001 0001 + 0x5514, // 246 = 1111 0110 -> 0101 0101 0001 0100 + 0x5515, // 247 = 1111 0111 -> 0101 0101 0001 0101 + 0x5540, // 248 = 1111 1000 -> 0101 0101 0100 0000 + 0x5541, // 249 = 1111 1001 -> 0101 0101 0100 0001 + 0x5544, // 250 = 1111 1010 -> 0101 0101 0100 0100 + 0x5545, // 251 = 1111 1011 -> 0101 0101 0100 0101 + 0x5550, // 252 = 1111 1100 -> 0101 0101 0101 0000 + 0x5551, // 253 = 1111 1101 -> 0101 0101 0101 0001 + 0x5554, // 254 = 1111 1110 -> 0101 0101 0101 0100 + 0x5555 // 255 = 1111 1111 -> 0101 0101 0101 0101 + +] diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Point.js b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Point.js new file mode 100644 index 0000000..fef3220 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Point.js @@ -0,0 +1,62 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { +// throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; +//} +if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } +if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } + +Clipperz.Crypto.ECC.BinaryField.Point = function(args) { + args = args || {}; + this._x = args.x; + this._y = args.y; + + return this; +} + +Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, { + + 'asString': function() { + return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")"; + }, + + //----------------------------------------------------------------------------- + + 'x': function() { + return this._x; + }, + + 'y': function() { + return this._y; + }, + + //----------------------------------------------------------------------------- + + 'isZero': function() { + return (this.x().isZero() && this.y().isZero()) + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Value.js b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Value.js new file mode 100644 index 0000000..634772a --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Value.js @@ -0,0 +1,379 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { +// throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; +//} +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } +if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } +if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } + +Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) { + if (aValue.constructor == String) { + var value; + var stringLength; + var numberOfWords; + var i,c; + + if (aBase != 16) { + throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase; + } + + value = aValue.replace(/ /g, ''); + stringLength = value.length; + numberOfWords = Math.ceil(stringLength / 8); + this._value = new Array(numberOfWords); + + c = numberOfWords; + for (i=0; i<c; i++) { + var word; + + if (i < (c-1)) { + word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16); + } else { + word = parseInt(value.substr(0, stringLength-(i*8)), 16); + } + + this._value[i] = word; + } + } else if (aValue.constructor == Array) { + var itemsToCopy; + + itemsToCopy = aValue.length; + while (aValue[itemsToCopy - 1] == 0) { + itemsToCopy --; + } + + this._value = aValue.slice(0, itemsToCopy); + } else if (aValue.constructor == Number) { + this._value = [aValue]; + } else { +// throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType; + } + + this._bitSize == aBitSize || null; + + return this; +} + +Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, { + + 'value': function() { + return this._value; + }, + + //----------------------------------------------------------------------------- + + 'wordSize': function() { + return this._value.length + }, + + //----------------------------------------------------------------------------- + + 'clone': function() { + return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize); + }, + + //----------------------------------------------------------------------------- + + 'isZero': function() { + return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0); + }, + + //----------------------------------------------------------------------------- + + 'asString': function(aBase) { + var result; + var i,c; + + if (aBase != 16) { + throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase; + } + + result = ""; + c = this.wordSize(); + for (i=0; i<c; i++) { + var wordAsString; + +// wordAsString = ("00000000" + this.value()[i].toString(16)); + wordAsString = ("00000000" + this._value[i].toString(16)); + wordAsString = wordAsString.substring(wordAsString.length - 8); + result = wordAsString + result; + } + + result = result.replace(/^(00)*/, ""); + + if (result == "") { + result = "0"; + } + + return result; + }, + + //----------------------------------------------------------------------------- + + 'shiftLeft': function(aNumberOfBitsToShift) { + // this method seems like it is never called. :-( + return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this._value, aNumberOfBitsToShift)); + }, + + //----------------------------------------------------------------------------- + + 'bitSize': function() { + if (this._bitSize == null) { + this._bitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(this._value); + } + + return this._bitSize; + }, + + //----------------------------------------------------------------------------- + + 'isBitSet': function(aBitPosition) { + return Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(this._value, aBitPosition); + }, + + //----------------------------------------------------------------------------- + + 'xor': function(aValue) { + return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(this._value, aValue._value)); + }, + + //----------------------------------------------------------------------------- + + 'compare': function(aValue) { + return Clipperz.Crypto.ECC.BinaryField.Value._compare(this._value, aValue._value); + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); +Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16); + +Clipperz.Crypto.ECC.BinaryField.Value._xor = function(a, b, aFirstItemOffset) { + var result; + var resultSize; + var i,c; + var firstItemOffset; + + firstItemOffset = aFirstItemOffset || 0; + resultSize = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset; + + result = new Array(resultSize); + + c = firstItemOffset; + for (i=0; i<c; i++) { + result[i] = a[i]; + } + + c = resultSize; + for (i=firstItemOffset; i<c; i++) { + result[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0); + } + + return result; +}; + +Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor = function(a, b, aFirstItemOffset) { + var i,c; + var firstItemOffset; + + firstItemOffset = aFirstItemOffset || 0; + + c = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset; + for (i=firstItemOffset; i<c; i++) { + a[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0); + } +}; + +Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft = function(aWordArray, aNumberOfBitsToShift) { + var numberOfWordsToShift; + var numberOfBitsToShift; + var result; + var overflowValue; + var nextOverflowValue; + var i,c; + + numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32); + numberOfBitsToShift = aNumberOfBitsToShift % 32; + + result = new Array(aWordArray.length + numberOfWordsToShift); + + c = numberOfWordsToShift; + for (i=0; i<c; i++) { + result[i] = 0; + } + + overflowValue = 0; + nextOverflowValue = 0; + + c = aWordArray.length; + for (i=0; i<c; i++) { + var value; + var resultWord; + +// value = this.value()[i]; + value = aWordArray[i]; + + if (numberOfBitsToShift > 0) { + nextOverflowValue = (value >>> (32 - numberOfBitsToShift)); + value = value & (0xffffffff >>> numberOfBitsToShift); + resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0); + } else { + resultWord = value; + } + + result[i+numberOfWordsToShift] = resultWord; + overflowValue = nextOverflowValue; + } + + if (overflowValue != 0) { + result[aWordArray.length + numberOfWordsToShift] = overflowValue; + } + + return result; +}; + +Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray, aNumberOfBitsToShift) { + var numberOfWordsToShift; + var numberOfBitsToShift; + var result; + var overflowValue; + var i,c; + + numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32); + numberOfBitsToShift = aNumberOfBitsToShift % 32; + + result = new Array(aWordArray.length + numberOfWordsToShift); + + c = numberOfWordsToShift; + for (i=0; i<c; i++) { + result[i] = 0; + } + + overflowValue = 0; + nextOverflowValue = 0; + + c = aWordArray.length; + for (i=0; i<c; i++) { + var value; + var resultWord; + +// value = this.value()[i]; + value = aWordArray[i]; + + if (numberOfBitsToShift > 0) { + var nextOverflowValue; + + nextOverflowValue = (value >>> (32 - numberOfBitsToShift)); + value = value & (0xffffffff >>> numberOfBitsToShift); + resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0); + } else { + resultWord = value; + } + + result[i+numberOfWordsToShift] = resultWord; + overflowValue = nextOverflowValue; + } + + if (overflowValue != 0) { + result[aWordArray.length + numberOfWordsToShift] = overflowValue; + } + + return result; +}; + +Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) { + var result; + var notNullElements; + var mostValuableWord; + var matchingBitsInMostImportantWord; + var mask; + var i,c; + + notNullElements = aWordArray.length; + + if ((aWordArray.length == 1) && (aWordArray[0] == 0)) { + result = 0; + } else { + notNullElements --; + while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) { + notNullElements --; + } + + result = notNullElements * 32; + mostValuableWord = aWordArray[notNullElements]; + + matchingBits = 32; + mask = 0x80000000; + + while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) { + matchingBits --; + mask >>>= 1; + } + + result += matchingBits; + } + + return result; +}; + +Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) { + var result; + var byteIndex; + var bitIndexInSelectedByte; + + byteIndex = Math.floor(aBitPosition / 32); + bitIndexInSelectedByte = aBitPosition % 32; + + if (byteIndex <= aWordArray.length) { + result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0); + } else { + result = false; + } + + return result; +}; + +Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) { + var result; + var i,c; + + result = MochiKit.Base.compare(a.length, b.length); + + c = a.length; + for (i=0; (i<c) && (result==0); i++) { + result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]); + } + + return result; +}; + + +Clipperz.Crypto.ECC.BinaryField.Value['exception']= { + 'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"), + 'UnsupportedConstructorValueType': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType") +}; diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/StandardCurves.js b/frontend/delta/js/Clipperz/Crypto/ECC/StandardCurves.js new file mode 100644 index 0000000..239e264 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/ECC/StandardCurves.js @@ -0,0 +1,229 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +//try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) { +// throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!"; +//} +//try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) { +// throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!"; +//} + +Clipperz.Crypto.ECC.StandardCurves = {}; + +MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, { + + //============================================================================== + + '_K571': null, + 'K571': function() { // f(z) = z^571 + z^10 + z^5 + z^2 + 1 + if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) { + Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({ + modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), + a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16), + b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16), + G: new Clipperz.Crypto.ECC.Koblitz.Point({ + x: new Clipperz.Crypto.ECC.Koblitz.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16), + y: new Clipperz.Crypto.ECC.Koblitz.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16) + }), + r: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16), + h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16), + primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16) + }); + } + + return Clipperz.Crypto.ECC.StandardCurves._K571; + }, + + //----------------------------------------------------------------------------- + + '_K283': null, + 'K283': function() { // f(z) = z^283 + z^12 + z^7 + z^5 + 1 + if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) { + Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({ + modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), + a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16), + b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16), + G: new Clipperz.Crypto.ECC.Koblitz.Point({ + x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16), + y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16) + }), + r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16), + h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16), + primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16) + }); + } + + return Clipperz.Crypto.ECC.StandardCurves._K283; + }, + + //============================================================================== + + '_B571': null, + 'B571': function() { // f(z) = z^571 + z^10 + z^5 + z^2 + 1 + if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) { + Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ + modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), + a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), + b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e 2221f295 de297117 b7f3d62f 5c6a97ff cb8ceff1 cd6ba8ce 4a9a18ad 84ffabbd 8efa5933 2be7ad67 56a66e29 4afd185a 78ff12aa 520e4de7 39baca0c 7ffeff7f 2955727a', 16), + G: new Clipperz.Crypto.ECC.BinaryField.Point({ + x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16), + y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16) + }), + r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16), + h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) + +// S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), +// n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) + }); + + //----------------------------------------------------------------------------- + // + // Guide to Elliptic Curve Cryptography + // Darrel Hankerson, Alfred Menezes, Scott Vanstone + // - Pag: 56, Alorithm 2.45 (with a typo!!!) + // + //----------------------------------------------------------------------------- + // + // http://www.milw0rm.com/papers/136 + // + // ------------------------------------------------------------------------- + // Polynomial Reduction Algorithm Modulo f571 + // ------------------------------------------------------------------------- + // + // Input: Polynomial p(x) of degree 1140 or less, stored as + // an array of 2T machinewords. + // Output: p(x) mod f571(x) + // + // FOR i = T-1, ..., 0 DO + // SET X := P[i+T] + // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15) + // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27) + // + // SET X := P[T-1] >> 27 + // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10) + // P[T-1] := P[T-1] & 0x07ffffff + // + // RETURN P[T-1],...,P[0] + // + // ------------------------------------------------------------------------- + // + Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module; + Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) { + var result; + + if (aValue.bitSize() > 1140) { + Clipperz.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation"); + result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue); + } else { + var C, T; + var i; + + C = aValue._value.slice(0); + for (i=35; i>=18; i--) { + T = C[i]; + C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0); + C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0); + } + T = (C[17] >>> 27); + C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0); + C[17] = (C[17] & 0x07ffffff); + + for(i=18; i<=35; i++) { + C[i] = 0; + } + + result = new Clipperz.Crypto.ECC.BinaryField.Value(C); + } + + return result; + }; + } + + return Clipperz.Crypto.ECC.StandardCurves._B571; + }, + + //----------------------------------------------------------------------------- + + '_B283': null, + 'B283': function() { // f(z) = z^283 + z^12 + z^7 + z^5 + 1 + if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) { + Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ + modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), + a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), + b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16), + G: new Clipperz.Crypto.ECC.BinaryField.Point({ + x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16), + y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16) + }), + r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16), + h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) + }); + + //----------------------------------------------------------------------------- + // + // Guide to Elliptic Curve Cryptography + // Darrel Hankerson, Alfred Menezes, Scott Vanstone + // - Pag: 56, Alorithm 2.43 + // + //----------------------------------------------------------------------------- + Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module; + Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) { + var result; + + if (aValue.bitSize() > 564) { + Clipperz.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation"); + result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue); + } else { + var C, T; + var i; + + C = aValue._value.slice(0); + for (i=17; i>=9; i--) { + T = C[i]; + C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0); + C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0); + } + T = (C[8] >>> 27); + C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0); + C[8] = (C[8] & 0x07ffffff); + + for(i=9; i<=17; i++) { + C[i] = 0; + } + + result = new Clipperz.Crypto.ECC.BinaryField.Value(C); + } + + return result; + }; + } + + return Clipperz.Crypto.ECC.StandardCurves._B283; + }, + + //============================================================================== + __syntaxFix__: "syntax fix" +}); + + + diff --git a/frontend/delta/js/Clipperz/Crypto/PRNG.js b/frontend/delta/js/Clipperz/Crypto/PRNG.js new file mode 100644 index 0000000..c539f06 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/PRNG.js @@ -0,0 +1,841 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; +} + +try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!"; +} + +try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!"; +} + +if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; } + +//############################################################################# + +Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) { + args = args || {}; +// MochiKit.Base.bindMethods(this); + + this._stack = new Clipperz.ByteArray(); + this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256; + return this; +} + +Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "Clipperz.Crypto.PRNG.EntropyAccumulator"; + }, + + //------------------------------------------------------------------------- + + 'stack': function() { + return this._stack; + }, + + 'setStack': function(aValue) { + this._stack = aValue; + }, + + 'resetStack': function() { + this.stack().reset(); + }, + + 'maxStackLengthBeforeHashing': function() { + return this._maxStackLengthBeforeHashing; + }, + + //------------------------------------------------------------------------- + + 'addRandomByte': function(aValue) { + this.stack().appendByte(aValue); + + if (this.stack().length() > this.maxStackLengthBeforeHashing()) { + this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack())); + } + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Crypto.PRNG.RandomnessSource = function(args) { + args = args || {}; + MochiKit.Base.bindMethods(this); + + this._generator = args.generator || null; + this._sourceId = args.sourceId || null; + this._boostMode = args.boostMode || false; + + this._nextPoolIndex = 0; + + return this; +} + +Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, { + + 'generator': function() { + return this._generator; + }, + + 'setGenerator': function(aValue) { + this._generator = aValue; + }, + + //------------------------------------------------------------------------- + + 'boostMode': function() { + return this._boostMode; + }, + + 'setBoostMode': function(aValue) { + this._boostMode = aValue; + }, + + //------------------------------------------------------------------------- + + 'sourceId': function() { + return this._sourceId; + }, + + 'setSourceId': function(aValue) { + this._sourceId = aValue; + }, + + //------------------------------------------------------------------------- + + 'nextPoolIndex': function() { + return this._nextPoolIndex; + }, + + 'incrementNextPoolIndex': function() { + this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators()); + }, + + //------------------------------------------------------------------------- + + 'updateGeneratorWithValue': function(aRandomValue) { + if (this.generator() != null) { + this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue); + this.incrementNextPoolIndex(); + } + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) { + args = args || {}; +// MochiKit.Base.bindMethods(this); + + this._intervalTime = args.intervalTime || 1000; + + Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); + + this.collectEntropy(); + return this; +} + +Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { + + 'intervalTime': function() { + return this._intervalTime; + }, + + //------------------------------------------------------------------------- + + 'collectEntropy': function() { + var now; + var entropyByte; + var intervalTime; + now = new Date(); + entropyByte = (now.getTime() & 0xff); + + intervalTime = this.intervalTime(); + if (this.boostMode() == true) { + intervalTime = intervalTime / 9; + } + + this.updateGeneratorWithValue(entropyByte); + setTimeout(this.collectEntropy, intervalTime); + }, + + //------------------------------------------------------------------------- + + 'numberOfRandomBits': function() { + return 5; + }, + + //------------------------------------------------------------------------- + + 'pollingFrequency': function() { + return 10; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//***************************************************************************** + +Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) { + args = args || {}; + + Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); + + this._numberOfBitsToCollectAtEachEvent = 4; + this._randomBitsCollector = 0; + this._numberOfRandomBitsCollected = 0; + + MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy'); + + return this; +} + +Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { + + //------------------------------------------------------------------------- + + 'numberOfBitsToCollectAtEachEvent': function() { + return this._numberOfBitsToCollectAtEachEvent; + }, + + //------------------------------------------------------------------------- + + 'randomBitsCollector': function() { + return this._randomBitsCollector; + }, + + 'setRandomBitsCollector': function(aValue) { + this._randomBitsCollector = aValue; + }, + + 'appendRandomBitsToRandomBitsCollector': function(aValue) { + var collectedBits; + var numberOfRandomBitsCollected; + + numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); + collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); + this.setRandomBitsCollector(collectetBits); + numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent(); + + if (numberOfRandomBitsCollected == 8) { + this.updateGeneratorWithValue(collectetBits); + numberOfRandomBitsCollected = 0; + this.setRandomBitsCollector(0); + } + + this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) + }, + + //------------------------------------------------------------------------- + + 'numberOfRandomBitsCollected': function() { + return this._numberOfRandomBitsCollected; + }, + + 'setNumberOfRandomBitsCollected': function(aValue) { + this._numberOfRandomBitsCollected = aValue; + }, + + //------------------------------------------------------------------------- + + 'collectEntropy': function(anEvent) { + var mouseLocation; + var randomBit; + var mask; + + mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent()); + + mouseLocation = anEvent.mouse().client; + randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask); + this.appendRandomBitsToRandomBitsCollector(randomBit) + }, + + //------------------------------------------------------------------------- + + 'numberOfRandomBits': function() { + return 1; + }, + + //------------------------------------------------------------------------- + + 'pollingFrequency': function() { + return 10; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//***************************************************************************** + +Clipperz.Crypto.PRNG.KeyboardRandomnessSource = function(args) { + args = args || {}; + Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); + + this._randomBitsCollector = 0; + this._numberOfRandomBitsCollected = 0; + + MochiKit.Signal.connect(document, 'onkeypress', this, 'collectEntropy'); + + return this; +} + +Clipperz.Crypto.PRNG.KeyboardRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { + + //------------------------------------------------------------------------- + + 'randomBitsCollector': function() { + return this._randomBitsCollector; + }, + + 'setRandomBitsCollector': function(aValue) { + this._randomBitsCollector = aValue; + }, + + 'appendRandomBitToRandomBitsCollector': function(aValue) { + var collectedBits; + var numberOfRandomBitsCollected; + + numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); + collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); + this.setRandomBitsCollector(collectetBits); + numberOfRandomBitsCollected ++; + + if (numberOfRandomBitsCollected == 8) { + this.updateGeneratorWithValue(collectetBits); + numberOfRandomBitsCollected = 0; + this.setRandomBitsCollector(0); + } + + this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) + }, + + //------------------------------------------------------------------------- + + 'numberOfRandomBitsCollected': function() { + return this._numberOfRandomBitsCollected; + }, + + 'setNumberOfRandomBitsCollected': function(aValue) { + this._numberOfRandomBitsCollected = aValue; + }, + + //------------------------------------------------------------------------- + + 'collectEntropy': function(anEvent) { +/* + var mouseLocation; + var randomBit; + + mouseLocation = anEvent.mouse().client; + + randomBit = ((mouseLocation.x ^ mouseLocation.y) & 0x1); + this.appendRandomBitToRandomBitsCollector(randomBit); +*/ + }, + + //------------------------------------------------------------------------- + + 'numberOfRandomBits': function() { + return 1; + }, + + //------------------------------------------------------------------------- + + 'pollingFrequency': function() { + return 10; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Crypto.PRNG.Fortuna = function(args) { + var i,c; + + args = args || {}; + + this._key = args.seed || null; + if (this._key == null) { + this._counter = 0; + this._key = new Clipperz.ByteArray(); + } else { + this._counter = 1; + } + + this._aesKey = null; + + this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64; + this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32; + + this._accumulators = []; + c = this.numberOfEntropyAccumulators(); + for (i=0; i<c; i++) { + this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator()); + } + + this._randomnessSources = []; + this._reseedCounter = 0; + + return this; +} + +Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "Clipperz.Crypto.PRNG.Fortuna"; + }, + + //------------------------------------------------------------------------- + + 'key': function() { + return this._key; + }, + + 'setKey': function(aValue) { + this._key = aValue; + this._aesKey = null; + }, + + 'aesKey': function() { + if (this._aesKey == null) { + this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()}); + } + + return this._aesKey; + }, + + 'accumulators': function() { + return this._accumulators; + }, + + 'firstPoolReseedLevel': function() { + return this._firstPoolReseedLevel; + }, + + //------------------------------------------------------------------------- + + 'reseedCounter': function() { + return this._reseedCounter; + }, + + 'incrementReseedCounter': function() { + this._reseedCounter = this._reseedCounter +1; + }, + + //------------------------------------------------------------------------- + + 'reseed': function() { + var newKeySeed; + var reseedCounter; + var reseedCounterMask; + var i, c; + + newKeySeed = this.key(); + this.incrementReseedCounter(); + reseedCounter = this.reseedCounter(); + + c = this.numberOfEntropyAccumulators(); + reseedCounterMask = 0xffffffff >>> (32 - c); + for (i=0; i<c; i++) { + if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) { + newKeySeed.appendBlock(this.accumulators()[i].stack()); + this.accumulators()[i].resetStack(); + } + } + + if (reseedCounter == 1) { + c = this.randomnessSources().length; + for (i=0; i<c; i++) { + this.randomnessSources()[i].setBoostMode(false); + } + } + + this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed)); + if (reseedCounter == 1) { +Clipperz.log("### PRNG.readyToGenerateRandomBytes"); + MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes'); + } + MochiKit.Signal.signal(this, 'reseeded'); + }, + + //------------------------------------------------------------------------- + + 'isReadyToGenerateRandomValues': function() { + return this.reseedCounter() != 0; + }, + + //------------------------------------------------------------------------- + + 'entropyLevel': function() { + return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel()); + }, + + //------------------------------------------------------------------------- + + 'counter': function() { + return this._counter; + }, + + 'incrementCounter': function() { + this._counter += 1; + }, + + 'counterBlock': function() { + var result; + + result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0); + + return result; + }, + + //------------------------------------------------------------------------- + + 'getRandomBlock': function() { + var result; + + result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues())); + this.incrementCounter(); + + return result; + }, + + //------------------------------------------------------------------------- + + 'getRandomBytes': function(aSize) { + var result; + + if (this.isReadyToGenerateRandomValues()) { + var i,c; + var newKey; + + result = new Clipperz.ByteArray(); + + c = Math.ceil(aSize / (128 / 8)); + for (i=0; i<c; i++) { + result.appendBlock(this.getRandomBlock()); + } + + if (result.length() != aSize) { + result = result.split(0, aSize); + } + + newKey = this.getRandomBlock().appendBlock(this.getRandomBlock()); + this.setKey(newKey); + } else { +Clipperz.logWarning("Fortuna generator has not enough entropy, yet!"); + throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'addRandomByte': function(aSourceId, aPoolId, aRandomValue) { + var selectedAccumulator; + + selectedAccumulator = this.accumulators()[aPoolId]; + selectedAccumulator.addRandomByte(aRandomValue); + + if (aPoolId == 0) { + MochiKit.Signal.signal(this, 'addedRandomByte') + if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) { + this.reseed(); + } + } + }, + + //------------------------------------------------------------------------- + + 'numberOfEntropyAccumulators': function() { + return this._numberOfEntropyAccumulators; + }, + + //------------------------------------------------------------------------- + + 'randomnessSources': function() { + return this._randomnessSources; + }, + + 'addRandomnessSource': function(aRandomnessSource) { + aRandomnessSource.setGenerator(this); + aRandomnessSource.setSourceId(this.randomnessSources().length); + this.randomnessSources().push(aRandomnessSource); + + if (this.isReadyToGenerateRandomValues() == false) { + aRandomnessSource.setBoostMode(true); + } + }, + + //------------------------------------------------------------------------- + + 'deferredEntropyCollection': function(aValue) { + var result; + + + if (this.isReadyToGenerateRandomValues()) { + result = aValue; + } else { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("PRNG.deferredEntropyCollection"); + deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue)); + MochiKit.Signal.connect(this, + 'readyToGenerateRandomBytes', + deferredResult, + 'callback'); + + result = deferredResult; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'fastEntropyAccumulationForTestingPurpose': function() { + while (! this.isReadyToGenerateRandomValues()) { + this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256)); + } + }, + + //------------------------------------------------------------------------- + + 'dump': function(appendToDoc) { + var tbl; + var i,c; + + tbl = document.createElement("table"); + tbl.border = 0; + with (tbl.style) { + border = "1px solid lightgrey"; + fontFamily = 'Helvetica, Arial, sans-serif'; + fontSize = '8pt'; + //borderCollapse = "collapse"; + } + var hdr = tbl.createTHead(); + var hdrtr = hdr.insertRow(0); + // document.createElement("tr"); + { + var ntd; + + ntd = hdrtr.insertCell(0); + ntd.style.borderBottom = "1px solid lightgrey"; + ntd.style.borderRight = "1px solid lightgrey"; + ntd.appendChild(document.createTextNode("#")); + + ntd = hdrtr.insertCell(1); + ntd.style.borderBottom = "1px solid lightgrey"; + ntd.style.borderRight = "1px solid lightgrey"; + ntd.appendChild(document.createTextNode("s")); + + ntd = hdrtr.insertCell(2); + ntd.colSpan = this.firstPoolReseedLevel(); + ntd.style.borderBottom = "1px solid lightgrey"; + ntd.style.borderRight = "1px solid lightgrey"; + ntd.appendChild(document.createTextNode("base values")); + + ntd = hdrtr.insertCell(3); + ntd.colSpan = 20; + ntd.style.borderBottom = "1px solid lightgrey"; + ntd.appendChild(document.createTextNode("extra values")); + + } + + c = this.accumulators().length; + for (i=0; i<c ; i++) { + var currentAccumulator; + var bdytr; + var bdytd; + var ii, cc; + + currentAccumulator = this.accumulators()[i] + + bdytr = tbl.insertRow(true); + + bdytd = bdytr.insertCell(0); + bdytd.style.borderRight = "1px solid lightgrey"; + bdytd.style.color = "lightgrey"; + bdytd.appendChild(document.createTextNode("" + i)); + + bdytd = bdytr.insertCell(1); + bdytd.style.borderRight = "1px solid lightgrey"; + bdytd.style.color = "gray"; + bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length())); + + + cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel()); + for (ii=0; ii<cc; ii++) { + var cellText; + + bdytd = bdytr.insertCell(ii + 2); + + if (ii < currentAccumulator.stack().length()) { + cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii)); + } else { + cellText = "_"; + } + + if (ii == (this.firstPoolReseedLevel() - 1)) { + bdytd.style.borderRight = "1px solid lightgrey"; + } + + bdytd.appendChild(document.createTextNode(cellText)); + } + + } + + + if (appendToDoc) { + var ne = document.createElement("div"); + ne.id = "entropyGeneratorStatus"; + with (ne.style) { + fontFamily = "Courier New, monospace"; + fontSize = "12px"; + lineHeight = "16px"; + borderTop = "1px solid black"; + padding = "10px"; + } + if (document.getElementById(ne.id)) { + MochiKit.DOM.swapDOM(ne.id, ne); + } else { + document.body.appendChild(ne); + } + ne.appendChild(tbl); + } + + return tbl; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.Crypto.PRNG.Random = function(args) { + args = args || {}; +// MochiKit.Base.bindMethods(this); + + return this; +} + +Clipperz.Crypto.PRNG.Random.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "Clipperz.Crypto.PRNG.Random"; + }, + + //------------------------------------------------------------------------- + + 'getRandomBytes': function(aSize) { +//Clipperz.Profile.start("Clipperz.Crypto.PRNG.Random.getRandomBytes"); + var result; + var i,c; + + result = new Clipperz.ByteArray() + c = aSize || 1; + for (i=0; i<c; i++) { + result.appendByte((Math.random()*255) & 0xff); + } + +//Clipperz.Profile.stop("Clipperz.Crypto.PRNG.Random.getRandomBytes"); + return result; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +_clipperz_crypt_prng_defaultPRNG = null; + +Clipperz.Crypto.PRNG.defaultRandomGenerator = function() { + if (_clipperz_crypt_prng_defaultPRNG == null) { + _clipperz_crypt_prng_defaultPRNG = new Clipperz.Crypto.PRNG.Fortuna(); + + //............................................................. + // + // TimeRandomnessSource + // + //............................................................. + { + var newRandomnessSource; + + newRandomnessSource = new Clipperz.Crypto.PRNG.TimeRandomnessSource({intervalTime:111}); + _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); + } + + //............................................................. + // + // MouseRandomnessSource + // + //............................................................. + { + var newRandomnessSource; + + newRandomnessSource = new Clipperz.Crypto.PRNG.MouseRandomnessSource(); + _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); + } + + //............................................................. + // + // KeyboardRandomnessSource + // + //............................................................. + { + var newRandomnessSource; + + newRandomnessSource = new Clipperz.Crypto.PRNG.KeyboardRandomnessSource(); + _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); + } + + } + + return _clipperz_crypt_prng_defaultPRNG; +}; + +//############################################################################# + +Clipperz.Crypto.PRNG.exception = { + NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy") +}; + + +MochiKit.DOM.addLoadEvent(Clipperz.Crypto.PRNG.defaultRandomGenerator); diff --git a/frontend/delta/js/Clipperz/Crypto/RSA.js b/frontend/delta/js/Clipperz/Crypto/RSA.js new file mode 100644 index 0000000..5a480f1 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/RSA.js @@ -0,0 +1,146 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!"; +} + +if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; } + +Clipperz.Crypto.RSA.VERSION = "0.1"; +Clipperz.Crypto.RSA.NAME = "Clipperz.RSA"; + +//############################################################################# + +MochiKit.Base.update(Clipperz.Crypto.RSA, { + + //------------------------------------------------------------------------- + + 'publicKeyWithValues': function (e, d, n) { + var result; + + result = {}; + + if (e.isBigInt) { + result.e = e; + } else { + result.e = new Clipperz.Crypto.BigInt(e, 16); + } + + if (d.isBigInt) { + result.d = d; + } else { + result.d = new Clipperz.Crypto.BigInt(d, 16); + } + + if (n.isBigInt) { + result.n = n; + } else { + result.n = new Clipperz.Crypto.BigInt(n, 16); + } + + return result; + }, + + 'privateKeyWithValues': function(e, d, n) { + return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n); + }, + + //----------------------------------------------------------------------------- + + 'encryptUsingPublicKey': function (aKey, aMessage) { + var messageValue; + var result; + + messageValue = new Clipperz.Crypto.BigInt(aMessage, 16); + result = messageValue.powerModule(aKey.e, aKey.n); + + return result.asString(16); + }, + + //............................................................................. + + 'decryptUsingPublicKey': function (aKey, aMessage) { + return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage); + }, + + //----------------------------------------------------------------------------- + + 'encryptUsingPrivateKey': function (aKey, aMessage) { + var messageValue; + var result; + + messageValue = new Clipperz.Crypto.BigInt(aMessage, 16); + result = messageValue.powerModule(aKey.d, aKey.n); + + return result.asString(16); + }, + + //............................................................................. + + 'decryptUsingPrivateKey': function (aKey, aMessage) { + return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage); + }, + + //----------------------------------------------------------------------------- + + 'generatePublicKey': function(aNumberOfBits) { + var result; + var e; + var d; + var n; + + e = new Clipperz.Crypto.BigInt("10001", 16); + + { + var p, q; + var phi; + + do { + p = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits); + } while (p.module(e).equals(1)); + + do { + q = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits); + } while ((q.equals(p)) || (q.module(e).equals(1))); + + n = p.multiply(q); + phi = (p.subtract(1).multiply(q.subtract(1))); + d = e.powerModule(-1, phi); + } + + result = Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n); + + return result; + }, + + //------------------------------------------------------------------------- + + __syntaxFix__: "syntax fix" + + //------------------------------------------------------------------------- + +}); + +//############################################################################# + diff --git a/frontend/delta/js/Clipperz/Crypto/SHA.js b/frontend/delta/js/Clipperz/Crypto/SHA.js new file mode 100644 index 0000000..f8bfe6e --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/SHA.js @@ -0,0 +1,296 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; +} + +if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } +if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; } + +Clipperz.Crypto.SHA.VERSION = "0.3"; +Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA"; + +MochiKit.Base.update(Clipperz.Crypto.SHA, { + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + 'toString': function () { + return this.__repr__(); + }, + + //----------------------------------------------------------------------------- + + 'rotateRight': function(aValue, aNumberOfBits) { +//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight"); + var result; + + result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits)); + +//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight"); + return result; + }, + + 'shiftRight': function(aValue, aNumberOfBits) { +//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight"); + var result; + + result = aValue >>> aNumberOfBits; + +//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight"); + return result; + }, + + //----------------------------------------------------------------------------- + + 'safeAdd': function() { +//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd"); + var result; + var i, c; + + result = arguments[0]; + c = arguments.length; + for (i=1; i<c; i++) { + var lowerBytesSum; + + lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff); + result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff); + } + +//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd"); + return result; + }, + + //----------------------------------------------------------------------------- + + 'sha256_array': function(aValue) { +//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array"); + var result; + var message; + var h0, h1, h2, h3, h4, h5, h6, h7; + var k; + var messageLength; + var messageLengthInBits; + var _i, _c; + var charBits; + var rotateRight; + var shiftRight; + var safeAdd; + var bytesPerBlock; + var currentMessageIndex; + + bytesPerBlock = 512/8; + rotateRight = Clipperz.Crypto.SHA.rotateRight; + shiftRight = Clipperz.Crypto.SHA.shiftRight; + safeAdd = Clipperz.Crypto.SHA.safeAdd; + + charBits = 8; + + h0 = 0x6a09e667; + h1 = 0xbb67ae85; + h2 = 0x3c6ef372; + h3 = 0xa54ff53a; + h4 = 0x510e527f; + h5 = 0x9b05688c; + h6 = 0x1f83d9ab; + h7 = 0x5be0cd19; + + k = [ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; + + message = aValue; + messageLength = message.length; + + //Pre-processing: + message.push(0x80); // append a single "1" bit to message + + _c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits; + if (_c < 0) { + _c = _c + (512 / charBits); + } + + for (_i=0; _i<_c; _i++) { + message.push(0x00); // append "0" bits until message length ≡ 448 ≡ -64 (mod 512) + } + + messageLengthInBits = messageLength * charBits; + message.push(0x00); // the 4 most high byte are alway 0 as message length is represented with a 32bit value; + message.push(0x00); + message.push(0x00); + message.push(0x00); + message.push((messageLengthInBits >> 24) & 0xff); + message.push((messageLengthInBits >> 16) & 0xff); + message.push((messageLengthInBits >> 8) & 0xff); + message.push( messageLengthInBits & 0xff); + + currentMessageIndex = 0; + while(currentMessageIndex < message.length) { + var w; + var a, b, c, d, e, f, g, h; + + w = Array(64); + + _c = 16; + for (_i=0; _i<_c; _i++) { + var _j; + + _j = currentMessageIndex + _i*4; + w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0); + } + + _c = 64; + for (_i=16; _i<_c; _i++) { + var s0, s1; + + s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3)); + s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10)); + w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1); + } + + a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7; + + _c = 64; + for (_i=0; _i<_c; _i++) { + var s0, s1, ch, maj, t1, t2; + + s0 = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22)); + maj = (a & b) ^ (a & c) ^ (b & c); + t2 = safeAdd(s0, maj); + s1 = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25)); + ch = (e & f) ^ ((~e) & g); + t1 = safeAdd(h, s1, ch, k[_i], w[_i]); + + h = g; + g = f; + f = e; + e = safeAdd(d, t1); + d = c; + c = b; + b = a; + a = safeAdd(t1, t2); + } + + h0 = safeAdd(h0, a); + h1 = safeAdd(h1, b); + h2 = safeAdd(h2, c); + h3 = safeAdd(h3, d); + h4 = safeAdd(h4, e); + h5 = safeAdd(h5, f); + h6 = safeAdd(h6, g); + h7 = safeAdd(h7, h); + + currentMessageIndex += bytesPerBlock; + } + + result = new Array(256/8); + result[0] = (h0 >> 24) & 0xff; + result[1] = (h0 >> 16) & 0xff; + result[2] = (h0 >> 8) & 0xff; + result[3] = h0 & 0xff; + + result[4] = (h1 >> 24) & 0xff; + result[5] = (h1 >> 16) & 0xff; + result[6] = (h1 >> 8) & 0xff; + result[7] = h1 & 0xff; + + result[8] = (h2 >> 24) & 0xff; + result[9] = (h2 >> 16) & 0xff; + result[10] = (h2 >> 8) & 0xff; + result[11] = h2 & 0xff; + + result[12] = (h3 >> 24) & 0xff; + result[13] = (h3 >> 16) & 0xff; + result[14] = (h3 >> 8) & 0xff; + result[15] = h3 & 0xff; + + result[16] = (h4 >> 24) & 0xff; + result[17] = (h4 >> 16) & 0xff; + result[18] = (h4 >> 8) & 0xff; + result[19] = h4 & 0xff; + + result[20] = (h5 >> 24) & 0xff; + result[21] = (h5 >> 16) & 0xff; + result[22] = (h5 >> 8) & 0xff; + result[23] = h5 & 0xff; + + result[24] = (h6 >> 24) & 0xff; + result[25] = (h6 >> 16) & 0xff; + result[26] = (h6 >> 8) & 0xff; + result[27] = h6 & 0xff; + + result[28] = (h7 >> 24) & 0xff; + result[29] = (h7 >> 16) & 0xff; + result[30] = (h7 >> 8) & 0xff; + result[31] = h7 & 0xff; + +//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array"); + return result; + }, + + //----------------------------------------------------------------------------- + + 'sha256': function(aValue) { +//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256"); + var result; + var resultArray; + var valueArray; + + valueArray = aValue.arrayValues(); + resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray); + + result = new Clipperz.ByteArray(resultArray); + +//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256"); + return result; + }, + + //----------------------------------------------------------------------------- + + 'sha_d256': function(aValue) { +//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256"); + var result; + var resultArray; + var valueArray; + + valueArray = aValue.arrayValues(); + resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray); + resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray); + + result = new Clipperz.ByteArray(resultArray); + +//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256"); + return result; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); diff --git a/frontend/delta/js/Clipperz/Crypto/SRP.js b/frontend/delta/js/Clipperz/Crypto/SRP.js new file mode 100644 index 0000000..597e72d --- a/dev/null +++ b/frontend/delta/js/Clipperz/Crypto/SRP.js @@ -0,0 +1,316 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; +} + +try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!"; +} + +try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!"; +} + +if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; } + +Clipperz.Crypto.SRP.VERSION = "0.1"; +Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP"; + +//############################################################################# + +MochiKit.Base.update(Clipperz.Crypto.SRP, { + + '_n': null, + '_g': null, + //------------------------------------------------------------------------- + + 'n': function() { + if (Clipperz.Crypto.SRP._n == null) { + Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16); + } + + return Clipperz.Crypto.SRP._n; + }, + + //------------------------------------------------------------------------- + + 'g': function() { + if (Clipperz.Crypto.SRP._g == null) { + Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); // eventually 5 (as suggested on the Diffi-Helmann documentation) + } + + return Clipperz.Crypto.SRP._g; + }, + + //----------------------------------------------------------------------------- + + 'exception': { + 'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue") + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# +// +// S R P C o n n e c t i o n version 1.0 +// +//============================================================================= +Clipperz.Crypto.SRP.Connection = function (args) { + args = args || {}; + + this._C = args.C; + this._P = args.P; + this.hash = args.hash; + + this._a = null; + this._A = null; + + this._s = null; + this._B = null; + + this._x = null; + + this._u = null; + this._K = null; + this._M1 = null; + this._M2 = null; + + this._sessionKey = null; + + return this; +} + +Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, { + + 'toString': function () { + return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription(); + }, + + //------------------------------------------------------------------------- + + 'C': function () { + return this._C; + }, + + //------------------------------------------------------------------------- + + 'P': function () { + return this._P; + }, + + //------------------------------------------------------------------------- + + 'a': function () { + if (this._a == null) { + this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16); +// this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10); + } + + return this._a; + }, + + //------------------------------------------------------------------------- + + 'A': function () { + if (this._A == null) { + // Warning: this value should be strictly greater than zero: how should we perform this check? + this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n()); + + if (this._A.equals(0)) { + Clipperz.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0."); + throw Clipperz.Crypto.SRP.exception.InvalidValue; + } + } + + return this._A; + }, + + //------------------------------------------------------------------------- + + 's': function () { + return this._s; + }, + + 'set_s': function(aValue) { + this._s = aValue; + }, + + //------------------------------------------------------------------------- + + 'B': function () { + return this._B; + }, + + 'set_B': function(aValue) { + // Warning: this value should be strictly greater than zero: how should we perform this check? + if (! aValue.equals(0)) { + this._B = aValue; + } else { + Clipperz.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0."); + throw Clipperz.Crypto.SRP.exception.InvalidValue; + } + }, + + //------------------------------------------------------------------------- + + 'x': function () { + if (this._x == null) { + this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16); + } + + return this._x; + }, + + //------------------------------------------------------------------------- + + 'u': function () { + if (this._u == null) { + this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16); + } + + return this._u; + }, + + //------------------------------------------------------------------------- + + 'S': function () { + if (this._S == null) { + var bigint; + var srp; + + bigint = Clipperz.Crypto.BigInt; + srp = Clipperz.Crypto.SRP; + + this._S = bigint.powerModule( + bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())), + bigint.add(this.a(), bigint.multiply(this.u(), this.x())), + srp.n() + ) + } + + return this._S; + }, + + //------------------------------------------------------------------------- + + 'K': function () { + if (this._K == null) { + this._K = this.stringHash(this.S().asString()); + } + + return this._K; + }, + + //------------------------------------------------------------------------- + + 'M1': function () { + if (this._M1 == null) { + this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K()); + } + + return this._M1; + }, + + //------------------------------------------------------------------------- + + 'M2': function () { + if (this._M2 == null) { + this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K()); + } + + return this._M2; + }, + + //========================================================================= + + 'serverSideCredentialsWithSalt': function(aSalt) { + var result; + var s, x, v; + + s = aSalt; + x = this.stringHash(s + this.P()); + v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); + + result = {}; + result['C'] = this.C(); + result['s'] = s; + result['v'] = v.asString(16); + + return result; + }, + + 'serverSideCredentials': function() { + var result; + var s; + + s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + + result = this.serverSideCredentialsWithSalt(s); + + return result; + }, + + //========================================================================= +/* + 'computeServerSide_S': function(b) { + var result; + var v; + var bigint; + var srp; + + bigint = Clipperz.Crypto.BigInt; + srp = Clipperz.Crypto.SRP; + + v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16); +// _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n()); + result = bigint.powerModule( + bigint.multiply( + this.A(), + bigint.powerModule(v, this.u(), srp.n()) + ), new Clipperz.Crypto.BigInt(b, 10), srp.n() + ); + + return result; + }, +*/ + //========================================================================= + + 'stringHash': function(aValue) { + var result; + + result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2); + + return result; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# diff --git a/frontend/delta/js/Clipperz/DOM.js b/frontend/delta/js/Clipperz/DOM.js new file mode 100644 index 0000000..1d52a4b --- a/dev/null +++ b/frontend/delta/js/Clipperz/DOM.js @@ -0,0 +1,134 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; } + +Clipperz.DOM.VERSION = "0.1"; +Clipperz.DOM.NAME = "Clipperz.DOM"; + +MochiKit.Base.update(Clipperz.DOM, { + + //------------------------------------------------------------------------- + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- + + 'selectOptionMatchingValue': function (aSelectElement, aValue, shouldUseCaseInsensitiveTest) { + var selectedOptionIndex; + var i, c; + + selectedOptionIndex = -1; + + c = aSelectElement.options.length; + for (i=0; (i<c) && (selectedOptionIndex == -1); i++) { + if (shouldUseCaseInsensitiveTest == true) { + if (aSelectElement.options[i].value.toLowerCase() == aValue.toLowerCase()) { + selectedOptionIndex = i; + } + } else { + if (aSelectElement.options[i].value == aValue) { + selectedOptionIndex = i; + } + } + } + + if (selectedOptionIndex != -1) { + aSelectElement.selectedIndex = selectedOptionIndex; + } + }, + + //------------------------------------------------------------------------- + + 'setFormContents': function(aNode, someValues) { + var node; + var values; + var i, c; + + values = {}; + c = someValues[0].length; + for (i=0; i<c; i++) { + values[someValues[0][i]] = someValues[1][i]; + } + +// var m = MochiKit.Base; +// var self = MochiKit.DOM; + if (typeof(aNode) == "undefined" || aNode === null) { + node = MochiKit.DOM._document.body; + } else { + node = MochiKit.DOM.getElement(aNode); + } + + MochiKit.Base.nodeWalk(node, function(aNode) { + var result; + var name; + + result = null; + name = aNode.name; + if (MochiKit.Base.isNotEmpty(name) && (typeof(values[name]) != 'undefined')) { + var tagName; + + tagName = aNode.tagName.toUpperCase(); + if (tagName === "INPUT" && (aNode.type == "radio" || aNode.type == "checkbox")) { + aNode.checked = values[name]; + } else if (tagName === "SELECT") { + if (aNode.type == "select-one") { + Clipperz.DOM.selectOptionMatchingValue(aNode, values[name]); + } else { // aNode.type == "select-multiple" + Clipperz.logWarning("### unhandled Select.type = 'select-multiple' condition"); + } + } else if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" || tagName === "DIV") { + result = aNode.childNodes; + } else { + aNode.value = values[name] + } + } else { + result = aNode.childNodes; + } + + return result; + }); + }, + + //------------------------------------------------------------------------- + + 'get': MochiKit.DOM.getElement, + + //------------------------------------------------------------------------- + + 'Helper': Clipperz.YUI.DomHelper, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + diff --git a/frontend/delta/js/Clipperz/Date.js b/frontend/delta/js/Clipperz/Date.js new file mode 100644 index 0000000..163790e --- a/dev/null +++ b/frontend/delta/js/Clipperz/Date.js @@ -0,0 +1,297 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; } + +Clipperz.Date.VERSION = "0.1"; +Clipperz.Date.NAME = "Clipperz.Date"; + +MochiKit.Base.update(Clipperz.Date, { + + //------------------------------------------------------------------------- + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- + + 'daysInMonth': [31,28,31,30,31,30,31,31,30,31,30,31], + + //------------------------------------------------------------------------- + + 'englishOrdinalDaySuffixForDate': function(aDate) { + var result; + + switch (aDate.getDate()) { + case 1: + case 21: + case 31: + result = "st"; + break; + case 2: + case 22: + result = "nd"; + break; + case 3: + case 23: + result = "rd"; + break; + default: + result = "th"; + break; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'isLeapYear': function(aDate) { + var year; + var result; + + year = aDate.getFullYear(); + result = ((year & 0x03) == 0 && (year % 100 || (year % 400 == 0 && year))); + + return result; + }, + + //------------------------------------------------------------------------- + + 'getDaysInMonth': function(aDate) { + var result; + + if (aDate.getMonth() == 1) { + Clipperz.Date.isLeapYear(aDate) + result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28; + } else { + result = Clipperz.Date.daysInMonth[aDate.getMonth()]; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'getTimezone': function(aDate) { + var result; + + result = aDate.toString(); + result = result.replace(/([A-Z]{3}) [0-9]{4}/, '$1'); + result = result.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3"); + + return result; + }, + + 'getGMTOffset': function(aDate) { + return (aDate.getTimezoneOffset() > 0 ? "-" : "+") + MochiKit.Format.numberFormatter('00')(Math.floor(this.getTimezoneOffset() / 60)) + + MochiKit.Format.numberFormatter('00')(this.getTimezoneOffset() % 60); + }, + + //------------------------------------------------------------------------- + + 'dayOfYear': function(aDate) { + var result; + var i,c; + + result = 0; + c = aDate.getMonth(); + for (i=0; i<c; i++) { + if (i == 1) { + result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28; + } else { + result += Clipperz.Date.daysInMonth[i]; + } + } + return num + this.getDate() - 1; + }, + + //------------------------------------------------------------------------- + + 'getPHPLikeFormatCode': function(aCharacter) { + var result; + + switch (aCharacter) { + case "d": + result = " + MochiKit.Format.numberFormatter('00')(aDate.getDate())"; + break; + case "D": + result = " + aLocale['shortDays'][aDate.getDay()]"; + break; + case "j": + result = " + aDate.getDate()"; + break; + case "l": + result = " + aLocale['days'][aDate.getDay()]"; + break; + case "S": + result = " + Clipperz.Date.englishOrdinalDaySuffixForDate(aDate)"; + break; + case "w": + result = " + aDate.getDay()"; + break; + case "z": + result = " + aDate.getDayOfYear()"; + break; + case "W": + result = " + aDate.getWeekOfYear()"; + break; + case "F": + result = " + aLocale['months'][aDate.getMonth()]"; + break; + case "m": + result = " + MochiKit.Format.numberFormatter('00')(aDate.getMonth() + 1)"; + break; + case "M": + result = " + aLocale['shortMonths'][aDate.getMonth()]"; + break; + case "n": + result = " + (aDate.getMonth() + 1)"; + break; + case "t": + result = " + Clipperz.Date.getDaysInMonth(aDate)"; + break; + case "L": + result = " + (Clipperz.Date.isLeapYear(aDate) ? 1 : 0)"; + break; + case "Y": + result = " + aDate.getFullYear()"; + break; + case "y": + result = " + ('' + aDate.getFullYear()).substring(2, 4)"; + break; + case "a": + result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'] : aLocale['pmDesignation'])"; + break; + case "A": + result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'].toUpperCase() : aLocale['pmDesignation'].toUpperCase())"; + break; + case "g": + result = " + ((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)"; + break; + case "G": + result = " + aDate.getHours()"; + break; + case "h": + result = " + MochiKit.Format.numberFormatter('00')((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)"; + break; + case "H": + result = " + MochiKit.Format.numberFormatter('00')(aDate.getHours())"; + break; + case "i": + result = " + MochiKit.Format.numberFormatter('00')(aDate.getMinutes())"; + break; + case "s": + result = " + MochiKit.Format.numberFormatter('00')(aDate.getSeconds())"; + break; + case "O": + result = " + aDate.getGMTOffset()"; + break; + case "T": + result = " + Clipperz.Date.getTimezone(aDate)"; + break; + case "Z": + result = " + ( + aDate.getTimezoneOffset() * -60)"; + break; + default: + result = " + '" + aCharacter + "'"; + break; + }; + + return result; + }, + + //========================================================================= + + 'formatDateWithPHPLikeTemplateAndLocale': function(aDate, aFormat, aLocale) { + var result; + var formatterCode; + var formatter; + var i,c; + + formatterCode = "Clipperz.Date.__scratchFormatter = function(aDate, aLocale){return ''"; + + c = aFormat.length; + i = 0; + + while (i<c) { + var character; + + character = aFormat.charAt(i); + if (character == "\\") { + i++; + character = aFormat.charAt(i); + formatterCode += " + '" + character + "'" + } else { + formatterCode += Clipperz.Date.getPHPLikeFormatCode(character); + } + + i++; + } + + formatterCode += ";}"; + eval(formatterCode); + + result = Clipperz.Date.__scratchFormatter.call(this, aDate, aLocale); + delete Clipperz.Date.__scratchFormatter; + + return result; + }, + + //------------------------------------------------------------------------- + + 'parseDateWithPHPLikeTemplateAndLocale': function(aString, aFormat, aLocale) { + return new Date(); + }, + + //========================================================================= + + 'formatDateWithUTCFormatAndLocale': function(aDate, aLocale) { +// return Clipperz.Date.formatWithJavaLikeTemplateAndLocale(aDate, "EEE, dd MMMM yyyy HH:mm:ss zzz", aLocale); + return aDate.toString(); + }, + + 'parseDateWithUTCFormatAndLocale': function(aValue, aLocale) { + return new Date(Date.parse(aValue)); + }, + + //========================================================================= + + 'exception': { +// 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"), +// 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType") + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + diff --git a/frontend/delta/js/Clipperz/KeePassExportProcessor.js b/frontend/delta/js/Clipperz/KeePassExportProcessor.js new file mode 100644 index 0000000..e35d729 --- a/dev/null +++ b/frontend/delta/js/Clipperz/KeePassExportProcessor.js @@ -0,0 +1,191 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } + + +Clipperz.KeePassExportProcessor = function(args) { + args = args || {}; + + return this; +} + +//============================================================================= + +Clipperz.KeePassExportProcessor.prototype = MochiKit.Base.update(null, { + + //------------------------------------------------------------------------- + + 'deferredParse_core': function(aContext) { + var deferredResult; + + if (aContext.line == "") { + deferredResult = MochiKit.Async.succeed(aContext.result); + } else { + var record; + + record = this.parseRecord(aContext); + if (record != null) { + aContext.result.push(record); + } + + aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, ""); + + deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredParse_core"); + deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)}); + deferredResult.addCallback(MochiKit.Async.wait, 0.2); + deferredResult.addMethod(this, 'deferredParse_core'); + deferredResult.callback(aContext); + } + + return deferredResult; + }, + + //......................................................................... + + 'deferredParse': function(aValue) { + var deferredResult; + var lines; + var context; + + lines = aValue.replace(/\r?\n/g, "\n"); + context = { + line: lines, + size: lines.length, + result: [] + } + + deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredResult"); + deferredResult.addMethod(this, 'deferredParse_core'); + deferredResult.callback(context); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'parseRecord': function(aContext) { + var result; + var recordLabelRegexp; + var fieldLabelRegexp; + var fieldValueRegexp; + var fullLineRegexp; +/* +[Record name] +Group Tree: +UserName: +URL: +Password: +Notes: test +UUID: 525f62430079bae48b79ed2961924b05 +Icon: 0 +Creation Time: 2007-06-26 17:56:03 +Last Access: 2007-10-25 16:23:51 +Last Modification: 2007-10-25 16:23:51 +Expires: 2999-12-28 23:59:59 + +[Record name] ==> Title +Group: General ==> Group +Group Tree: ==> Group Tree +UserName: ==> UserName +URL: ==> URL +Password: ==> Password +Notes: test ==> Notes +UUID: 525f62430079bae48b79ed2961924b05 ==> UUID +Icon: 0 ==> Icon +Creation Time: 2007-06-26 17:56:03 ==> Creation Time +Last Access: 2007-10-25 16:23:51 ==> Last Access +Last Modification: 2007-10-25 16:23:51 ==> Last Modification +Expires: 2999-12-28 23:59:59 ==> Expires +Attachment Description: ==> Attachment Description +Attachment: ==> Attachment +*/ +// recordLabelRegexp = new RegExp("(^\\[(.*)\\]\\n|^Title:\s*(.*)\\n)"); + recordLabelRegexp = new RegExp("^\\[(.*)\\]\\n|^Title:\s*(.*)\\n"); + fieldLabelRegexp = new RegExp("^\s?(Group|Group Tree|Username|UserName|User Name|Url|URL|Password|Notes|Comment|UUID|Icon|Creation Time|Last Access|Last Modification|Expires|Attachment Description|Attachment|Valid until): "); + fieldValueRegexp = new RegExp("(.*)(\\n|$)"); + fullLineRegexp = new RegExp("^(.*\\n)"); + + if (recordLabelRegexp.test(aContext.line) == true) { + var line; + + line = aContext.line; + + result = {}; + result['Title'] = line.match(recordLabelRegexp)[1]; + line = line.replace(/^.*\n/, ""); + while (fieldLabelRegexp.test(line) == true) { + var fieldName; + var fieldValue; + + fieldName = RegExp.$1; + line = RegExp.rightContext; + + fieldValue = line.match(fieldValueRegexp)[1]; + line = RegExp.rightContext; + + if (fieldName == 'Notes') { + var isMultiline; + + isMultiline = false; + + if ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) { + fieldValue += '\n'; + } + + while ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) { + var newLineValue; + + newLineValue = line.match(fullLineRegexp)[1]; + if (newLineValue != "\n") { + isMultiline = true; + } + fieldValue += newLineValue; + line = RegExp.rightContext; + } + + if (isMultiline) { + fieldValue = fieldValue.replace(/\n$/g, ""); + } else { + fieldValue = fieldValue.replace(/\n\n$/g, ""); + } + + line = line.replace(/^\n/, ''); + } + + result[fieldName] = fieldValue; + } + } else { + result = null; + } + + aContext.line = line; + + return result; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + + diff --git a/frontend/delta/js/Clipperz/KeyValueObjectStore.js b/frontend/delta/js/Clipperz/KeyValueObjectStore.js new file mode 100644 index 0000000..8bc125b --- a/dev/null +++ b/frontend/delta/js/Clipperz/KeyValueObjectStore.js @@ -0,0 +1,166 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } + +//############################################################################# + +Clipperz.KeyValueObjectStore = function(args) { + args = args || {}; + +// this._name = args['name'] || "unnamed KeyValueObjectStore"; + this._values = args['values'] || {}; +// this._referenceObjectStore = null; + + return this; +} + +Clipperz.KeyValueObjectStore.prototype = MochiKit.Base.update(null, { + + 'values': function() { + return this._values; + }, + + 'initWithValues': function (someValues) { + this._values = Clipperz.Base.deepClone(someValues) || {}; + return this; + }, + + 'setValues': function (someValues) { + this._values = someValues; + return this; + }, + +// 'initWithObjectStore': function (anObjectStore) { +// this._referenceObjectStore = anObjectStore; +// }, + + 'removeAllData': function () { + this._values = {}; + }, + + //------------------------------------------------------------------------- + + 'getValue': function(aKeyPath) { + var result; + var keys; + var i,c; + + result = this.values(); + + keys = (aKeyPath + '').split('.'); + c = keys.length; + i = 0; + + while ((i<c) && (result != null)) { + if (typeof result[keys[i]] != 'undefined') { + result = result[keys[i]]; + } else { + result = null; + } + + i++; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'setValue': function(aKeyPath, aValue) { + var targetObject; + var keys; + var i,c; + + targetObject = this.values(); + keys = (aKeyPath + '').split('.'); + c = keys.length - 1; + for (i=0; i<c; i++) { + if (typeof targetObject[keys[i]] == 'undefined') { + targetObject[keys[i]] = {} + } + + targetObject = targetObject[keys[i]]; + } + + targetObject[keys[c]] = aValue; + + return aValue; + }, + + //------------------------------------------------------------------------- + + 'removeValue': function (aKeyPath) { +// this.setValue(aKeyPath, null); + + var targetObject; + var keys; + var i,c; + + targetObject = this.values(); + keys = ('' + aKeyPath).split('.'); + c = keys.length - 1; + for (i=0; i<c; i++) { + if (typeof targetObject[keys[i]] == 'undefined') { + targetObject[keys[i]] = {} + } + + targetObject = targetObject[keys[i]]; + } + + delete targetObject[keys[c]]; + }, + + //------------------------------------------------------------------------- + + 'deferredGetOrSet': function(aKeyPath, aGetterFunction) { + var deferredResult; + + if (this.getValue(aKeyPath) != null) { + deferredResult = MochiKit.Async.succeed(this.getValue(aKeyPath)); + } else { + deferredResult = new Clipperz.Async.Deferred("KeyValueObjectStore.deferredGetOrSet [" + aKeyPath + "]", {trace:false}); + + deferredResult.addCallback(aGetterFunction); + deferredResult.addMethod(this, 'setValue', aKeyPath); + deferredResult.callback(); + } + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'isEmpty': function () { + return (MochiKit.Base.keys(this.values()).length == 0) + }, + + //------------------------------------------------------------------------- +/* + 'dumpData': function () { + return Clipperz.Base.serializeJSON(this.values()); + }, +*/ + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); diff --git a/frontend/delta/js/Clipperz/Logging.js b/frontend/delta/js/Clipperz/Logging.js new file mode 100644 index 0000000..b6b806a --- a/dev/null +++ b/frontend/delta/js/Clipperz/Logging.js @@ -0,0 +1,32 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.Base.module('Clipperz'); + +Clipperz.log = function () { + console.log.apply(console, arguments); +} + +Clipperz.logError = Clipperz.log; +Clipperz.logWarning = Clipperz.log; +Clipperz.logDebug = Clipperz.log;
\ No newline at end of file diff --git a/frontend/delta/js/Clipperz/PM/BookmarkletProcessor.js b/frontend/delta/js/Clipperz/PM/BookmarkletProcessor.js new file mode 100644 index 0000000..4818b76 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/BookmarkletProcessor.js @@ -0,0 +1,191 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/* +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } + +Clipperz.PM.BookmarkletProcessor = function(aConfiguration) { + this._configuration = aConfiguration; + + this._editableFields = null; + this._favicon = null; + + return this; +} + +Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "Clipperz.PM.BookmarkletProcessor"; + }, + + //------------------------------------------------------------------------- + + 'configuration': function() { + return this._configuration; + }, + + //------------------------------------------------------------------------- + + 'pageTitle': function() { + return this.configuration().page.title; + }, + + //------------------------------------------------------------------------- + + 'fields': function() { + return this.configuration().form.inputs; + }, + + //------------------------------------------------------------------------- + + 'editableFields': function() { + if (this._editableFields == null) { + this._editableFields = MochiKit.Base.filter(function(aField) { + var result; + var type; + + type = aField['type'].toLowerCase(); + result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select')); + + return result; + }, this.fields()) + } + + return this._editableFields; + }, + + //------------------------------------------------------------------------- + + 'hostname': function() { + if (this._hostname == null) { + var actionUrl; + + actionUrl = this.configuration()['form']['attributes']['action']; + this._hostname = actionUrl.replace(/ ^ h t t p s ? : \ / \ / ( [ ^ \ / ] * ) \ / . * /, '$1'); + } + + return this._hostname; + }, + + 'favicon': function() { + if (this._favicon == null) { + this._favicon = "http://" + this.hostname() + "/favicon.ico"; + } + + return this._favicon; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//############################################################################# +/ * +Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) { + var processor; + var record; + var recordVersion; + var directLogin; + var bindings; + var i,c; + + processor = new Clipperz.PM.BookmarkletProcessor(aConfiguration); + + record = new Clipperz.PM.DataModel.Record({ + 'label': processor.pageTitle(), + 'notes': "", + 'user': anUser + }); + recordVersion = new Clipperz.PM.DataModel.Record.Version(record, {}) + record.setCurrentVersion(recordVersion); + + bindings = {}; + + c = processor.editableFields().length; + for (i=0; i<c; i++) { + var formField; + var recordField; + + formField = processor.editableFields()[i]; + recordField = new Clipperz.PM.DataModel.RecordField({ + 'label': formField['name'], + 'value': formField['value'], + 'type': Clipperz.PM.Strings.inputTypeToRecordFieldType[formField['type']], + 'hidden': false, + 'recordVersion': recordVersion + }); + recordVersion.addField(recordField); + + bindings[formField['name']] = recordField.key(); + } + + directLogin = new Clipperz.PM.DataModel.DirectLogin({ + 'record': record, + 'label': processor.pageTitle(), + 'favicon': processor.favicon(), + 'formData': processor.configuration()['form'], + 'bindingData': bindings, + 'bookmarkletVersion': '0.2' + }); + record.addDirectLogin(directLogin); + + anUser.addRecord(record); + + return record; +}; +* / +//----------------------------------------------------------------------------- + +Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration = function(aConfiguration) { + var result; + +// throw "XSS Bookmarklet attempt"; + + result = aConfiguration; + + return result; +}; + +//----------------------------------------------------------------------------- + +Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration = function(aConfiguration) { + var result; + + try { + result = Clipperz.Base.evalJSON(aConfiguration); + result = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(result); + + if (result['version'] != '0.2.3') { + throw "WrongBookmarkletVersion"; + } + } catch (exception) { + throw exception; + } + + return result; +}; + +//----------------------------------------------------------------------------- +*/
\ No newline at end of file diff --git a/frontend/delta/js/Clipperz/PM/Connection.js b/frontend/delta/js/Clipperz/PM/Connection.js new file mode 100644 index 0000000..c02125f --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Connection.js @@ -0,0 +1,636 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } + +//----------------------------------------------------------------------------- +// +// Abstract C O N N E C T I O N class +// +//----------------------------------------------------------------------------- + +Clipperz.PM.Connection = function (args) { + args = args || {}; + + this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy; + this._getCredentialsFunction = args.getCredentialsFunction; + + this._clipperz_pm_crypto_version = null; + this._connectionId = null; + this._sharedSecret = null; + this._serverLockValue = null; + + return this; +} + +Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "Connection [" + this.version() + "]"; + }, + + //========================================================================= + + 'version': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + 'clipperz_pm_crypto_version': function() { + if (this._clipperz_pm_crypto_version == null) { + var connectionVersions; + var versions; + var version; + var i, c; + + version = null; + connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions; + versions = MochiKit.Base.keys(connectionVersions); + c = versions.length; + for (i=0; i<c; i++) { + if (! (versions[i] == 'current')) { + if (this instanceof connectionVersions[versions[i]]) { + version = versions[i]; + }; + } + } + + this._clipperz_pm_crypto_version = version; + } + + return this._clipperz_pm_crypto_version; + }, + + //------------------------------------------------------------------------- + + 'defaultErrorHandler': function(anErrorString, anException) { +// Clipperz.logError("### Connection.defaultErrorHandler: " + anErrorString, anException); + Clipperz.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")"); + }, + + //------------------------------------------------------------------------- + + 'getCredentialsFunction': function () { + return this._getCredentialsFunction; + }, + + 'normalizedCredentials': function(someValues) { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //========================================================================= + + 'proxy': function () { + return this._proxy; + }, + + //========================================================================= + + 'register': function () { + throw Clipperz.Base.exception.AbstractMethod; + }, + + 'login': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'message': function(someArguments, aCallback) { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //------------------------------------------------------------------------- + + 'serverSideUserCredentials': function() { + throw Clipperz.Base.exception.AbstractMethod; + }, + + //========================================================================= + + 'sharedSecret': function () { + return this._sharedSecret; + }, + + 'setSharedSecret': function (aValue) { + this._sharedSecret = aValue; + }, + + //------------------------------------------------------------------------- + + 'connectionId': function() { + return this._connectionId; + }, + + 'setConnectionId': function(aValue) { + this._connectionId = aValue; + }, + + //------------------------------------------------------------------------- + + 'serverLockValue': function () { + return this._serverLockValue; + }, + + 'setServerLockValue': function (aValue) { + this._serverLockValue = aValue; + }, + + //========================================================================= +/* +// TODO: ????? + 'oneTimePassword': function() { + return this._oneTimePassword; + }, + + 'setOneTimePassword': function(aValue) { + this._oneTimePassword = aValue; + }, +*/ + //========================================================================= + + 'reset': function() { + this.setSharedSecret(null); + this.setConnectionId(null); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" + +} +); + + +if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; } +//----------------------------------------------------------------------------- +// +// S R P [ 1 . 0 ] C O N N E C T I O N class +// +//----------------------------------------------------------------------------- + +Clipperz.PM.Connection.SRP['1.0'] = function (args) { + Clipperz.PM.Connection.call(this, args); + + return this; +} + +Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), { + + 'version': function() { + return '1.0'; + }, + + //========================================================================= + + 'register': function (someUserData) { + var deferredResult; + var cryptoVersion; + var srpConnection; + + cryptoVersion = this.clipperz_pm_crypto_version(); + + deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false}); + deferredResult.collectResults({ + 'credentials': [ + this.getCredentialsFunction(), + MochiKit.Base.method(this, 'normalizedCredentials'), + MochiKit.Base.bind(function(someCredentials) { + var srpConnection; + var result; + + srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); + result = srpConnection.serverSideCredentials(); + result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion; + + return result; + }, this) + ], + 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData), + 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Connection.communicationProtocol.currentVersion), + 'message': MochiKit.Base.partial(MochiKit.Async.succeed, 'completeRegistration') + }); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + deferredResult.addMethod(this.proxy(), 'registration'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'updateCredentials': function (aUsername, aPassphrase, someUserData) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Connection.updateCredentials", {trace:false}); + deferredResult.collectResults({ + 'credentials': [ + MochiKit.Base.method(this, 'normalizedCredentials', {username:aUsername, password:aPassphrase}), + MochiKit.Base.bind(function(someCredentials) { + var srpConnection; + var result; + + srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); + result = srpConnection.serverSideCredentials(); + result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion; + + return result; + }, this) + ], + 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData) + }); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + deferredResult.addMethod(this, 'message', 'upgradeUserCredentials'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + deferredResult.callback(); + + return deferredResult; + + }, + + //========================================================================= + + 'redeemOneTimePassword': function (someParameters) { +/* + //========================================================================= + // LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js) + deferredResult.addCallback(function(anUsername, aOneTimePassword) { + var args; + + args = { + 'message': 'oneTimePassword', + 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion, + 'parameters': { + 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword), + 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword) + } + } + + return args; + }, anUsername, oneTimePassword); + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP'); + deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake')); + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase'); + deferredResult.addCallback(function(aResult) { + return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']); + }); + deferredResult.addCallback(function(aResult) { + return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString(); + }); + deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername), +*/ + var args; + var normalizedOTP; + + normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']); + + args = { + 'message': 'oneTimePassword', + 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion, + 'parameters': { + 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP), + 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP) + } + } + + return Clipperz.Async.callbacks("Connction.redeemOTP", [ + MochiKit.Base.method(this.proxy(), 'handshake', args), + function(aResult) { + return Clipperz.PM.Crypto.deferredDecrypt({ + value: aResult['data'], + key: normalizedOTP, + version:aResult['version'] + }); + }, + function(aResult) { + return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString(); + } + ], {trace:false}) + }, + + 'login': function(isReconnecting) { + var deferredResult; + var cryptoVersion; + var srpConnection; + + cryptoVersion = this.clipperz_pm_crypto_version(); + deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false}); + deferredResult.addCallback(this.getCredentialsFunction()); + deferredResult.addMethod(this, 'normalizedCredentials'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) { + srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); + }, this)); + deferredResult.addCallback(function() { + var result; + + result = { + message: 'connect', + version: cryptoVersion, + parameters: { + C: srpConnection.C(), + A: srpConnection.A().asString(16) +// reconnecting: this.connectionId() + } + }; + +// TODO: ????? +// if (isReconnecting == true) { +// args.parameters['reconnecting'] = aConnection.connectionId(); +// } + + return result; + }); + deferredResult.addMethod(this.proxy(), 'handshake'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + deferredResult.addCallback(function(someParameters) { + var result; + + srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16)); + srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16)); + +// TODO: ????? +// if (typeof(someParameters['oneTimePassword']) != 'undefined') { +// this.setOneTimePassword(someParameters['oneTimePassword']); +// } + + result = { + message: 'credentialCheck', + version: cryptoVersion, + parameters: { + M1: srpConnection.M1() + } + }; + + return result; + }); + deferredResult.addMethod(this.proxy(), 'handshake'); + deferredResult.addCallback(function(someParameters) { + var result; + + if (someParameters['M2'] == srpConnection.M2()) { + result = MochiKit.Async.succeed(someParameters); + } else { + result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum); + } + + return result; + }); + deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) { + this.setConnectionId(someParameters['connectionId']); + this.setSharedSecret(srpConnection.K()); +// TODO: ????? +// if (this.oneTimePassword() != null) { +/// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword())); +// } + + if ((isReconnecting == true) && (this.serverLockValue() != someParameters['lock'])) { + throw Clipperz.PM.Connection.exception.StaleData; + } else { + this.setServerLockValue(someParameters['lock']); + } + + return someParameters; + }, this)); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); +// deferredResult.addCallback(MochiKit.Async.succeed, {result:"done"}); + + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'logout': function() { + return Clipperz.Async.callbacks("Connection.logout", [ + MochiKit.Base.method(this, 'setSharedSecret'), + MochiKit.Base.method(this.proxy(), 'logout', {}) + ], {trace:false}); + }, + + //========================================================================= + + 'ping': function () { + // TODO: ping the server in order to have a valid session + }, + + //========================================================================= + + 'message': function(aMessageName, someParameters) { + var args; + var parameters; + + parameters = someParameters || {}; + if (typeof(parameters['user']) != 'undefined') { + parameters['user']['lock'] = this.serverLockValue(); + } + + args = { + message: aMessageName, + srpSharedSecret: this.sharedSecret(), +// parameters: (someParameters || {}) + parameters: parameters + } + + return this.sendMessage(args); + }, + + //------------------------------------------------------------------------- + + 'sendMessage': function(someArguments) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Connection.sendMessage", {trace:false}); + deferredResult.addMethod(this.proxy(), 'message', someArguments); + deferredResult.addCallback(MochiKit.Base.bind(function(res) { + if (typeof(res['lock']) != 'undefined') { + this.setServerLockValue(res['lock']); + } + return res; + }, this)); + + deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments); + deferredResult.callback(); + + return deferredResult + }, + + //------------------------------------------------------------------------- + + 'messageExceptionHandler': function(anOriginalMessageArguments, anError) { + var result; + +Clipperz.log(">>> Connection.messageExceptionHandler: " + anError.message, anError); + if (anError instanceof MochiKit.Async.CancelledError) { + result = anError; + } else { + if ((anError.message == 'Trying to communicate without an active connection') || + (anError.message == 'No tollManager available for current session') + ) { + result = this.reestablishConnection(anOriginalMessageArguments); + } else if (anError.message == 'Session with stale data') { + MochiKit.Signal.signal(this, 'EXCEPTION'); + } else { + result = anError; + } + } +Clipperz.log("<<< Connection.messageExceptionHandler") + + return result;; + }, + + //========================================================================= + + 'reestablishConnection': function(anOriginalMessageArguments) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Connection.reestablishConnection"); + deferredResult.addMethod(this, 'reset'); + deferredResult.addMethod(this, 'login', true); + deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) { + aMessage['srpSharedSecret'] = this.sharedSecret(); + return aMessage; + }, this), anOriginalMessageArguments); + deferredResult.addMethod(this, 'sendMessage'); + deferredResult.addErrback(MochiKit.Signal.signal, this, 'EXCEPTION', null); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'serverSideUserCredentials': function(aUsername, aPassword) { + var result; + var newSrpConnection; + var normalizedAttributes; + + normalizedAttributes = this.normalizedCredentials({username:aUsername, password:aPassword}); + newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:normalizedAttributes['username'], P:normalizedAttributes['password'], hash:this.hash() }); + result = newSrpConnection.serverSideCredentials(); + result['version'] = this.clipperz_pm_crypto_version(); + + return result; + }, + + //========================================================================= + + 'normalizedCredentials': function(someValues) { + var result; + + result = {} + result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'])).toHexString().substring(2); + result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2); + + return result; + }, + + //----------------------------------------------------------------------------- + + 'hash': function() { + return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + + + +//----------------------------------------------------------------------------- +// +// S R P [ 1 . 1 ] C O N N E C T I O N class +// +//----------------------------------------------------------------------------- + +Clipperz.PM.Connection.SRP['1.1'] = function (args) { + Clipperz.PM.Connection.SRP['1.0'].call(this, args); + + return this; +} + +Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), { + + 'version': function() { + return '1.1'; + }, + + //----------------------------------------------------------------------------- + + 'normalizedCredentials': function(someValues) { + var result; + + result = {} + result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'] + someValues['password'])).toHexString().substring(2); + result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2); + + return result; + }, + + //----------------------------------------------------------------------------- + + 'hash': function() { + return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash; + }, + + //----------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +Clipperz.PM.Connection.exception = { + WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue"), + StaleData: new MochiKit.Base.NamedError("Stale data"), + UnexpectedRequest: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.UnexpectedRequest") +}; + + +Clipperz.PM.Connection.communicationProtocol = { + 'currentVersion': '0.2', + 'versions': { + '0.1': Clipperz.PM.Connection.SRP['1.0'], //Clipperz.Crypto.SRP.versions['1.0'].Connection, + '0.2': Clipperz.PM.Connection.SRP['1.1'] //Clipperz.Crypto.SRP.versions['1.1'].Connection + }, + 'fallbackVersions': { +// 'current': '0.1', + '0.2': '0.1', + '0.1': null + } +}; + +MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, { + 'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion] +}); + +MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.fallbackVersions, { + 'current': Clipperz.PM.Connection.communicationProtocol.fallbackVersions[Clipperz.PM.Connection.communicationProtocol.currentVersion] +}); + + + diff --git a/frontend/delta/js/Clipperz/PM/Crypto.js b/frontend/delta/js/Clipperz/PM/Crypto.js new file mode 100644 index 0000000..7edf17f --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Crypto.js @@ -0,0 +1,546 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; } + +Clipperz.PM.Crypto.VERSION = "0.2"; +Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto"; + +Clipperz.PM.Crypto.encryptingFunctions = {}; + +MochiKit.Base.update(Clipperz.PM.Crypto, { + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- +/* + 'communicationProtocol': { + 'currentVersion': '0.2', + 'versions': { + '0.1': Clipperz.PM.Connection.SRP['1.0'], //Clipperz.Crypto.SRP.versions['1.0'].Connection, + '0.2': Clipperz.PM.Connection.SRP['1.1'] //Clipperz.Crypto.SRP.versions['1.1'].Connection + }, + 'fallbackVersions': { + 'current': '0.1', + '0.2': '0.1', + '0.1': null + } + }, +*/ + //------------------------------------------------------------------------- + + 'encryptingFunctions': { + 'currentVersion': '0.4', + 'versions': { + + //##################################################################### + + '0.1': { + 'encrypt': function(aKey, aValue) { + return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue)); + }, + + 'deferredEncrypt': function(aKey, aValue) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt"); + deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue); + deferredResult.callback(); + + return deferredResult; + }, + + 'decrypt': function(aKey, aValue) { + var result; + + if (aValue != null) { + result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue)); + } else { + result = null; + } + + return result; + }, + + 'deferredDecrypt': function(aKey, aValue) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt"); + deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue); + deferredResult.callback(); + + return deferredResult; + }, + + 'hash': function(aValue) { + var result; + var strngResult; + + stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); // !!!!!!! + result = new Clipperz.ByteArray("0x" + stringResult); + + return result; + }, + + 'deriveKey': function(aStringValue) { + return Clipperz.Crypto.Base.computeHashValue(aStringValue); + } + }, + + //##################################################################### + + '0.2': { + 'encrypt': function(aKey, aValue, aNonce) { + var result; + var key, value; + var dataToEncrypt; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue)); + dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value); + encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce); + result = encryptedData.toBase64String(); + + return result; + }, + + 'deferredEncrypt': function(aKey, aValue, aNonce) { + var deferredResult; + var key, value; + var dataToEncrypt; +// var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue)); + dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value); + + deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt") + deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce); + deferredResult.addCallback(function(aResult) { + return aResult.toBase64String(); + }) + deferredResult.callback(); + + return deferredResult; + }, + + 'decrypt': function(aKey, aValue) { + var result; + + if (aValue != null) { + var key, value; + var decryptedData; + var decryptedValue; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + decryptedData = Clipperz.Crypto.AES.decrypt(key, value); + decryptedValue = decryptedData.split((256/8)); + + try { + result = Clipperz.Base.evalJSON(decryptedValue.asString()); + } catch (exception) { + Clipperz.logError("Error while decrypting data [1]"); + throw Clipperz.Crypto.Base.exception.CorruptedMessage; + } + } else { + result = null; + } + + return result; + }, + + 'deferredDecrypt': function(aKey, aValue) { + var result; + + if (aValue != null) { + var deferredResult; + var key, value; +// var decryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt"); + deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); + deferredResult.addCallback(function(aResult) { + var result; + var decryptedData; + + decryptedData = aResult.split((256/8)); + + try { + result = Clipperz.Base.evalJSON(decryptedData.asString()); + } catch (exception) { + Clipperz.logError("Error while decrypting data [2]"); + throw Clipperz.Crypto.Base.exception.CorruptedMessage; + } + + return result; + }) + deferredResult.callback(); + + result = deferredResult; + } else { + result = MochiKit.Async.succeed(null); + } + + return result; + }, + + 'hash': Clipperz.Crypto.SHA.sha_d256, + + 'deriveKey': function(aStringValue) { + var byteData; + var result; + + byteData = new Clipperz.ByteArray(aStringValue); + result = Clipperz.Crypto.SHA.sha_d256(byteData); + + return result; + } + }, + + //##################################################################### + + '0.3': { + 'encrypt': function(aKey, aValue, aNonce) { + var result; + var key, value; + var data; + var dataToEncrypt; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = Clipperz.Base.serializeJSON(aValue); + data = new Clipperz.ByteArray(value); + encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce); + result = encryptedData.toBase64String(); + + return result; + }, + + 'deferredEncrypt': function(aKey, aValue, aNonce) { + var deferredResult; + var key, value; + var data; + var dataToEncrypt; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = Clipperz.Base.serializeJSON(aValue); + data = new Clipperz.ByteArray(value); + + deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt") + deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce); + deferredResult.addCallback(function(aResult) { + return aResult.toBase64String(); + }) + deferredResult.callback(); + + return deferredResult; + }, + + 'decrypt': function(aKey, aValue) { + var result; + + if (aValue != null) { + var key, value; + var decryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + decryptedData = Clipperz.Crypto.AES.decrypt(key, value); + + value = decryptedData.asString(); + try { + result = Clipperz.Base.evalJSON(value); + } catch (exception) { + Clipperz.logError("Error while decrypting data [3]"); + throw Clipperz.Crypto.Base.exception.CorruptedMessage; + } + } else { + result = null; + } + + return result; + }, + + 'deferredDecrypt': function(aKey, aValue) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false}); +// now = new Date; + + if (aValue != null) { + var key, value; +// var decryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); + deferredResult.addCallback(MochiKit.Async.wait, 0.1); + deferredResult.addCallback(function(aResult) { + return aResult.asString(); + }); + deferredResult.addCallback(MochiKit.Async.wait, 0.1); + deferredResult.addCallback(Clipperz.Base.evalJSON); + deferredResult.addErrback(function(anError) { +console.log("PIPPO_1", anError) + Clipperz.logError("Error while decrypting data [4]"); + throw Clipperz.Crypto.Base.exception.CorruptedMessage; + }) + } else { + deferredResult.addCallback(function() { + return null; + }); + } + deferredResult.callback(); + + return deferredResult; + }, + + 'hash': Clipperz.Crypto.SHA.sha_d256, + + 'deriveKey': function(aStringValue) { + var byteData; + var result; + + byteData = new Clipperz.ByteArray(aStringValue); + result = Clipperz.Crypto.SHA.sha_d256(byteData); + + return result; + } + }, + + //##################################################################### + + '0.4': { + 'encrypt': function(aKey, aValue, aNonce) { + var result; + var key, value; + var data; + var dataToEncrypt; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = Clipperz.Base.serializeJSON(aValue); + data = new Clipperz.ByteArray(value); + encryptedData = Clipperz.Crypto.AES_2.encrypt(key, data, aNonce); + result = encryptedData.toBase64String(); + + return result; + }, + + 'deferredEncrypt': function(aKey, aValue, aNonce) { + var deferredResult; + var key, value; + var data; + var dataToEncrypt; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = Clipperz.Base.serializeJSON(aValue); + data = new Clipperz.ByteArray(value); + + deferredResult = new Clipperz.Async.Deferred("Crypto[0.4].deferredEncrypt") + deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredEncrypt, key, data, aNonce); + deferredResult.addCallback(function(aResult) { + return aResult.toBase64String(); + }) + deferredResult.callback(); + + return deferredResult; + }, + + 'decrypt': function(aKey, aValue) { + var result; + + if (aValue != null) { + var key, value; + var decryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + decryptedData = Clipperz.Crypto.AES_2.decrypt(key, value); + + value = decryptedData.asString(); + try { + result = Clipperz.Base.evalJSON(value); + } catch (exception) { + console.log("PIPPO_2", anError) + Clipperz.logError("Error while decrypting data [4]"); + throw Clipperz.Crypto.Base.exception.CorruptedMessage; + } + } else { + result = null; + } + + return result; + }, + + 'deferredDecrypt': function(aKey, aValue) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Crypto[0.4].deferredDecrypt", {trace: false}); + + if (aValue != null) { + var key, value; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredDecrypt, key, value); + deferredResult.addCallback(MochiKit.Async.wait, 0.1); + deferredResult.addCallback(function(aResult) { + return aResult.asString(); + }); + deferredResult.addCallback(MochiKit.Async.wait, 0.1); + deferredResult.addCallback(Clipperz.Base.evalJSON); + deferredResult.addErrback(function(anError) { + Clipperz.logError("Error while decrypting data [4]"); + throw Clipperz.Crypto.Base.exception.CorruptedMessage; + }) + } else { + deferredResult.addCallback(function() { + return null; + }); + } + deferredResult.callback(); + + return deferredResult; + }, + + 'hash': Clipperz.Crypto.SHA.sha_d256, + + 'deriveKey': function(aStringValue) { + var byteData; + var result; + + byteData = new Clipperz.ByteArray(aStringValue); + result = Clipperz.Crypto.SHA.sha_d256(byteData); + + return result; + } + }, + + //##################################################################### + __syntaxFix__: "syntax fix" + } + }, + + //------------------------------------------------------------------------- + + 'encrypt': function(aKey, aValue, aVersion) { + return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue); + }, + + 'deferredEncrypt': function(someParameters) { + return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredEncrypt(someParameters['key'], someParameters['value']); + }, + + //......................................................................... + + 'decrypt': function(aKey, aValue, aVersion) { + return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].decrypt(aKey, aValue); + }, + + 'deferredDecrypt': function(someParameters) { + return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredDecrypt(someParameters['key'], someParameters['value']); + }, + + //------------------------------------------------------------------------- + + 'hash': function(aValue) { + return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]['hash'](aValue); + }, + + //------------------------------------------------------------------------- + + 'randomKey': function() { + return Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + }, + + //------------------------------------------------------------------------- + + 'deriveKey': function(aValue) { + return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion].deriveKey(aValue); + }, + + //------------------------------------------------------------------------- + + 'passwordEntropy': function(aValue) { + var result; + var bitPerChar; + + bitPerChar = 4; + if (/[a-z]/.test(aValue)) { + bitPerChar ++; + } + if (/[A-Z]/.test(aValue)) { + bitPerChar ++; + } + if (/[^a-zA-Z0-9]/.test(aValue)) { + bitPerChar ++; + } + + result = aValue.length * bitPerChar; + + return result; + }, + + //------------------------------------------------------------------------- + + 'nullValue': '####', + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//***************************************************************************** + +//MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, { +// 'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion] +//}); + +MochiKit.Base.update(Clipperz.PM.Crypto.encryptingFunctions.versions, { + 'current': Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion] +}); + +//***************************************************************************** diff --git a/frontend/delta/js/Clipperz/PM/DataModel/DirectLogin.js b/frontend/delta/js/Clipperz/PM/DataModel/DirectLogin.js new file mode 100644 index 0000000..8db90de --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/DirectLogin.js @@ -0,0 +1,1086 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.Base.module('Clipperz.PM.DataModel'); + +Clipperz.PM.DataModel.DirectLogin = function(args) { + args = args || {}; + + Clipperz.PM.DataModel.DirectLogin.superclass.constructor.apply(this, arguments); + + this._reference = args.reference + || Clipperz.PM.Crypto.randomKey(); + this._record = args.record + || Clipperz.Base.exception.raise('MandatoryParameter'); + + this._retrieveIndexDataFunction = args.retrieveIndexDataFunction + || this.record().retrieveDirectLoginIndexDataFunction() + || Clipperz.Base.exception.raise('MandatoryParameter'); + this._setIndexDataFunction = args.setIndexDataFunction + || this.record().setDirectLoginIndexDataFunction() + || Clipperz.Base.exception.raise('MandatoryParameter'); + this._removeIndexDataFunction = args.removeIndexDataFunction + || this.record().removeDirectLoginIndexDataFunction() + || Clipperz.Base.exception.raise('MandatoryParameter'); + + this._inputs = null; + this._bindings = null; + this._formValues = null; + +// this._inputsDeferredLock = new MochiKit.Async.DeferredLock(); +// this._bindingsDeferredLock = new MochiKit.Async.DeferredLock(); +// this._formValuesDeferredLock = new MochiKit.Async.DeferredLock(); + + this._transientState = null; + + this._isBrandNew = MochiKit.Base.isUndefinedOrNull(args.reference); + + this.record().addDirectLogin(this); + + return this; +} + +Clipperz.Base.extend(Clipperz.PM.DataModel.DirectLogin, Object, { + + 'toString': function() { + return "DirectLogin (" + this.reference() + ")"; + }, + + //========================================================================= + + 'reference': function () { + return this._reference; + }, + + //------------------------------------------------------------------------- + + 'record': function () { + return this._record; + }, + + //========================================================================= + + 'isBrandNew': function () { + return this._isBrandNew; + }, + + //========================================================================= + + 'removeIndexDataFunction': function () { + return this._removeIndexDataFunction; + }, + + 'remove': function () { + return Clipperz.Async.callbacks("DirectLogin.remove", [ + MochiKit.Base.partial(this.removeIndexDataFunction(), this.reference()), + MochiKit.Base.method(this.record(), 'removeDirectLogin', this) + ], {trace:false}); + }, + + //========================================================================= +/* + 'inputsDeferredLock': function () { + return this._inputsDeferredLock; + }, + + 'bindingsDeferredLock': function () { + return this._bindingsDeferredLock; + }, + + 'formValuesDeferredLock': function () { + return this._formValuesDeferredLock; + }, +*/ + //========================================================================= + + 'label': function () { + return this.getIndexDataForKey('label'); + }, + + 'setLabelKeepingBackwardCompatibilityWithBeta': function (aValue) { + return Clipperz.Async.callbacks("DirectLogin.setLabelKeepingBackwardCompatibilityWithBeta", [ + MochiKit.Base.method(this, 'setIndexDataForKey', 'label', aValue), + MochiKit.Base.method(this, 'setValue', 'label', aValue) + ], {trace:false}); + }, + + 'setLabel': function (aValue) { + return this.setLabelKeepingBackwardCompatibilityWithBeta(aValue); +// return this.setIndexDataForKey('label', aValue); + }, + + //========================================================================= + + 'favicon': function () { + return this.getIndexDataForKey('favicon'); + }, + + 'setFavicon': function (aValue) { + return this.setIndexDataForKey('favicon', aValue); + }, + + 'faviconUrlWithBookmarkletConfiguration': function (aBookmarkletConfiguration) { + var result; + + if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['page']['favicon'])) { + result = aBookmarkletConfiguration['page']['favicon']; + } else if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['form']['attributes']['action'])) { + var actionUrl; + var hostname; + + actionUrl = aBookmarkletConfiguration['form']['attributes']['action']; + hostname = actionUrl.replace(/^https?:\/\/([^\/]*)\/.*/, '$1'); + result = "http://" + hostname + "/favicon.ico"; + } else { + result = null; + } + + + return result; + }, + + //------------------------------------------------------------------------- +/* + 'faviconData': function () { + var regexp = new RegExp('^data\:\/\/.*', 'i'); + + return Clipperz.Async.callbacks("DirectLogin.favicon", [ + MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'), + MochiKit.Base.method(regexp, 'test'), + Clipperz.Async.deferredIf("is data URL", [ + MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon') + ], [ + MochiKit.Base.method(this, 'transientState'), + MochiKit.Base.itemgetter('faviconData'), + Clipperz.Async.deferredIf('has a chaced value for the favicon data', [ + MochiKit.Base.operator.identity + ], [ + MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'), + MochiKit.Base.method(this, 'loadFaviconDataFromURL') + ]) + + ]) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'loadFaviconDataFromURL': function (anURL) { + var deferredResult; + var image; + + deferredResult = new Clipperz.Async.Deferred("DirectLogin.loadFaviconDataFromURL", {trace:false}); + deferredResult.addCallback(function (anEvent) { + var image = anEvent.src(); + var canvas = document.createElement("canvas"); + var result; + + canvas.width = image.width; + canvas.height = image.height; + + var ctx = canvas.getContext("2d"); + ctx.drawImage(image, 0, 0); + + result = canvas.toDataURL(/*"image/png"* /); + + return result; + }); + deferredResult.addErrback(MochiKit.Async.succeed, Clipperz.PM.Strings.getValue('defaultFaviconUrl')); + deferredResult.addBoth(MochiKit.Base.bind(function (aDataUrl) { + this.transientState()['faviconData'] = aDataUrl; + + return aDataUrl; + }, this)); + + image = new Image(); + MochiKit.Signal.connect(image, 'onload', MochiKit.Base.method(deferredResult, 'callback')); + MochiKit.Signal.connect(image, 'onerror', MochiKit.Base.method(deferredResult, 'errback')); + MochiKit.Signal.connect(image, 'onabort', MochiKit.Base.method(deferredResult, 'errback')); + + image.src = anURL; + + return deferredResult; + }, +*/ + + //========================================================================= + + 'type': function () { + return this.getValue('formData.attributes.type') + }, + + //========================================================================= + + 'serializedData': function () { + return Clipperz.Async.collectResults("DirectLogin.serializedData", { + 'bookmarkletVersion': MochiKit.Base.method(this, 'getValue', 'bookmarkletVersion'), + 'formData': MochiKit.Base.method(this, 'getValue', 'formData'), + 'formValues': MochiKit.Base.method(this, 'getValue', 'formValues'), + 'bindingData': [ + MochiKit.Base.method(this, 'bindings'), + function (someBindings) { + var result; + var bindingKey; + + result = {} + for (bindingKey in someBindings) { + result[bindingKey] = someBindings[bindingKey].serializedData(); + } + + return result; + } + ] + }, {trace:false})() + }, + + //========================================================================= +/* + 'fixFormDataFromBookmarkletVersion_0_1': function(aValue) { +//{"type":"radio", "name":"action", "value":"new-user", "checked":false }, { "type":"radio", "name":"action", "value":"sign-in", "checked":true } +// || +// \ / +// \/ +//{"name":"dominio", "type":"radio", "options":[{"value":"@alice.it", "checked":true}, {"value":"@tin.it", "checked":false}, {"value":"@virgilio.it", "checked":false}, {"value":"@tim.it", "checked":false}]} + var result; + var inputs; + var updatedInputs; + var radios; + + result = aValue; + inputs = aValue['inputs']; + + updatedInputs = MochiKit.Base.filter(function(anInput) { + var result; + var type; + + type = anInput['type'] || 'text'; + result = type.toLowerCase() != 'radio'; + + return result; + }, inputs); + radios = MochiKit.Base.filter(function(anInput) { + var result; + var type; + + type = anInput['type'] || 'text'; + result = type.toLowerCase() == 'radio'; + + return result; + }, inputs); + + if (radios.length > 0) { + var updatedRadios; + + updatedRadios = {}; + MochiKit.Iter.forEach(radios, MochiKit.Base.bind(function(aRadio) { + var radioConfiguration; + + radioConfiguration = updatedRadios[aRadio['name']]; + if (radioConfiguration == null) { + radioConfiguration = {type:'radio', name:aRadio['name'], options:[]}; + updatedRadios[aRadio['name']] = radioConfiguration; + } + +// TODO: remove the value: field and replace it with element.dom.value = <some value> + radioConfiguration.options.push({value:aRadio['value'], checked:aRadio['checked']}); + +// TODO: shoud remove the 'formValues' call, as it is now deferred +// if ((aRadio['checked'] == true) && (this.formValues()[aRadio['name']] == null)) { +// this.formValues()[aRadio['name']] = aRadio['value']; +// } + }, this)) + + updatedInputs = MochiKit.Base.concat(updatedInputs, MochiKit.Base.values(updatedRadios)); + } + + delete result.inputs; + result.inputs = updatedInputs; + + return result; + }, + + '_fixConfiguration': function (aConfiguration) { + var fixedConfiguration; +// var inputs; +// var bindings; +// var i,c; + + fixedConfiguration = Clipperz.Base.deepClone(aConfiguration); + +//Clipperz.log("PROCESS CONFIGURATION", aConfiguration); + switch (aConfiguration['bookmarkletVersion']) { + case '0.1': + fixedConfiguration['formData'] = this.fixFormDataFromBookmarkletVersion_0_1(aConfiguration['formData']); + break; + case '0.2': + fixedConfiguration['formData'] = aConfiguration['formData']; + break; + } + +/ * + aConfiguration['_inputs'] = []; + c = formData['inputs'].length; + for (i=0; i<c; i++) { + aConfiguration['_inputs'].push(new Clipperz.PM.DataModel.DirectLoginInput(formData['inputs'][i])); + } +* / +/ * + aConfiguration['_bindings'] = {}; + if (aConfiguration['legacyBindingData'] == null) { + if (aConfiguration['bindingData'] != null) { + var bindingKey; + + for (bindingKey in aConfiguration['bindingData']) { + var newBinding; + + newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldKey:aConfiguration['bindingData'][bindingKey]}); + aConfiguration['_bindings'][newBinding.key()] = newBinding; + } + } else { + var editableFields; + + editableFields = MochiKit.Base.filter(function(aField) { + var result; + var type; + + type = aField['type'].toLowerCase(); + result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select')); + + return result; + }, aConfiguration['_inputs']); + + MochiKit.Iter.forEach(editableFields, MochiKit.Base.bind(function(anEditableField) { + var newBinding; + + newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(anEditableField['name']); + aConfiguration['_bindings'][newBinding.key()] = newBinding; + }, this)); + } + + } else { + var bindingKey; + + for (bindingKey in aConfiguration['legacyBindingData']) { + var newBinding; + + newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldName:aConfiguration['legacyBindingData'][bindingKey]}); + aConfiguration['_bindings'][newBinding.key()] = newBinding; + } + } +* / + + return fixedConfiguration; + }, + + //------------------------------------------------------------------------- + + 'getObjectDataStore': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore", {trace:false}); + deferredResult.acquireLock(this.objectDataStoreDeferredLock()); + deferredResult.addCallback(MochiKit.Base.bind(function () { + var innerDeferredResult; + + if (this._objectDataStore == null) { + this._objectDataStore = new Clipperz.KeyValueObjectStore(); + + innerDeferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore <inner deferred>", {trace:false}); +// innerDeferredResult.addMethod(this.record(), 'getValue', 'directLogins' + '.' + this.reference()); + innerDeferredResult.addMethod(this, 'getValue', ''), + innerDeferredResult.addMethod(this, 'setOriginalState'); + innerDeferredResult.addMethod(this, '_fixConfiguration'); + innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues'); +// innerDeferredResult.addMethod(this._objectDataStore, 'setValues'); + innerDeferredResult.callback(); + } else { + innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore); + } + + return innerDeferredResult; + }, this)); + deferredResult.releaseLock(this.objectDataStoreDeferredLock()); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'hasInitiatedObjectDataStore': function () { + return (this._objectDataStore != null); + }, + + //------------------------------------------------------------------------- + + 'resetObjectDataStore': function () { + this._objectDataStore.removeAllData(); + this._objectDataStore = null; + }, +*/ + //========================================================================= + + 'bookmarkletConfiguration': function () { + return Clipperz.Async.callbacks("DirectLogin.bookmarkletConfiguration", [ + Clipperz.Async.collectResults("DirectLogin.bookmarkletConfiguration <inner results>", { + 'label': MochiKit.Base.method(this, 'label'), + 'configuration': MochiKit.Base.method(this, 'getValue', '') + }, {trace:false}), + function (someValues) { + var result; + + if (someValues['configuration'] != null) { + var configuration; + + configuration = { + 'page': { + 'title': someValues['label'] + // 'favicon' + // 'url' + }, + 'form': someValues['configuration']['formData'], + 'version': someValues['configuration']['bookmarkletVersion'] + } + + result = Clipperz.Base.formatJSON(configuration); + } else { + result = ''; + } + + return result; + } + ], {trace:false}); + + }, + + //------------------------------------------------------------------------- + + 'setBookmarkletConfiguration': function (aValue) { + var bookmarkletConfiguration; + + bookmarkletConfiguration = Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(aValue); + + return Clipperz.Async.callbacks("DirectLogin.setBookmarkletConfiguration", [ + MochiKit.Base.method(this, 'setValue', 'formData', bookmarkletConfiguration['form']), + MochiKit.Base.method(this, 'setValue', 'bookmarkletVersion', bookmarkletConfiguration['version']), + + MochiKit.Base.method(this, 'favicon'), + Clipperz.Async.deferredIf("the favicon is not set", [ + ], [ + MochiKit.Base.method(this, 'faviconUrlWithBookmarkletConfiguration', bookmarkletConfiguration), + MochiKit.Base.method(this, 'setFavicon') + ]), + + MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration'), + MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'), + MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'), + + MochiKit.Base.noop + ], {trace:false}); + }, + + //========================================================================= + + 'formAttributes': function () { + return this.getValue('formData.attributes'); + }, + + //========================================================================= + + 'inputs': function () { + return Clipperz.Async.callbacks("DirectLogin.inputs", [ + Clipperz.Async.deferredIf("this._inputs is defined", [ + ], [ + MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration') + ]) + ], {trace:false}, this._inputs); + }, + + 'setInputWithFormDataConfiguration': function (aFormDataConfiguration) { + this._inputs = {}; + + if (aFormDataConfiguration != null) { + MochiKit.Iter.forEach(aFormDataConfiguration['inputs'], MochiKit.Base.bind(function (anInputData) { + var newInput; + + newInput = new Clipperz.PM.DataModel.DirectLoginInput(anInputData); + this._inputs[newInput.name()] = newInput; + }, this)); + } + + return this._inputs; + }, + + 'updateInputsAfterChangingBookmarkletConfiguration': function () { + return Clipperz.Async.callbacks("DirectLogin.updateInputsAfterChangingBookmarkletConfiguration", [ + MochiKit.Base.method(this, 'getValue', 'formData'), + MochiKit.Base.method(this, 'setInputWithFormDataConfiguration') + ], {trace:false}); + }, + + //========================================================================= + + 'inputValues': function () { + return Clipperz.Async.callbacks("DirectLogin.inputValues", [ + MochiKit.Base.method(this, 'inputs'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.partial(MochiKit.Base.method(this, 'inputValue'))), + Clipperz.Async.collectAll, + Clipperz.Base.mergeItems + ], {trace:false}); + }, + + 'inputValue': function (anInput) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("DirectLogin.inputValue", {trace:false}); + + if (anInput.needsFormValue()) { + deferredResult.addMethod(this, 'formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name())); + deferredResult.addMethodcaller('value'); + } else if (anInput.needsBinding()) { + deferredResult.addMethod(this, 'bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name())); + deferredResult.addMethodcaller('field'); + deferredResult.addMethodcaller('value'); + } else { + deferredResult.addCallback(MochiKit.Async.succeed, anInput.value()); + } + deferredResult.addCallback(function (anActualValue) { + return [anInput.name(), anActualValue]; + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'bindings': function () { + return Clipperz.Async.callbacks("DirectLogin.bindings", [ + Clipperz.Async.deferredIf("this._bindings is defined", [ + ], [ + MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'), + MochiKit.Base.bind(function () { return this._bindings;}, this) + ]) + ], {trace:false}, this._bindings); + }, + + 'bindFormFieldWithLabelToRecordFieldWithLabel': function (aFormFieldLabel, aRecordFieldLabel) { + return Clipperz.Async.callbacks("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel", [ + Clipperz.Async.collectResults("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel - collect results", { + 'binding': [ + MochiKit.Base.method(this, 'bindings'), + MochiKit.Base.itemgetter(aFormFieldLabel) + ], + 'field': [ + MochiKit.Base.method(this.record(), 'fieldWithLabel', aRecordFieldLabel) + ] + }), + function (someValues) { + someValues['binding'].setField(someValues['field']) + } + ], {trace:false}); + }, + + //------------------------------------------------------------------------- +/* + 'bindingValues': function () { + return Clipperz.Async.callbacks("DirectLogin.bindingValues", [ + Clipperz.Async.collectResults("DirectLogin.bindingValues [collectResults]", { + 'fieldValues': [ + MochiKit.Base.method(this, 'record'), + MochiKit.Base.methodcaller('getFieldsValues') + ], + 'bindings': MochiKit.Base.method(this, 'bindings') + }, {trace:false}), + function (someData) { + var result; + var bindingKey; + + result = {}; + for (bindingKey in someData['bindings']) { + result[bindingKey] = someData['fieldValues'][someData['bindings'][bindingKey].fieldKey()]['value']; + } + + return result; + } + ], {trace:false}); + }, +*/ + //------------------------------------------------------------------------- + + 'updateBindingsAfterChangingBookmarkletConfiguration': function () { + return Clipperz.Async.callbacks("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration", [ + Clipperz.Async.collectResults("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration<collect results>", { + 'currentValues': MochiKit.Base.method(this, 'getValue', ''), + 'originalValues': MochiKit.Base.method(this, 'originalConfiguration'), + 'inputs': MochiKit.Base.method(this, 'inputs') + }, {trace:false}), + MochiKit.Base.bind(function (someValues) { + var availableBindingValues; + var inputRequiringBindingValues; + var newBindingValues; + + if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['bindingData'])) { + availableBindingValues = {}; + } else { + availableBindingValues = Clipperz.Base.deepClone(someValues['originalValues']['bindingData']) + } + + if (someValues['currentValues'] != null) { + MochiKit.Base.update(availableBindingValues, someValues['currentValues']['bindingData']); + } + + this._bindings = {}; + newBindingValues = {} + MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsBinding'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) { + var newBinding; + + newBindingValues[anInput.name()] = availableBindingValues[anInput.name()]; + newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, { + 'key': anInput.name(), + 'field': availableBindingValues[anInput.name()] + }); + + this._bindings[anInput.name()] = newBinding; + }, this)) + + return newBindingValues; + +/* + this._bindings = {}; + + if (someValues['currentValues'] != null) { + if (someValues['currentValues']['bindingData'] != null) { + var bindingKey; + + for (bindingKey in someValues['currentValues']['bindingData']) { + var newBinding; + + newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, { + 'key': bindingKey, + 'field': someValues['currentValues']['bindingData'][bindingKey] + }); + this._bindings[newBinding.key()] = newBinding; + } + } else if (someValues['currentValues']['legacyBindingData'] == null) { + var bindingKey; + + for (bindingKey in someValues['currentValues']['legacyBindingData']) { + var newBinding; + + newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, { + 'key': bindingKey, + 'field': someValues['currentValues']['legacyBindingData'][bindingKey] + }); + this._bindings[newBinding.key()] = newBinding; + } + } else { + WTF = TODO; + } + } + + return this._bindings; +*/ + }, this), + MochiKit.Base.method(this, 'setValue', 'bindingData') + ], {trace:false}); + }, + + //========================================================================= + + 'formValues': function () { + return Clipperz.Async.callbacks("DirectLogin.formValues", [ + Clipperz.Async.deferredIf("this._formValues is defined", [ + ], [ + MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'), + MochiKit.Base.bind(function () { return this._formValues;}, this) + ]) + ], {trace:false}, this._formValues); + }, + + //------------------------------------------------------------------------- + + 'updateFormValuesAfterChangingBookmarkletConfiguration': function () { + return Clipperz.Async.callbacks("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration", [ + Clipperz.Async.collectResults("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration <collect results>", { + 'currentValues': MochiKit.Base.method(this, 'getValue', ''), + 'originalValues': MochiKit.Base.method(this, 'originalConfiguration'), + 'inputs': MochiKit.Base.method(this, 'inputs') + }, {trace:false}), + MochiKit.Base.bind(function (someValues) { + var availableFormValues; + var inputRequiringFormValues; + var newFormValues; + + if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['formValues'])) { + availableFormValues = {}; + } else { + availableFormValues = Clipperz.Base.deepClone(someValues['originalValues']['formValues']) + } + + MochiKit.Base.update(availableFormValues, someValues['currentValues']['formValues']); + + this._formValues = {}; + newFormValues = {}; + MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsFormValue'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) { + var newFormValue; + var fieldOptions; + + fieldOptions = { + 'type': anInput.type(), + 'options': anInput.options() + }; + + newFormValues[anInput.name()] = availableFormValues[anInput.name()] + newFormValue = new Clipperz.PM.DataModel.DirectLoginFormValue(this, { + 'key': anInput.name(), + 'fieldOptions': fieldOptions, + 'value': availableFormValues[anInput.name()] + }); + + this._formValues[anInput.name()] = newFormValue; + }, this)) + + return newFormValues; + }, this), + MochiKit.Base.method(this, 'setValue', 'formValues') + ], {trace:false}); + }, + + //========================================================================= + + 'retrieveIndexDataFunction': function () { + return this._retrieveIndexDataFunction; + }, + + 'getIndexDataForKey': function (aKey) { + return Clipperz.Async.callbacks("DirectLogin.getIndexDataForKey", [ + MochiKit.Base.partial(this.retrieveIndexDataFunction(), this.reference()), + Clipperz.Async.deferredIf("DirectLogin.getIndexDataForKey - index data not null", [ + MochiKit.Base.itemgetter(aKey) + ],[ + MochiKit.Async.succeed + ]) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'setIndexDataForKey': function (aKey, aValue) { + return Clipperz.Async.callbacks("DirectLogin.setValueForKey", [ + MochiKit.Base.method(this, 'getIndexDataForKey', aKey), + MochiKit.Base.bind(function (anActualValue) { + var transientStateKey; + + transientStateKey = 'original_' + aKey; + if (MochiKit.Base.isUndefinedOrNull(this.transientState()[transientStateKey])) { + if (anActualValue != aValue) { + this.transientState()[transientStateKey] = anActualValue; + } + } else if (this.transientState()[transientStateKey] == aValue) { + this.transientState()[transientStateKey] = null; + } + }, this), + MochiKit.Base.partial(this._setIndexDataFunction, this.reference(), aKey, aValue) + ], {trace:false}) + }, + + //------------------------------------------------------------------------- +/* + 'setValueForKey': function (aKey, aValue) { + return Clipperz.Async.callbacks("DirectLogin.setValueForKey", [ + MochiKit.Base.method(this, 'getIndexDataForKey', aKey), + MochiKit.Base.bind(function (anActualValue) { + var transientStateKey; + + transientStateKey = 'original_' + aKey; + if (MochiKit.Base.isUndefinedOrNull(this.transientState()[transientStateKey])) { + if (anActualValue != aValue) { + this.transientState()[transientStateKey] = anActualValue; + } + } else if (this.transientState()[transientStateKey] == aValue) { + this.transientState()[transientStateKey] = null; + } + }, this), + MochiKit.Base.method(this, 'setIndexDataForKey', aKey, aValue) + ], {trace:false}) + }, +*/ + //========================================================================= +/* + 'storedConfiguration': function () { + return this.record().getValue('directLogins' + '.' + this.reference()); + }, + +// 'setStoredConfiguration': function (aValue) { +// return this.record().setValue('directLogins' + '.' + this.reference(), aValue); +// }, +*/ + //========================================================================= + + 'hasPendingChanges': function () { + var result; + var deferredResult; + + result = false; + result = result || this.isBrandNew(); + result = result || (! MochiKit.Base.isUndefinedOrNull(this.transientState()['original_label'])); + result = result || (! MochiKit.Base.isUndefinedOrNull(this.transientState()['original_favicon'])); + + if ((result == false) && (this.originalConfiguration() != null)) { + deferredResult = Clipperz.Async.callbacks("DirectLogin.hasPendingChanges", [ + MochiKit.Base.method(this, 'serializedData'), + MochiKit.Base.bind(function (aCurrentConfiguration) { + var originalConfiguration; + var currentConfiguration; + var result; + + originalConfiguration = this.originalConfiguration(); + currentConfiguration = aCurrentConfiguration; + + result = false; + result = result || (MochiKit.Base.compare(originalConfiguration['bookmarkletVersion'], currentConfiguration['bookmarkletVersion']) != 0); + result = result || (MochiKit.Base.compare(originalConfiguration['formData'], currentConfiguration['formData']) != 0); + result = result || (MochiKit.Base.compare(originalConfiguration['formValues'], currentConfiguration['formValues']) != 0); + result = result || (MochiKit.Base.compare(originalConfiguration['bindingData'], currentConfiguration['bindingData']) != 0); + + return result; + }, this) + ], {trace:false}); + } else { + deferredResult = MochiKit.Async.succeed(result); + } + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'revertChanges': function () { + var deferredResult; + + if (this.transientState()['original_label'] != null) { + this.setLabel(this.transientState()['original_label']); + } + + if (this.transientState()['original_favicon'] != null) { + this.setFavicon(this.transientState()['original_favicon']); + } + + if (this.originalConfiguration() != null) { + deferredResult = this.setValue('', this.originalConfiguration()); + } else { + deferredResult = MochiKit.Async.succeed(); + } + + this._inputs = null; + this._bindings = null; + this._formValues = null; + + this.resetTransientState(false); + +/* + if (this.hasInitiatedObjectDataStore()) { + deferredResult = Clipperz.Async.callbacks("DirectLogin.revertChanges", [ +// MochiKit.Base.method(this.record(), 'setValue', 'directLogins' + '.' + this.reference(), this.originalState()), + MochiKit.Base.method(this, 'setValue', '', this.originalState()), + MochiKit.Base.method(this, 'resetObjectDataStore') + ], {trace:false}) + } else { + deferredResult = MochiKit.Async.succeed(); + } +*/ + return deferredResult; + }, + + + //========================================================================= + + 'transientState': function () { + if (this._transientState == null) { + this._transientState = {} + } + + return this._transientState; + }, + + 'resetTransientState': function (isCommitting) { + this._transientState = null; + }, + + 'commitTransientState': function (isCommitting) { + this._transientState = null; + this._isBrandNew = false; + }, + + //------------------------------------------------------------------------- + + 'originalConfiguration': function () { + return this.transientState()['original_configuration']; + }, + + 'setOriginalConfiguration': function (aConfiguration) { + this.transientState()['original_configuration'] = Clipperz.Base.deepClone(aConfiguration); + }, + + //========================================================================= + + 'actualKey': function (aValueKey) { + var actualKey; + + actualKey = 'directLogins' + '.' + this.reference(); + if (aValueKey != '') { + actualKey = actualKey + '.' + aValueKey; + } + + return actualKey; + }, + + //------------------------------------------------------------------------- + + 'getValue': function (aValueKey) { + return this.record().getValue(this.actualKey(aValueKey)); + }, + + 'setValue': function (aValueKey, aValue) { +// return this.record().setValue(this.actualKey(aValueKey), aValue); + + return Clipperz.Async.callbacks("DirectLogin.setValue", [ + MochiKit.Base.method(this, 'getValue', ''), + MochiKit.Base.bind(function (aValue) { + if (this.originalConfiguration() == null) { + this.setOriginalConfiguration(aValue); + } + }, this), +// MochiKit.Base.method(this, 'originalConfiguration'), +// Clipperz.Async.deferredIf("originalConfiguration has been set", [ +// ], [ +// MochiKit.Base.method(this, 'getValue', ''), +// MochiKit.Base.method(this, 'setOriginalConfiguration') +// ]), + MochiKit.Base.method(this.record(), 'setValue', this.actualKey(aValueKey), aValue) + ], {trace:false}); + }, + + 'removeValue': function (aValueKey) { +// return this.record().removeValue(this.actualKey(aValueKey)); + + return Clipperz.Async.callbacks("DirectLogin.setValue", [ + MochiKit.Base.method(this, 'originalConfiguration'), + Clipperz.Async.deferredIf("originalConfiguration has been set", [ + ], [ + MochiKit.Base.method(this, 'getValue', ''), + MochiKit.Base.method(this, 'setOriginalConfiguration') + ]), + MochiKit.Base.method(this.record(), 'removeValue', this.actualKey(aValueKey)) + ], {trace:false}); + }, + + //========================================================================= + + 'content': function () { +// return this.serializedData(); +// return MochiKit.Async.succeed(this); + + var deferredResult; + var fieldValues; + + fieldValues = {}; + deferredResult = new Clipperz.Async.Deferred("DirectLogin.content", {trace:false}); + deferredResult.addMethod(this, 'reference'); + deferredResult.addCallback(function (aValue) { fieldValues['reference'] = aValue; }); + deferredResult.addMethod(this, 'label'); + deferredResult.addCallback(function (aValue) { fieldValues['label'] = aValue; }); + deferredResult.addMethod(this, 'favicon'); + deferredResult.addCallback(function (aValue) { fieldValues['favicon'] = aValue; }); + deferredResult.addCallback(function () { return fieldValues; }); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'deleteAllCleanTextData': function () { + this._inputs = null; + this._bindings = null; + this._formValues = null; + + this.resetTransientState(); + }, + + //------------------------------------------------------------------------- + + 'hasAnyCleanTextData': function () { + var result; + + result = false; + + result = result || (this._inputs != null); + result = result || (this._bindings != null); + result = result || (this._formValues != null); + result = result || (MochiKit.Base.keys(this.transientState()).length != 0); + + return MochiKit.Async.succeed(result); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.PM.DataModel.DirectLogin.exception = { + 'WrongBookmarkletConfiguration': new MochiKit.Base.NamedError("Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration") +}; + +Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration = function(aConfiguration) { + var configuration; + + try { + configuration = Clipperz.Base.evalJSON(aConfiguration); +// configuration = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(configuration); + + if (MochiKit.Base.isUndefinedOrNull(configuration['page']['title']) + || MochiKit.Base.isUndefinedOrNull(configuration['form']['attributes']['action']) +// || MochiKit.Base.isUndefinedOrNull(configuration['form']['attributes']['method']) + || MochiKit.Base.isUndefinedOrNull(configuration['form']['inputs']) + || MochiKit.Base.isUndefinedOrNull(configuration['version']) + ) { + throw Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration; + } + +// if (MochiKit.Base.isUndefinedOrNull(configuration['favicon'])) { +// throw Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration; +// } + + } catch (exception) { + throw exception; + } + + return configuration; +}; diff --git a/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginBinding.js b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginBinding.js new file mode 100644 index 0000000..a8ebb97 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginBinding.js @@ -0,0 +1,120 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } + + +//############################################################################# + +Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, args) { + args = args || {}; + + this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter'); + + this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter'); + this._fieldKey = args.field || /* this.directLogin().fieldWithName(args.fieldName).reference() || */ null; + + return this; +} + +Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "DirectLoginBinding (" + this.key() + ", " + this.fieldKey() + ")"; + }, + + //------------------------------------------------------------------------- + + 'directLogin': function () { + return this._directLogin; + }, + + //------------------------------------------------------------------------- + + 'key': function() { + return this._key; + }, + + //------------------------------------------------------------------------- + + 'fieldKey': function() { + return this._fieldKey; + }, + + 'setFieldKey': function(aValue) { + this._fieldKey = aValue; + + return this.directLogin().setValue('bindingData' + '.' + this.key(), aValue); + }, + +// 'fieldName': function() { +// return this._fieldName; +// }, + + //------------------------------------------------------------------------- + + 'field': function() { + var deferredResult; + + if (this.fieldKey() != null) { + deferredResult = Clipperz.Async.callbacks("DirectLoginBinding.field [1]", [ + MochiKit.Base.method(this.directLogin().record(), 'fields'), + MochiKit.Base.itemgetter(this.fieldKey()) + ], {trace:false}); +// } else if (this.fieldName() != null) { +// WTF = TODO; +// result = this.directLogin().record().fieldWithName(this.fieldName()); +// +// this.setFieldKey(result.key()); + } else { + deferredResult = MochiKit.Async.succeed(null); + } + + return deferredResult; + }, + + 'setField': function (aField) { + this.setFieldKey(aField.reference()); + }, + + //------------------------------------------------------------------------- +/* + 'fieldValue': function () { + return Clipperz.Async.callbacks("DirectLoginBinding.fieldValue", [ + MochiKit.Base.method('field'), + MochiKit.Base.methodcaller('value') + ], {trace:false}); + }, +*/ + //------------------------------------------------------------------------- + + 'serializedData': function() { + return this.fieldKey(); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginFormValue.js b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginFormValue.js new file mode 100644 index 0000000..2429f88 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginFormValue.js @@ -0,0 +1,101 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } + + +//############################################################################# + +Clipperz.PM.DataModel.DirectLoginFormValue = function(aDirectLogin, args) { + args = args || {}; + + this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter'); + + this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter'); + this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter'); + this._value = args.value || null; + + return this; +} + +Clipperz.PM.DataModel.DirectLoginFormValue.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "DirectLoginFormValue (" + this.key() + ", " + this.value() + ")"; + }, + + //------------------------------------------------------------------------- + + 'directLogin': function () { + return this._directLogin; + }, + + //------------------------------------------------------------------------- + + 'key': function() { + return this._key; + }, + + //------------------------------------------------------------------------- + + 'fieldOptions': function() { + return this._fieldOptions; + }, + + //------------------------------------------------------------------------- + + 'type': function () { + return this.fieldOptions()['type']; + }, + + //------------------------------------------------------------------------- + + 'value': function() { + var result; + + result = this._value; + +// if ((result == null) && (this.type() == 'checkbox')) { +// result = false; +// }; + + return result; + }, + + 'setValue': function (aValue) { + this._value = aValue; + return this.directLogin().setValue('formValues' + '.' + this.key(), aValue); + }, + + //------------------------------------------------------------------------- +/* + 'serializedData': function() { + return this.value(); + }, +*/ + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginInput.js b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginInput.js new file mode 100644 index 0000000..d9995fc --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginInput.js @@ -0,0 +1,192 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } + +//############################################################################# + +Clipperz.PM.DataModel.DirectLoginInput = function(args) { + this._args = args; + + return this; +} + +Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, { + + 'args': function() { + return this._args; + }, + + //------------------------------------------------------------------------- + + 'name': function() { + return this.args()['name']; + }, + + //------------------------------------------------------------------------- + + 'type': function() { + var result; + + result = this.args()['type']; + + if (result != null) { + result = result.toLowerCase(); + } + return result; + }, + + //------------------------------------------------------------------------- + + 'options': function() { + return this.args()['options']; + }, + + //------------------------------------------------------------------------- + + 'value': function() { + return this.args()['value']; + }, + + //------------------------------------------------------------------------- +/* + 'formConfiguration': function(someFormValues, someBindings, someFields) { + var result; + + if (this.shouldSetValue()) { + switch (this.type()) { + case 'select': + var currentValue; + var options; + +// currentValue = this.directLogin()._configuration['formValues'][this.name()]; + currentValue = someFormValues[this.name()]; + options = this.args()['options']; + + result = MochiKit.DOM.SELECT({name:this.name()}, + MochiKit.Base.map(function(anOption) { + var options; + + options = {value:anOption['value']}; + if (currentValue == anOption['value']) { + options.selected = true; + } + + return MochiKit.DOM.OPTION(options, anOption['label']) + }, options) + ) + break; + case 'checkbox': + var options; + + options = {type:'checkbox', name: this.name()}; +// if (this.directLogin()._configuration['formValues'][this.name()] == true) { + if (someFormValues[this.name()] == true) { + options['checked'] = true; + }; + + result = MochiKit.DOM.INPUT(options, null); + break; + case 'radio': + var currentName; + var currentValue; + var options; + + currentName = this.name(); +// currentValue = this.directLogin()._configuration['formValues'][this.name()]; + currentValue = someFormValues[this.name()]; + options = this.args()['options']; + + result = MochiKit.DOM.DIV(null, + MochiKit.Base.map(function(anOption) { + var options; + var isChecked; + var inputNode; + var divNode; + + options = {type:'radio', name:currentName, value:anOption['value']} + isChecked = (currentValue == anOption['value']); + if (isChecked) { + options.checked = true; + } + + if (Clipperz_IEisBroken == true) { + var checkedValue; + + checkedValue = (isChecked ? " CHECKED" : ""); + inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">"); + } else { + inputNode = MochiKit.DOM.INPUT(options, anOption['value']); + } + divNode = MochiKit.DOM.DIV(null, inputNode); + + return divNode; + }, options) + ); + break; + } + } else { + var binding; +// binding = this.directLogin().bindings()[this.name()]; + binding = someBindings[this.name()]; + + result = MochiKit.DOM.INPUT({ + type:((this.type() != 'password') ? this.type() : 'text'), + name:this.name(), +// value:((binding != null)? binding.field().value() : this.value()) + value:((binding != null)? someFields[binding.fieldKey()]['value'] : this.value()) +// value:((binding != null)? someFields[binding.fieldKey()].value() : this.value()) + }, null); + } + + return result; + }, +*/ + //------------------------------------------------------------------------- + + 'needsFormValue': function() { + var type; + var result; + + type = this.type(); + result = ((type == 'checkbox') || (type == 'radio') || (type == 'select')); + + return result; + }, + + 'needsBinding': function() { + var type; + var result; + + type = this.type(); + result = ((type == 'text') || (type == 'password')); + + return result; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js b/frontend/delta/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js new file mode 100644 index 0000000..1aa7a52 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js @@ -0,0 +1,542 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!"; +} + +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } + +Clipperz.PM.DataModel.EncryptedRemoteObject = function(args) { + args = args || {}; + + this._name = args.name || null; + this._reference = args.reference || Clipperz.PM.Crypto.randomKey(); + this._isBrandNew = ((args.reference == null) && (args.remoteData == null)); + + if ((this._isBrandNew == false) && (args['retrieveKeyFunction'] == null)) { + Clipperz.Base.exception.raise('MandatoryParameter'); + } else { + this._retrieveKeyFunction = args['retrieveKeyFunction']; + } + + this._retrieveRemoteDataFunction = args.retrieveRemoteDataFunction || null; + this._remoteData = args.remoteData || null; +// this._remoteData = args.remoteData ? Clipperz.Base.deepClone(args.remoteData) : null; + if ((!this._isBrandNew) && ((this._retrieveRemoteDataFunction == null) && (this._remoteData == null))) { + Clipperz.Base.exception.raise('MandatoryParameter'); + } + + + this._encryptedDataKeypath = args.encryptedDataKeypath || 'data'; //Clipperz.Base.exception.raise('MandatoryParameter'); + this._encryptedVersionKeypath = args.encryptedVersionKeypath || 'version'; //Clipperz.Base.exception.raise('MandatoryParameter'); + + + this._transientState = null; + this._deferredLocks = {}; + + if (this._isBrandNew == true) { + this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [1]'}*/); + } else { + this._objectDataStore = null; + } + + return this; +} + +// +// Basic data workflow +// ======================= +// +// getRemoteData +// unpackRemoteData +// getDecryptData [encryptedDataKeypath, encryptedVersionKeypath] +// unpackData +// +// +// ?? packData +// ?? encryptDataWithKey +// ?? packRemoteData [encryptedDataKeypath (?), encryptedVersionKeypath (?)] +// + +Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(null, { + + 'toString': function () { + return "Clipperz.PM.DataModel.EncryptedRemoteObject" + (this.name() != null ? " - " + this.name() : ""); + }, + + //------------------------------------------------------------------------- + + 'name': function () { + return this._name; + }, + + //------------------------------------------------------------------------- + + 'reference': function () { + return this._reference; + }, + + 'setReference': function (aValue) { + this._reference = aValue; + + return this._reference; + }, + + //------------------------------------------------------------------------- + + 'transientState': function () { + if (this._transientState == null) { + this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.transientState [2]'}*/); + } + + return this._transientState; + }, + + 'resetTransientState': function (isCommitting) { + if (this._transientState != null) { + this._transientState.removeAllData(); + } + + this._transientState = null; + }, + + //------------------------------------------------------------------------- + + 'isBrandNew': function () { + return this._isBrandNew; + }, + + //------------------------------------------------------------------------- + + 'getKey': function () { + var deferredResult; + var deferredLock; + + deferredLock = this.getDeferredLockForKey('key'); + + deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getKey", {trace:false}); + deferredResult.acquireLock(deferredLock); + deferredResult.addMethod( + this.decryptedDataStore(), + 'deferredGetOrSet', + 'decryptionKey', + MochiKit.Base.partial(this.retrieveKeyFunction(), this.reference()) + ); + deferredResult.releaseLock(deferredLock); + deferredResult.callback(); + + return deferredResult; + }, + + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + 'retrieveKeyFunction': function () { + return this._retrieveKeyFunction; + }, + + 'setRetrieveKeyFunction': function (aFunction) { + this._retrieveKeyFunction = aFunction; + }, + + //------------------------------------------------------------------------- + + 'hasLoadedRemoteData': function () { + return (this._remoteData != null); + }, + + 'getRemoteData': function () { + var deferredResult; + var deferredLock; + + deferredLock = this.getDeferredLockForKey('remoteData'); + + deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObjects.getRemoteData", {trace:false}); + deferredResult.acquireLock(deferredLock); + deferredResult.addCallback(MochiKit.Base.bind(function () { + var innerDeferredResult; + + if (this._remoteData != null) { + innerDeferredResult = MochiKit.Async.succeed(this._remoteData); + } else { + innerDeferredResult = Clipperz.Async.callbacks("EncryptedRemoteObjects.getRemoteData <inner deferred>", [ + MochiKit.Base.partial(this.retrieveRemoteDataFunction(), this.reference()), + MochiKit.Base.method(this, 'unpackRemoteData'), + MochiKit.Base.bind(function (someData) { + this._remoteData = someData; + return this._remoteData; + }, this) + ], {trace:false}); + } + + return innerDeferredResult; + }, this)) + deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + deferredResult.releaseLock(deferredLock); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'unpackRemoteData': function (someData) { + return MochiKit.Async.succeed(someData); + }, + + //......................................................................... + + 'packRemoteData': function (someData) { + var result; + + result = { + 'reference': this.reference(), + 'data': someData, + 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion + }; + + return MochiKit.Async.succeed(result); + }, + + //------------------------------------------------------------------------- + + 'retrieveRemoteDataFunction': function () { + return this._retrieveRemoteDataFunction; + }, + + 'setRetrieveRemoteDataFunction': function (aFunction) { + this._retrieveRemoteDataFunction = aFunction; + }, + + //------------------------------------------------------------------------- + + 'decryptedDataStore': function () { + if (this._decryptedDataStore == null) { + this._decryptedDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.decryptedDataStore [3]'}*/); + }; + + return this._decryptedDataStore; + }, + + //......................................................................... + + 'getDecryptedData': function () { + var deferredResult; + var deferredLock; + + deferredLock = this.getDeferredLockForKey('decryptedData'); + + deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData", {trace:false}); + deferredResult.acquireLock(deferredLock); + deferredResult.addMethod(this, 'decryptedDataStore'); + deferredResult.addCallback(MochiKit.Base.methodcaller('deferredGetOrSet', 'decryptedData', MochiKit.Base.bind(function () { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData <inner deferred>", {trace:false}); + + innerDeferredResult.addMethod(this, 'getRemoteData'); + innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + innerDeferredResult.collectResults({ + 'key': MochiKit.Base.method(this, 'getKey'), + 'value': MochiKit.Base.itemgetter(this._encryptedDataKeypath), + 'version': MochiKit.Base.itemgetter(this._encryptedVersionKeypath) + }); + + innerDeferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt); + innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + innerDeferredResult.addMethod(this, 'unpackData'); + innerDeferredResult.callback(); + + return innerDeferredResult; + }, this))); + deferredResult.releaseLock(deferredLock); + deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setValue': function(aKey, aValue) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.setValue", {trace:false}); + deferredResult.addMethod(this, '_getObjectDataStore'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', aKey, aValue)); + deferredResult.callback(); + + return deferredResult; + }, + + //......................................................................... + + 'getValue': function (aKey) { + return Clipperz.Async.callbacks("EncryptedRemoteObject.getValue", [ + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('getValue', aKey) + ], {trace:false}); + }, + + //......................................................................... + + 'removeValue': function (aKey) { + return Clipperz.Async.callbacks("EncryptedRemoteObject.removeValue", [ + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('removeValue', aKey) + ], {trace:false}); + }, + + //......................................................................... + + 'values': function () { + return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [ + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('values') + ], {trace:false}); + }, + + 'setValues': function (someValues) { + return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [ + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('setValues', someValues) + ], {trace:false}); + }, + + //......................................................................... + + '_getObjectDataStore': function () { + var deferredResult; + var deferredLock; + + deferredLock = this.getDeferredLockForKey('objectDataStore'); + + deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore", {trace:false}); + deferredResult.acquireLock(deferredLock); + deferredResult.addCallback(MochiKit.Base.bind(function () { + var innerDeferredResult; + + if (this._objectDataStore == null) { + this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [4]'}*/); + + innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore <inner deferred>", {trace:false}); + innerDeferredResult.addMethod(this, 'getDecryptedData'); + innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues'); + innerDeferredResult.callback(); + } else { + innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore); + } + + return innerDeferredResult; + }, this)); + deferredResult.releaseLock(deferredLock); + deferredResult.callback(); + + return deferredResult; + }, + + 'hasInitiatedObjectDataStore': function () { + return (this._objectDataStore != null); + }, + + //------------------------------------------------------------------------- + + 'getDeferredLockForKey': function (aKey) { + var result; + + result = this._deferredLocks[aKey]; + + if (typeof(result) == 'undefined') { + result = new MochiKit.Async.DeferredLock(); + this._deferredLocks[aKey] = result; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'unpackData': function (someData) { // ++ + return someData; + }, + + 'packData': function (someData) { // ++ + return someData; + }, + + //------------------------------------------------------------------------- + + 'hasPendingChanges': function () { + var deferredResult; + var tempObj = this; + + if (this.isBrandNew()) { +// deferredResult = MochiKit.Async.succeed(true); + deferredResult = this.hasPendingChangesWhenBrandNew(); + } else if (this.hasInitiatedObjectDataStore()) { + deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.hasPendingChanges", {trace:false}); + deferredResult.collectResults({ + 'decryptedData': [ + MochiKit.Base.method(this, 'getDecryptedData'), + Clipperz.Base.serializeJSON + ], + 'objectData': [ + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('values'), + Clipperz.Base.serializeJSON + ] + }); + deferredResult.addCallback(function (someValues) { + return (someValues['decryptedData'] != someValues['objectData']); + }); + deferredResult.callback(); + } else { + deferredResult = MochiKit.Async.succeed(false); + } + + return deferredResult; + }, + + 'hasPendingChangesWhenBrandNew': function () { + return MochiKit.Async.succeed(true); + }, + + //------------------------------------------------------------------------- + + 'commitTransientState': function () { + var deferredResult; + +// if (this.transientState().getValue('__prepareRemoteData') == true) { + if (this.transientState().getValue('packedRemoteData') != null) { + deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - prepareRemoteData", [ + MochiKit.Base.bind(function (someData) { + this._remoteData = this.transientState().getValue('packedRemoteData'); + }, this), + + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('values'), + Clipperz.Base.deepClone, + MochiKit.Base.method(this.decryptedDataStore(), 'setValue', 'decryptedData'), + + MochiKit.Base.method(this, 'resetTransientState', true) + ], {trace:false}); + + } else { + deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - NO prepareRemoteData", [ + MochiKit.Base.method(this, 'resetTransientState', true) + ], {trace:false}); + } + + this._isBrandNew = false; + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'revertChanges': function () { + if (this.hasInitiatedObjectDataStore()) { + this._objectDataStore.removeAllData(); + this._objectDataStore = null; + } + this.resetTransientState(false); + + return MochiKit.Async.succeed(); + }, + + //------------------------------------------------------------------------- + + 'deleteAllCleanTextData': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.deleteAllCleanTextData", {trace:false}); + + deferredResult.addMethod(this, 'resetTransientState', false); + + deferredResult.acquireLock(this.getDeferredLockForKey('decryptedData')); + deferredResult.addCallback(MochiKit.Base.bind(function () { + if (this._decryptedDataStore != null) { + this._decryptedDataStore.removeAllData(); + } + }, this)); + deferredResult.releaseLock(this.getDeferredLockForKey('decryptedData')); + + deferredResult.acquireLock(this.getDeferredLockForKey('objectDataStore')); + deferredResult.addCallback(MochiKit.Base.bind(function () { + if (this._objectDataStore != null) { + this._objectDataStore.removeAllData(); + this._objectDataStore = null; + } + }, this)); + deferredResult.releaseLock(this.getDeferredLockForKey('objectDataStore')); + + deferredResult.callback(); + + return deferredResult; + }, + + //......................................................................... + + 'hasAnyCleanTextData': function () { + var result; + + result = false; + + result = result || (! this.decryptedDataStore().isEmpty()); + result = result || (! this.transientState().isEmpty()); + if (this.hasInitiatedObjectDataStore()) { + result = result || (! this._objectDataStore.isEmpty()); + } + + return MochiKit.Async.succeed(result); + }, + + //------------------------------------------------------------------------- + + 'prepareRemoteDataWithKey': function (aKey) { + return Clipperz.Async.callbacks("EncryptedRemoteObject.prepareRemoteDataWithKey", [ +// MochiKit.Base.method(this.transientState(), 'setValue', '__prepareRemoteData', true), + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('values'), + MochiKit.Base.method(this, 'packData'), + function (someData) { + return Clipperz.PM.Crypto.deferredEncrypt({ + 'key': aKey, + 'value': someData, + 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion + }) + }, + MochiKit.Base.method(this, 'packRemoteData'), + MochiKit.Base.method(this.transientState(), 'setValue', 'packedRemoteData'), + function (someData) { + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'advanceProgress'); + return someData; + } + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); diff --git a/frontend/delta/js/Clipperz/PM/DataModel/OneTimePassword.js b/frontend/delta/js/Clipperz/PM/DataModel/OneTimePassword.js new file mode 100644 index 0000000..fbca1ff --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/OneTimePassword.js @@ -0,0 +1,350 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } + + +//############################################################################# + +Clipperz.PM.DataModel.OneTimePassword = function(args) { + args = args || {}; + +// this._user = args['user']; + this._reference = args['reference'] || Clipperz.PM.Crypto.randomKey(); + this._password = args['password']; + this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']); + this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date(); + this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null; + + this._status = args['status'] || 'ACTIVE'; // 'REQUESTED', 'USED', 'DISABLED' + this._connectionInfo= null; + + this._key = null; + this._keyChecksum = null; + + return this; +} + +Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "Clipperz.PM.DataModel.OneTimePassword"; + }, +/* + //------------------------------------------------------------------------- + + 'user': function() { + return this._user; + }, + + //------------------------------------------------------------------------- + + 'password': function() { + return this._password; + }, + + //------------------------------------------------------------------------- + + 'passwordValue': function() { + return this._passwordValue; + }, + + //------------------------------------------------------------------------- + + 'creationDate': function() { + return this._creationDate; + }, + + //------------------------------------------------------------------------- + + 'reference': function() { + return this._reference; + }, + + //------------------------------------------------------------------------- + + 'key': function() { + if (this._key == null) { + this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue()); + } + + return this._key; + }, + + //------------------------------------------------------------------------- + + 'keyChecksum': function() { + if (this._keyChecksum == null) { + this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue()); + } + + return this._keyChecksum; + }, +*/ + //------------------------------------------------------------------------- + + 'status': function() { + return this._status; + }, + + 'setStatus': function(aValue) { + this._status = aValue; + }, + + //------------------------------------------------------------------------- +/* + 'serializedData': function() { + var result; + + result = { + 'password': this.password(), + 'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null, + 'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null, + 'status': this.status() + }; + + return result; + }, + + //------------------------------------------------------------------------- + + 'packedPassphrase': function() { + var result; + var packedPassphrase; + var encodedPassphrase; + var prefixPadding; + var suffixPadding; + var getRandomBytes; + + getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes'); + + encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String(); +//Clipperz.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length); + prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String(); +//Clipperz.logDebug("--- prefixPadding.length: " + prefixPadding.length); + suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String(); +//Clipperz.logDebug("--- suffixPadding.length: " + suffixPadding.length); +//Clipperz.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length)); + + packedPassphrase = { + 'prefix': prefixPadding, + 'passphrase': encodedPassphrase, + 'suffix': suffixPadding + }; + +// result = Clipperz.Base.serializeJSON(packedPassphrase); + result = packedPassphrase; +//Clipperz.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result); +//Clipperz.logDebug("<<< OneTimePassword.packedPassphrase"); + + return result; + }, + + //------------------------------------------------------------------------- + + 'encryptedPackedPassphrase': function() { + return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase()) + }, + + //------------------------------------------------------------------------- + + 'encryptedData': function() { + var deferredResult; + var result; + +//Clipperz.logDebug(">>> OneTimePassword.encryptedData"); +//Clipperz.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference()); + result = { + 'reference': this.reference(), + 'key': this.key(), + 'keyChecksum': this.keyChecksum(), + 'data': "", + 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion + } +//Clipperz.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result)); + deferredResult = new MochiKit.Async.Deferred(); +//Clipperz.logDebug("--- OneTimePassword.encryptedData - 3"); +//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;}); +//# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase()); + deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase')); +//Clipperz.logDebug("--- OneTimePassword.encryptedData - 4"); +//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;}); + deferredResult.addCallback(function(aResult, res) { + aResult['data'] = res; + return aResult; + }, result); +//Clipperz.logDebug("--- OneTimePassword.encryptedData - 5"); +//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;}); + deferredResult.callback(); +//Clipperz.logDebug("--- OneTimePassword.encryptedData - 6"); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'saveChanges': function() { + var deferredResult; + var result; + +//Clipperz.logDebug(">>> OneTimePassword.saveChanges"); + result = {}; + deferredResult = new MochiKit.Async.Deferred(); + + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData'); + deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData')); + deferredResult.addCallback(function(aResult, res) { + aResult['user'] = res; + return aResult; + }, result); + + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData'); + deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData')); + deferredResult.addCallback(function(aResult, res) { + aResult['oneTimePassword'] = res; + return aResult; + }, result); + + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData'); +//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;}); + deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword'); + + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface'); +//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;}); + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated'); + deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null); +//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;}); + deferredResult.callback(); +//Clipperz.logDebug("<<< OneTimePassword.saveChanges"); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'usageDate': function() { + return this._usageDate; + }, + + 'setUsageDate': function(aValue) { + this._usageDate = aValue; + }, + + //------------------------------------------------------------------------- + + 'connectionInfo': function() { + return this._connectionInfo; + }, + + 'setConnectionInfo': function(aValue) { + this._connectionInfo = aValue; + }, + + //------------------------------------------------------------------------- + + 'isExpired': function() { + return (this.usageDate() != null); + }, + + //------------------------------------------------------------------------- + + 'updateStatusWithValues': function(someValues) { + var result; + + result = false; + + if (someValues['status'] != this.status()) { + result = true; + } + + this.setStatus(someValues['status']); + this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate'])); + this.setConnectionInfo(someValues['connection']); + + return result; + }, +*/ + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + +//############################################################################# + +Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) { + return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2); +} + +Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) { + return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2); +} + +//============================================================================= + +Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue = function(aPassword) { + var result; + +// "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg" + if (aPassword.replace(/[\s\-]/g, '').length == 32) { + try { + var passwordByteArray; + + passwordByteArray = new Clipperz.ByteArray(); + passwordByteArray.appendBase32String(aPassword); + + result = true; + } catch(exception) { + result = false; + } + } else { + result = false; + } + + return result; +} + +//============================================================================= + +Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) { + var result; + + if (aPassword.replace(/[\s\-]/g, '').length == 32) { + try { + var passwordByteArray; + + passwordByteArray = new Clipperz.ByteArray(); + passwordByteArray.appendBase32String(aPassword); + + result = passwordByteArray.toBase64String(); + } catch(exception) { + result = aPassword; + } + } else { + result = aPassword; + } + + return result; +} + +//############################################################################# diff --git a/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.Field.js b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.Field.js new file mode 100644 index 0000000..01e7196 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.Field.js @@ -0,0 +1,186 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.DataModel.Record.Version) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.DataModel.Record.Version.Field depends on Clipperz.PM.DataModel.Record.Version!"; +} + +Clipperz.PM.DataModel.Record.Version.Field = function(args) { + Clipperz.PM.DataModel.Record.Version.Field.superclass.constructor.apply(this, arguments); + + this._recordVersion = args.recordVersion || Clipperz.Base.exception.raise('MandatoryParameter'); + this._reference = args.reference || Clipperz.PM.Crypto.randomKey(); + + return this; +} + + +Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version.Field, Object, { + + 'toString': function() { + return "Record.Version.Field (" + this.reference() + ")"; + }, + + //------------------------------------------------------------------------- + + 'recordVersion': function () { + return this._recordVersion; + }, + + //------------------------------------------------------------------------- + + 'reference': function () { + return this._reference; + }, + + //------------------------------------------------------------------------- + + 'getItem': function (aKey) { + return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [ + MochiKit.Base.method(this, 'recordVersion'), + MochiKit.Base.methodcaller('getValue', 'fields' + '.' + this.reference() + '.' + aKey) + ], {trace:false}); + }, + + 'setItem': function (aKey, aValue) { + return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [ + MochiKit.Base.method(this, 'recordVersion'), + MochiKit.Base.methodcaller('setValue', 'fields' + '.' + this.reference() + '.' + aKey, aValue) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'label': function () { + return this.getItem('label'); + }, + + 'setLabel': function (aValue) { + return this.setItem('label', aValue); + }, + + //------------------------------------------------------------------------- + + 'value': function () { + return this.getItem('value'); + }, + + 'setValue': function (aValue) { + return this.setItem('value', aValue); + }, + + //------------------------------------------------------------------------- + + 'actionType': function () { + return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.actionType", [ + Clipperz.Async.collectResults("Clipperz.PM.DataModel.Record.Version.Field.actionType [collect results]", { + 'isHidden': MochiKit.Base.method(this, 'isHidden'), + 'value': MochiKit.Base.method(this, 'value') + }, {trace:false}), + function (someValues) { + var result; // 'NONE', 'URL', 'EMAIL', 'PASSWORD' + + result = 'NONE'; + + if (someValues['isHidden']) { + result = 'PASSWORD'; + } else if (Clipperz.Base.isUrl(someValues['value'])) { + result = 'URL' + } else if (Clipperz.Base.isEmail(someValues['value'])) { + result = 'EMAIL' + }; + + return result; + } + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'isHidden': function () { + return this.getItem('hidden'); + }, + + 'setIsHidden': function (aValue) { + return this.setItem('hidden', aValue); + }, + + //------------------------------------------------------------------------- + + 'isEmpty': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.Field.isEmpty", {trace:false}); + + deferredResult.collectResults({ + 'label': [ + MochiKit.Base.method(this, 'label'), + MochiKit.Base.partial(MochiKit.Base.operator.eq, '') + ], + 'value': [ + MochiKit.Base.method(this, 'value'), + MochiKit.Base.partial(MochiKit.Base.operator.eq, '') + ], + 'isHidden': [ + MochiKit.Base.method(this, 'isHidden'), + MochiKit.Base.partial(MochiKit.Base.operator.eq, false) + ] + }); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(function(someValues) { + return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'content': function () { + var deferredResult; + var fieldValues; + + fieldValues = {}; + deferredResult = new Clipperz.Async.Deferred("Record.Version.Field.content", {trace:false}); + deferredResult.addMethod(this, 'reference'); + deferredResult.addCallback(function (aValue) { fieldValues['reference'] = aValue; }); + deferredResult.addMethod(this, 'label'); + deferredResult.addCallback(function (aValue) { fieldValues['label'] = aValue; }); + deferredResult.addMethod(this, 'value'); + deferredResult.addCallback(function (aValue) { fieldValues['value'] = aValue; }); + deferredResult.addMethod(this, 'actionType'); + deferredResult.addCallback(function (aValue) { fieldValues['actionType'] = aValue; }); + deferredResult.addMethod(this, 'isHidden'); + deferredResult.addCallback(function (aValue) { fieldValues['isHidden'] = aValue; }); + deferredResult.addCallback(function () { return fieldValues; }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js new file mode 100644 index 0000000..87b319c --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js @@ -0,0 +1,328 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!"; +} + +Clipperz.PM.DataModel.Record.Version = function(args) { + Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments); + + this._getVersionFunction = args.getVersion || Clipperz.Base.exception.raise('MandatoryParameter'); + this._fields = null; + + return this; +} + + +Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, { + + 'toString': function() { + return "Record.Version (" + this.reference() + ")"; + }, + + //------------------------------------------------------------------------- + + 'reference': function () { + return this._reference; + }, + + //------------------------------------------------------------------------- +/* + 'hasPendingChanges': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false}); + deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this)); + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + + + 'hasPendingChangesWhenBrandNew': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false}); + deferredResult.addMethod(this, 'fields'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty')) + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(function(someValues) { + return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity); + }); + deferredResult.addCallback(MochiKit.Base.operator.lognot) + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'commitTransientState': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false}); + deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this)); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'unpackData': function (someData) { // ++ + var result; + + result = someData; + if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) { + var fields; + var i,c; + + fields = someData['fields']; + delete someData['fields']; + + someData['fields'] = {}; + c = fields.length; + for (i=0; i<c; i++) { + someData['fields'][i] = fields[i]; + } + } + + + + return result; + }, + + //========================================================================= + + 'fields': function () { + var deferredResult; + var deferredLock; + + deferredLock = this.getDeferredLockForKey('fields'); + + deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false}); + deferredResult.acquireLock(deferredLock); + deferredResult.addCallback(MochiKit.Base.bind(function () { + var innerDeferredResult; + + if (this._fields == null) { + innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false}); + innerDeferredResult.addMethod(this, 'getValue', 'fields'); + innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) { + var reference; + + this._fields = {}; + + for (reference in someObjectData) { + var recordVersionField; + + recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({ + 'recordVersion': this, + 'reference': reference + }); + + this._fields[reference] = recordVersionField; + } + + return this._fields; + }, this)); + innerDeferredResult.callback(); + } else { + innerDeferredResult = MochiKit.Async.succeed(this._fields); + } + + return innerDeferredResult; + }, this)); + deferredResult.releaseLock(deferredLock); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getFieldsValues': function () { + return this.getValue('fields'); + }, + + //------------------------------------------------------------------------- + + 'addField': function (someParameters) { + var newField; + + newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this}); + + return Clipperz.Async.callbacks("Record.Version.addField", [ + MochiKit.Base.method(this, 'fields'), + + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('values'), + Clipperz.Base.serializeJSON, + + MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this), + MochiKit.Base.method(newField, 'setLabel', someParameters['label']), + MochiKit.Base.method(newField, 'setValue', someParameters['value']), + MochiKit.Base.method(newField, 'setIsHidden', someParameters['isHidden']), + + MochiKit.Base.method(this, '_getObjectDataStore'), + MochiKit.Base.methodcaller('values'), + Clipperz.Base.serializeJSON, + + MochiKit.Base.partial(MochiKit.Async.succeed, newField) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'removeField': function (aField) { + return Clipperz.Async.callbacks("Record.Version.removeField", [ + MochiKit.Base.method(this, 'fields'), + MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this), + MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference()) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- +/* + 'sortFieldReference': function (someSortedFieldReferences) { + + + + }, +*/ + //========================================================================= +/* + 'directLogins': function () { + return MochiKit.Base.values(this._directLogins); + }, + + 'addDirectLogin': function (aDirectLogin) { + this._directLogins[aDirectLogin.reference()] = aDirectLogin; + }, +*/ + + //========================================================================= +/* + 'updateValues': function (anotherVersion) { + return Clipperz.Async.callbacks("Record.Version.updateValue", [ + MochiKit.Base.partial(MochiKit.Async.succeed, this) + ], {trace:false}); + }, +*/ + //========================================================================= + + 'setRemoteData': function (aValue) { + this._remoteData = aValue; + + return aValue; + }, + + //========================================================================= + + 'getVersionFunction': function () { + return this._getVersionFunction; + }, + + 'previousVersion': function () { + return Clipperz.Async.callbacks("Record.Versions.previousVersion", [ + MochiKit.Base.method(this, 'previousVersionReference'), + this.getVersionFunction() + ], {trace:false}); + }, + + 'previousVersionReference': function () { + return this.getValue('previousVersionReference'); + }, + + 'previousVersionKey': function () { +// TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!! + return this.getValue('previousVersionKey'); + }, + + //------------------------------------------------------------------------- + + 'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) { +// this._previousVersion = anotherVersion; + return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [ + MochiKit.Base.method(this, 'setValue', 'previousVersionReference', aVersionObjectAndKey['reference']), + MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key']) + ], {trace:false}); + }, + + //========================================================================= + + 'revertChanges': function () { + this.setReference(this.transientState()['originalReference']); + Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments); + }, + + //------------------------------------------------------------------------- + + 'prepareRemoteDataWithKey': function (aKey) { + var deferredResult; + var result; + + result = {}; + + deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false}); + if (this.isBrandNew() == false) { + this.transientState()['originalReference'] = this.reference(); + + deferredResult.collectResults({ + 'key': MochiKit.Base.partial(MochiKit.Async.succeed, aKey), + 'value': MochiKit.Base.method(this, 'getKey'), + 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion) + }); + deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey'); + } else { + deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue); + } + deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey)); + deferredResult.addCallback(MochiKit.Base.update, result); + deferredResult.addMethod(this, 'setRemoteData'); + + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= +/* + 'deleteAllCleanTextData': function () { + return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments); + }, + + 'hasAnyCleanTextData': function () { + return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments); + }, +*/ + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/Record.js b/frontend/delta/js/Clipperz/PM/DataModel/Record.js new file mode 100644 index 0000000..379872a --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/Record.js @@ -0,0 +1,891 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } + + +Clipperz.PM.DataModel.Record = function(args) { + Clipperz.PM.DataModel.Record.superclass.constructor.apply(this, arguments); + + this._updateDate = (args.updateDate ? Clipperz.PM.Date.parse(args.updateDate) : Clipperz.Base.exception.raise('MandatoryParameter')); + + this._retrieveIndexDataFunction = args.retrieveIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter'); + this._updateIndexDataFunction = args.updateIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter'); + + this._retrieveDirectLoginIndexDataFunction = args.retrieveDirectLoginIndexDataFunction || null; + this._setDirectLoginIndexDataFunction = args.setDirectLoginIndexDataFunction || null; + this._removeDirectLoginIndexDataFunction = args.removeDirectLoginIndexDataFunction || null; + + this._createNewDirectLoginFunction = args.createNewDirectLoginFunction || null; + + this._directLogins = {}; + + this._versions = {}; + + this._currentRecordVersion = null; + if (this.isBrandNew()) { + var newVersion; + + this.setNotes(''); + newVersion = new Clipperz.PM.DataModel.Record.Version({ + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getVersionKey'), + 'getVersion': MochiKit.Base.method(this, 'getVersion') + + }); + this._versions[newVersion.reference()] = newVersion; + this._currentVersionReference = newVersion.reference(); +// this.setLabel(''); + } + + return this; +} + + +Clipperz.Base.extend(Clipperz.PM.DataModel.Record, Clipperz.PM.DataModel.EncryptedRemoteObject, { + + 'toString': function() { + return "Record (" + this.reference() + ")"; + }, + + //------------------------------------------------------------------------- + + 'reference': function () { + return this._reference; + }, + + //========================================================================= + + 'getIndexData': function () { + return this._retrieveIndexDataFunction(this.reference()); + }, + + //......................................................................... + + 'getIndexDataForKey': function (aKey) { + return Clipperz.Async.callbacks("Record.getIndexDataForKey", [ + MochiKit.Base.method(this, 'getIndexData'), + MochiKit.Base.itemgetter(aKey) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'setIndexDataForKey': function (aKey, aValue) { +// return this._updateIndexDataFunction(this.reference(), aKey, aValue); + + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Record.setIndexDataForKey", {trace:false}); + deferredResult.addMethod(this, 'getIndexDataForKey', aKey); + deferredResult.addCallback(MochiKit.Base.bind(function (aCurrentValue) { + var result; + var originalValue; + + originalValue = this.transientState().getValue('originalValues.indexData.' + aKey); + if (originalValue == null) { + originalValue = this.transientState().setValue('originalValues.indexData.' + aKey, aCurrentValue); + } + + if (aCurrentValue != aValue) { + if (originalValue != aValue) { + this.transientState().setValue('hasPendingChanges.indexData.' + aKey, true); + } else { + this.transientState().setValue('hasPendingChanges.indexData.' + aKey, false); + } + + result = this._updateIndexDataFunction(this.reference(), aKey, aValue); + } else { + result = MochiKit.Async.succeed(aValue); + } + + return result; + }, this)); + + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= +/* + 'key': function () { + return this.getIndexDataForKey('key'); + }, +*/ + //========================================================================= + + 'label': function () { + return this.getIndexDataForKey('label'); + }, + + //......................................................................... + + 'setLabel': function (aValue) { + return this.setIndexDataForKey('label', aValue); + }, + + //========================================================================= + + 'headerNotes': function () { + return this.getIndexDataForKey('notes'); + }, + + //------------------------------------------------------------------------- + + 'notes': function () { + return Clipperz.Async.callbacks("Record.notes", [ + MochiKit.Base.method(this, 'headerNotes'), + MochiKit.Base.bind(function (someHeaderNotes) { + var result; + + if ((someHeaderNotes == null) || (typeof(someHeaderNotes) == 'undefined')) { + result = this.getValue('notes'); + } else { + result = MochiKit.Async.succeed(someHeaderNotes); + } + + return result; + }, this) + ], {trace:false}); + }, + + //......................................................................... + + 'setNotes': function (aValue) { + return this.setValue('notes', aValue); + }, + + //========================================================================= + + 'updateDate': function () { + return MochiKit.Async.succeed(this._updateDate); + }, + + //========================================================================= + + 'favicon': function () { + var result; + var directLogins; + + directLogins = MochiKit.Base.values(this.directLogins()); + if (directLogins.length > 0) { + result = directLogins[0].favicon(); +// } else if (/* is there an URL to use for searching a favicon */){ + } else { + result = null; // MochiKit.Async.succeed(Clipperz.PM.Strings['defaultFaviconUrl']); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'searchableContent': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Record.searchableContent", {trace:false}); + + deferredResult.collectResults({ + 'recordLabel': MochiKit.Base.method(this, 'label'), + 'directLoginLabels': [ + MochiKit.Base.method(this, 'directLoginReferences'), + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.itemgetter('label')) + ] + }) + deferredResult.addCallback(function (someValues) { + return someValues['recordLabel'] + ' ' + someValues['directLoginLabels'].join(' '); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'isMatching': function (aRegExp) { + return Clipperz.Async.callbacks("deferredFilterFunction", [ + MochiKit.Base.method(this, 'searchableContent'), + MochiKit.Base.method(aRegExp, 'test'), + function (doesItMatch) { + var result; + + if (doesItMatch) { + result = MochiKit.Async.succeed('match'); + } else { + result = MochiKit.Async.fail('miss'); + } + + return result; + } + ], {trace:false}); + }, + + //========================================================================= + + 'content': function () { + var deferredResult; + var result; + + result = { + 'fields': [], + 'directLogins': [] + }; + + deferredResult = new Clipperz.Async.Deferred("Record.content", {trace:false}); + deferredResult.addMethod(this, 'reference'); + deferredResult.addCallback(function (aValue) { result['reference'] = aValue; }); + deferredResult.addMethod(this, 'label'); + deferredResult.addCallback(function (aValue) { result['title'] = aValue; }); + deferredResult.addMethod(this, 'notes'); + deferredResult.addCallback(function (aValue) { result['notes'] = aValue; }); + + deferredResult.addMethod(this, 'fields'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('content')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.map, function (aValue) { result['fields'].push(aValue); }); + + deferredResult.addMethod(this, 'directLogins'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('content')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.map, function (aValue) { result['directLogins'].push(aValue); }); + deferredResult.addCallback(function () { return result; }); + + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'directLogins': function () { + return this._directLogins; + }, + + 'addDirectLogin': function (aDirectLogin) { + this._directLogins[aDirectLogin.reference()] = aDirectLogin; + }, + + 'directLoginWithReference': function (aDirectLoginReference) { + return this._directLogins[aDirectLoginReference]; + }, + + 'createNewDirectLoginFunction': function () { + return this._createNewDirectLoginFunction; + }, + + 'saveOriginalDirectLoginStatusToTransientState': function () { + if (this.transientState().getValue('directLogins') == null) { +// this.transientState().setValue('directLogins', this._directLogins) + MochiKit.Iter.forEach(MochiKit.Base.keys(this._directLogins), MochiKit.Base.bind(function(aKey) { + this.transientState().setValue('directLogins' + '.' + aKey, this._directLogins[aKey]) + }, this)) + } + }, + + 'createNewDirectLogin': function () { + this.saveOriginalDirectLoginStatusToTransientState(); + + return this.createNewDirectLoginFunction()(this); + }, + + 'removeDirectLogin': function(aDirectLogin) { + this.saveOriginalDirectLoginStatusToTransientState(); + + return Clipperz.Async.callbacks("Record.removeDirectLogin", [ + MochiKit.Base.method(this, 'removeValue', 'directLogins' + '.' + aDirectLogin.reference()), + MochiKit.Base.bind(function () { + delete this._directLogins[aDirectLogin.reference()] + }, this) + ], {trace:false}); + + }, + + 'directLoginReferences': function () { + var result; + + result = Clipperz.Async.callbacks("Record.directLoginReferences", [ + MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.values, + function (someDirectLogins) { + var result; + var i,c; + + result = []; + c = someDirectLogins.length; + for (i=0; i<c; i++) { + result.push(Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", { + '_rowObject': MochiKit.Async.succeed, + '_reference': MochiKit.Base.methodcaller('reference'), + 'label': MochiKit.Base.methodcaller('label'), + 'favicon': MochiKit.Base.methodcaller('favicon') + }, {trace:false})(someDirectLogins[i])); + }; + + return result; + }, + Clipperz.Async.collectAll + ], {trace:false}); + + return result; + }, + + //========================================================================= + + 'unpackRemoteData': function (someData) { + var result; + +/* + this._currentRecordVersion = new Clipperz.PM.DataModel.Record.Version({ + 'reference': someData['currentVersion']['reference'], + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getCurrentRecordVersionKey'), + 'remoteData': someData['currentVersion'], + }); +*/ + var versionKey; + + for (versionKey in someData['versions']) { + this._versions[versionKey] = new Clipperz.PM.DataModel.Record.Version({ + 'reference': versionKey, + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getVersionKey'), + 'remoteData': someData['versions'][versionKey], + 'getVersion': MochiKit.Base.method(this, 'getVersion') + }) + } + +// this._currentVersionReference = someData['currentVersion']['reference']; + this._currentVersionReference = someData['currentVersion']; + + result = Clipperz.PM.DataModel.Record.superclass.unpackRemoteData.apply(this, arguments); + + return result; + }, + + //------------------------------------------------------------------------- + + 'unpackData': function (someData) { + var result; + + result = Clipperz.PM.DataModel.Record.superclass.unpackData.apply(this, arguments); + + if (MochiKit.Base.isUndefinedOrNull(result['notes'])) { + result['notes'] = '' + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'prepareRemoteDataWithKey': function (aKey) { + var deferredResult; + var newVersionKey; + var result; + + newVersionKey = Clipperz.PM.Crypto.randomKey(); + result = {}; + + deferredResult = new Clipperz.Async.Deferred("Record.prepareRemoteDataWithKey", {trace:false}); + deferredResult.addCallbackList([ + Clipperz.Async.collectResults("Record.prepareRemoteDataWithKey - collect results", { + 'isBrandNew': MochiKit.Base.method(this, 'isBrandNew'), + 'versionHasPendingChanges': [ +// MochiKit.Base.method(this, 'getCurrentRecordVersion'), +// MochiKit.Base.methodcaller('hasPendingChanges') + MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges') + ] + }), + Clipperz.Async.or, + + Clipperz.Async.deferredIf("Current Version has pending changes", [ + MochiKit.Base.method(this, 'createNewRecordVersion'), + MochiKit.Base.methodcaller('prepareRemoteDataWithKey', newVersionKey), + MochiKit.Base.partial(Clipperz.Async.setItem, result, 'currentRecordVersion'), + MochiKit.Base.method(this, 'setCurrentRecordVersionKey', newVersionKey) + ], []), + + MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey), + MochiKit.Base.partial(Clipperz.Async.setItem, result, 'record'), + + MochiKit.Base.partial(MochiKit.Async.succeed, result) + ]); + + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'fields': function () { + return this.invokeCurrentRecordVersionMethod('fields'); + }, + + 'addField': function (someParameters) { + return this.invokeCurrentRecordVersionMethod('addField', someParameters); + }, + + 'removeField': function (someParameters) { + return this.invokeCurrentRecordVersionMethod('removeField', someParameters); + }, + +// 'sortFieldReference': function (someSortedFieldReferences) { +// return this.invokeCurrentRecordVersionMethod('sortFieldReference', someSortedFieldReferences); +// }, + + 'getFieldsValues': function () { + return this.invokeCurrentRecordVersionMethod('getFieldsValues'); + }, + + 'fieldWithLabel': function (aLabel) { + return Clipperz.Async.callbacks("Record.fieldWithLabel", [ + MochiKit.Base.method(this, 'fields'), + MochiKit.Base.values, + MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aField) { + return Clipperz.Async.callbacks("Record.fieldWithLabel - check field label", [ + MochiKit.Base.methodcaller('label'), + MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel) + ], {trace:false}, aField); + }), + function (someFilteredResults) { + var result; + + switch (someFilteredResults.length) { + case 0: + result = null; + break; + case 1: + result = someFilteredResults[0]; + break; + default: + WTF = TODO; + break; + } + + return result; + } + ], {trace:false}); + }, + + //========================================================================= + + 'getVersion': function (aVersionReference) { + return Clipperz.Async.callbacks("Record.getVersion", [ + MochiKit.Base.method(this, 'getVersions'), + MochiKit.Base.itemgetter(aVersionReference) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'getVersionKey': function (aVersionReference) { + var deferredResult; + var transientStateKey; + + transientStateKey = 'versionKeys' + '.' + aVersionReference; + if (this.transientState().getValue(transientStateKey) != null) { + deferredResult = MochiKit.Async.succeed(this.transientState().getValue(transientStateKey)); + } else { + deferredResult = Clipperz.Async.callbacks("Record.getVersionKey", [ + MochiKit.Base.method(this, 'getVersions'), + MochiKit.Base.partial(MochiKit.Base.operator.eq, aVersionReference, this.currentVersionReference()), + Clipperz.Async.deferredIf("getVersionKey for current version", [ + MochiKit.Base.method(this, 'getCurrentRecordVersionKey'), + MochiKit.Base.method(this.transientState(), 'setValue', transientStateKey) + ],[ + MochiKit.Async.fail + ]) + ], {trace:false}); + } + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'versions': function () { + return this._versions; + }, + + 'getVersions': function () { + return Clipperz.Async.callbacks("Record.versions", [ + MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'), + MochiKit.Base.bind(function () { return this._versions; }, this) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'getCurrentRecordVersion': function () { + return Clipperz.Async.callbacks("Record.getCurrentRecordVersion", [ +// MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'), +// MochiKit.Base.bind(function () { return this._currentRecordVersion; }, this) + + MochiKit.Base.method(this, 'versions'), + MochiKit.Base.itemgetter(this.currentVersionReference()), + Clipperz.Async.deferredIf("The current version is available", [ + MochiKit.Async.succeed + ], [ + MochiKit.Base.method(this, 'getVersions'), + MochiKit.Base.bind(function (someVersions) { return someVersions[this.currentVersionReference()]}, this) + ]) + ], {trace:false}); + }, + + 'setCurrentRecordVersion': function (aRecordVersion) { + this._currentVersionReference = aRecordVersion.reference(); + }, + + //......................................................................... + + 'currentVersionReference': function () { + return this._currentVersionReference; + }, + + //------------------------------------------------------------------------- + + 'createNewRecordVersion': function () { + var deferredResult; + + if (this.isBrandNew()) { + deferredResult = this.getCurrentRecordVersion(); + } else { + var newVersion; + + newVersion = new Clipperz.PM.DataModel.Record.Version({ + // 'reference': versionKey, + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getVersionKey'), +// 'remoteData': {}, + 'getVersion': MochiKit.Base.method(this, 'getVersion') + }) + this._versions[newVersion.reference()] = newVersion; + + deferredResult = Clipperz.Async.callbacks("Record.createNewRecordVersion", [ +// MochiKit.Base.method(this, 'getCurrentRecordVersion'), +// MochiKit.Base.methodcaller('values'), + MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'values'), + MochiKit.Base.method(newVersion, 'setValues'), + + Clipperz.Async.collectResults("Record.createNewRecordVersion [collect results]", { + 'reference': MochiKit.Base.method(this, 'currentVersionReference'), + 'key': MochiKit.Base.method(this, 'getCurrentRecordVersionKey') + }, {trace:false}), + MochiKit.Base.method(newVersion, 'setPreviousVersionReferenceAndKey'), + +// MochiKit.Base.method(this, 'getCurrentRecordVersion'), +// MochiKit.Base.method(this, 'revertChanges'), + MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'revertChanges'), + + MochiKit.Base.method(this, 'setCurrentRecordVersion', newVersion), + MochiKit.Base.partial(MochiKit.Async.succeed, newVersion) + ], {trace:false}); + } + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getCurrentRecordVersionKey': function () { + return Clipperz.Async.callbacks("Record.getCurrentRecordVersionKey", [ + MochiKit.Base.method(this, 'getValue', 'currentVersionKey'), + Clipperz.Async.deferredIf("currentVersionKey is NOT null", [ + MochiKit.Async.succeed + ], [ + MochiKit.Base.method(this, 'getKey') + ]) + ], {trace:false}); + }, + + 'setCurrentRecordVersionKey': function (aValue) { + // TODO: triple check this method! + return Clipperz.Async.callbacks("Record.setCurrentRecordVersionKey", [ + MochiKit.Base.method(this, 'setValue', 'currentVersionKey', aValue) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'invokeCurrentRecordVersionMethod': function (aMethodName, someValues) { + return Clipperz.Async.callbacks("Record.invokeCurrentRecordVersionMethod", [ + MochiKit.Base.method(this, 'getCurrentRecordVersion'), + MochiKit.Base.methodcaller(aMethodName, someValues) + ], {trace:false}); + }, + + + 'lazilyinvokeCurrentRecordVersionMethod': function (aMethodName, someValues, defaultResult) { + return Clipperz.Async.callbacks("Record.lazilyinvokeCurrentRecordVersionMethod", [ + MochiKit.Base.method(this, 'currentVersionReference'), + Clipperz.Async.deferredIf("versions has been loaded", [ + MochiKit.Base.method(this, 'getCurrentRecordVersion'), + MochiKit.Base.methodcaller(aMethodName, someValues), + ], [ + MochiKit.Base.partial(MochiKit.Async.succeed, defaultResult), + ]) + ], {trace:false}); + }, + + //========================================================================= + + 'hasPendingChanges': function () { + var deferredResult; + + if (this.hasInitiatedObjectDataStore()) { + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChanges", {trace:false}); + deferredResult.collectResults({ + 'super': MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasPendingChanges, this), + 'currentVersion': [ +// MochiKit.Base.method(this, 'getCurrentRecordVersion'), +// MochiKit.Base.methodcaller('hasPendingChanges') + MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges') + ], + 'directLogins': [ + MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')), + Clipperz.Async.collectAll, + Clipperz.Async.or +// function(someValues) { +// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); +// } + ] + }); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.bind(function(someValues) { + var result; + result = MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); + + if ((result == false) && (this.isBrandNew() == false)) { + result = MochiKit.Iter.some(MochiKit.Base.values(this.transientState().getValue('hasPendingChanges.indexData')), MochiKit.Base.operator.identity); + } + + return result; + }, this)); + + deferredResult.callback(); + } else { + deferredResult = Clipperz.Async.callbacks("Recrod.hasPendingChanges [hasInitiatedObjectDataStore == false]", [ + MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')), + Clipperz.Async.collectAll, + Clipperz.Async.or +// function(someValues) { +// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); +// } + ], {trace:false}) + } + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'hasPendingChangesWhenBrandNew': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChangesWhenBrandNew", {trace:false}); + deferredResult.collectResults({ + 'label': [ + MochiKit.Base.method(this, 'label'), + MochiKit.Base.partial(MochiKit.Base.operator.ne, '') + ], + 'notes': [ + MochiKit.Base.method(this, 'notes'), + MochiKit.Base.partial(MochiKit.Base.operator.ne, '') + ] + }); +// deferredResult.addCallback(MochiKit.Base.values); +// deferredResult.addCallback(function(someValues) { +// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); +// }); + deferredResult.addCallback(Clipperz.Async.or); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'isBrandNewWithNoPendingChanges': function () { + var deferredResult; + + if (this.isBrandNew() == false) { + deferredResult = MochiKit.Async.succeed(false); + } else { + deferredResult = Clipperz.Async.callbacks("Record.isBrandNewWithNoPendingChanges", [ + MochiKit.Base.method(this, 'hasPendingChanges'), + MochiKit.Base.operator.lognot + ], {trace:false}); + } + + return deferredResult; + }, + + //========================================================================= + + 'revertChanges': function () { + var deferredResult; + + if (this.isBrandNew() == false) { + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.revertChanges", {trace:false}); + deferredResult.addMethod(this, 'hasPendingChanges'); + deferredResult.addIf([ +// MochiKit.Base.method(this, 'getCurrentRecordVersion'), +// MochiKit.Base.methodcaller('revertChanges'), + MochiKit.Base.method(this,'invokeCurrentRecordVersionMethod', 'revertChanges'), + + MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('revertChanges')), + + MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.revertChanges, this) + ], [ + MochiKit.Async.succeed + ]); + deferredResult.callback(); + } else { +// this.deleteAllCleanTextData(); + deferredResult = MochiKit.Async.succeed(); + } + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'resetTransientState': function (isCommitting) { +// if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) { +// this._directLogins = this.transientState().getValue('directLogins'); +// } + + return Clipperz.Async.callbacks("Record.resetTransientState", [ +//- MochiKit.Base.method(this, 'getCurrentRecordVersion'), +//- MochiKit.Base.methodcaller('resetTransientState'), +// MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'resetTransientState'), + MochiKit.Base.method(this, 'lazilyinvokeCurrentRecordVersionMethod', 'resetTransientState'), + + MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('resetTransientState')), + + MochiKit.Base.bind(function () { + if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) { + this._directLogins = this.transientState().getValue('directLogins'); + } + }, this), + + MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.resetTransientState, this, isCommitting) + ], {trace:false}) + }, + + //------------------------------------------------------------------------- + + 'commitTransientState': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.commitTransientState", {trace:false}); + deferredResult.addMethod(this, 'hasPendingChanges'); + deferredResult.addIf([ + MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.commitTransientState, this), +// MochiKit.Base.method(this, 'getCurrentRecordVersion'), +// MochiKit.Base.methodcaller('commitTransientState'), + MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'commitTransientState'), + MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('commitTransientState')) + ], [ + MochiKit.Async.succeed + ]); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'retrieveDirectLoginIndexDataFunction': function () { + return this._retrieveDirectLoginIndexDataFunction; + }, + + 'setDirectLoginIndexDataFunction': function () { + return this._setDirectLoginIndexDataFunction; + }, + + 'removeDirectLoginIndexDataFunction': function () { + return this._removeDirectLoginIndexDataFunction; + }, + + //========================================================================= + + 'deleteAllCleanTextData': function () { +// return Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData.apply(this, arguments); + + return Clipperz.Async.callbacks("Record.deleteAllCleanTextData", [ + MochiKit.Base.method(this, 'versions'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')), + + MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')), + + MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData, this) + ], {trace:false}); + }, + + 'hasAnyCleanTextData': function () { +// return Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData.apply(this, arguments); + + return Clipperz.Async.callbacks("Record.hasAnyCleanTextData", [ + Clipperz.Async.collectResults("Record.hasAnyCleanTextData [collect results]", { + 'versions': [ + MochiKit.Base.method(this, 'versions'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')), + Clipperz.Async.collectAll + ], + 'directLogins': [ + MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.values, + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')), + Clipperz.Async.collectAll + ], + 'super': [ + MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData, this) + ] + }, {trace:false}), + Clipperz.Async.or + ]) + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Legacy.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Legacy.js new file mode 100644 index 0000000..cda5a41 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Legacy.js @@ -0,0 +1,182 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!"; +} + +if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } + +Clipperz.PM.DataModel.User.Header.Legacy = function(args) { +// args = args || {}; + Clipperz.PM.DataModel.User.Header.Legacy.superclass.constructor.apply(this, arguments); + + this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction || Clipperz.Base.exception.raise('MandatoryParameter'); + this._records = null; +// this._directLogins = null; + + return this; +} + + +Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Legacy, Clipperz.PM.DataModel.EncryptedRemoteObject, { + + 'toString': function() { + return "Clipperz.PM.DataModel.User.Header.Legacy"; + }, + + //------------------------------------------------------------------------- + + 'retrieveRecordDetailFunction': function () { + return this._retrieveRecordDetailFunction; + }, + + //------------------------------------------------------------------------- + + 'getRecordKey': function (aRecordReference) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.getRecordKey", {trace:false}); + deferredResult.addMethod(this, 'getRecordIndexData'); + deferredResult.addCallback(MochiKit.Base.itemgetter('key')) + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'getRecordIndexData': function (aRecordReference) { + return this.getValue('records.' + aRecordReference); + }, + + 'updateRecordIndexData': function (aRecordReference, aKey, aValue) { + return this.setValue('records.' + aRecordReference + "." + aKey, aValue); + }, + + //------------------------------------------------------------------------- + + 'getDirectLoginIndexData': function (aDirectLoginReference) { + return this.getValue('directLogins.' + aDirectLoginReference); + }, + + 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) { + return this.setValue('directLogins.' + aDirectLoginReference + '.' + aKey, aValue); + }, + + 'removeDirectLoginIndexData': function (aDirectLoginReference) { + return this.removeValue('directLogins.' + aDirectLoginReference); + }, + + //========================================================================= + + 'records': function () { + var deferredResult; + var deferredLock; + + deferredLock = this.getDeferredLockForKey('records'); + + deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records", {trace:false}); + deferredResult.acquireLock(deferredLock); + deferredResult.addCallback(MochiKit.Base.bind(function () { + var innerDeferredResult; + + if (this._records == null) { + innerDeferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records <inner deferred>", {trace:false}); + innerDeferredResult.collectResults({ + 'header': [ +// MochiKit.Base.method(this, 'getObjectDataStore'), +// MochiKit.Base.methodcaller('values') + MochiKit.Base.method(this, 'values') + ], + 'recordsStats': [ + MochiKit.Base.method(this, 'getRemoteData'), + MochiKit.Base.itemgetter('recordsStats') + ] + }); + innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) { + var reference; + + this._records = {}; +// this._directLogins = {}; + + for (reference in someObjectData['header']['records']) { + var record; + + record = new Clipperz.PM.DataModel.Record({ + 'reference': reference, + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), + 'retrieveRemoteDataFunction': this.retrieveRecordDetailFunction(), +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version', + + 'retrieveIndexDataFunction': MochiKit.Base.method(this, 'getRecordIndexData'), + 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), + 'updateDate': someObjectData['recordsStats'][reference]['updateDate'], + + 'retrieveDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'getDirectLoginIndexData'), + 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), + 'removeDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData') + }); + + this._records[reference] = record; + } + + for (reference in someObjectData['header']['directLogins']) { + var directLogin; + var record; + + record = this._records[someObjectData['header']['directLogins'][reference]['record']]; + if (record != null) { + directLogin = new Clipperz.PM.DataModel.DirectLogin({ + 'reference': reference, + 'record': record //, +// 'retrieveIndexDataFunction': MochiKit.Base.method(this, 'getDirectLoginIndexData'), +// 'setIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), +// 'removeIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData') + }); + } else { +Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!"); + } + } + + return this._records; + }, this)); + innerDeferredResult.callback(); + } else { + innerDeferredResult = MochiKit.Async.succeed(this._records); + } + + return innerDeferredResult; + }, this)); + deferredResult.releaseLock(deferredLock); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js new file mode 100644 index 0000000..e82da47 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js @@ -0,0 +1,117 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!"; +} +if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } + +//----------------------------------------------------------------------------- + +Clipperz.PM.DataModel.User.Header.OneTimePasswords = function(args) { + Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.constructor.apply(this, arguments); + + this._oneTimePasswords = null; + + return this; +} + +//----------------------------------------------------------------------------- + +Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.OneTimePasswords, Clipperz.PM.DataModel.EncryptedRemoteObject, { + + 'toString': function() { + return "Clipperz.PM.DataModel.User.Header.OneTimePasswords"; + }, + + //------------------------------------------------------------------------- +/* + 'packData': function (someData) { // ++ + var result; + + result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packData.apply(this, arguments); + + return result; + }, +*/ + //------------------------------------------------------------------------- +/* + 'packRemoteData': function (someData) { + var result; + + result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packRemoteData.apply(this, arguments); + + return result; + }, +*/ + //------------------------------------------------------------------------- +/* + 'prepareRemoteDataWithKey': function (aKey) { + var result; + + result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.prepareRemoteDataWithKey.apply(this, arguments); + + return result; + }, +*/ + //========================================================================= + + 'oneTimePasswords': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.Header.OneTimePasswords.oneTimePasswords", {trace:false}); + if (this._oneTimePasswords == null) { + deferredResult.addMethod(this, 'values') + deferredResult.addCallback(MochiKit.Base.bind(function (someData) { + var otpKey; + + this._oneTimePasswords = {}; + + for (otpKey in someData) { + var otp; + var otpParameters; + + otpParameters = Clipperz.Base.deepClone(someData[otpKey]); + otpParameters['reference'] = otpKey; + + otp = new Clipperz.PM.DataModel.OneTimePassword(otpParameters); + this._oneTimePasswords[otpKey] = otp; + } + + return this._oneTimePasswords; + + }, this)); + deferredResult.callback(); + } else { + deferredResult = MochiKit.Async.succeed(this._oneTimePasswords); + } + + return deferredResult; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + +//----------------------------------------------------------------------------- + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Preferences.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Preferences.js new file mode 100644 index 0000000..f1f95e8 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Preferences.js @@ -0,0 +1,48 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!"; +} + +if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } + +Clipperz.PM.DataModel.User.Header.Preferences = function(args) { + Clipperz.PM.DataModel.User.Header.Preferences.superclass.constructor.apply(this, arguments); + + return this; +} + + +Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Preferences, Clipperz.PM.DataModel.EncryptedRemoteObject, { + + 'toString': function() { + return "Clipperz.PM.DataModel.User.Header.Preferences"; + }, + + //------------------------------------------------------------------------- + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js new file mode 100644 index 0000000..5681f70 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js @@ -0,0 +1,685 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!"; +} + +if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } + +Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) { + Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments); + + this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'name': 'recordsData', + 'retrieveKeyFunction': args.retrieveKeyFunction, + 'remoteData': { + 'data': args.recordsData['data'], + 'version': args.encryptedDataVersion, + 'recordsStats': args.recordsStats + }//, +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version' + }); + + this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'name': 'directLoginsData', + 'retrieveKeyFunction': args.retrieveKeyFunction, + 'remoteData': { + 'data': args.directLoginsData['data'], + 'version': args.encryptedDataVersion + }//, +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version' + }); + + this._lock = new MochiKit.Async.DeferredLock(); + this._transientState = null; + + this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction || Clipperz.Base.exception.raise('MandatoryParameter'); + this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter'); + this._directLoginsIndex = args.directLoginsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter'); + + this._records = null; + + return this; +} + + +Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, { + + 'toString': function() { + return "Clipperz.PM.DataModel.User.Header.RecordIndex"; + }, + + //------------------------------------------------------------------------- + + 'retrieveRecordDetailFunction': function () { + return this._retrieveRecordDetailFunction; + }, + + //------------------------------------------------------------------------- + + 'recordsIndex': function () { + return this._recordsIndex; + }, + + 'recordsData': function () { + return this._recordsData; + }, + + //------------------------------------------------------------------------- + + 'directLoginsIndex': function () { + return this._directLoginsIndex; + }, + + 'directLoginsData': function () { + return this._directLoginsData; + }, + + //------------------------------------------------------------------------- + + 'lock': function () { + return this._lock; + }, + + //------------------------------------------------------------------------- + + 'transientState': function () { + if (this._transientState == null) { + this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/); + } + + return this._transientState; + }, + + 'resetTransientState': function (isCommitting) { + if (this._transientState != null) { + this._transientState.removeAllData(); + } + + this._transientState = null; + }, + + //------------------------------------------------------------------------- + + 'getRecordKey': function (aRecordReference) { + return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [ + MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference), + MochiKit.Base.itemgetter('key') + ], {trace:false}); + }, + + 'setRecordKey': function (aRecordReference, aValue) { + return this.updateRecordIndexData(aRecordReference, 'key', aValue); + }, + + //------------------------------------------------------------------------- + + 'getRecordIndexData': function (aRecordReference) { + return this.recordsData().getValue(this.recordsIndex()[aRecordReference]); + }, + + //......................................................................... + + 'updateRecordIndexData': function (aRecordReference, aKey, aValue) { + return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue); + }, + + //------------------------------------------------------------------------- + + 'getDirectLoginIndexData': function (aDirectLoginReference) { + return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]); + }, + + 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) { +//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) { +// throw "PIPPO"; +//} + return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue); + }, + + 'addDirectLoginIndexData': function (aDirectLoginReference) { + return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {}); + }, + + 'removeDirectLoginIndexData': function (aDirectLoginReference) { + return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference]) + }, + + //------------------------------------------------------------------------- + + 'records': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false}); + deferredResult.acquireLock(this.lock()); + deferredResult.addCallback(MochiKit.Base.bind(function () { + var innerDeferredResult; + + if (this._records == null) { + innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false}); + innerDeferredResult.collectResults({ + 'records': [ +// MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'), +// MochiKit.Base.methodcaller('values') + MochiKit.Base.method(this.recordsData(), 'values') + ], + 'recordsStats': [ + MochiKit.Base.method(this.recordsData(), 'getRemoteData'), + MochiKit.Base.itemgetter('recordsStats') + ], + 'directLogins': [ +// MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'), +// MochiKit.Base.methodcaller('values') + MochiKit.Base.method(this.directLoginsData(), 'values') + ] + }) + innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) { + var indexReference; + var recordsInvertedIndex; + var directLoginsInvertedIndex; + + recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex()); + directLoginsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex()); + + this._records = {}; + + for (indexReference in someData['records']) { + var record; + var reference; + var updateDate; + + reference = recordsInvertedIndex[indexReference]; + + if (typeof(someData['recordsStats'][reference]) != 'undefined') { + updateDate = someData['recordsStats'][reference]['updateDate']; + + record = new Clipperz.PM.DataModel.Record({ + 'reference': reference, + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), + 'retrieveRemoteDataFunction': this.retrieveRecordDetailFunction(), + + 'retrieveIndexDataFunction': MochiKit.Base.method(this, 'getRecordIndexData'), + 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), + 'updateDate': updateDate, + + 'retrieveDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'getDirectLoginIndexData'), + 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), + 'removeDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData'), + + 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin') + }); + + this._records[reference] = record; + } else { +Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference])); + // # skip the record, as it seems it is not present in the DB + // updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + } + } + + for (indexReference in someData['directLogins']) { +// var directLogin; + var reference; + var record; + + reference = directLoginsInvertedIndex[indexReference]; + record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]]; + + if (record != null) { +// directLogin = new Clipperz.PM.DataModel.DirectLogin({ + new Clipperz.PM.DataModel.DirectLogin({ + 'reference': reference, + 'record': record + }); + } else { + Clipperz.logWarning("WARNING: DIRECT LOGIN without a matching RECORD!!"); + } + } + + return this._records; + }, this)); + innerDeferredResult.callback(); + } else { + innerDeferredResult = MochiKit.Async.succeed(this._records); + } + + return innerDeferredResult; + }, this)); + deferredResult.releaseLock(this.lock()); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'updateRecordIndexForNewRecord': function (aNewRecord) { + var newRecordIndex; + var recordReference; + + recordReference = aNewRecord.reference(); + newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + ''; + this.recordsIndex()[recordReference] = newRecordIndex; + + this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex); + this.transientState().setValue('newlyCreatedRecordsReferences' + '.' + recordReference, aNewRecord); + }, + + //......................................................................... + + 'createNewRecord': function () { + var deferredResult; + var newRecord; + + newRecord = new Clipperz.PM.DataModel.Record({ + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), + 'retrieveRemoteDataFunction': this.retrieveRecordDetailFunction(), + + 'retrieveIndexDataFunction': MochiKit.Base.method(this, 'getRecordIndexData'), + 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), + 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), + + 'retrieveDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'getDirectLoginIndexData'), + 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), + 'removeDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData'), + + 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin') + }); + + this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord); + this.updateRecordIndexForNewRecord(newRecord); + + deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [ + MochiKit.Base.method(this, 'records'), + MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord), + MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()), + MochiKit.Base.method(newRecord, 'setLabel', ''), + MochiKit.Base.partial(MochiKit.Async.succeed, newRecord) + ], {trace:false}); + + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deleteRecord': function (aRecord) { + var deferredResult; + var recordReference; + + recordReference = aRecord.reference(); + + deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false}); + + deferredResult.addMethod(aRecord, 'directLogins'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin')); + + deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]); + deferredResult.addCallback(MochiKit.Base.bind(function () { + this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]); + delete this.recordsIndex()[recordReference]; + }, this)); + + deferredResult.addMethod(this, 'records'); + deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference)); + deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference); + + deferredResult.addMethod(this, 'records'); + deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) { + delete someRecords[recordReference]; + }, this)); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'removeDirectLogin': function (aDirectLogin) { + this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]); + }, + + //------------------------------------------------------------------------- + + 'createNewDirectLogin': function (aRecord) { + var newDirectLogin; + var newDirectLoginIndexValue; + + newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord}); + newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1; + + this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin); + + this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue; + this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]}); + + return newDirectLogin; + }, + + //========================================================================= + + 'deleteAllCleanTextData': function () { + return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [ +// MochiKit.Base.method(this, 'records'), +// MochiKit.Base.values, +// MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')), + + MochiKit.Base.method(this, 'recordsData'), + MochiKit.Base.methodcaller('deleteAllCleanTextData'), + MochiKit.Base.method(this, 'directLoginsData'), + MochiKit.Base.methodcaller('deleteAllCleanTextData') + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'hasAnyCleanTextData': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred({trace:false}); + deferredResult.collectResults({ + 'recordsData': [ + MochiKit.Base.method(this, 'recordsData'), + MochiKit.Base.methodcaller('hasAnyCleanTextData') + ], + 'directLoginsData': [ + MochiKit.Base.method(this, 'directLoginsData'), + MochiKit.Base.methodcaller('hasAnyCleanTextData') + ], +// 'records': [ +// MochiKit.Base.method(this, 'records'), +// MochiKit.Base.values, +// MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')), +// Clipperz.Async.collectAll +// ] + }); + +// deferredResult.addCallback(MochiKit.Base.values); +// deferredResult.addCallback(MochiKit.Base.flattenArguments); +// deferredResult.addCallback(function(someValues) { +// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); +// }); + deferredResult.addCallback(Clipperz.Async.or); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'hasPendingChanges': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.hasPendingChanges", {trace:false}); + deferredResult.collectResults({ + 'recordsData': [ + MochiKit.Base.method(this, 'recordsData'), + MochiKit.Base.methodcaller('hasPendingChanges') + ], + 'directLoginsData': [ + MochiKit.Base.method(this, 'directLoginsData'), + MochiKit.Base.methodcaller('hasPendingChanges') + ] + }); + deferredResult.addCallback(Clipperz.Async.or); +// deferredResult.addCallback(MochiKit.Base.values); +// deferredResult.addCallback(MochiKit.Base.flattenArguments); +// deferredResult.addCallback(function(someValues) { +// return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); +// }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'commitTransientState': function () { + var deferredResult; + + deferredResut = Clipperz.Async.callbacks("User.Header.RecordIndex.commitTransientState", [ + MochiKit.Base.method(this, 'recordsData'), + MochiKit.Base.methodcaller('commitTransientState'), + + MochiKit.Base.method(this, 'directLoginsData'), + MochiKit.Base.methodcaller('commitTransientState'), + + MochiKit.Base.method(this, 'resetTransientState', true) + ], {trace:false}); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'revertChanges': function () { + return Clipperz.Async.callbacks("User.Header.RecordIndex.revertChanges", [ + MochiKit.Base.method(this, 'recordsData'), + MochiKit.Base.methodcaller('revertChanges'), + +// MochiKit.Base.method(this, 'directLoginsData'), +// MochiKit.Base.methodcaller('revertChanges'), + + MochiKit.Base.method(this, 'records'), + MochiKit.Base.bind(function (someRecords) { + var recordReference; + + for (recordReference in this.transientState().getValue('deleteRecordsReferences')) { + this.recordsIndex()[recordReference] = this.transientState().getValue('deleteRecordsIndex' + '.' + recordReference); + someRecords[recordReference] = this.transientState().getValue('deleteRecordsReferences' + '.' + recordReference); + } + + for (recordReference in this.transientState().getValue('newRecordsReferences')) { + delete this.recordsIndex()[recordReference]; + delete someRecords[recordReference]; + } + }, this), + +// MochiKit.Base.method(this, 'directLogins'), + MochiKit.Base.bind(function () { + var directLoginReference; + +// this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin); +// +// this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue; +// this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]}); + + +// for (directLoginReference in this.transientState().getValue('deleteDirectLoginReferences')) { +// someDirectLogins[directLoginReference] = this.transientState().getValue('deleteDirectLoginReferences' + '.' + recordReference); +// } + + for (directLoginReference in this.transientState().getValue('newDirectLoginReferences')) { +// this.directLoginsData().removeValue(this.directLoginsIndex()[directLoginReference]); + delete this.directLoginsIndex()[directLoginReference]; + } + }, this), + + MochiKit.Base.method(this, 'directLoginsData'), + MochiKit.Base.methodcaller('revertChanges'), + + MochiKit.Base.method(this, 'resetTransientState', false) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'prepareRemoteDataWithKey': function (aKey) { +// "records": { +// "index": { +// "eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5": "0", +// "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551": "1", +// ... +// "465a067a0bd2b470fa834de5397e38494de0c7707938262fae3427932e219744": "18", +// "4fd1dc2ca860b7fb47cef10a84edb3270da05510b0a30a6b0b083898712d4b9e": "19" +// }, +// "data": "n+AzGEEQXaSRSY4d ... BDypotrXgPo94uHfoXvGFzwCn8w=" +// }, +// "directLogins": { +// "index": { +// "61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0", +// "989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1", +// ... +// "cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17", +// "7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18" +// }, +// "data":"5YG9KKU/OZ5guUgFlms6k1 ... ZG/5Fn0uN+LoAsNfHm+EE62x" +// }, + + var deferredResult; + var result; + + result = {}; + + deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataWithKey", {trace:false}); + deferredResult.collectResults({ + 'index': MochiKit.Base.partial(MochiKit.Async.succeed, this.recordsIndex()), + 'data': [ + MochiKit.Base.method(this.recordsData(), 'prepareRemoteDataWithKey', aKey), + MochiKit.Base.itemgetter('data') + ] + }); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'records'); + + deferredResult.collectResults({ + 'index': MochiKit.Base.partial(MochiKit.Async.succeed, this.directLoginsIndex()), + 'data': [ + MochiKit.Base.method(this.directLoginsData(), 'prepareRemoteDataWithKey', aKey), + MochiKit.Base.itemgetter('data') + ] + }); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'directLogins'); + + deferredResult.addCallback(MochiKit.Async.succeed, result); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'updateRecordKeyAndPrepareRemoteData': function (aRecord) { + var newRecordKey; + var deferredResult; + + newRecordKey = Clipperz.PM.Crypto.randomKey(); + + deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.updateRecordKeyAndPrepareRemoteData", {trace:false}); + deferredResult.addCallback(MochiKit.Base.method(aRecord, 'prepareRemoteDataWithKey', newRecordKey)); + deferredResult.addCallbackPass(MochiKit.Base.method(this, 'setRecordKey', aRecord.reference(), newRecordKey)); + deferredResult.callback(); + + return deferredResult; + }, + + //......................................................................... + + 'removeNewRecordWithNoChanges': function (aRecord) { + var deferredResult; + var recordReference; + + recordReference = aRecord.reference(); + + deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.removeNewRecordWithNoChanges", {trace:false}); + + deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]); + deferredResult.addCallback(MochiKit.Base.bind(function () { + delete this.recordsIndex()[recordReference]; + }, this)); + + deferredResult.addMethod(this, 'records'); + deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) { + delete someRecords[recordReference]; + }, this)); + deferredResult.callback(); + + return deferredResult; + }, + + //......................................................................... + + 'prepareRemoteDataForChangedRecords': function () { + var deferredResult; + var result; + + result = {}; + + deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataForChangedRecords", {trace:false}); + + deferredResult.addMethod(this, 'records'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('isBrandNewWithNoPendingChanges')); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeNewRecordWithNoChanges')); + + deferredResult.addMethod(this, 'records'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordKeyAndPrepareRemoteData')); + deferredResult.addCallback(Clipperz.Async.collectAll); + + deferredResult.addCallback(Clipperz.Async.deferredIf("updated records != null", [ + MochiKit.Base.operator.identity + ], [ + MochiKit.Base.partial(MochiKit.Async.succeed, []) + ])); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'updated'); + + deferredResult.addMethod(this.transientState(), 'getValue', 'deleteRecordsReferences'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(Clipperz.Async.deferredIf("deleted records != null", [ + MochiKit.Base.operator.identity + ], [ + MochiKit.Base.partial(MochiKit.Async.succeed, []) + ])); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'deleted'); + + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + + + +Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex = function (anIndex) { + var result; + var key; + + result = {}; + + for (key in anIndex) { + result[anIndex[key]] = key; + } + + return result; +};
\ No newline at end of file diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Subscription.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Subscription.js new file mode 100644 index 0000000..341e9f3 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Subscription.js @@ -0,0 +1,53 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.DataModel.User.Subscription depends on Clipperz.PM.DataModel.User!"; +} + +Clipperz.PM.DataModel.User.Subscription = function(args) { + this._attributes = args; + return this; +} + + +Clipperz.Base.extend(Clipperz.PM.DataModel.User.Subscription, Object, { + + 'features': function () { + return this._attributes['features']; + }, + + 'type': function () { + return this._attributes['type']; + }, + + 'validity': function () { + return { + 'from': this._attributes['fromDate'], + 'to': this._attributes['toDate'] + }; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.js b/frontend/delta/js/Clipperz/PM/DataModel/User.js new file mode 100644 index 0000000..1d90800 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/DataModel/User.js @@ -0,0 +1,827 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } + + +//############################################################################# + +Clipperz.PM.DataModel.User = function (args) { + args = args || {}; + + Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments); + + this._username = args.username || null; + this._getPassphraseFunction = args.getPassphraseFunction || null; + + this._data = null; + + this._connection = null; + this._connectionVersion = 'current'; + + this._subscription = null; + this._serverData = null; +// this._serverLockValue = null; + this._transientState = null; + + this._deferredLocks = { + 'passphrase': new MochiKit.Async.DeferredLock(), + 'serverData': new MochiKit.Async.DeferredLock(), +// 'recordsIndex': new MochiKit.Async.DeferredLock(), +// 'directLoginsIndex': new MochiKit.Async.DeferredLock() +// 'preferences': new MochiKit.Async.DeferredLock() +// 'oneTimePasswords': new MochiKit.Async.DeferredLock() + '__syntaxFix__': 'syntax fix' + }; + + return this; +} + +Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, { + + 'toString': function () { + return "Clipperz.PM.DataModel.User - " + this.username(); + }, + + //------------------------------------------------------------------------- + + 'username': function () { + return this._username; + }, + + 'setUsername': function (aValue) { + this._username = aValue; + }, + + //------------------------------------------------------------------------- + +// this.setSubscription(new Clipperz.PM.DataModel.User.Subscription(someServerData['subscription'])); + 'subscription': function () { + return this._subscription; + }, + + 'setSubscription': function (aValue) { + this._subscription = aValue; + }, + + //------------------------------------------------------------------------- + + 'displayName': function() { + return "" + this.username() + ""; + }, + + //------------------------------------------------------------------------- + + 'data': function () { + if (this._data == null) { + this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/); + }; + + return this._data; + }, + + //------------------------------------------------------------------------- +/* + 'serverLockValue': function () { + return this._serverLockValue; + }, + + 'setServerLockValue': function (aValue) { + this._serverLockValue = aValue; + }, +*/ + //------------------------------------------------------------------------- + + 'transientState': function () { + if (this._transientState == null) { + this._transientState = {} + } + + return this._transientState; + }, + + 'resetTransientState': function (isCommitting) { + this._transientState = null; + }, + + //------------------------------------------------------------------------- + + 'deferredLockForSection': function(aSectionName) { + return this._deferredLocks[aSectionName]; + }, + + //------------------------------------------------------------------------- + + 'getPassphrase': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false}); + deferredResult.acquireLock(this.deferredLockForSection('passphrase')); + deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction()); + deferredResult.releaseLock(this.deferredLockForSection('passphrase')); + deferredResult.callback(); + + return deferredResult; + }, + + 'getPassphraseFunction': function () { + return this._getPassphraseFunction; + }, + + //------------------------------------------------------------------------- + + 'getCredentials': function () { + return Clipperz.Async.collectResults("User; get username and passphrase", { + 'username': MochiKit.Base.method(this, 'username'), + 'password': MochiKit.Base.method(this, 'getPassphrase') + }, {trace:false})(); + }, + + //------------------------------------------------------------------------- + + 'changePassphrase': function (aNewValue) { + return this.updateCredentials(this.username(), aNewValue); + }, + + //......................................................................... + + 'updateCredentials': function (aUsername, aPassphrase) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false}); +// deferredResult.addMethod(this, 'getPassphrase'); +// deferredResult.setValue('currentPassphrase'); + deferredResult.addMethod(this.connection(), 'ping'); + deferredResult.addMethod(this, 'setUsername', aUsername) + deferredResult.acquireLock(this.deferredLockForSection('passphrase')); + deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase); + deferredResult.releaseLock(this.deferredLockForSection('passphrase')); +// deferredResult.getValue('currentPassphrase'); + deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase); + deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'initialSetupWithNoData': function () { + this._serverData = { + 'version': '0.1', + 'statistics': "", + 'header': { + 'data': null, + 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion, + + 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({ + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), + 'recordsData': {'data':null, 'index':{}}, + 'recordsStats': null, + 'directLoginsData': {'data':null, 'index':{}}, + 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion, + 'retrieveRecordDetailFunction': MochiKit.Base.method(this, 'getRecordDetail') + }), + 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({ + 'name': 'preferences', + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') + }), + 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ + 'name': 'preferences', + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') + }) + } + }; + +// this._serverLockValue = Clipperz.PM.Crypto.randomKey(); + }, + + //......................................................................... + + 'registerAsNewAccount': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false}); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); + deferredResult.addMethod(this, 'initialSetupWithNoData') + deferredResult.addMethod(this, 'getPassphrase'); + deferredResult.addMethod(this, 'prepareRemoteDataWithKey'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + deferredResult.addMethod(this.connection(), 'register'); +// deferredResult.addCallback(MochiKit.Base.itemgetter('lock')); +// deferredResult.addMethod(this, 'setServerLockValue'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered'); + +// deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure')); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'login': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false}); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); + deferredResult.addMethod(this, 'getPassphrase'); + deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue); + deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [ +// MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}), + MochiKit.Base.method(this, 'getCredentials'), + MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'), + MochiKit.Base.method(this.data(), 'setValue', 'passphrase') + ], [])); + deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase')); + deferredResult.addMethod(this.connection(), 'login', false); + deferredResult.addMethod(this, 'setupConnectionInfo'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn'); + deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback')); + + deferredResult.callback(); + + return deferredResult; + }, + + //......................................................................... + + 'handleConnectionFallback': function(aValue) { + var result; + +//console.log("USER - handleConnectionFallback", aValue, aValue['isPermanent']); + if (aValue instanceof MochiKit.Async.CancelledError) { + result = aValue; + } else if ((aValue['isPermanent'] === true) || (Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()] == null)) { + result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [ + MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'), + MochiKit.Base.method(this, 'setConnectionVersion', 'current'), +// MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'), +// MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed) + MochiKit.Base.partial(MochiKit.Async.fail, aValue) + ], {trace:false}); + } else { + this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]); + result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry"); + result.addMethod(this, 'login'); + result.callback(); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'setupConnectionInfo': function (aValue) { +// this.setLoginInfo(aValue['loginInfo']); + this.setSubscription(new Clipperz.PM.DataModel.User.Subscription(aValue['subscription'])); + }, + + //------------------------------------------------------------------------- + + 'lock': function () { + return Clipperz.Async.callbacks("User.lock", [ + MochiKit.Base.method(this, 'deleteAllCleanTextData') + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'logout': function () { + return Clipperz.Async.callbacks("User.logout", [ + MochiKit.Base.method(this, 'deleteAllCleanTextData'), + MochiKit.Base.method(this.connection(), 'logout') + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'headerFormatVersion': function(anHeader) { + var result; + + if (anHeader.charAt(0) == '{') { + var headerData; + + headerData = Clipperz.Base.evalJSON(anHeader); + result = headerData['version']; + } else { + result = 'LEGACY'; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'unpackServerData': function (someServerData) { + var unpackedData; + var headerVersion; + + var recordsIndex; + var preferences; + var oneTimePasswords; + +// this.setServerLockValue(someServerData['lock']); + + headerVersion = this.headerFormatVersion(someServerData['header']); + switch (headerVersion) { + case 'LEGACY': + var legacyHeader; + + legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({ + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), + 'remoteData': { + 'data': someServerData['header'], + 'version': someServerData['version'], + 'recordsStats': someServerData['recordsStats'] + }, +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version', + 'retrieveRecordDetailFunction': MochiKit.Base.method(this, 'getRecordDetail') + }); + + recordsIndex = legacyHeader; + preferences = legacyHeader; + oneTimePasswords = legacyHeader; + break; + case '0.1': + var headerData; + + headerData = Clipperz.Base.evalJSON(someServerData['header']); + + recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({ + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), + 'recordsData': headerData['records'], + 'recordsStats': someServerData['recordsStats'], + 'directLoginsData': headerData['directLogins'], + 'encryptedDataVersion': someServerData['version'], + 'retrieveRecordDetailFunction': MochiKit.Base.method(this, 'getRecordDetail') + }); + + // Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing + if (typeof(headerData['preferences']) != 'undefined') { + preferences = new Clipperz.PM.DataModel.User.Header.Preferences({ + 'name': 'preferences', + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), + 'remoteData': { + 'data': headerData['preferences']['data'], + 'version': someServerData['version'] + } + }); + } else { + preferences = new Clipperz.PM.DataModel.User.Header.Preferences({ + 'name': 'preferences', + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') + }); + } + + if (typeof(headerData['oneTimePasswords']) != 'undefined') { + oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ + 'name': 'preferences', + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), + 'remoteData': { + 'data': headerData['oneTimePasswords']['data'], + 'version': someServerData['version'] + } + }); + } else { + oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ + 'name': 'preferences', + 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') + }); + } + + break; + } + + unpackedData = { + 'version': someServerData['version'], + 'statistics': someServerData['statistics'], + 'header': { + 'data': someServerData['header'], + 'version': headerVersion, + + 'recordsIndex': recordsIndex, + 'preferences': preferences, + 'oneTimePasswords': oneTimePasswords + } + }; + + this._serverData = unpackedData; + + return this._serverData; + }, + + //------------------------------------------------------------------------- + + 'getServerData': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.getServerData", {trace:false}); + deferredResult.acquireLock(this.deferredLockForSection('serverData')); + deferredResult.addCallback(MochiKit.Base.bind(function(aResult) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("User.getUserDetails.innerDeferred", {trace:false}); + if (this._serverData == null) { + innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadingUserDetails'); + innerDeferredResult.addMethod(this.connection(), 'message', 'getUserDetails'); + innerDeferredResult.addMethod(this, 'unpackServerData'); + innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadedUserDetails'); + } + + innerDeferredResult.addCallback(MochiKit.Base.bind(function () { + return this._serverData; + },this)); + innerDeferredResult.callback(); + + return innerDeferredResult; + }, this)); + deferredResult.releaseLock(this.deferredLockForSection('serverData')); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'connectionVersion': function() { + return this._connectionVersion; + }, + + 'setConnectionVersion': function(aValue) { + if (this._connectionVersion != aValue) { + this.resetConnection(); + } + this._connectionVersion = aValue; + }, + + //------------------------------------------------------------------------- + + 'connection': function() { + if ((this._connection == null) && (this.connectionVersion() != null) ){ + this._connection = new Clipperz.PM.Connection.communicationProtocol.versions[this.connectionVersion()]({ + getCredentialsFunction: MochiKit.Base.method(this, 'getCredentials') + }); + } + + return this._connection; + }, + + 'resetConnection': function(aValue) { + if (this._connection != null) { + this._connection.reset(); + } + + this._connection = null; + }, + + //========================================================================= + + 'getHeaderIndex': function (aKey) { + return Clipperz.Async.callbacks("User.getHeaderIndex", [ + MochiKit.Base.method(this, 'getServerData'), + MochiKit.Base.itemgetter('header'), + MochiKit.Base.itemgetter(aKey) + ], {trace:false}) + }, + + //========================================================================= + + 'getRecords': function () { + return Clipperz.Async.callbacks("User.getRecords", [ + MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), + MochiKit.Base.methodcaller('records'), + MochiKit.Base.values + ], {trace:false}); + }, + + 'recordWithLabel': function (aLabel) { + return Clipperz.Async.callbacks("User.recordWithLabel", [ + MochiKit.Base.method(this, 'getRecords'), + MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aRecord) { + return Clipperz.Async.callbacks("User.recordWithLabel - check record label", [ + MochiKit.Base.methodcaller('label'), + MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel) + ], {trace:false}, aRecord); + }), + function (someFilteredResults) { + var result; + + switch (someFilteredResults.length) { + case 0: + result = null; + break; + case 1: + result = someFilteredResults[0]; + break; + default: + WTF = TODO; + break; + } + + return result; + } + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'getRecord': function (aRecordReference) { + return Clipperz.Async.callbacks("User.getRecord", [ + MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), + MochiKit.Base.methodcaller('records'), + MochiKit.Base.itemgetter(aRecordReference), + + Clipperz.Async.deferredIf("record != null", [ + MochiKit.Base.operator.identity + ], [ + function () { throw "Record does not exists"} + ]) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'getRecordDetail': function (aRecordReference) { + return this.connection().message('getRecordDetail', {reference: aRecordReference}); + }, + + //------------------------------------------------------------------------- + + 'deleteRecord': function (aRecord) { + return Clipperz.Async.callbacks("User.deleteRecord", [ + MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), + MochiKit.Base.methodcaller('deleteRecord', aRecord) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'createNewRecord': function () { + return Clipperz.Async.callbacks("User.createNewRecord", [ + MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), + MochiKit.Base.methodcaller('createNewRecord') + ], {trace:false}); + }, + + //========================================================================= + + 'getDirectLogins': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.getDirectLogins", {trace:false}); + deferredResult.addMethod(this, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.compose(MochiKit.Base.values, MochiKit.Base.methodcaller('directLogins'))); + deferredResult.addCallback(MochiKit.Base.flattenArray); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'getOneTimePasswords': function () { + return Clipperz.Async.callbacks("User.getOneTimePasswords", [ + MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'), + MochiKit.Base.methodcaller('oneTimePasswords'), + MochiKit.Base.values + ], {trace:false}); + }, + + //========================================================================= + + 'invokeMethodNamedOnHeader': function (aMethodName, aValue) { + return Clipperz.Async.collectResults("User.invokeMethodNamedOnHeader [" + aMethodName + "]", { + 'recordIndex': [ + MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), + MochiKit.Base.methodcaller(aMethodName, aValue) + ], + 'preferences': [ + MochiKit.Base.method(this, 'getHeaderIndex', 'preferences'), + MochiKit.Base.methodcaller(aMethodName, aValue) + ], + 'oneTimePasswords': [ + MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'), + MochiKit.Base.methodcaller(aMethodName, aValue) + ]//, +// 'statistics': [ +// MochiKit.Base.method(this, 'getStatistics'), +// MochiKit.Base.methodcaller(aMethodName, aValue) +// ] + }, {trace:false})(); + }, + + //------------------------------------------------------------------------- + + 'invokeMethodNamedOnRecords': function (aMethodName, aValue) { + return Clipperz.Async.callbacks("User.invokeMethodNamedOnRecords[" + aMethodName + "]", [ + MochiKit.Base.method(this, 'getRecords'), + MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller(aMethodName, aValue)), + Clipperz.Async.collectAll + ], {trace:false}); + }, + + //========================================================================= + + 'hasPendingChanges': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.hasPendingChanges", {trace:false}); + deferredResult.collectResults({ + 'header': [ + MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasPendingChanges'), + MochiKit.Base.values + ], + 'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasPendingChanges') + }); + deferredResult.addCallback(Clipperz.Async.or); + deferredResult.callback(); +// recordsIndex = legacyHeader; +// preferences = legacyHeader; +// oneTimePasswords = legacyHeader; + + return deferredResult; + }, + + //========================================================================= + + 'commitTransientState': function () { + return Clipperz.Async.callbacks("User.commitTransientState", [ + MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'commitTransientState'), + MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'commitTransientState'), + + MochiKit.Base.method(this, 'transientState'), +// MochiKit.Base.itemgetter('lock'), +// MochiKit.Base.method(this, 'setServerLockValue'), + MochiKit.Base.method(this, 'resetTransientState', true) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'revertChanges': function () { + return Clipperz.Async.callbacks("User.revertChanges", [ + MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'revertChanges'), + MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'revertChanges'), + MochiKit.Base.method(this, 'resetTransientState', false) + ], {trace:false}); + }, + + //========================================================================= + + 'deleteAllCleanTextData': function () { + return Clipperz.Async.callbacks("User.deleteAllCleanTextData", [ + MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'deleteAllCleanTextData'), + MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'deleteAllCleanTextData'), + + MochiKit.Base.method(this.data(), 'removeAllData'), + MochiKit.Base.method(this, 'resetTransientState', false) + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'hasAnyCleanTextData': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("User.hasAnyCleanTextData", {trace:false}); + deferredResult.collectResults({ + 'header': [ + MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasAnyCleanTextData'), + MochiKit.Base.values + ], + 'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasAnyCleanTextData'), + 'data': MochiKit.Base.bind(function () { + return MochiKit.Async.succeed(! this.data().isEmpty()); + }, this), + 'transientState': MochiKit.Base.bind(function () { + return MochiKit.Async.succeed(MochiKit.Base.keys(this.transientState()).length != 0); + }, this) + }); + deferredResult.addCallback(Clipperz.Async.or); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'prepareRemoteDataWithKey': function (aKey /*, aCurrentKey*/) { + var deferredResult; + var result; + + result = {}; + deferredResult = new Clipperz.Async.Deferred("User.prepareRemoteDataWithKey", {trace:false}); + deferredResult.addMethod(this, 'invokeMethodNamedOnHeader', 'prepareRemoteDataWithKey', aKey /*, aCurrentKey*/); + deferredResult.addCallback(MochiKit.Base.bind(function (aResult, someHeaderPackedData) { + var header; + + header = {}; + header['records'] = someHeaderPackedData['recordIndex']['records']; + header['directLogins'] = someHeaderPackedData['recordIndex']['directLogins']; + header['preferences'] = {'data': someHeaderPackedData['preferences']['data']}; + header['oneTimePasswords'] = {'data': someHeaderPackedData['oneTimePasswords']['data']}; + header['version'] = '0.1'; + + aResult['header'] = Clipperz.Base.serializeJSON(header); + aResult['statistics'] = this._serverData['statistics']; // "someHeaderPackedData['statistics']['data']"; + + return aResult; + }, this), result); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'version', Clipperz.PM.Crypto.encryptingFunctions.currentVersion); +// deferredResult.addCallback(Clipperz.Async.setItem, result, 'lock', this.serverLockValue()); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'saveChanges': function () { + var deferredResult; + var messageParameters; + + messageParameters = {}; + + deferredResult = new Clipperz.Async.Deferred("User.saveChangaes", {trace:false}); + + deferredResult.addMethod(this, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'records'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + + deferredResult.addMethod(this, 'getPassphrase'); + deferredResult.addMethod(this, 'prepareRemoteDataWithKey'); + deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'user'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + + deferredResult.addCallback(MochiKit.Async.succeed, messageParameters); + deferredResult.addMethod(this.connection(), 'message', 'saveChanges'); + deferredResult.addCallback(MochiKit.Base.update, this.transientState()) +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); + + deferredResult.addMethod(this, 'commitTransientState'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); +// deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved'); + + deferredResult.addErrbackPass(MochiKit.Base.method(this, 'revertChanges')); +// deferredResult.addErrbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'failureWhileSavingUserData'); + + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + +//----------------------------------------------------------------------------- + +Clipperz.PM.DataModel.User.registerNewAccount = function (anUsername, aPassphraseFunction) { + var deferredResult; + var user; + + user = new Clipperz.PM.DataModel.User({'username':anUsername, 'getPassphraseFunction':aPassphraseFunction}); + + deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.User.registerNewAccount", {trace:false}); + deferredResult.addMethod(user, 'registerAsNewAccount'); + deferredResult.addMethod(user, 'login'); + deferredResult.addCallback(MochiKit.Async.succeed, user); + deferredResult.callback(); + + return deferredResult; +} + +//----------------------------------------------------------------------------- + +Clipperz.PM.DataModel.User.exception = { + LoginFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.LoginFailed"), + CredentialUpgradeFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed") +}; + +//----------------------------------------------------------------------------- diff --git a/frontend/delta/js/Clipperz/PM/Date.js b/frontend/delta/js/Clipperz/PM/Date.js new file mode 100644 index 0000000..a62857e --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Date.js @@ -0,0 +1,196 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; } + +Clipperz.PM.Date.VERSION = "0.1"; +Clipperz.PM.Date.NAME = "Clipperz.PM.Date"; + +MochiKit.Base.update(Clipperz.PM.Date, { + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- + + 'locale': function() { + return { + 'amDesignation': Clipperz.PM.Strings.getValue('calendarStrings.amDesignation'), + 'pmDesignation': Clipperz.PM.Strings.getValue('calendarStrings.pmDesignation'), + 'days': Clipperz.PM.Strings.getValue('calendarStrings.days'), + 'shortDays': Clipperz.PM.Strings.getValue('calendarStrings.shortDays'), + 'shortMonths': Clipperz.PM.Strings.getValue('calendarStrings.shortMonths'), + 'months': Clipperz.PM.Strings.getValue('calendarStrings.months') + } + }, + + //========================================================================= +/* + 'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) { + return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); + }, + + 'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) { + return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); + }, + + //========================================================================= + + 'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) { + return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); + }, + + 'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) { + return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); + }, +*/ + //========================================================================= + + 'formatWithTemplate': function (aTemplate, aDate) { + return Clipperz.PM.Date.formatDateWithTemplate(aDate, aTemplate); + }, + + 'formatDateWithTemplate': function(aDate, aTemplate) { + var result; + + if (aDate == null) { + result = "" + } else { + result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); + }; + + return result; + }, + + 'parseDateWithTemplate': function(aValue, aTemplate) { + return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale()); + }, + + //========================================================================= + + 'formatDateWithUTCFormat': function(aDate) { + return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale()); + }, + + 'parseDateWithUTCFormat': function(aValue) { + var result; + + if (aValue == null) { + result = null; + } else { + result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale()); + } + + return result; + }, + + //========================================================================= + + 'getElapsedTimeDescription': function(aDate) { + var result; + + result = "" + + if (aDate != null) { + var now; + var elapsedTime; + + var millisencondsInAMinute; + var millisencondsInAnHour; + var millisencondsInADay; + var millisencondsInAWeek; + var millisencondsInAMonth; + + now = new Date(); + elapsedTime = now.getTime() - aDate.getTime(); + + millisencondsInAMinute = 60 * 1000; + millisencondsInAnHour = millisencondsInAMinute * 60; + millisencondsInADay = millisencondsInAnHour * 24; + millisencondsInAWeek = millisencondsInADay * 7; + millisencondsInAMonth = millisencondsInAWeek * 5; + + if ((elapsedTime / millisencondsInAMonth) > 1) { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_MONTH_AGO'); + } else if ((elapsedTime / millisencondsInAWeek) > 1) { + var elapsedWeeks; + + elapsedWeeks = Math.floor((elapsedTime / millisencondsInAWeek)); + if (elapsedWeeks == 1) { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_WEEK_AGO'); + } else { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_*_WEEKS_AGO').replace(/__elapsed__/, elapsedWeeks); + } + } else if ((elapsedTime / millisencondsInADay) > 1) { + var elapsedDays; + + elapsedDays = Math.floor((elapsedTime / millisencondsInADay)); + if (elapsedDays == 1) { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.YESTERDAY'); + } else { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_DAYS_AGO').replace(/__elapsed__/, elapsedDays); + } + } else if ((elapsedTime / millisencondsInAnHour) > 1) { + var elapsedHours; + + elapsedHours = Math.floor((elapsedTime / millisencondsInAnHour)); + if (elapsedHours == 1) { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_AN_HOUR_AGO'); + } else { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_HOURS_AGO').replace(/__elapsed__/, elapsedHours); + } + } else { + var elapsed10Minutes; + + elapsed10Minutes = (Math.floor((elapsedTime / millisencondsInAMinute) / 10)) * 10; + if (elapsed10Minutes == 0) { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.JUST_A_FEW_MINUTES_AGO'); + } else { + result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_*_MINUTES_AGO').replace(/__elapsed__/, elapsed10Minutes+""); + } + } + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'parse': function (aValue) { + return Clipperz.PM.Date.parseDateWithUTCFormat(aValue); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + diff --git a/frontend/delta/js/Clipperz/PM/PIN.js b/frontend/delta/js/Clipperz/PM/PIN.js new file mode 100644 index 0000000..a32889a --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/PIN.js @@ -0,0 +1,132 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.PIN) == 'undefined') { Clipperz.PM.PIN = {}; } + +MochiKit.Base.update(Clipperz.PM.PIN, { + + //------------------------------------------------------------------------- + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + 'CREDENTIALS': 'CLIPPERZ.CREDENTIALS', + 'FAILURE_COUNT': 'CLIPPERZ.FAILED_LOGIN_COUNT', + 'ALLOWED_RETRY': 3, + + //------------------------------------------------------------------------- + + 'isSet': function () { + return (this.storedCredentials() != null); + }, + + 'storedCredentials': function () { + return localStorage[this.CREDENTIALS]; + }, + + //------------------------------------------------------------------------- + + 'recordFailedAttempt': function () { + var failureCount; + var result; + + failureCount = localStorage[this.FAILURE_COUNT]; + + if (failureCount == null) { + failureCount = 0 + } + + failureCount ++; + + if (failureCount < this.ALLOWED_RETRY) { + localStorage[this.FAILURE_COUNT] = failureCount; + result = failureCount; + } else { + this.removeLocalCredentials(); + result = -1; + } + + return result; + }, + + 'resetFailedAttemptCount': function () { + localStorage.removeItem(this.FAILURE_COUNT); + }, + + 'failureCount': function () { + return localStorage[this.FAILURE_COUNT]; + }, + + //------------------------------------------------------------------------- + + 'deriveKeyFromPin': function (aPIN) { + return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aPIN)); + }, + + 'credentialsWithPIN': function (aPIN) { + var byteArrayValue; + var decryptedValue; + var result; + + byteArrayValue = (new Clipperz.ByteArray()).appendBase64String(localStorage[this.CREDENTIALS]); + decryptedValue = Clipperz.Crypto.AES.decrypt(this.deriveKeyFromPin(aPIN), byteArrayValue).asString(); + try { + result = Clipperz.Base.evalJSON(decryptedValue); + } catch (error) { + result = {'username':'fakeusername', 'passphrase':'fakepassphrase'}; + } + + return result; + }, + + 'setCredentialsWithPIN': function (aPIN, someCredentials) { + var encodedValue; + var byteArrayValue; + var encryptedValue; + + encodedValue = Clipperz.Base.serializeJSON(someCredentials); + byteArrayValue = new Clipperz.ByteArray(encodedValue); + encryptedValue = Clipperz.Crypto.AES.encrypt(this.deriveKeyFromPin(aPIN), byteArrayValue).toBase64String(); + + localStorage[this.CREDENTIALS] = encryptedValue; + }, + + 'removeLocalCredentials': function () { + localStorage.removeItem(this.CREDENTIALS); + localStorage.removeItem(this.FAILURE_COUNT); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + diff --git a/frontend/delta/js/Clipperz/PM/Proxy.js b/frontend/delta/js/Clipperz/PM/Proxy.js new file mode 100644 index 0000000..2ac684a --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Proxy.js @@ -0,0 +1,186 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } + +//============================================================================= + +Clipperz.PM.Proxy = function(args) { + args = args || {}; + + this._shouldPayTolls = args.shouldPayTolls || false; + + this._tolls = { + 'CONNECT': [], + 'REGISTER': [], + 'MESSAGE': [] + }; + + if (args.isDefault === true) { + Clipperz.PM.Proxy.defaultProxy = this; + } + + return this; +} + +Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "Clipperz.PM.Proxy"; + }, + + //========================================================================= + + 'shouldPayTolls': function() { + return this._shouldPayTolls; + }, + + //------------------------------------------------------------------------- + + 'tolls': function() { + return this._tolls; + }, + + //------------------------------------------------------------------------- + + 'payToll': function(aRequestType, someParameters) { + var deferredResult; + + if (this.shouldPayTolls()) { + deferredResult = new Clipperz.Async.Deferred("Proxy.payToll", {trace:false}); + + if (this.tolls()[aRequestType].length == 0) { + deferredResult.addMethod(this, 'sendMessage', 'knock', {requestType:aRequestType}); + deferredResult.addMethod(this, 'setTollCallback'); + } + deferredResult.addMethod(this.tolls()[aRequestType], 'pop'); + deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay')); + deferredResult.addCallback(function(aToll) { + var result; + + result = { + parameters: someParameters, + toll: aToll + } + + return result; + }); + + deferredResult.callback(); + } else { + deferredResult = MochiKit.Async.succeed({parameters:someParameters}); + } + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addToll': function(aToll) { + this.tolls()[aToll.requestType()].push(aToll); + }, + + //========================================================================= + + 'setTollCallback': function(someParameters) { + if (typeof(someParameters['toll']) != 'undefined') { + this.addToll(new Clipperz.PM.Toll(someParameters['toll'])); + } + + return someParameters['result']; + }, + + //========================================================================= + + 'registration': function (someParameters) { + return this.processMessage('registration', someParameters, 'REGISTER'); + }, + + 'handshake': function (someParameters) { + return this.processMessage('handshake', someParameters, 'CONNECT'); + }, + + 'message': function (someParameters) { + return this.processMessage('message', someParameters, 'MESSAGE'); + }, + + 'logout': function (someParameters) { + return this.processMessage('logout', someParameters, 'MESSAGE'); + }, + + //========================================================================= + + 'processMessage': function (aFunctionName, someParameters, aRequestType) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false}); + deferredResult.addMethod(this, 'payToll', aRequestType); + deferredResult.addMethod(this, 'sendMessage', aFunctionName); + deferredResult.addMethod(this, 'setTollCallback'); + deferredResult.callback(someParameters); + + return deferredResult; + }, + + //========================================================================= + + '_sendMessage': function (aFunctionName, aVersion, someParameters) { + throw Clipperz.Base.exception.AbstractMethod; + }, + + 'sendMessage': function (aFunctionName, someParameters) { + var deferredResult; + +// TODO: read actual application version for a property set at build time + deferredResult = new Clipperz.Async.Deferred("Proxy.sendMessage", {trace:false}); + deferredResult.addMethod(this, '_sendMessage', aFunctionName, 'fake-app-version'); + deferredResult.addErrback(MochiKit.Base.method(this, 'handleError')); + deferredResult.callback(someParameters); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'handleError': function (anError) { + if (anError['message'] == 'Wrong application version') { + anError['isPermanent'] = true; + } + return anError; + }, + + //========================================================================= + + 'isReadOnly': function () { + return false; + }, + + 'canRegisterNewUsers': function () { + return true; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" + +}); diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.JSON.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.JSON.js new file mode 100755 index 0000000..1638d99 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.JSON.js @@ -0,0 +1,86 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } + +//============================================================================= + +Clipperz.PM.Proxy.JSON = function(args) { + Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args); + + this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter'); + + return this; +} + +Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, { + + 'toString': function() { + return "Clipperz.PM.Proxy.JSON"; + }, + + //========================================================================= + + 'url': function () { + return this._url; + }, + + //========================================================================= + + '_sendMessage': function(aFunctionName, aVersion, someParameters) { + var deferredResult; + var parameters; + + parameters = { + method: aFunctionName, + version: aVersion, + parameters: Clipperz.Base.serializeJSON(someParameters) + }; + + deferredResult = new Clipperz.Async.Deferred("Proxy.JSON.sendMessage", {trace:false}); + deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent'); + deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), { + method:'POST', + sendContent:MochiKit.Base.queryString(parameters), + headers:{"Content-Type":"application/x-www-form-urlencoded"} + }); + deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived'); + deferredResult.addCallback(MochiKit.Base.itemgetter('responseText')); + deferredResult.addCallback(Clipperz.Base.evalJSON); + deferredResult.addCallback(function (someValues) { + if (someValues['result'] == 'EXCEPTION') { + throw someValues['message']; + } + + return someValues; + }) + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" + +}); diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js new file mode 100644 index 0000000..5711742 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js @@ -0,0 +1,793 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!"; +} + +//============================================================================= + +Clipperz.PM.Proxy.Offline.DataStore = function(args) { + args = args || {}; + + this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null); + this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly); + this._shouldPayTolls = args.shouldPayTolls || false; + + this._tolls = {}; + this._currentStaticConnection = null; + + return this; +} + +Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, { + + //------------------------------------------------------------------------- + + 'isReadOnly': function () { + return this._isReadOnly; + }, + + 'canRegisterNewUsers': function () { + return false; + }, + + + //------------------------------------------------------------------------- + + 'shouldPayTolls': function() { + return this._shouldPayTolls; + }, + + //------------------------------------------------------------------------- + + 'data': function () { + return this._data; + }, + + //------------------------------------------------------------------------- + + 'tolls': function () { + return this._tolls; + }, + + //========================================================================= + + 'resetData': function() { + this._data = { + 'users': { + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + } + } + }; + }, + + //------------------------------------------------------------------------- + + 'setupWithEncryptedData': function(someData) { + this._data = Clipperz.Base.deepClone(someData); + }, + + //------------------------------------------------------------------------- + + 'setupWithData': function(someData) { + var deferredResult; + var resultData; + var i, c; + +//Clipperz.log(">>> Proxy.Test.setupWithData"); + resultData = this._data; + + deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false}); + c = someData['users'].length; + + for (i=0; i<c; i++) { + var newConnection; + var recordConfiguration; + + deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]); + deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) { + resultData['users'][aUserSerializationContext['credentials']['C']] = { + 's': aUserSerializationContext['credentials']['s'], + 'v': aUserSerializationContext['credentials']['v'], + 'version': aUserSerializationContext['data']['connectionVersion'], + 'userDetails': aUserSerializationContext['encryptedData']['user']['header'], + 'userDetailsVersion': aUserSerializationContext['encryptedData']['user']['version'], + 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'], + 'lock': aUserSerializationContext['encryptedData']['user']['lock'], + 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records']) + } + }, this)); + } + + deferredResult.addCallback(MochiKit.Base.bind(function() { + this._data = resultData; + }, this)); + + deferredResult.callback(); +//Clipperz.log("<<< Proxy.Test.setupWithData"); + + return deferredResult; + }, + + //========================================================================= + + 'getTollForRequestType': function (aRequestType) { + var result; + var targetValue; + var cost; + + targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + switch (aRequestType) { + case 'REGISTER': + cost = 5; + break; + case 'CONNECT': + cost = 5; + break; + case 'MESSAGE': + cost = 2; + break; + } + + result = { + requestType: aRequestType, + targetValue: targetValue, + cost: cost + } + + if (this.shouldPayTolls()) { + this.tolls()[targetValue] = result; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'checkToll': function (aFunctionName, someParameters) { + if (this.shouldPayTolls()) { + var localToll; + var tollParameters; + + tollParameters = someParameters['toll']; + localToll = this.tolls()[tollParameters['targetValue']]; + + if (localToll != null) { + if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) { + throw "Toll value too low."; + }; + } else { + throw "Missing toll"; + } + } + }, + + //========================================================================= + + 'currentStaticConnection': function () { + if (this._currentStaticConnection == null) { + this._currentStaticConnection = {}; + } + + return this._currentStaticConnection; + }, + + //------------------------------------------------------------------------- + + 'getConnectionForRequest': function (aFunctionName, someParameters) { + var result; + + if (this.shouldPayTolls()) { + if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) { + result = this.tolls()[someParameters['toll']['targetValue']]['connection']; + if (typeof(result) == 'undefined') { + result = {}; + } + } else { + result = {}; + } + } else { + result = this.currentStaticConnection(); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) { + if (this.shouldPayTolls()) { + if ((typeof(aResponse['toll']) != 'undefined') + && (typeof(aResponse['toll']['targetValue']) != 'undefined') + && (typeof(this.tolls()[aResponse['toll']['targetValue']]) != 'undefined') + ) { + this.tolls()[aResponse['toll']['targetValue']]['connection'] = aConnection; + } + } + }, + + //========================================================================= + + 'processMessage': function (aFunctionName, someParameters) { + var result; + var connection; + + connection = this.getConnectionForRequest(aFunctionName, someParameters); + + switch(aFunctionName) { + case 'knock': + result = this._knock(connection, someParameters); + break; + case 'registration': + this.checkToll(aFunctionName, someParameters); + result = this._registration(connection, someParameters.parameters); + break; + case 'handshake': + this.checkToll(aFunctionName, someParameters); + result = this._handshake(connection, someParameters.parameters); + break; + case 'message': + this.checkToll(aFunctionName, someParameters); + result = this._message(connection, someParameters.parameters); + break; + case 'logout': + this._currentStaticConnection = null; + result = this._logout(connection, someParameters.parameters); + break; + } + + this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result); + + return MochiKit.Async.succeed(result); + }, + + //========================================================================= + + '_knock': function(aConnection, someParameters) { + var result; + + result = { + toll: this.getTollForRequestType(someParameters['requestType']) + } + + return result; + }, + + //------------------------------------------------------------------------- + + '_registration': function(aConnection, someParameters) { + if (this.isReadOnly() == false) { + if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') { + this.data()['users'][someParameters['credentials']['C']] = { + 's': someParameters['credentials']['s'], + 'v': someParameters['credentials']['v'], + 'version': someParameters['credentials']['version'], +// 'lock': Clipperz.Crypto.Base.generateRandomSeed(), + 'userDetails': someParameters['user']['header'], + 'statistics': someParameters['user']['statistics'], + 'userDetailsVersion': someParameters['user']['version'], + 'records': {} + } + } else { + throw "user already exists"; + } + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } + + result = { + result: { + 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'], + 'result': 'done' + }, + toll: this.getTollForRequestType('CONNECT') + } + + return result; + }, + + //------------------------------------------------------------------------- + + '_handshake': function(aConnection, someParameters) { + var result; + var nextTollRequestType; + + result = {}; + if (someParameters.message == "connect") { + var userData; + var randomBytes; + var v; + + userData = this.data()['users'][someParameters.parameters.C]; + + if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) { + aConnection['userData'] = userData; + aConnection['C'] = someParameters.parameters.C; + } else { + aConnection['userData'] = this.data()['users']['catchAllUser']; + } + + randomBytes = Clipperz.Crypto.Base.generateRandomSeed(); + aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16); + v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); + aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n())); + + aConnection['A'] = someParameters.parameters.A; + + result['s'] = aConnection['userData']['s']; + result['B'] = aConnection['B'].asString(16); + + nextTollRequestType = 'CONNECT'; + } else if (someParameters.message == "credentialCheck") { + var v, u, S, A, K, M1; + + v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); + u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16); + A = new Clipperz.Crypto.BigInt(aConnection['A'], 16); + S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()); + + K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2); + + M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2); + if (someParameters.parameters.M1 == M1) { + var M2; + + M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2); + result['M2'] = M2; + } else { + throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error"); + } + + nextTollRequestType = 'MESSAGE'; + } else if (someParameters.message == "oneTimePassword") { + var otpData; + + otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey]; + + try { + if (typeof(otpData) != 'undefined') { + if (otpData['status'] == 'ACTIVE') { + if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) { + result = { + 'data': otpData['data'], + 'version': otpData['version'] + } + + otpData['status'] = 'REQUESTED'; + } else { + otpData['status'] = 'DISABLED'; + throw "The requested One Time Password has been disabled, due to a wrong keyChecksum"; + } + } else { + throw "The requested One Time Password was not active"; + } + } else { + throw "The requested One Time Password has not been found" + } + } catch (exception) { + result = { + 'data': Clipperz.PM.Crypto.randomKey(), + 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion + } + } + nextTollRequestType = 'CONNECT'; + } else { + Clipperz.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message); + } + + result = { + result: result, + toll: this.getTollForRequestType(nextTollRequestType) + } + + return result; + }, + + //------------------------------------------------------------------------- + + '_message': function(aConnection, someParameters) { + var result; + + result = {}; + + //===================================================================== + // + // R E A D - O N L Y M e t h o d s + // + //===================================================================== + if (someParameters.message == 'getUserDetails') { + var recordsStats; + var recordReference; + + recordsStats = {}; + for (recordReference in aConnection['userData']['records']) { + recordsStats[recordReference] = { + 'updateDate': aConnection['userData']['records'][recordReference]['updateDate'] + } + } + + result['header'] = this.userDetails(aConnection); + result['statistics'] = this.statistics(aConnection); + result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords']; + result['version'] = aConnection['userData']['userDetailsVersion']; + result['recordsStats'] = recordsStats; + + if (this.isReadOnly() == false) { + var lock; + + if (typeof(aConnection['userData']['lock']) == 'undefined') { + aConnection['userData']['lock'] = "<<LOCK>>"; + } + + result['lock'] = aConnection['userData']['lock']; + } + + //===================================================================== + } else if (someParameters.message == 'getRecordDetail') { +/* + var recordData; + var currentVersionData; + + recordData = this.userData()['records'][someParameters['parameters']['reference']]; + result['reference'] = someParameters['parameters']['reference']; + result['data'] = recordData['data']; + result['version'] = recordData['version']; + result['creationData'] = recordData['creationDate']; + result['updateDate'] = recordData['updateDate']; + result['accessDate'] = recordData['accessDate']; + + currentVersionData = recordData['versions'][recordData['currentVersion']]; + + result['currentVersion'] = {}; + result['currentVersion']['reference'] = recordData['currentVersion']; + result['currentVersion']['version'] = currentVersionData['version']; + result['currentVersion']['header'] = currentVersionData['header']; + result['currentVersion']['data'] = currentVersionData['data']; + result['currentVersion']['creationData'] = currentVersionData['creationDate']; + result['currentVersion']['updateDate'] = currentVersionData['updateDate']; + result['currentVersion']['accessDate'] = currentVersionData['accessDate']; + if (typeof(currentVersionData['previousVersion']) != 'undefined') { + result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey']; + result['currentVersion']['previousVersion'] = currentVersionData['previousVersion']; + } +*/ + MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]); + result['reference'] = someParameters['parameters']['reference']; + + //===================================================================== + // + // R E A D - W R I T E M e t h o d s + // + //===================================================================== + } else if (someParameters.message == 'upgradeUserCredentials') { + if (this.isReadOnly() == false) { + var parameters; + var credentials; + + parameters = someParameters['parameters']; + credentials = parameters['credentials']; + + if ((credentials['C'] == null) + || (credentials['s'] == null) + || (credentials['v'] == null) + || (credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion) + ) { + result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed; + } else { + var oldCValue; + oldCValue = aConnection['C']; + + this.data()['users'][credentials['C']] = aConnection['userData']; + aConnection['C'] = credentials['C']; + + aConnection['userData']['s'] = credentials['s']; + aConnection['userData']['v'] = credentials['v']; + aConnection['userData']['version'] = credentials['version']; + + aConnection['userData']['userDetails'] = parameters['user']['header']; + aConnection['userData']['userDetailsVersion'] = parameters['user']['version']; + aConnection['userData']['statistics'] = parameters['user']['statistics']; + + aConnection['userData']['lock'] = parameters['user']['lock']; + + delete this.data()['users'][oldCValue]; + + result = {result:"done", parameters:parameters}; + } + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } + //===================================================================== +/* } else if (someParameters.message == 'updateData') { + if (this.isReadOnly() == false) { + var i, c; + + if (this.userData()['lock'] != someParameters['parameters']['user']['lock']) { + throw "the lock attribute is not processed correctly" + } + + this.userData()['userDetails'] = someParameters['parameters']['user']['header']; + this.userData()['statistics'] = someParameters['parameters']['user']['statistics']; + this.userData()['userDetailsVersions'] = someParameters['parameters']['user']['version']; + + c = someParameters['parameters']['records'].length; + for (i=0; i<c; i++) { + var currentRecord; + var currentRecordData; + + currentRecordData = someParameters['parameters']['records'][i]; + currentRecord = this.userData()['records'][currentRecordData['record']['reference']]; + + if (currentRecord == null) { + } + + currentRecord['data'] = currentRecordData['record']['data']; + currentRecord['version'] = currentRecordData['record']['version']; + currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference']; + + currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = { + 'data': currentRecordData['currentRecordVersion']['data'], + 'version': currentRecordData['currentRecordVersion']['version'], + 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'], + 'previousVersionKey': currentRecordData['currentRecordVersion']['previousVersionKey'] + } + } + + this.userData()['lock'] = Clipperz.PM.Crypto.randomKey(); + result['lock'] = this.userData()['lock']; + result['result'] = 'done'; + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } +*/ //===================================================================== + } else if (someParameters.message == 'saveChanges') { + if (this.isReadOnly() == false) { + var i, c; + + if (aConnection['userData']['lock'] != someParameters['parameters']['user']['lock']) { + throw "the lock attribute is not processed correctly" + } + + aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header']; + aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics']; + aConnection['userData']['userDetailsVersion'] = someParameters['parameters']['user']['version']; + + c = someParameters['parameters']['records']['updated'].length; + for (i=0; i<c; i++) { + var currentRecord; + var currentRecordData; + + currentRecordData = someParameters['parameters']['records']['updated'][i]; + currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']]; + + if ( + (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined') + && + (typeof(currentRecordData['currentRecordVersion']) == 'undefined') + ) { + throw "Record added without a recordVersion"; + } + + if (currentRecord == null) { + currentRecord = {}; + currentRecord['versions'] = {}; + currentRecord['creationDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + + aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord; + } + + currentRecord['data'] = currentRecordData['record']['data']; + currentRecord['version'] = currentRecordData['record']['version']; + currentRecord['updateDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + + if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') { + currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference']; + currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = { + 'data': currentRecordData['currentRecordVersion']['data'], + 'version': currentRecordData['currentRecordVersion']['version'], + 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'], + 'previousVersionKey': currentRecordData['currentRecordVersion']['previousVersionKey'], + 'creationDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), + 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), + 'accessDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()) + } + } + } + + c = someParameters['parameters']['records']['deleted'].length; + for (i=0; i<c; i++) { + var currentRecordReference; + + currentRecordReference = someParameters['parameters']['records']['deleted'][i]; + delete aConnection['userData']['records'][currentRecordReference]; + } + + aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey(); + result['lock'] = aConnection['userData']['lock']; + result['result'] = 'done'; + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } + + //===================================================================== + // + // U N H A N D L E D M e t h o d + // + //===================================================================== + } else { + Clipperz.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message); + } + + result = { + result: result, + toll: this.getTollForRequestType('MESSAGE') + } + +// return MochiKit.Async.succeed(result); + return result; + }, + + //------------------------------------------------------------------------- + + '_logout': function(someParameters) { +// return MochiKit.Async.succeed({result: 'done'}); + return {result: 'done'}; + }, + + //========================================================================= + //######################################################################### + + 'isTestData': function(aConnection) { + return (typeof(aConnection['userData']['__masterkey_test_value__']) != 'undefined'); + }, + + 'userDetails': function(aConnection) { + var result; + + if (this.isTestData(aConnection)) { + var serializedHeader; + var version; + +//Clipperz.logDebug("### test data"); + version = aConnection['userData']['userDetailsVersion']; + serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']); + result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader); + } else { +//Clipperz.logDebug("### NOT test data"); + result = aConnection['userData']['userDetails']; + } + + return result; + }, + + 'statistics': function(aConnection) { + var result; + + if (aConnection['userData']['statistics'] != null) { + if (this.isTestData(aConnection)) { + var serializedStatistics; + var version; + + version = aConnection['userData']['userDetailsVersion']; + serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']); + result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics); + } else { + result = aConnection['userData']['statistics']; + } + } else { + result = null; + } + + return result; + }, + +/* + 'userSerializedEncryptedData': function(someData) { + var deferredResult; + var deferredContext; + + deferredContext = { 'data': someData }; + + deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false}); + deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) { + aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']); + return aDeferredContext; + }, this)); + deferredResult.addCallback(function(aDeferredContext) { +// return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']); + return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']); + }); + deferredResult.addCallback(function(aUserEncryptedData) { + deferredContext['encryptedData'] = aUserEncryptedData; + return deferredContext; + }); + deferredResult.addCallback(function(aDeferredContext) { + var connection; + + connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]() + aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase()); + + return aDeferredContext; + }); + +// deferredResult.addCallback(function(aDeferredContext) { +// return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']); +// }, deferredContext); +// deferredResult.addCallback(function(aUserSerializedData) { +// }); +// +// deferredResult.addCallback(MochiKit.Async.succeed, deferredContext); + deferredResult.callback(deferredContext); + + return deferredResult; + }, + + 'createUserUsingConfigurationData': function(someData) { + var result; + var user; + var recordLabel; + + user = new Clipperz.PM.DataModel.User(); + user.initForTests(); + user.setUsername(someData['username']); + user.setPassphrase(someData['passphrase']); + + for (recordLabel in someData['records']) { + var recordData; + var record; + var i, c; + + recordData = someData['records'][recordLabel]; + record = new Clipperz.PM.DataModel.Record({user:user, label:recordLabel}); + record.setNotes(recordData['notes']); + + c = recordData['fields'].length; + for (i=0; i<c; i++) { + var recordField; + + recordField = new Clipperz.PM.DataModel.RecordField(); + recordField.setLabel(recordData['fields'][i]['name']); + recordField.setValue(recordData['fields'][i]['value']); + recordField.setType(recordData['fields'][i]['type']); + record.addField(recordField); + } + user.addRecord(record, true); + } + + result = user; + + return result; + }, +*/ + //========================================================================= + __syntaxFix__: "syntax fix" +}); + +Clipperz.PM.Proxy.Offline.DataStore['exception'] = { + 'ReadOnly': new MochiKit.Base.NamedError("Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly") +};
\ No newline at end of file diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js new file mode 100644 index 0000000..a3c238c --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js @@ -0,0 +1,420 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.Proxy.Offline.DataStore) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.Proxy.Offline.LocalStorageDataStore depends on Clipperz.PM.Proxy.Offline.DataStore!"; +} + +//============================================================================= + +Clipperz.PM.Proxy.Offline.LocalStorageDataStore = function(args) { + args = args || {}; + + this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null); + this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly); + this._shouldPayTolls = args.shouldPayTolls || false; + + this._tolls = {}; + this._currentStaticConnection = null; + +// Clipperz.PM.Proxy.Offline.LocalStorageDataStore.superclass.constructor.apply(this, arguments); + + return this; +} + +Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.LocalStorageDataStore, Clipperz.PM.Proxy.Offline.DataStore, { + + //========================================================================= + + '_knock': function(aConnection, someParameters) { + var result; + + result = { + toll: this.getTollForRequestType(someParameters['requestType']) + } + + return result; + }, + + //------------------------------------------------------------------------- + + '_registration': function(aConnection, someParameters) { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + }, + + //------------------------------------------------------------------------- + + '_handshake': function(aConnection, someParameters) { + var result; + var nextTollRequestType; + + result = {}; + if (someParameters.message == "connect") { + var userData; + var randomBytes; + var v; + + userData = this.data()['users'][someParameters.parameters.C]; + + if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) { + aConnection['userData'] = userData; + aConnection['C'] = someParameters.parameters.C; + } else { + aConnection['userData'] = this.data()['users']['catchAllUser']; + } + + randomBytes = Clipperz.Crypto.Base.generateRandomSeed(); + aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16); + v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); + aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n())); + + aConnection['A'] = someParameters.parameters.A; + + result['s'] = aConnection['userData']['s']; + result['B'] = aConnection['B'].asString(16); + + nextTollRequestType = 'CONNECT'; + } else if (someParameters.message == "credentialCheck") { + var v, u, S, A, K, M1; + + v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); + u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16); + A = new Clipperz.Crypto.BigInt(aConnection['A'], 16); + S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()); + + K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2); + + M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2); + if (someParameters.parameters.M1 == M1) { + var M2; + + M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2); + result['M2'] = M2; + } else { + throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error"); + } + + nextTollRequestType = 'MESSAGE'; + } else if (someParameters.message == "oneTimePassword") { + var otpData; + + otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey]; + + try { + if (typeof(otpData) != 'undefined') { + if (otpData['status'] == 'ACTIVE') { + if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) { + result = { + 'data': otpData['data'], + 'version': otpData['version'] + } + + otpData['status'] = 'REQUESTED'; + } else { + otpData['status'] = 'DISABLED'; + throw "The requested One Time Password has been disabled, due to a wrong keyChecksum"; + } + } else { + throw "The requested One Time Password was not active"; + } + } else { + throw "The requested One Time Password has not been found" + } + } catch (exception) { + result = { + 'data': Clipperz.PM.Crypto.randomKey(), + 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion + } + } + nextTollRequestType = 'CONNECT'; + } else { + Clipperz.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message); + } + + result = { + result: result, + toll: this.getTollForRequestType(nextTollRequestType) + } + + return result; + }, + + //------------------------------------------------------------------------- + + '_message': function(aConnection, someParameters) { + var result; + + result = {}; + + //===================================================================== + // + // R E A D - O N L Y M e t h o d s + // + //===================================================================== + if (someParameters.message == 'getUserDetails') { + var recordsStats; + var recordReference; + + recordsStats = {}; + for (recordReference in aConnection['userData']['records']) { + recordsStats[recordReference] = { + 'updateDate': aConnection['userData']['records'][recordReference]['updateDate'] + } + } + + result['header'] = this.userDetails(aConnection); + result['statistics'] = this.statistics(aConnection); + result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords']; + result['version'] = aConnection['userData']['userDetailsVersion']; + result['recordsStats'] = recordsStats; + + if (this.isReadOnly() == false) { + var lock; + + if (typeof(aConnection['userData']['lock']) == 'undefined') { + aConnection['userData']['lock'] = "<<LOCK>>"; + } + + result['lock'] = aConnection['userData']['lock']; + } + + //===================================================================== + } else if (someParameters.message == 'getRecordDetail') { +/* + var recordData; + var currentVersionData; + + recordData = this.userData()['records'][someParameters['parameters']['reference']]; + result['reference'] = someParameters['parameters']['reference']; + result['data'] = recordData['data']; + result['version'] = recordData['version']; + result['creationData'] = recordData['creationDate']; + result['updateDate'] = recordData['updateDate']; + result['accessDate'] = recordData['accessDate']; + + currentVersionData = recordData['versions'][recordData['currentVersion']]; + + result['currentVersion'] = {}; + result['currentVersion']['reference'] = recordData['currentVersion']; + result['currentVersion']['version'] = currentVersionData['version']; + result['currentVersion']['header'] = currentVersionData['header']; + result['currentVersion']['data'] = currentVersionData['data']; + result['currentVersion']['creationData'] = currentVersionData['creationDate']; + result['currentVersion']['updateDate'] = currentVersionData['updateDate']; + result['currentVersion']['accessDate'] = currentVersionData['accessDate']; + if (typeof(currentVersionData['previousVersion']) != 'undefined') { + result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey']; + result['currentVersion']['previousVersion'] = currentVersionData['previousVersion']; + } +*/ + MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]); + result['reference'] = someParameters['parameters']['reference']; + + //===================================================================== + // + // R E A D - W R I T E M e t h o d s + // + //===================================================================== + } else if (someParameters.message == 'upgradeUserCredentials') { + if (this.isReadOnly() == false) { + var parameters; + var credentials; + + parameters = someParameters['parameters']; + credentials = parameters['credentials']; + + if ((credentials['C'] == null) + || (credentials['s'] == null) + || (credentials['v'] == null) + || (credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion) + ) { + result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed; + } else { + var oldCValue; + oldCValue = aConnection['C']; + + this.data()['users'][credentials['C']] = aConnection['userData']; + aConnection['C'] = credentials['C']; + + aConnection['userData']['s'] = credentials['s']; + aConnection['userData']['v'] = credentials['v']; + aConnection['userData']['version'] = credentials['version']; + + aConnection['userData']['userDetails'] = parameters['user']['header']; + aConnection['userData']['userDetailsVersion'] = parameters['user']['version']; + aConnection['userData']['statistics'] = parameters['user']['statistics']; + + aConnection['userData']['lock'] = parameters['user']['lock']; + + delete this.data()['users'][oldCValue]; + + result = {result:"done", parameters:parameters}; + } + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } + + //===================================================================== + + } else if (someParameters.message == 'saveChanges') { + if (this.isReadOnly() == false) { + var i, c; + + if (aConnection['userData']['lock'] != someParameters['parameters']['user']['lock']) { + throw "the lock attribute is not processed correctly" + } + + aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header']; + aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics']; + aConnection['userData']['userDetailsVersion'] = someParameters['parameters']['user']['version']; + + c = someParameters['parameters']['records']['updated'].length; + for (i=0; i<c; i++) { + var currentRecord; + var currentRecordData; + + currentRecordData = someParameters['parameters']['records']['updated'][i]; + currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']]; + + if ( + (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined') + && + (typeof(currentRecordData['currentRecordVersion']) == 'undefined') + ) { + throw "Record added without a recordVersion"; + } + + if (currentRecord == null) { + currentRecord = {}; + currentRecord['versions'] = {}; + currentRecord['creationDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + + aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord; + } + + currentRecord['data'] = currentRecordData['record']['data']; + currentRecord['version'] = currentRecordData['record']['version']; + currentRecord['updateDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + + if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') { + currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference']; + currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = { + 'data': currentRecordData['currentRecordVersion']['data'], + 'version': currentRecordData['currentRecordVersion']['version'], + 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'], + 'previousVersionKey': currentRecordData['currentRecordVersion']['previousVersionKey'], + 'creationDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), + 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), + 'accessDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()) + } + } + } + + c = someParameters['parameters']['records']['deleted'].length; + for (i=0; i<c; i++) { + var currentRecordReference; + + currentRecordReference = someParameters['parameters']['records']['deleted'][i]; + delete aConnection['userData']['records'][currentRecordReference]; + } + + aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey(); + result['lock'] = aConnection['userData']['lock']; + result['result'] = 'done'; + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } + + //===================================================================== + // + // U N H A N D L E D M e t h o d + // + //===================================================================== + } else { + Clipperz.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message); + } + + result = { + result: result, + toll: this.getTollForRequestType('MESSAGE') + } + +// return MochiKit.Async.succeed(result); + return result; + }, + + //------------------------------------------------------------------------- + + '_logout': function(someParameters) { +// return MochiKit.Async.succeed({result: 'done'}); + return {result: 'done'}; + }, + + //========================================================================= + //######################################################################### +/* + 'userDetails': function(aConnection) { + var result; + + if (this.isTestData(aConnection)) { + var serializedHeader; + var version; + +//Clipperz.logDebug("### test data"); + version = aConnection['userData']['userDetailsVersion']; + serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']); + result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader); + } else { +//Clipperz.logDebug("### NOT test data"); + result = aConnection['userData']['userDetails']; + } + + return result; + }, + + 'statistics': function(aConnection) { + var result; + + if (aConnection['userData']['statistics'] != null) { + if (this.isTestData(aConnection)) { + var serializedStatistics; + var version; + + version = aConnection['userData']['userDetailsVersion']; + serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']); + result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics); + } else { + result = aConnection['userData']['statistics']; + } + } else { + result = null; + } + + return result; + }, +*/ + //========================================================================= + __syntaxFix__: "syntax fix" +}); + diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js new file mode 100644 index 0000000..ecc4408 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js @@ -0,0 +1,643 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +try { if (typeof(Clipperz.PM.Proxy.Offline.DataStore) == 'undefined') { throw ""; }} catch (e) { + throw "Clipperz.PM.Proxy.Offline.MemoryDataStore depends on Clipperz.PM.Proxy.Offline.DataStore!"; +} + +//============================================================================= + +Clipperz.PM.Proxy.Offline.MemoryDataStore = function(args) { + args = args || {}; + + this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null); + this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly); + this._shouldPayTolls = args.shouldPayTolls || false; + + this._tolls = {}; + this._currentStaticConnection = null; + + return this; +} + +Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.MemoryDataStore, Clipperz.PM.Proxy.Offline.DataStore, { + + //========================================================================= + + 'resetData': function() { + this._data = { + 'users': { + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + } + } + }; + }, + + //------------------------------------------------------------------------- + + 'setupWithEncryptedData': function(someData) { + this._data = Clipperz.Base.deepClone(someData); + }, + + //------------------------------------------------------------------------- + + 'setupWithData': function(someData) { + var deferredResult; + var resultData; + var i, c; + +//Clipperz.log(">>> Proxy.Test.setupWithData"); + resultData = this._data; + + deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false}); + c = someData['users'].length; + + for (i=0; i<c; i++) { + var newConnection; + var recordConfiguration; + + deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]); + deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) { + resultData['users'][aUserSerializationContext['credentials']['C']] = { + 's': aUserSerializationContext['credentials']['s'], + 'v': aUserSerializationContext['credentials']['v'], + 'version': aUserSerializationContext['data']['connectionVersion'], + 'userDetails': aUserSerializationContext['encryptedData']['user']['header'], + 'userDetailsVersion': aUserSerializationContext['encryptedData']['user']['version'], + 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'], + 'lock': aUserSerializationContext['encryptedData']['user']['lock'], + 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records']) + } + }, this)); + } + + deferredResult.addCallback(MochiKit.Base.bind(function() { + this._data = resultData; + }, this)); + + deferredResult.callback(); +//Clipperz.log("<<< Proxy.Test.setupWithData"); + + return deferredResult; + }, + + //========================================================================= + + 'getTollForRequestType': function (aRequestType) { + var result; + var targetValue; + var cost; + + targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + switch (aRequestType) { + case 'REGISTER': + cost = 5; + break; + case 'CONNECT': + cost = 5; + break; + case 'MESSAGE': + cost = 2; + break; + } + + result = { + requestType: aRequestType, + targetValue: targetValue, + cost: cost + } + + if (this.shouldPayTolls()) { + this.tolls()[targetValue] = result; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'checkToll': function (aFunctionName, someParameters) { + if (this.shouldPayTolls()) { + var localToll; + var tollParameters; + + tollParameters = someParameters['toll']; + localToll = this.tolls()[tollParameters['targetValue']]; + + if (localToll != null) { + if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) { + throw "Toll value too low."; + }; + } else { + throw "Missing toll"; + } + } + }, + + //========================================================================= + + 'currentStaticConnection': function () { + if (this._currentStaticConnection == null) { + this._currentStaticConnection = {}; + } + + return this._currentStaticConnection; + }, + + //------------------------------------------------------------------------- + + 'getConnectionForRequest': function (aFunctionName, someParameters) { + var result; + + if (this.shouldPayTolls()) { + if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) { + result = this.tolls()[someParameters['toll']['targetValue']]['connection']; + if (typeof(result) == 'undefined') { + result = {}; + } + } else { + result = {}; + } + } else { + result = this.currentStaticConnection(); + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) { + if (this.shouldPayTolls()) { + if ((typeof(aResponse['toll']) != 'undefined') + && (typeof(aResponse['toll']['targetValue']) != 'undefined') + && (typeof(this.tolls()[aResponse['toll']['targetValue']]) != 'undefined') + ) { + this.tolls()[aResponse['toll']['targetValue']]['connection'] = aConnection; + } + } + }, + + //========================================================================= + + 'processMessage': function (aFunctionName, someParameters) { + var result; + var connection; + + connection = this.getConnectionForRequest(aFunctionName, someParameters); + + switch(aFunctionName) { + case 'knock': + result = this._knock(connection, someParameters); + break; + case 'registration': + this.checkToll(aFunctionName, someParameters); + result = this._registration(connection, someParameters.parameters); + break; + case 'handshake': + this.checkToll(aFunctionName, someParameters); + result = this._handshake(connection, someParameters.parameters); + break; + case 'message': + this.checkToll(aFunctionName, someParameters); + result = this._message(connection, someParameters.parameters); + break; + case 'logout': + this._currentStaticConnection = null; + result = this._logout(connection, someParameters.parameters); + break; + } + + this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result); + + return MochiKit.Async.succeed(result); + }, + + //========================================================================= + + '_knock': function(aConnection, someParameters) { + var result; + + result = { + toll: this.getTollForRequestType(someParameters['requestType']) + } + + return result; + }, + + //------------------------------------------------------------------------- + + '_registration': function(aConnection, someParameters) { + if (this.isReadOnly() == false) { + if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') { + this.data()['users'][someParameters['credentials']['C']] = { + 's': someParameters['credentials']['s'], + 'v': someParameters['credentials']['v'], + 'version': someParameters['credentials']['version'], +// 'lock': Clipperz.Crypto.Base.generateRandomSeed(), + 'userDetails': someParameters['user']['header'], + 'statistics': someParameters['user']['statistics'], + 'userDetailsVersion': someParameters['user']['version'], + 'records': {} + } + } else { + throw "user already exists"; + } + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } + + result = { + result: { + 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'], + 'result': 'done' + }, + toll: this.getTollForRequestType('CONNECT') + } + + return result; + }, + + //------------------------------------------------------------------------- + + '_handshake': function(aConnection, someParameters) { + var result; + var nextTollRequestType; + + result = {}; + if (someParameters.message == "connect") { + var userData; + var randomBytes; + var v; + + userData = this.data()['users'][someParameters.parameters.C]; + + if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) { + aConnection['userData'] = userData; + aConnection['C'] = someParameters.parameters.C; + } else { + aConnection['userData'] = this.data()['users']['catchAllUser']; + } + + randomBytes = Clipperz.Crypto.Base.generateRandomSeed(); + aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16); + v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); + aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n())); + + aConnection['A'] = someParameters.parameters.A; + + result['s'] = aConnection['userData']['s']; + result['B'] = aConnection['B'].asString(16); + + nextTollRequestType = 'CONNECT'; + } else if (someParameters.message == "credentialCheck") { + var v, u, S, A, K, M1; + + v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); + u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16); + A = new Clipperz.Crypto.BigInt(aConnection['A'], 16); + S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()); + + K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2); + + M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2); + if (someParameters.parameters.M1 == M1) { + var M2; + + M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2); + result['M2'] = M2; + } else { + throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error"); + } + + nextTollRequestType = 'MESSAGE'; + } else if (someParameters.message == "oneTimePassword") { + var otpData; + + otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey]; + + try { + if (typeof(otpData) != 'undefined') { + if (otpData['status'] == 'ACTIVE') { + if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) { + result = { + 'data': otpData['data'], + 'version': otpData['version'] + } + + otpData['status'] = 'REQUESTED'; + } else { + otpData['status'] = 'DISABLED'; + throw "The requested One Time Password has been disabled, due to a wrong keyChecksum"; + } + } else { + throw "The requested One Time Password was not active"; + } + } else { + throw "The requested One Time Password has not been found" + } + } catch (exception) { + result = { + 'data': Clipperz.PM.Crypto.randomKey(), + 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion + } + } + nextTollRequestType = 'CONNECT'; + } else { + Clipperz.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message); + } + + result = { + result: result, + toll: this.getTollForRequestType(nextTollRequestType) + } + + return result; + }, + + //------------------------------------------------------------------------- + + '_message': function(aConnection, someParameters) { + var result; + + result = {}; + + //===================================================================== + // + // R E A D - O N L Y M e t h o d s + // + //===================================================================== + if (someParameters.message == 'getUserDetails') { + var recordsStats; + var recordReference; + + recordsStats = {}; + for (recordReference in aConnection['userData']['records']) { + recordsStats[recordReference] = { + 'updateDate': aConnection['userData']['records'][recordReference]['updateDate'] + } + } + + result['header'] = this.userDetails(aConnection); + result['statistics'] = this.statistics(aConnection); + result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords']; + result['version'] = aConnection['userData']['userDetailsVersion']; + result['recordsStats'] = recordsStats; + + if (this.isReadOnly() == false) { + var lock; + + if (typeof(aConnection['userData']['lock']) == 'undefined') { + aConnection['userData']['lock'] = "<<LOCK>>"; + } + + result['lock'] = aConnection['userData']['lock']; + } + + //===================================================================== + } else if (someParameters.message == 'getRecordDetail') { +/* + var recordData; + var currentVersionData; + + recordData = this.userData()['records'][someParameters['parameters']['reference']]; + result['reference'] = someParameters['parameters']['reference']; + result['data'] = recordData['data']; + result['version'] = recordData['version']; + result['creationData'] = recordData['creationDate']; + result['updateDate'] = recordData['updateDate']; + result['accessDate'] = recordData['accessDate']; + + currentVersionData = recordData['versions'][recordData['currentVersion']]; + + result['currentVersion'] = {}; + result['currentVersion']['reference'] = recordData['currentVersion']; + result['currentVersion']['version'] = currentVersionData['version']; + result['currentVersion']['header'] = currentVersionData['header']; + result['currentVersion']['data'] = currentVersionData['data']; + result['currentVersion']['creationData'] = currentVersionData['creationDate']; + result['currentVersion']['updateDate'] = currentVersionData['updateDate']; + result['currentVersion']['accessDate'] = currentVersionData['accessDate']; + if (typeof(currentVersionData['previousVersion']) != 'undefined') { + result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey']; + result['currentVersion']['previousVersion'] = currentVersionData['previousVersion']; + } +*/ + MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]); + result['reference'] = someParameters['parameters']['reference']; + + //===================================================================== + // + // R E A D - W R I T E M e t h o d s + // + //===================================================================== + } else if (someParameters.message == 'upgradeUserCredentials') { + if (this.isReadOnly() == false) { + var parameters; + var credentials; + + parameters = someParameters['parameters']; + credentials = parameters['credentials']; + + if ((credentials['C'] == null) + || (credentials['s'] == null) + || (credentials['v'] == null) + || (credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion) + ) { + result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed; + } else { + var oldCValue; + oldCValue = aConnection['C']; + + this.data()['users'][credentials['C']] = aConnection['userData']; + aConnection['C'] = credentials['C']; + + aConnection['userData']['s'] = credentials['s']; + aConnection['userData']['v'] = credentials['v']; + aConnection['userData']['version'] = credentials['version']; + + aConnection['userData']['userDetails'] = parameters['user']['header']; + aConnection['userData']['userDetailsVersion'] = parameters['user']['version']; + aConnection['userData']['statistics'] = parameters['user']['statistics']; + + aConnection['userData']['lock'] = parameters['user']['lock']; + + delete this.data()['users'][oldCValue]; + + result = {result:"done", parameters:parameters}; + } + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } + + //===================================================================== + + } else if (someParameters.message == 'saveChanges') { + if (this.isReadOnly() == false) { + var i, c; + + if (aConnection['userData']['lock'] != someParameters['parameters']['user']['lock']) { + throw "the lock attribute is not processed correctly" + } + + aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header']; + aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics']; + aConnection['userData']['userDetailsVersion'] = someParameters['parameters']['user']['version']; + + c = someParameters['parameters']['records']['updated'].length; + for (i=0; i<c; i++) { + var currentRecord; + var currentRecordData; + + currentRecordData = someParameters['parameters']['records']['updated'][i]; + currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']]; + + if ( + (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined') + && + (typeof(currentRecordData['currentRecordVersion']) == 'undefined') + ) { + throw "Record added without a recordVersion"; + } + + if (currentRecord == null) { + currentRecord = {}; + currentRecord['versions'] = {}; + currentRecord['creationDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + + aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord; + } + + currentRecord['data'] = currentRecordData['record']['data']; + currentRecord['version'] = currentRecordData['record']['version']; + currentRecord['updateDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); + + if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') { + currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference']; + currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = { + 'data': currentRecordData['currentRecordVersion']['data'], + 'version': currentRecordData['currentRecordVersion']['version'], + 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'], + 'previousVersionKey': currentRecordData['currentRecordVersion']['previousVersionKey'], + 'creationDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), + 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), + 'accessDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()) + } + } + } + + c = someParameters['parameters']['records']['deleted'].length; + for (i=0; i<c; i++) { + var currentRecordReference; + + currentRecordReference = someParameters['parameters']['records']['deleted'][i]; + delete aConnection['userData']['records'][currentRecordReference]; + } + + aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey(); + result['lock'] = aConnection['userData']['lock']; + result['result'] = 'done'; + } else { + throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; + } + + //===================================================================== + // + // U N H A N D L E D M e t h o d + // + //===================================================================== + } else { + Clipperz.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message); + } + + result = { + result: result, + toll: this.getTollForRequestType('MESSAGE') + } + +// return MochiKit.Async.succeed(result); + return result; + }, + + //------------------------------------------------------------------------- + + '_logout': function(someParameters) { +// return MochiKit.Async.succeed({result: 'done'}); + return {result: 'done'}; + }, + + //========================================================================= + //######################################################################### + + 'isTestData': function(aConnection) { + return (typeof(aConnection['userData']['__masterkey_test_value__']) != 'undefined'); + }, + + 'userDetails': function(aConnection) { + var result; + + if (this.isTestData(aConnection)) { + var serializedHeader; + var version; + +//Clipperz.logDebug("### test data"); + version = aConnection['userData']['userDetailsVersion']; + serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']); + result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader); + } else { +//Clipperz.logDebug("### NOT test data"); + result = aConnection['userData']['userDetails']; + } + + return result; + }, + + 'statistics': function(aConnection) { + var result; + + if (aConnection['userData']['statistics'] != null) { + if (this.isTestData(aConnection)) { + var serializedStatistics; + var version; + + version = aConnection['userData']['userDetailsVersion']; + serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']); + result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics); + } else { + result = aConnection['userData']['statistics']; + } + } else { + result = null; + } + + return result; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.js new file mode 100644 index 0000000..6d6ee1e --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.js @@ -0,0 +1,72 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } + +//============================================================================= + +Clipperz.PM.Proxy.Offline = function(args) { + args = args || {}; + + Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args); + + this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args); + + return this; +} + +Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, { + + 'toString': function () { + return "Clipperz.PM.Proxy.Offline"; + }, + + //------------------------------------------------------------------------- + + 'dataStore': function () { + return this._dataStore; + }, + + //------------------------------------------------------------------------- + + '_sendMessage': function(aFunctionName, aVersion, someParameters) { + return this.dataStore().processMessage(aFunctionName, someParameters); + }, + + //------------------------------------------------------------------------- + + 'isReadOnly': function () { + return this.dataStore().isReadOnly(); + }, + + 'canRegisterNewUsers': function () { + return this.dataStore().canRegisterNewUsers(); + }, + + //------------------------------------------------------------------------- + + __syntaxFix__: "syntax fix" + +}); + diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Test.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Test.js new file mode 100644 index 0000000..83d9244 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Test.js @@ -0,0 +1,161 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; } + +//============================================================================= + +Clipperz.PM.Proxy.Test = function(args) { + Clipperz.PM.Proxy.Test.superclass.constructor.call(this, args); + + args = args || {}; + + this._expectedRequests = (args.shouldCheckExpectedRequests === true) ? [] : null; + this._isExpectingRequests = true; + this._unexpectedRequests = []; + + this.dataStore().resetData(); + + return this; +} + +Clipperz.Base.extend(Clipperz.PM.Proxy.Test, Clipperz.PM.Proxy.Offline, { + + 'toString': function() { + return "Clipperz.PM.Proxy.Test"; + }, + + //========================================================================= + + 'expectedRequests': function () { + return this._expectedRequests; + }, + + //------------------------------------------------------------------------- + + 'shouldCheckExpectedRequests': function () { + return (this._expectedRequests != null); + }, + + 'setShouldCheckExpectedRequests': function(aValue) { + if (aValue) { + this._expectedRequests = aValue; + } else { + this._expectedRequests = null; + } + }, + + //------------------------------------------------------------------------- + + 'shouldNotReceiveAnyFurtherRequest': function () { + this._isExpectingRequests = false; + }, + + 'mayReceiveMoreRequests': function () { + this._isExpectingRequests = true; + this.resetUnexpectedRequests(); + }, + + 'isExpectingRequests': function () { + return this._isExpectingRequests; + }, + + //------------------------------------------------------------------------- + + 'unexpectedRequests': function () { + return this._unexpectedRequests; + }, + + 'resetUnexpectedRequests': function () { + this._unexpectedRequests = []; + }, + + //------------------------------------------------------------------------- + + 'testExpectedRequestParameters': function (aPath, anActualRequest, anExpectedRequest) { + var aKey; + for (aKey in anExpectedRequest) { + if (typeof(anActualRequest[aKey]) == 'undefined') { + throw "the expected paramter [" + aKey + "] is missing from the actual request"; + } + if (typeof(anExpectedRequest[aKey]) == 'object') { + this.testExpectedRequestParameters(aPath + "." + aKey, anActualRequest[aKey], anExpectedRequest[aKey]) + } else { + if (! anExpectedRequest[aKey](anActualRequest[aKey])) { + throw "wrong value for paramter [" + aKey + "]; got '" + anActualRequest[aKey] + "'"; + } + } + } + }, + + //------------------------------------------------------------------------- + + 'checkRequest': function(aFunctionName, someParameters) { + if (this.shouldCheckExpectedRequests()) { + var expectedRequest; + + expectedRequest = this.expectedRequests().pop(); + if (expectedRequest == null) { + throw "Proxy.Test.sentMessage: no expected result specified. Got request '" + aFunctionName + "': " + someParameters; + } + + try { + if (aFunctionName != expectedRequest.functionName) { + throw "wrong function name. Got '" + aFunctionName + "', expected '" + expectedRequest.request.functionName + "'"; + } + + this.testExpectedRequestParameters("parameters", someParameters, expectedRequest.parameters); + } catch(exception) { + throw "Proxy.Test.sentMessage[" + expectedRequest.name + "]: " + exception; + } + } + }, + + //========================================================================= + + '_sendMessage': function(aFunctionName, aVersion, someParameters) { + var result; + + if (this.isExpectingRequests() == false) { +// throw Clipperz.PM.Connection.exception.UnexpectedRequest; +Clipperz.log("UNEXPECTED REQUEST " + aFunctionName /* + ": " + Clipperz.Base.serializeJSON(someParameters) */); + this.unexpectedRequests().push({'functionName':aFunctionName, 'someParameters': someParameters}); + }; +//if (aFunctionName == 'knock') { +// console.log(">>> send message - " + aFunctionName, someParameters); +//} else { +// console.log(">>> SEND MESSAGE - " + aFunctionName + " [" + someParameters['parameters']['message'] + "]", someParameters['parameters']['parameters']); +//} + this.checkRequest(aFunctionName, someParameters); + result = Clipperz.PM.Proxy.Test.superclass._sendMessage.call(this, aFunctionName, aVersion, someParameters); + + return result; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" + +}); + diff --git a/frontend/delta/js/Clipperz/PM/Strings.js b/frontend/delta/js/Clipperz/PM/Strings.js new file mode 100644 index 0000000..7e855ff --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Strings.js @@ -0,0 +1,285 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } +if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; } + +//----------------------------------------------------------------------------- +/* +Clipperz.PM.Strings.standardStrings = { + 'loginPanelSwitchLanguageSelectOptions': [ +/ * + {tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true}, + {tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true}, + {tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true}, + {tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true}, + {tag:'option', html:"Català", value:'ca-ES', disabled:true}, + {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true}, + {tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true}, + {tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true}, + {tag:'option', html:"Dansk", value:'da-DK', disabled:true}, + {tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /}, + {tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /}, + {tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /}, + {tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /}, + {tag:'option', html:"Español", value:'es-ES', disabled:true}, + {tag:'option', html:"Eesti", value:'et-EE', disabled:true}, + {tag:'option', html:"Français", value:'fr-FR', disabled:true}, + {tag:'option', html:"Galego", value:'gl-ES', disabled:true}, + {tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true}, + {tag:'option', html:"Íslenska", value:'is-IS', disabled:true}, + {tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /}, + {tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true}, + {tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true}, + {tag:'option', html:"Latviešu", value:'lv-LV', disabled:true}, + {tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true}, + {tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true}, + {tag:'option', html:"Magyar", value:'hu-HU', disabled:true}, + {tag:'option', html:"Nederlands", value:'nl-NL', disabled:true}, + {tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true}, + {tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true}, + {tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true}, + {tag:'option', html:"Polski", value:'pl-PL', disabled:true}, + {tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /}, + {tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /}, + {tag:'option', html:"Românä", value:'ro-RO', disabled:true}, + {tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true}, + {tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true}, + {tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true}, + {tag:'option', html:"Suomi", value:'fi-FI', disabled:true}, + {tag:'option', html:"Svenska", value:'sv-SE', disabled:true}, + {tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true}, + {tag:'option', html:"Türkçe", value:'tr-TR', disabled:true}, + {tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true} +* / + {tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'}, +// {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true}, + {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'}, + {tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"English", value:"en-US"}, + {tag:'option', html:"French (Français)", value:"fr-FR"}, + {tag:'option', html:"German (Deutsch)", value:"de-DE", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Greek (Ελληνικά)", value:"el-GR", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Hebrew (עברית)", value:"he-IL", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Italian (Italiano)", value:"it-IT"}, + {tag:'option', html:"Japanese (日本語)", value:"ja-JP"}, + {tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Portuguese (Português)", value:"pt-BR"}, + {tag:'option', html:"Russian (Русский)", value:"ru-RU", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Spanish (Español)", value:"es-ES"}, + {tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'}, + {tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'} + ] +} +*/ + +Clipperz.PM.Strings.GeneralSettings = { + 'defaults': { +// 'loginFormAarghThatsBadUrl': "http://www.clipperz.com/support/faq/account_faq", +// 'loginFormVerifyTheCodeUrl': "http://www.clipperz.com/learn_more/reviewing_the_code", + +// 'donateHeaderLinkUrl': "http://www.clipperz.com/donations", +// 'creditsHeaderLinkUrl': "http://www.clipperz.com/credits", +// 'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact", +// 'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide", +// 'forumHeaderLinkUrl': "http://www.clipperz.com/forum", + +// 'httpAuthBookmarkletConfiguration': {tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" + +// "{ \"page\":{\"title\":\"HTTP authentication\"}," + "\n" + +// " \"form\":{\"attributes\": {" + "\n" + +// " \"action\":\"\"," + "\n" + +// " \"type\":\"http_auth\"" + "\n" + +// " }, \"inputs\": [" + "\n" + +// " {\"type\":\"text\",\"name\":\"url\",\"value\":\"\"}," + "\n" + +// " {\"type\":\"text\",\"name\":\"username\",\"value\":\"\"}," + "\n" + +// " {\"type\":\"password\",\"name\":\"password\",\"value\":\"\"}" + "\n" + +// " ]}, \"version\":\"0.2.3\"}" +// }, + + 'directLoginJumpPageUrl': "", + 'defaultFaviconUrl': "data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=", + 'defaultFaviconUrl_IE': "https://www.clipperz.com/images/icons/misc/favicon.ico", + +// 'icons_baseUrl': "https://www.clipperz.com/images/icons", + +// 'passwordGeneratorLowercaseCharset': "abcdefghijklmnopqrstuvwxyz", +// 'passwordGeneratorUppercaseCharset': "ABCDEFGHIJKLMNOPQRSTUVWXYZ", +// 'passwordGeneratorNumberCharset': "0123456789", +// 'passwordGeneratorSymbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_", + +// 'passwordGenerator': { +// 'lowercaseCharset': "abcdefghijklmnopqrstuvwxyz", +// 'uppercaseCharset': "ABCDEFGHIJKLMNOPQRSTUVWXYZ", +// 'numberCharset': "0123456789", +// 'symbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_", +// }, + + '_': "" + } +} + +Clipperz.PM.Strings.defaultLanguages = { + 'default': "en-us", + +// 'de': "de-de", +// 'el': "el-gr", +// 'he': "he-il", +// 'ru': "ru-ru", + + 'fr': "fr-fr", + 'es': "es-es", + 'zh': "zh-cn", + 'ja': "ja-jp", + 'pt': "pt-br", + 'it': "it-it", + 'en': "en-us" +} + +Clipperz.PM.Strings.inputTypeToRecordFieldType = { + 'text': 'TXT', + 'password': 'PWD', + 'checkbox': 'CHECK', + 'radio': 'RADIO', + 'select': 'SELECT' +}; + +//----------------------------------------------------------------------------- + +Clipperz.PM.Strings.translateBookmarklet = function (aBookmarkletString) { + var result; + + result = aBookmarkletString; + + result = result.replace(/@BOOKMARKLET_NO_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.noExceptionMessage')); + result = result.replace(/@BOOKMARKLET_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.exceptionMessage')); + result = result.replace(/@BOOKMARKLET_COPY@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.copy')); + result = result.replace(/@BOOKMARKLET_SUCCESSFUL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.successfulMessage')); + result = result.replace(/@BOOKMARKLET_FAIL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.failMessage')); + + return result; +} + +//----------------------------------------------------------------------------- + +Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) { + var language; + var selectedLanguage; + + language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase(); + if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') { + language = Clipperz.PM.Strings.defaultLanguages[language]; + } + + if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') { + selectedLanguage = language; + } else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') { + selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]; + } else { + selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default']; + } + + if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) { + var translations; + + Clipperz.PM.Strings.selectedLanguage = selectedLanguage; + + translations = {}; +// MochiKit.Base.update(translations, Clipperz.PM.Strings.standardStrings) + + MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages['defaults']); + MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings['defaults']); + + MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]); + MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]); + + MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[selectedLanguage]); + MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]); + + Clipperz.PM.Strings.stringsObjectStore = new Clipperz.KeyValueObjectStore(/*{'name':'String.stringsObjectStore [1]'}*/); + Clipperz.PM.Strings.stringsObjectStore.initWithValues(translations); + + if (typeof(bookmarklet) != 'undefined') { + Clipperz.PM.Strings.stringsObjectStore.setValue('bookmarklet', Clipperz.PM.Strings.translateBookmarklet(bookmarklet)); + } + + MochiKit.Signal.signal(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage); + } +} + +//----------------------------------------------------------------------------- + +Clipperz.PM.Strings.getValue = function (aKeyPath, someKeyValues) { + var result; + + result = Clipperz.PM.Strings.stringsObjectStore.getValue(aKeyPath); + + if (typeof(result) == 'string') { + if (typeof (someKeyValues) != 'undefined') { + var key; + + for (key in someKeyValues) { + result = result.replace( new RegExp(key), someKeyValues[key]); + } + } + + result = result.replace(new RegExp('\n'), '<br>'); + } + + return result; +} + +Clipperz.PM.Strings.errorDescriptionForException = function (anException) { + var result; + + result = Clipperz.PM.Strings.getValue('exceptionsMessages' + '.' + anException.name); + + if (result == null) { + result = anException.message; + } + + return result; +}, + +//----------------------------------------------------------------------------- + +Clipperz.PM.Strings.Languages.initSetup = function() { + var language; + var languageParser; + + language = navigator.language || navigator.userLanguage; // en, en-US, .... "de", "nb-no" + languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i"); + if (languageParser.test(window.location.search)) { + language = RegExp.$1; + } + + Clipperz.PM.Strings.preferredLanguage = language.toLowerCase(); + Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage); +} + +//----------------------------------------------------------------------------- diff --git a/frontend/delta/js/Clipperz/PM/Strings/MessagePanelConfigurations.js b/frontend/delta/js/Clipperz/PM/Strings/MessagePanelConfigurations.js new file mode 100644 index 0000000..7565d2d --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Strings/MessagePanelConfigurations.js @@ -0,0 +1,384 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } + +Clipperz.PM.Strings.messagePanelConfigurations = { + + + //------------------------------------------------------------------------- + // + // Registration - connection + // + 'registration_verify': function() { + return { + 'title': null, + 'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText'] + } + }, + + 'registration_sendingCredentials': function() { + return { + 'title': null, + 'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText'] + } + }, + + //------------------------------------------------------------------------- + // + // One Time Password login message panel + // + + 'OTP_login_start': function() { + return { + 'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'], + 'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'], + 'steps': '+3', + 'buttons': {} + } + }, + + 'OTP_login_loadingOTP': function() { + return { + 'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'], + 'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText'] + } + }, + + 'OTP_login_extractingPassphrase': function() { + return { + 'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'], + 'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText'] + } + }, + + + //------------------------------------------------------------------------- + // + // Login message panel + // + 'login_start': function() { + return { + 'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'], + 'text': Clipperz.PM.Strings['loginMessagePanelInitialText'], + 'steps': '+7', + 'buttons': { + 'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel'] + } + } + }, + + 'login_connected': function() { + return { + 'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'], + 'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'], + 'buttons': {} + } + }, + + 'login_failed': function() { + return { + 'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'], + 'text': Clipperz.PM.Strings['loginMessagePanelFailureText'], + 'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel'] + } + }, + + //------------------------------------------------------------------------- + // + // Login message panel - connection + // + 'connection_sendingCredentials': function() { + return { + 'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'], + 'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText'] + } + }, + + 'connection_credentialVerification': function() { + return { + 'title': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageTitle'], + 'text': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageText'] + } + }, + + 'connection_loggedIn': function() { + return { + 'title': Clipperz.PM.Strings['connectionLoginDoneMessageTitle'], + 'text': Clipperz.PM.Strings['connectionLoginDoneMessageText'] + } + }, + + //------------------------------------------------------------------------- + // + // Login message panel - user + // + 'connection_upgrading': function() { + return { + 'title': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageTitle'], + 'text': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageText'], + 'steps': '+1' + } + }, + + 'connection_done': function() { + return { + 'title': Clipperz.PM.Strings['userLoginPanelConnectedMessageTitle'], + 'text': Clipperz.PM.Strings['userLoginPanelConnectedMessageText'] + } + }, + + 'connection_tryOlderSchema': function() { + return { + 'title': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageTitle'], + 'text': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageText'], + 'steps': '+4' + } + }, + + 'connection_loadingUserData': function() { + return { + 'title': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageTitle'], + 'text': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageText'] + } + }, + + 'connection_decryptingUserData': function() { + return { + 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageTitle'], + 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageText'], + 'steps': '+1' + } + }, + + 'connection_decryptingUserStatistics': function() { + return { + 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageTitle'], + 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageText'] + } + }, + + 'collectingEntropy': function() { + return { + 'text': Clipperz.PM.Strings['panelCollectingEntryopyMessageText'], + 'steps': '+1' + } + }, + + //------------------------------------------------------------------------- + // + // Cards block - delete card panel + // + 'deleteRecord_collectData': function() { + return { + 'title': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageTitle'], + 'text': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageText'] + } + }, + + 'deleteRecord_encryptData': function() { + return { + 'title': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageTitle'], + 'text': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageText'] + } + }, + + 'deleteRecord_sendingData': function() { + return { + 'title': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageTitle'], + 'text': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageText'] + } + }, + + 'deleteRecord_updatingInterface': function() { + return { + 'title': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageTitle'], + 'text': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageText'] + } + }, + + + //------------------------------------------------------------------------- + // + // Cards block - save card panel + // + 'saveCard_collectRecordInfo': function() { + return { + 'title': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageTitle'], + 'text': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageText'] + } + }, + + 'saveCard_encryptUserData': function() { + return { + 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageTitle'], + 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageText'] + } + }, + + 'saveCard_encryptRecordData': function() { + return { + 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageTitle'], + 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageText'] + } + }, + + 'saveCard_encryptRecordVersions': function() { + return { + 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageTitle'], + 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageText'] + } + }, + + 'saveCard_sendingData': function() { + return { + 'title': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageTitle'], + 'text': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageText'] + } + }, + + 'saveCard_updatingInterface': function() { + return { + 'title': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageTitle'], + 'text': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageText'] + } + }, + + //------------------------------------------------------------------------- + // + // Account panel - user preferences + // + 'account_savingPreferences_1': function() { + return { + 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step1'], + 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step1'], + 'steps': '+3' + } + }, + + 'account_savingPreferences_2': function() { + return { + 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step2'], + 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step2'] + } + }, + + + //------------------------------------------------------------------------- + // + // Account panel - change credentials + // + 'changeCredentials_encryptingData': function() { + return { + 'title': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageTitle'], + 'text': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageText'] + } + }, + + 'changeCredentials_creatingNewCredentials': function() { + return { + 'title': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageTitle'], + 'text': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageText'] + } + }, + + 'changeCredentials_sendingCredentials': function() { + return { + 'title': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle'], + 'text': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageText'] + } + }, + + 'changeCredentials_done': function() { + return { + 'title': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageTitle'], + 'text': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageText'] + } + }, + + + //------------------------------------------------------------------------- + // + // Account panel - change credentials + // + 'saveOTP_encryptUserData': function() { + return { + 'title': Clipperz.PM.Strings['saveOTP_encryptUserDataTitle'], + 'text': Clipperz.PM.Strings['saveOTP_encryptUserDataText'], + 'steps': '+4' + } + }, + + 'saveOTP_encryptOTPData': function() { + return { + 'title': Clipperz.PM.Strings['saveOTP_encryptOTPDataTitle'], + 'text': Clipperz.PM.Strings['saveOTP_encryptOTPDataText'] + } + }, + + 'saveOTP_sendingData': function() { + return { + 'title': Clipperz.PM.Strings['saveOTP_sendingDataTitle'], + 'text': Clipperz.PM.Strings['saveOTP_sendingDataText'] + } + }, + + 'saveOTP_updatingInterface': function() { + return { + 'title': Clipperz.PM.Strings['saveOTP_updatingInterfaceTitle'], + 'text': Clipperz.PM.Strings['saveOTP_updatingInterfaceText'] + } + }, + + + //------------------------------------------------------------------------- + // + // Data panel - processingImportData + // + 'parseImportData': function() { + return { + 'title': Clipperz.PM.Strings['importData_parsingDataTitle'], + 'text': Clipperz.PM.Strings['importData_parsingDataText'] + } + }, + + 'previewImportData': function() { + return { + 'title': Clipperz.PM.Strings['importData_previewingDataTitle'], + 'text': Clipperz.PM.Strings['importData_previewingDataText'] + } + }, + + 'processingImportData': function() { + return { + 'title': Clipperz.PM.Strings['importData_processingDataTitle'], + 'text': Clipperz.PM.Strings['importData_processingDataText'] + } + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +} diff --git a/frontend/delta/js/Clipperz/PM/Strings/Strings_defaults.js b/frontend/delta/js/Clipperz/PM/Strings/Strings_defaults.js new file mode 100644 index 0000000..aefd94a --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Strings/Strings_defaults.js @@ -0,0 +1,385 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } +if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } +if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; } + +//============================================================================= +// +// D E F A U L T S ( defaults ) +// +//============================================================================= + +Clipperz.PM.Strings.Languages['defaults'] = { + +'elapsedTimeDescriptions': { + 'MORE_THAN_A_MONTH_AGO': "more than a month ago", + 'MORE_THAN_A_WEEK_AGO': "more than a week ago", + 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago", + 'YESTERDAY': "yesterday", + '*_DAYS_AGO': "__elapsed__ days ago", + 'ABOUT_AN_HOUR_AGO': "about an hour ago", + '*_HOURS_AGO': "__elapsed__ hours ago", + 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago", + 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago" +}, +/* +'unknown_ip': "unknown", + +'countries': { + '--': "unknown", + 'AD': "Andorra", + 'AE': "United Arab Emirates", + 'AF': "Afghanistan", + 'AG': "Antigua and Barbuda", + 'AI': "Anguilla", + 'AL': "Albania", + 'AM': "Armenia", + 'AN': "Netherlands Antilles", + 'AO': "Angola", + 'AP': "Non-Spec Asia Pas Location", + 'AR': "Argentina", + 'AS': "American Samoa", + 'AT': "Austria", + 'AU': "Australia", + 'AW': "Aruba", + 'AX': "Aland Islands", + 'AZ': "Azerbaijan", + 'BA': "Bosnia and Herzegowina", + 'BB': "Barbados", + 'BD': "Bangladesh", + 'BE': "Belgium", + 'BF': "Burkina Faso", + 'BG': "Bulgaria", + 'BH': "Bahrain", + 'BI': "Burundi", + 'BJ': "Benin", + 'BM': "Bermuda", + 'BN': "Brunei Darussalam", + 'BO': "Bolivia", + 'BR': "Brazil", + 'BS': "Bahamas", + 'BT': "Bhutan", + 'BW': "Botswana", + 'BY': "Belarus", + 'BZ': "Belize", + 'CA': "Canada", + 'CD': "Congo the Democratic Republic of the", + 'CF': "Central African Republic", + 'CH': "Switzerland", + 'CI': "Cote D'ivoire", + 'CK': "Cook Islands", + 'CL': "Chile", + 'CM': "Cameroon", + 'CN': "China", + 'CO': "Colombia", + 'CR': "Costa Rica", + 'CS': "Serbia and Montenegro", + 'CU': "Cuba", + 'CY': "Cyprus", + 'CZ': "Czech Republic", + 'DE': "Germany", + 'DJ': "Djibouti", + 'DK': "Denmark", + 'DO': "Dominican Republic", + 'DZ': "Algeria", + 'EC': "Ecuador", + 'EE': "Estonia", + 'EG': "Egypt", + 'ER': "Eritrea", + 'ES': "Spain", + 'ET': "Ethiopia", + 'EU': "European Union", + 'FI': "Finland", + 'FJ': "Fiji", + 'FM': "Micronesia Federated States of", + 'FO': "Faroe Islands", + 'FR': "France", + 'GA': "Gabon", + 'GB': "United Kingdom", + 'GD': "Grenada", + 'GE': "Georgia", + 'GF': "French Guiana", + 'GG': "Guernsey", + 'GH': "Ghana", + 'GI': "Gibraltar", + 'GL': "Greenland", + 'GM': "Gambia", + 'GP': "Guadeloupe", + 'GR': "Greece", + 'GT': "Guatemala", + 'GU': "Guam", + 'GW': "Guinea-Bissau", + 'GY': "Guyana", + 'HK': "Hong Kong", + 'HN': "Honduras", + 'HR': "Croatia (Local Name: Hrvatska)", + 'HT': "Haiti", + 'HU': "Hungary", + 'ID': "Indonesia", + 'IE': "Ireland", + 'IL': "Israel", + 'IM': "Isle of Man", + 'IN': "India", + 'IO': "British Indian Ocean Territory", + 'IQ': "Iraq", + 'IR': "Iran (Islamic Republic of)", + 'IS': "Iceland", + 'IT': "Italy", + 'JE': "Jersey", + 'JM': "Jamaica", + 'JO': "Jordan", + 'JP': "Japan", + 'KE': "Kenya", + 'KG': "Kyrgyzstan", + 'KH': "Cambodia", + 'KI': "Kiribati", + 'KN': "Saint Kitts and Nevis", + 'KR': "Korea Republic of", + 'KW': "Kuwait", + 'KY': "Cayman Islands", + 'KZ': "Kazakhstan", + 'LA': "Lao People's Democratic Republic", + 'LB': "Lebanon", + 'LC': "Saint Lucia", + 'LI': "Liechtenstein", + 'LK': "Sri Lanka", + 'LR': "Liberia", + 'LS': "Lesotho", + 'LT': "Lithuania", + 'LU': "Luxembourg", + 'LV': "Latvia", + 'LY': "Libyan Arab Jamahiriya", + 'MA': "Morocco", + 'MC': "Monaco", + 'MD': "Moldova Republic of", + 'MG': "Madagascar", + 'MH': "Marshall Islands", + 'MK': "Macedonia the Former Yugoslav Republic of", + 'ML': "Mali", + 'MM': "Myanmar", + 'MN': "Mongolia", + 'MO': "Macau", + 'MP': "Northern Mariana Islands", + 'MR': "Mauritania", + 'MS': "Montserrat", + 'MT': "Malta", + 'MU': "Mauritius", + 'MV': "Maldives", + 'MW': "Malawi", + 'MX': "Mexico", + 'MY': "Malaysia", + 'MZ': "Mozambique", + 'NA': "Namibia", + 'NC': "New Caledonia", + 'NF': "Norfolk Island", + 'NG': "Nigeria", + 'NI': "Nicaragua", + 'NL': "Netherlands", + 'NO': "Norway", + 'NP': "Nepal", + 'NR': "Nauru", + 'NU': "Niue", + 'NZ': "New Zealand", + 'OM': "Oman", + 'PA': "Panama", + 'PE': "Peru", + 'PF': "French Polynesia", + 'PG': "Papua New Guinea", + 'PH': "Philippines", + 'PK': "Pakistan", + 'PL': "Poland", + 'PR': "Puerto Rico", + 'PS': "Palestinian Territory Occupied", + 'PT': "Portugal", + 'PW': "Palau", + 'PY': "Paraguay", + 'QA': "Qatar", + 'RO': "Romania", + 'RS': "Serbia", + 'RU': "Russian Federation", + 'RW': "Rwanda", + 'SA': "Saudi Arabia", + 'SB': "Solomon Islands", + 'SC': "Seychelles", + 'SD': "Sudan", + 'SE': "Sweden", + 'SG': "Singapore", + 'SI': "Slovenia", + 'SK': "Slovakia (Slovak Republic)", + 'SL': "Sierra Leone", + 'SM': "San Marino", + 'SN': "Senegal", + 'SR': "Suriname", + 'SV': "El Salvador", + 'SY': "Syrian Arab Republic", + 'SZ': "Swaziland", + 'TC': "Turks and Caicos Islands", + 'TG': "Togo", + 'TH': "Thailand", + 'TJ': "Tajikistan", + 'TM': "Turkmenistan", + 'TN': "Tunisia", + 'TO': "Tonga", + 'TR': "Turkey", + 'TT': "Trinidad and Tobago", + 'TV': "Tuvalu", + 'TW': "Taiwan Province of China", + 'TZ': "Tanzania United Republic of", + 'UA': "Ukraine", + 'UG': "Uganda", + 'US': "United States", + 'UY': "Uruguay", + 'UZ': "Uzbekistan", + 'VA': "Holy See (Vatican City State)", + 'VE': "Venezuela", + 'VG': "Virgin Islands (British)", + 'VI': "Virgin Islands (U.S.)", + 'VN': "Viet Nam", + 'VU': "Vanuatu", + 'WF': "Wallis and Futuna Islands", + 'WS': "Samoa", + 'YE': "Yemen", + 'ZA': "South Africa", + 'ZM': "Zambia", + 'ZW': "Zimbabwe", + 'ZZ': "Reserved" +}, + +'browsers': { + 'UNKNOWN': "Unknown", + 'MSIE': "Internet Explorer", + 'FIREFOX': "Firefox", + 'OPERA': "Opera", + 'SAFARI': "Safari", + 'OMNIWEB': "OmniWeb", + 'CAMINO': "Camino", + 'CHROME': "Chrome" +}, + +'operatingSystems': { + 'UNKNOWN': "Unknown", + 'WINDOWS': "Windows", + 'MAC': "Mac", + 'LINUX': "Linux", + 'IPHONE': "iPhone", + 'MOBILE': "Mobile", + 'OPENBSD': "OpenBSD", + 'FREEBSD': "FreeBSD", + 'NETBSD': "NetBSD" +}, +*/ + +// Calendar texts +'calendarStrings': { + 'months': { + '0': "January", + '1': "February", + '2': "March", + '3': "April", + '4': "May", + '5': "June", + '6': "July", + '7': "August", + '8': "September", + '9': "October", + '10': "November", + '11': "December" + }, + 'shortMonths': { + '0': "Jan", + '1': "Feb", + '2': "Mar", + '3': "Apr", + '4': "May", + '5': "Jun", + '6': "Jul", + '7': "Aug", + '8': "Sep", + '9': "Oct", + '10': "Nov", + '11': "Dec" + }, + + 'days': { + '0': "Sunday", + '1': "Monday", + '2': "Tuesday", + '3': "Wednesday", + '4': "Thursday", + '5': "Friday", + '6': "Saturday" + }, + + 'shortDays': { + '0': "Sun", + '1': "Mon", + '2': "Tue", + '3': "Wed", + '4': "Thu", + '5': "Fri", + '6': "Sat" + }, + + 'veryShortDays': { + '0': "Su", + '1': "Mo", + '2': "Tu", + '3': "We", + '4': "Th", + '5': "Fr", + '6': "Sa" + }, + + 'amDesignation': "am", + 'pmDesignation': "pm" + +}, + +// Date format +'fullDate_format': "l, F d, Y H:i:s", + +//################################################################################ + +'pageHeader': { + 'donation': "donate", + 'forum': "forum", + 'credits': "credits", + 'feedback': "feedback", + 'help': "help" +}, + +'bookmarkletCopy': { + 'noExceptionMessage': "The direct login configuration has been collected.", + 'exceptionMessage': "Sorry! There was an error while processing the page.", + 'copy': "copy", + 'successfulMessage': "DONE!", + 'failMessage': "Failed! :(" +}, + +//################################################################################ + +__syntaxFix__: "syntax fix" +} diff --git a/frontend/delta/js/Clipperz/PM/Strings/Strings_en-US.js b/frontend/delta/js/Clipperz/PM/Strings/Strings_en-US.js new file mode 100644 index 0000000..72460ba --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Strings/Strings_en-US.js @@ -0,0 +1,1336 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +//============================================================================= +// +// E N G L I S H A M E R I C A N ( en_US ) +// +//============================================================================= + +Clipperz.PM.Strings.Languages['en-us'] = { +/* +// Login page - description +'clipperzServiceDescription': "\ + <!-- FIX CSS DONE --> \ + <h2>Keep it to yourself!</h2>\ + <ul>\ + <li>\ + <h3>Clipperz is:</h3>\ + <ul>\ + <li><p>a secure and simple password manager</p></li>\ + <li><p>an effective single sign-on solution</p></li>\ + <li><p>a digital vault for your personal data</p></li>\ + </ul>\ + </li>\ + <li>\ + <h3>With Clipperz you can:</h3>\ + <ul>\ + <li><p>store and manage your passwords and online credentials</p></li>\ + <li><p>login to your web services without entering any username or password</p></li>\ + <li><p>protect all your sensitive data: codes for burglar alarms, PINs, credit card numbers, …</p></li>\ + <li><p>share secrets with family members and associates (coming soon)</p></li>\ + </ul>\ + </li>\ + <li>\ + <h3>Clipperz benefits:</h3>\ + <ul>\ + <li><p>free and completely anonymous</p></li>\ + <li><p>access it any time from any computer</p></li>\ + <li><p>no software to download and nothing to install</p></li>\ + <li><p>avoid keeping secrets on your PC or on paper</p></li>\ + </ul>\ + </li>\ + <li>\ + <h3>Clipperz security:</h3>\ + <ul>\ + <li><p>your secrets are locally encrypted by your browser before being uploaded to Clipperz</p></li>\ + <li><p>the encryption key is a passphrase known only to you</p></li>\ + <li><p>Clipperz hosts your sensitive data in encrypted form and could never actually access the data in its plain form</p></li>\ + <li><p>Clipperz is built upon standard encryption schemes, nothing fancies or homemade</p></li>\ + <li><p>you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!</p></li>\ + </ul>\ + </li>\ + <li>\ + <a href=\"http://www.clipperz.com\" target=\"_blank\">Learn more</a>\ + </li>\ + </ul>", + + +'loginFormTitle': "login with your Clipperz account", +'loginFormUsernameLabel': "username", +'loginFormPassphraseLabel': "passphrase", +'loginFormDontHaveAnAccountLabel': "don\'t have an account?", +'loginFormCreateOneLabel': "create one", +'loginFormForgotYourCredentialsLabel': "forgot your credentials?", +'loginFormAarghThatsBadLabel': "aargh! that\'s bad!", +'loginFormAfraidOfMaliciousScriptsLabel': "afraid of malicious scripts?", +'loginFormVerifyTheCodeLabel': "verify the code", +'loginFormButtonLabel': "Login", +'loginFormOneTimePasswordCheckboxLabel': "use a one-time passphrase", +'loginFormOneTimePasswordCheckboxDescription': "", + +// Login page - language selection +'loginPanelSwithLanguageDescription': "<h5>Switch to your preferred language</h5>", + +// Login page - browser compatibility +'browserCompatibilityDescription': "<p>Have a better and safer Clipperz experience with Firefox. However Clipperz works just fine also with Opera, Safari and MS Internet Explorer!</p>", + +// Login with OTP - message panel +'OTPloginMessagePanelInitialTitle': "Logging in using a one-time passphrase", +'OTPloginMessagePanelInitialText': "Sending OTP credentials …", +'OTPloginMessagePanelLoadingTitle': "Logging in using a one-time passphrase", +'OTPloginMessagePanelLoadingText': "Fetching encrypted authentication data from the server …", +'OTPloginMessagePanelProcessingTitle': "Logging in using a one-time passphrase", +'OTPloginMessagePanelProcessingText': "Local decryption of authentication data", + +// Regular login - message panel +'loginMessagePanelInitialTitle': "Logging in …", +'loginMessagePanelInitialText': "---", +'loginMessagePanelInitialButtonLabel': "Cancel", +'loginMessagePanelConnectedTitle': "Connected", +'loginMessagePanelConnectedText': "Done", +'loginMessagePanelFailureTitle': "Error", +'loginMessagePanelFailureText': "Login failed", +'loginMessagePanelFailureButtonLabel': "Close", + +// Regular login - message panel - connection +'connectionLoginSendingCredentialsMessageTitle': "Verifying credentials", +'connectionLoginSendingCredentialsMessageText': "Sending credentials", +'connectionLoginCredentialsVerificationMessageTitle': "Verifying credentials", +'connectionLoginCredentialsVerificationMessageText': "Performing SRP authentication", +'connectionLoginDoneMessageTitle': "Verifying credentials", +'connectionLoginDoneMessageText': "Connected", + +// Regular login - message panel - user +'userLoginPanelUpgradingUserCredentialsMessageTitle': "Verifying credentials", +'userLoginPanelUpgradingUserCredentialsMessageText': "Upgrading your credentials to a new authentication schema", +'userLoginPanelConnectedMessageTitle': "User authenticated", +'userLoginPanelConnectedMessageText': "Successfully logged in", +'userLoginPanelTryingAnOlderConnectionSchemaMessageTitle': "Verifying credentials", +'userLoginPanelTryingAnOlderConnectionSchemaMessageText': "Trying an older authentication schema", +'userLoginPanelLoadingUserDataMessageTitle': "User authenticated", +'userLoginPanelLoadingUserDataMessageText': "Downloading encrypted card headers from Clipperz", +'userLoginPanelDecryptingUserDataMessageTitle': "User authenticated", +'userLoginPanelDecryptingUserDataMessageText': "Local decryption of card headers", +'userLoginPanelDecryptingUserStatisticsMessageTitle': "User authenticated", +'userLoginPanelDecryptingUserStatisticsMessageText': "Local decryption of usage statistics", + +// Registration page - splash alert +'splashAlertTitle': "Welcome to Clipperz!", +'splashAlertText': "\ + <!-- FIX CSS DONE! --> \ + <p>Some security advice</p>\ + <ul>\ + <li><p>Storing your data at Clipperz is as secure as the passphrase you choose to protect them. Nobody can access them unless they know your passphrase.</p></li>\ + <li><p>If you are going to use Clipperz for safeguarding sensitive and critical information please make sure to use a strong passphrase. The longer the better!</p></li>\ + <li><p>Clipperz will not be able to recover a lost passphrase!</p></li>\ + </ul>\ + <p>For any further information, please refer to <a href=\"http://www.clipperz.com\" target=\"_blank\">Clipperz</a> website.</p>", +'splashAlertCloseButtonLabel': "Ok", + +// Registration page - form +'registrationFormTitle': "create your account", +'registrationFormUsernameLabel': "username", +'registrationFormPassphraseLabel': "passphrase", +'registrationFormRetypePassphraseLabel': "re-enter passphrase", +'registrationFormSafetyCheckLabel': "I understand that Clipperz will not be able to recover a lost passphrase.", +'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='https://www.clipperz.com/terms_service' target='_blank'>Terms of Service</a>.", +'registrationFormDoYouAlreadyHaveAnAccountLabel': "do you already have an account?", +'registrationFormSimplyLoginLabel': "simply login", +'registrationFormButtonLabel': "Register", + +// Registration page - warning messages +'registrationFormWarningMessageNotMatchingPassphrases': "Your passphrases don't match, please re-type them.", +'registrationFormWarningMessageSafetyCheckNotSelected': "Please read and check all the boxes below.", +'registrationFormWarningMessageTermsOfServiceCheckNotSelected': "You need to agree to the Terms of Service.", + +// Registration page - message panel +'registrationMessagePanelInitialTitle': "Creating account …", +'registrationMessagePanelInitialText': "---", +'registrationMessagePanelInitialButtonLabel': "Cancel", +'registrationMessagePanelRegistrationDoneTitle': "Registration", +'registrationMessagePanelRegistrationDoneText': "Done", +'registrationMessagePanelFailureTitle': "Registration failed", +'registrationMessagePanelFailureButtonLabel': "Close", + +// Registration page - message panel - connection +'connectionRegistrationSendingRequestMessageText': "Verifying credentials", +'connectionRegistrationSendingCredentialsMessageText': "Sending credentials", + +// Registration page - splash panel +'registrationSplashPanelTitle': "Security advice", +'registrationSplashPanelDescription': "<p>These are your Clipperz credentials, take good care of them. Clipperz will never display your username and passphrase a second time!</p>", +'registrationSplashPanelUsernameLabel': "username", +'registrationSplashPanelPassphraseLabel': "passphrase", + +'registrationSplashPanelShowPassphraseButtonLabel': "show passphrase", + +// Header links +'donateHeaderLinkLabel': "donate", +'creditsHeaderLinkLabel': "credits", +'feedbackHeaderLinkLabel': "feedback", +'helpHeaderLinkLabel': "help", +'forumHeaderLinkLabel': "forum", + +// Menu labels +'recordMenuLabel': "cards", +'accountMenuLabel': "account", +'dataMenuLabel': "data", +'contactsMenuLabel': "contacts", +'toolsMenuLabel': "tools", +'logoutMenuLabel': "logout", +'lockMenuLabel': "lock", + +// Lock dialog +'lockTitle': "The account is locked", +'lockDescription': "<p>To unlock your account, please enter your passphrase.</p>", +'unlockButtonLabel': "Unlock", + +// Account panel - change passphrase +'changePasswordTabLabel': "Change your passphrase", +'changePasswordTabTitle': "Change your passphrase", + +'changePasswordFormUsernameLabel': "username", +'changePasswordFormOldPassphraseLabel': "old passphrase", +'changePasswordFormNewPassphraseLabel': "new passphrase", +'changePasswordFormRetypePassphraseLabel': "re-enter new passphrase", +'changePasswordFormSafetyCheckboxLabel': "I understand that Clipperz will not be able to recover a lost passphrase.", +'changePasswordFormSubmitLabel': "Change passphrase", + +// Account panel - change passphrase - warning messages +'changePasswordFormWrongUsernameWarning': "Wrong username", +'changePasswordFormWrongPassphraseWarning': "Wrong passphrase", +'changePasswordFormWrongRetypePassphraseWarning': "Your passphrases don't match, please re-type them.", +'changePasswordFormSafetyCheckWarning': "Please read and check the box below.", + +// Account panel - change passphrase - progress dialog +'changePasswordFormProgressDialogTitle': "Changing user credentials", +'changePasswordFormProgressDialogEmptyText': "---", +'changePasswordFormProgressDialogConnectedMessageTitle': "Connected", +'changePasswordFormProgressDialogConnectedMessageText': "Done", +'changePasswordFormProgressDialogErrorMessageTitle': "Error", +'changePasswordFormProgressDialogErrorMessageText': "Credentials change failed!", + +'changeCredentialsPanelEncryptingDataMessageTitle': "Changing your passphrase", +'changeCredentialsPanelEncryptingDataMessageText': "Local encryption of card headers", +'changeCredentialsPanelCreatingNewCredentialsMessageTitle': "Changing your passphrase", +'changeCredentialsPanelCreatingNewCredentialsMessageText': "Updating your credentials", +'changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle': "Changing your passphrase", +'changeCredentialsPanelSendingNewCredentialsToTheServerMessageText': "Uploading your encrypted credentials to Clipperz", +'changeCredentialsPanelDoneMessageTitle': "Changing your passphrase", +'changeCredentialsPanelDoneMessageText': "Done", + +// Account panel - OTP +'manageOTPTabLabel': "Manage your one-time passphrases", +'manageOTPTabTitle': "Manage your one-time passphrases", + +'manageOTPTabDescription': "\ + <p>A one-time passphrase works like your regular passphrase, but can be used only once.</p>\ + <p>If the same passphrase is used again at a later stage in a login attempt it will be rejected and the login process will fail.</p>\ + <p>Immediately after a successful login, your one-time passphrase will be deleted preventing any fraudulent access.</p>\ + <p>One-time passphrases are an excellent choice if one is concerned about keyloggers or spyware infections that may be collecting data from compromised machines.</p>\ + <p><b>It's strongly advisable to use one-time passphrases when accessing Clipperz from public terminals, such as Internet cafes and libraries.</b></p>", + +// Account panel - OTP - OTP table +'oneTimePasswordReadOnlyMessage': "\ + <h6>Sorry!</h6>\ + <p>You cannot manage your one-time passphrases when using the offline version of Clipperz.</p>", + +'oneTimePasswordLoadingMessage': "\ + <h6>Loading data</h6>\ + <p>Please wait …</p>", + +'oneTimePasswordNoPasswordAvailable': "\ + <h6>No one-time passphrase available</h6>\ + <p>Click the “New” button above to add one-time passphrases to your account.</p>", + +'createNewOTPButtonLabel': "New", +'deleteOTPButtonLabel': "Delete", +'printOTPButtonLabel': "Print", + +'disabledOneTimePassword_warning': "disabled", + +'oneTimePasswordSelectionLink_selectLabel': "Select:", +'oneTimePasswordSelectionLink_all': "all", +'oneTimePasswordSelectionLink_none': "none", +'oneTimePasswordSelectionLink_used': "used", +'oneTimePasswordSelectionLink_unused': "unused", + +//Account panel - OTP - saving new OTP dialog +'saveOTP_encryptUserDataTitle': "Saving one-time passphrase", +'saveOTP_encryptUserDataText': "Processing new OTP credentials …", +'saveOTP_encryptOTPDataTitle': "Saving one-time passphrase", +'saveOTP_encryptOTPDataText': "Local encryption of authentication data …", +'saveOTP_sendingDataTitle': "Saving one-time passphrase", +'saveOTP_sendingDataText': "Sending authentication data to the server …", +'saveOTP_updatingInterfaceTitle': "Saving one-time passphrase", +'saveOTP_updatingInterfaceText': "Updating interface", + +// Account panel - preferences +'accountPreferencesLabel': "Preferences", +'accountPreferencesTabTitle': "Preferences", + +'accountPreferencesLanguageTitle': "Language", +'accountPreferencesLanguageDescription': "<p>Choose your preferred language from the list below.</p>", + +'showDonationReminderPanelTitle': "Donation reminders", +'showDonationReminderPanelDescription': "<p>Show donation reminders</p>", + +'saveUserPreferencesFormSubmitLabel': "Save", +'cancelUserPreferencesFormSubmitLabel': "Cancel", + +// Account panel - preferences - saving dialog +'accountPreferencesSavingPanelTitle_Step1': "Saving preferences", +'accountPreferencesSavingPanelText_Step1': "Local encryption of your preferences", +'accountPreferencesSavingPanelTitle_Step2': "Saving preferences", +'accountPreferencesSavingPanelText_Step2': "Sending encrypted preferences to Clipperz", + +// Account panel - login history +'accountLoginHistoryLabel': "Login history", +'loginHistoryTabTitle': "Login history", + +'loginHistoryReadOnlyMessage': "\ + <h6>Sorry!</h6>\ + <p>The login history is not available while using the offline version of Clipperz.</p>", + +'loginHistoryLoadingMessage': "\ + <h6>Loading data</h6>\ + <p>Please wait …</p>", + +'loginHistoryLoadedMessage': "\ + <h6>Your latest 10 logins</h6>\ + <p></p>", + +'loginHistoryIPLabel': "IP", +'loginHistoryTimeLabel': "date", +'loginHistoryCurrentSessionText': "current session", +'loginHistoryReloadButtonLabel': "Reload login history", + +// Account panel - delete account +'deleteAccountTabLabel': "Delete your account", +'deleteAccountTabTitle': "Delete your account", + +'deleteAccountFormUsernameLabel': "username", +'deleteAccountFormPassphraseLabel': "passphrase", +'deleteAccountFormSafetyCheckboxLabel': "I understand that all my data will be deleted and that this action is irreversible.", +'deleteAccountFormSubmitLabel': "Delete my account", + +//Account panel - delete account - warnings +'deleteAccountFormWrongUsernameWarning': "Wrong username", +'deleteAccountFormWrongPassphraseWarning': "Wrong passphrase", +'deleteAccountFormSafetyCheckWarning': "Please read and check the box below.", + +//Account panel - delete account - confirmation +'accountPanelDeletingAccountPanelConfirmationTitle': "ATTENTION", +'accountPanelDeleteAccountPanelConfirmationText': "Are your sure you want to delete your account?", +'accountPanelDeleteAccountPanelConfirmButtonLabel': "Yes", +'accountPanelDeleteAccountPanelDenyButtonLabel': "No", + +//Account panel - delete account - confirmation +'accountPanelDeletingAccountPanelProgressTitle': "Deleting the account data", +'accountPanelDeletingAccountPanelProgressText': "The operation could take long, please be patient.", + +//Data panel - offline copy +'offlineCopyTabLabel': "Offline copy", +'offlineCopyTabTitle': "Offline copy", + +'offlineCopyTabDescription': "\ + <!-- FIX CSS DONE! --> \ + <p>With just one click you can dump all your encrypted data from Clipperz servers to your hard disk and create a read-only offline version of Clipperz to be used when you are not connected to the Internet.</p>\ + <p>The read-only version is as secure as the read-and-write one and will not expose your data to higher risks since they both share the same code and security architecture.</p>\ + <ol>\ + <li><p>Click the link below to start the download.</p></li>\ + <li><p>The browser will ask you what to do with the “Clipperz_YYYYMMDD.html” file. Save it on your hard disk.</p></li>\ + <li><p>Double click on the downloaded file to launch the offline version in your browser.</p></li>\ + <li><p>Enter the usual username and passphrase.</p></li>\ + </ol>", + +'offlineCopyDownloadLinkLabel': "Download", + +// Data panel - offline copy - not updated +'offlineCopyDownloadWarning': "\ + <!-- FIX CSS DONE! --> \ + <h4><a href=\"#\" id=\"offlineCopyDownloadWarningLink\">Update your “offline copy”!</a></h4>\ + <p>You have recently created or modified one or more cards, it would be wise to download a new copy of the offline version.</p>", + +'offlineCopyDownloadOk': "", + +// Data panel - sharing +'sharingTabLabel': "Sharing", +'sharingTabTitle': "Sharing", + +'sharingTabDescription': "\ + <p>Quite often a confidential piece of information needs to be shared with one or more persons.</p>\ + <p>This could be as simple as giving your colleague the access code of your voice mailbox when you are out of the office, or as complicated as enabling the entitled heirs to access your safe deposit box at the local bank when you pass on.</p>\ + <p>Clipperz can make sharing your secrets a secure and straightforward process.</p>\ + <p></p>\ + <p><b>Coming soon …</b></p>", + +// Data panel - import +'importTabLabel': "Import", +'importTabTitle': "Import", + +'importTabDescription': "<p>You can bulk import data to your Clipperz account from several file formats.</p>", + +// Data panel - export +'printingTabLabel': "Export", +'printingTabTitle': "Export", + +'printingTabDescription': "\ + <h5>Printing</h5>\ + <p>Click on the link below to open a new window displaying all your cards in a printable format.</p>\ + <p>If you are going to print for backup purposes, please consider the safer option provided by the “offline copy”.</p>", + +'printingLinkLabel': "Printable version", + +'exportTabDescription': "\ + <h5>Exporting to JSON</h5>\ + <p>JSON enables a “lossless” export of your cards. All the information will be preserved, including direct login configurations.</p>\ + <p>This custom format it’s quite convenient if you need to move some of all of your cards to a different Clipperz account. Or if you want to restore a card that has been accidentally deleted.</p>\ + <p>Click on the link below to start the export process.</p>", + +'exportLinkLabel': "Export to JSON", + +'exportDataInProgressDescription': "<h4>Exporting, please wait while your data are being processed …</h4>", + +'exportDataDescription': "\ + <h4>Instructions</h4>\ + <p>Copy the text below to your favorite editor and save it. (e.g. “clipperz_export_20071217.json”)</p>", + +// Contacts panel +'contactsTabLabel': "Contacts", +'contactsTabTitle': "Contacts", + +//Tools panel - password generator +'passwordGeneratorTabLabel': "Password generator", +'bookmarkletTabLabel': "Bookmarklet", +'compactTabLabel': "Compact edition", +'httpAuthTabLabel': "HTTP authentication", + +'passwordGeneratorTabTitle': "Password generator", +'bookmarkletTabTitle': "Bookmarklet", +'compactTabTitle': "Compact edition", +'httpAuthTabTitle': "HTTP authentication", + + +// Tools panel - password generator - description +'paswordGeneratorTabDescription': "<p></p>", +'passwordGeneratorTabButtonLabel': "Generate password", + +// Tools panel - bookmarklet +'bookmarkletTabLabel': "Bookmarklet", +'bookmarkletTabTitle': "Bookmarklet", + +'bookmarkletTabDescription': "\ + <!-- FIX CSS DONE! --> \ + <p>A bookmarklet is a simple “one-click” tool that can perform very useful tasks. It can be saved and used like a normal web page bookmark.</p>\ + <p>The Clipperz bookmarklet will help you to quickly create new cards and new “direct logins” within existing cards.</p>\ + <p><b>Please note that the bookmarklet does not include any information related to your account (e.g. your username or passphrase), the bookmarklet is a general tool containing the same code for every Clipperz user.</b></p>\ + <h3>How to install the bookmarklet</h3>\ + <h>Firefox, Camino, Opera, Safari</h5>\ + <ol>\ + <li><p>Make sure that the “Bookmarks Bar” is displayed by selecting “View > Toolbars > Bookmarks”, or similar menu items, from the browser menu.</p></li>\ + <li><p>Drag and drop the “Add to Clipperz” link below to the bookmark bar.</p></li>\ + </ol>\ + \ + <h5>Internet Explorer</h5>\ + <ol>\ + <li><p>Make sure that the “Links” toolbar is displayed by selecting “View > Toolbars > Links” from the browser menu.</p></li>\ + <li><p>Right-click on the “Add to Clipperz” link below.</p></li>\ + <li><p>Select “Add to favorites” from the contextual menu.</p></li>\ + <li><p>Click “Yes” for any security message that pops up.</p></li>\ + <li><p>Open the “Links” folder and click “OK”</p></li>\ + </ol>", + +'bookmarkletTabBookmarkletTitle': "Add to Clipperz", + +// Tools panel - bookmarklet - instructions +'bookmarkletTabInstructions': "\ + <!-- FIX CSS DONE! --> \ + <h3>How to create a new card inclusive of a “direct login” link to an online service</h3>\ + <ol>\ + <li><p>Open the web page where the login form is hosted. (this is the page where you usually enter your sign-in credentials)</p></li>\ + <li><p>Launch the bookmarklet by clicking on it: a pop-up window will appear over the web page.</p></li>\ + <li><p>Copy to the clipboard the content of the large text area within the pop-up. (ctrl-C)</p></li>\ + <li><p>Enter your Clipperz account and click on the <b>Add new card</b> button.</p></li>\ + <li><p>Select the “Direct login” template and paste the content of the clipboard to the large text area in the form. (ctrl-V)</p></li>\ + <li><p>Press the <b>Create</b> button, complete and review the details, then click <b>Save</b>.</p></li>\ + </ol>\ + \ + <h3>How to add a “direct login” link to an existing card</h3>\ + <ol>\ + <li><p>Same as above.</p></li>\ + <li><p>Same as above.</p></li>\ + <li><p>Same as above.</p></li>\ + <li><p>Enter your Clipperz account and select the card containing the credentials for the web service you just visited and click the <b>Edit</b> button.</p></li>\ + <li><p>Paste the content of the clipboard to the large text area in the “Direct logins” section. (ctrl-V)</p></li>\ + <li><p>Press the <b>Add direct login</b> button, review the details and then click <b>Save</b>.</p></li>\ + </ol>\ + \ + <p></p>\ + <p>Further information about the bookmarklet are <a href=\"http://www.clipperz.com/support/user_guide/bookmarklet\" target=\"_blank\">available here</a>.</p>", + +// Tools panel - Compact - instructions +'compactTabDescription': "\ + <!-- FIX CSS DONE! --> \ + <p>Clipperz Compact is a special version of Clipperz designed to be opened in the Firefox sidebar.</p>\ + <p>Its purpose is to keep your collection of “direct logins” always at hand. Read more <a href=\"http://www.clipperz.com/support/user_guide/clipperz_compact\", target=\"blank\">here</a></p>\ + \ + <h3>How to launch Clipperz Compact in the sidebar</h3>\ + <ol>\ + <li><p>Get Firefox! Sidebars are only available in Firefox and you need to switch to Firefox in order to enjoy the convenience of Clipperz Compact.</p></li>\ + <li>\ + <p>Add the following URL to Firefox bookmarks, or even better, drag it to the bookmark bar.</p>\ + <div id=\"compactLinkBox\"><a href=\"https://www.clipperz.com/beta/index.html?compact\" target=\"_search\">Clipperz Compact</a></div>\ + </li>\ + <li><p>Change the properties of the bookmark so that “load this bookmark in the sidebar” is checked.</p></li>\ + </ol>\ + \ + <h5>Added bonus: Clipperz Compact works also in Opera’s panel.</h5>", + +// Tools panel - HTTP authentication - instructions +'httpAuthTabDescription': "\ + <!-- FIX CSS DONE! --> \ + <p>HTTP authentication is a method designed to allow a web browser to provide credentials – in the form of a username and password – including them in a website address (HTTP or HTTPS URL).</p>\ + <p>Nowadays it is rarely used, but it can still be found on small, private websites. You can tell that a website is protected by HTTP authentication when the browser displays a pop-up window to enter username and password.</p>\ + <p>Unfortunately the Clipperz bookmarklet does not work on websites that use HTTP authentication. However you can still create a “direct login”.</p>\ + \ + <h3>How to create a “direct login” for a website that uses HTTP authentication</h3>\ + <ol>\ + <li><p>Store website URL, username and password in a new card.</p></li>\ + <li><p>Copy the configuration below and paste it to the large text area in the “Direct logins” section of the new card.</p></li>\ + <li><p>Press the <b>Add direct login</b> button, bind URL, username and password fields and then click <b>Save</b>.</p></li>\ + </ol>\ + \ + <h5><a href=\"http://support.microsoft.com/kb/834489\" target=\"_blank\">Warning: Internet Explorer does not support HTTP authentication.</a></h5>", + +// Direct logins block +'mainPanelDirectLoginBlockLabel': "Direct logins", +'directLinkReferenceShowButtonLabel': "show", + +// Direct logins - blank slate +'mainPanelDirectLoginBlockDescription': "\ + <!-- FIX CSS DONE! --> \ + <p>Add “direct logins” to sign in to your web accounts without typing usernames and passwords!</p>\ + <p>“Direct logins” greatly enhance your password security since you can:</p>\ + <ul>\ + <li><p>conveniently adopt and enter complex passwords;</p></li>\ + <li><p>never re-use the same and easy-to-guess password.</p></li>\ + </ul>\ + <p>Simple and quick configuration with the <b>Clipperz bookmarklet</b>.</p>\ + <a href=\"http://www.clipperz.com/support/user_guide/direct_logins\" target=\"_blank\">Learn more about “direct logins”</a>", + +// Cards block +'mainPanelRecordsBlockLabel': "Cards", +'mainPanelAddRecordButtonLabel': "Add new card", +'mainPanelRemoveRecordButtonLabel': "Delete card", + +// Cards block - filter tabs +'mainPanelRecordFilterBlockAllLabel': "all", +'mainPanelRecordFilterBlockTagsLabel': "tags", +'mainPanelRecordFilterBlockSearchLabel': "search", + +// Cards block - blank slate +'recordDetailNoRecordAtAllTitle': "Welcome to Clipperz!", +'recordDetailNoRecordAtAllDescription': "\ + <h5>Get started by adding cards to your account.</h5>\ + <p>Cards are simple and flexible forms where you can store your passwords and any other confidential data.</p>\ + <p>Cards could contain credentials for accessing a web site, the combination of your bicycle lock, details of your credit card, …</p>\ + \ + <h5>Don't forget the Clipperz bookmarklet!</h5>\ + <p>Before you start, install the “Add to Clipperz” bookmarklet: it will make creating cards easier and more fun.</p>\ + <p>Go to the “Tools” tab to discover how to install it and how it use it.</p>\ + <p></p>\ + <p>Then simply click the <b>\"Add new card\"</b> button and enjoy your Clipperz account.</p>\ + <p></p>\ + <a href=\"http://www.clipperz.com/support/user_guide/managing_cards\" target=\"_blank\">Learn more about creating and managing cards</a>", + +// Cards block - new card wizard - bookmarklet configuration +'newRecordWizardTitleBox': "\ + <h5>Please select a template</h5>\ + <p>Cards are simple and flexible forms where you can store passwords or any other confidential data.</p>\ + <p>Start choosing one of the templates below. You can always customize your cards later by adding or removing fields.</p>", + +'newRecordWizardBookmarkletConfigurationTitle': "Direct login", +'newRecordWizardBookmarkletConfigurationDescription': "\ + <p>Paste below the configuration code generated by the Clipperz bookmarklet.</p>\ + <p>A new card complete with a direct login to your web account will be created.</p>", + +'newRecordWizardCreateButtonLabel': "Create", +'newRecordWizardCancelButtonLabel': "Cancel", + +// Create new card - Donation splash +'donateSplashPanelTitle': "Support Clipperz, make a donation today!", +'donateSplashPanelDescription': "\ + <!-- FIX CSS DONE! --> \ + <p>A few good reasons to make a donation:</p>\ + <ul>\ + <li><p>support the development of new features</p></li>\ + <li><p>keep Clipperz free</p></li>\ + <li><p>show appreciation for our hard work</p></li>\ + </ul>\ + <p>For any further information, please visit our <a href=\"http://www.clipperz.com/donations\" target=\"_blank\">Donations page</a>.</p>\ + <p><b>Ready to donate?</b></p>", + +'donateCloseButtonLabel': "Not yet", +'donateDonateButtonLabel': "Yes", + +// Card templates +'recordTemplates': { + +//Web password + 'WebAccount': { + 'title': "Web password", + 'description': "<p>A simple card to store login credentials for your online services.</p>", + 'fields': [ + {label:"Web address", type:'URL'}, + {label:"Username or email", type:'TXT'}, + {label:"Password", type:'PWD'} + ] + }, + +//Bank account + 'BankAccount': { + 'title': "Bank account", + 'description': "<p>Safely store your bank account number and online banking credentials.</p>", + 'fields': [ + {label:"Bank", type:'TXT'}, + {label:"Account number", type:'TXT'}, + {label:"Bank website", type:'URL'}, + {label:"Online banking ID", type:'TXT'}, + {label:"Online banking password", type:'PWD'} + ] + }, + +// Credit card + 'CreditCard': { + 'title': "Credit card", + 'description': "<p>Card number, expire date, CVV2 and PIN always at hand with Clipperz.</p>", + 'fields': [ + {label:"Type (Visa, AmEx, …)", type:'TXT'}, + {label:"Number", type:'TXT'}, + {label:"Owner name", type:'TXT'}, + {label:"Expiry date", type:'TXT'}, + {label:"CVV2", type:'TXT'}, + {label:"PIN", type:'PWD'}, + {label:"Card website", type:'URL'}, + {label:"Username", type:'TXT'}, + {label:"Password", type:'PWD'} + ] + }, + +// Address book entry + 'AddressBookEntry': { + 'title': "Address book entry", + 'description': "<p>Clipperz could also work as your new private address book. Use this template to easily add a new entry.</p>", + 'fields': [ + {label:"Name", type:'TXT'}, + {label:"Email", type:'TXT'}, + {label:"Phone", type:'TXT'}, + {label:"Mobile", type:'TXT'}, + {label:"Address", type:'ADDR'} + ] + }, + +//Custom card + 'Custom': { + 'title': "Custom card", + 'description': "<p>No matter which kind of confidential data you need to protect, create a custom card to match your needs.</p>", + 'fields': [ + {label:"Label 1", type:'TXT'}, + {label:"Label 2", type:'TXT'}, + {label:"Label 3", type:'TXT'} + ] + } +}, + + +'recordFieldTypologies': { + 'TXT': { + description: "simple text field", + shortDescription: "text" + }, + 'PWD': { + description: "simple text field, with default status set to hidden", + shortDescription: "password" + }, + 'URL': { + description: "simple text field in edit mode, that became an active url in view mode", + shortDescription: "web address" + }, + 'DATE': { + description: "a value set with a calendar helper", + shortDescription: "date" + }, + 'ADDR': { + description: "just like the URL, but the active link points to Google Maps (or similar service) passing the address value as argument", + shortDescription: "street address" + }, + 'CHECK': { + description: "check description", + shortDescription: "check" + }, + 'RADIO': { + description: "radio description", + shortDescription: "radio" + }, + 'SELECT': { + description: "select description", + shortDescription: "select" + } +}, + +// Cards block - new card - warnings +'newRecordPanelGeneralExceptionTitle': "Error", +'newRecordPanelGeneralExceptionMessage': "The configuration text is not valid. Make sure to get your text from the bookmarklet pop-up and retry.", +'newRecordPanelWrongBookmarkletVersionExceptionTitle': "Error", +'newRecordPanelWrongBookmarkletVersionExceptionMessage': "The configuration text has been generated by an old version of the bookmarklet. Please update your bookmarklet and retry.", +'newRecordPanelExceptionPanelCloseButtonLabel': "Cancel", + +// Cards block - delete card +'mainPanelDeletingRecordPanelConfirmationTitle': "Deleting selected card", +'mainPanelDeleteRecordPanelConfirmationText': "Do your really want to delete the selected card?", +'mainPanelDeleteRecordPanelConfirmButtonLabel': "Yes", +'mainPanelDeleteRecordPanelDenyButtonLabel': "No", +'mainPanelDeletingRecordPanelInitialTitle': "Deleting selected card", +'mainPanelDeletingRecordPanelInitialText': "---", +'mainPanelDeletingRecordPanelCompletedText': "Done", + +// Cards block - delete card panel +'deleteRecordPanelCollectRecordDataMessageTitle': "Delete card", +'deleteRecordPanelCollectRecordDataMessageText': "Updating card list", +'deleteRecordPanelEncryptUserDataMessageTitle': "Delete card", +'deleteRecordPanelEncryptUserDataMessageText': "Local encryption of card headers", +'deleteRecordPanelSendingDataToTheServerMessageTitle': "Delete card", +'deleteRecordPanelSendingDataToTheServerMessageText': "Uploading encrypted card headers to Clipperz", +'deleteRecordPanelUpdatingTheInterfaceMessageTitle': "Delete card", +'deleteRecordPanelUpdatingTheInterfaceMessageText': "Updating the interface", + +// Cards block - no record selected +'recordDetailNoRecordSelectedTitle': "No card selected", +'recordDetailNoRecordSelectedDescription': "<p>Please select a card from the list on the left.</p>", + +// Cards block - loading messages +'recordDetailLoadingRecordMessage': "Downloading encrypted card from Clipperz", +'recordDetailDecryptingRecordMessage': "Local decryption of card\'s data", +'recordDetailLoadingRecordVersionMessage': "Downloading latest card version", +'recordDetailDecryptingRecordVersionMessage': "Local decryption of latest version", +'recordDetailLoadingErrorMessageTitle': "Error while downloading the card", + +// Cards block - card details +'recordDetailNotesLabel': "Notes", +'recordDetailLabelFieldColumnLabel': "Field label", +'recordDetailDataFieldColumnLabel': "Field data", +'recordDetailTypeFieldColumnLabel': "Type", + +'recordDetailSavingChangesMessagePanelInitialTitle': "Saving card", +'recordDetailSavingChangesMessagePanelInitialText': "---", + +'recordDetailRemoveFieldButtonLabel': "-", +'recordDetailAddFieldButtonLabel': "Add new field", +'recordDetailPasswordFieldHelpLabel': "click the stars to select the password and then Ctrl-C to copy", + +'recordDetailPasswordFieldScrambleLabel': "scramble", +'recordDetailPasswordFieldUnscrambleLabel': "unscramble", + +'recordDetailDirectLoginBlockTitle': "Direct logins", +'recordDetailNewDirectLoginDescription': "<p>Direct login configuration</p>", + +'recordDetailDirectLoginBlockNoDirectLoginConfiguredDescription': "\ + <p>Does this card contain credentials to access an online service?</p>\ + <p>Use the bookmarklet to configure a “direct login” from Clipperz with just one click!</p>", + +'recordDetailDeleteDirectLoginButtonLabel': "-", +'recordDetailAddNewDirectLoginButtonLabel': "Add new direct login", + +'recordDetailEditButtonLabel': "Edit", +'recordDetailSaveButtonLabel': "Save", +'recordDetailCancelButtonLabel': "Cancel", + +'newRecordTitleLabel': "_new card_", +'newDirectLoginLabelSuffix': "", + +// Cards block - save card panel +'recordSaveChangesPanelCollectRecordInfoMessageTitle': "Save card", +'recordSaveChangesPanelCollectRecordInfoMessageText': "Updating card headers", +'recordSaveChangesPanelEncryptUserDataMessageTitle': "Save card", +'recordSaveChangesPanelEncryptUserDataMessageText': "Local encryption of card headers", +'recordSaveChangesPanelEncryptRecordDataMessageTitle': "Save card", +'recordSaveChangesPanelEncryptRecordDataMessageText': "Local encryption of card's data", +'recordSaveChangesPanelEncryptRecordVersionDataMessageTitle': "Save card", +'recordSaveChangesPanelEncryptRecordVersionDataMessageText': "Local encryption of card's version data", +'recordSaveChangesPanelSendingDataToTheServerMessageTitle': "Save card", +'recordSaveChangesPanelSendingDataToTheServerMessageText': "Uploading encrypted card's header to Clipperz", +'recordSaveChangesPanelUpdatingTheInterfaceMessageTitle': "Save card", +'recordSaveChangesPanelUpdatingTheInterfaceMessageText': "Updating the interface", + +// Password Generator strings +'passwordGeneratorPanelTitle': "Password generator", +'passwordGeneratorPanelOkLabel': "Ok", +'passwordGeneratorPanelCancelLabel': "Cancel", + +'passwordGeneratorLowercaseLabel': "abc", +'passwordGeneratorUppercaseLabel': "ABC", +'passwordGeneratorNumberLabel': "012", +'passwordGeneratorSymbolLabel': "@#$", + +'passwordGeneratorLengthLabel': "length:", + + +//Miscellaneous strings + +'comingSoon': "coming soon …", +'panelCollectingEntryopyMessageText': "Collecting entropy", +'directLoginConfigurationCheckBoxFieldSelectedValue': "Yes", +'directLoginConfigurationCheckBoxFieldNotSelectedValue': "No", + + + +// NEW - Import panel +'importFormats': { + 'CSV': { + 'label': "CSV", + 'description': "<p>A widely recognized file format that stores tabular data. Several password managers can export data to this format.</p>" + }, + 'Excel': { + 'label': "Excel", + 'description': "<p>The popular spreadsheet from Microsoft. Storing passwords in Excel files is very common but not advisable.</p>" + }, + 'KeePass': { + 'label': "KeePass", + 'description': "<p>The custom TXT file created by KeePass password manager.</p>" + }, + 'PasswordPlus': { + 'label': "Password Plus", + 'description': "<p>The custom CSV format produced by Password Plus, a password manager mostly used on mobile devices.</p>" + }, + 'Roboform': { + 'label': "RoboForm", + 'description': "<p>The special HTML file created by Roboform password manager when displaying Passcard and Safenotes for printing.</p>" + }, + 'ClipperzExport': { + 'label': "JSON", + 'description': "<p>The file created by Clipperz itself in JSON format. It preserves all information contained in your cards, even direct login configurations.</p>" + } +}, + +// JSON +'Clipperz_ImportWizard_Title': "JSON import", +'importOptions_clipperz_description': "<p>Open the JSON file exported from Clipperz in a text editor. Then copy and paste its content to the text area below.</p>", + +// CSV +'CSV_ImportWizard_Title': "CSV import", +'importOptions_csv_description_': "\ + <p>Open the CSV file in a text editor. Then copy and paste its content to the text area below.</p>\ + <p>Please select the special characters used within your file.</p>", + +// Excel +'Excel_ImportWizard_Title': "Excel import", +'importOptions_excel_description_': "<p>Open the Excel file and select the cells you want to import. Then copy and paste them to the text area below.</p>", + +// KeePass +'KeePass_ImportWizard_Title': "KeePass import", +'importOptions_keePass_description_': "<p>Open the TXT file created by Keepass in a text editor. Then copy and paste its content to the text area below.</p>", + +// PasswordPlus +'PasswordPlus_ImportWizard_Title': "Password Plus import", +'importOptions_passwordPlus_description': "<p>Open the CSV file created by PasswordPlus in a text editor. Then copy and paste its content to the text area below.</p>", + +// RoboForm +'RoboForm_ImportWizard_Title': "RoboForm import", +'importOptions_roboForm_description': "<p>Open the HTML file created by RoboForm in a text editor. Then copy and paste its content to the text area below.</p>", + + +'importData_parsingDataTitle': "Import", +'importData_parsingDataText': "Parsing data …", + +'importData_previewingDataTitle': "Import", +'importData_previewingDataText': "Processing data …", + +'importData_processingDataTitle': "Import", +'importData_processingDataText': "Creating new cards …", + +'ImportWizard': { + 'EDIT': "edit", + 'PREVIEW': "preview", + 'IMPORT': "import", + + 'KEEPASS_SETTINGS': "settings", + + 'CSV_EDIT': "paste", + 'CSV_COLUMNS': "columns", + 'CSV_HEADER': "labels", + 'CSV_TITLE': "titles", + 'CSV_NOTES': "notes", + 'CSV_FIELDS': "types", + + 'EXCEL_EDIT': "edit" +}, + +'CSV_ImportWizard_Columns': "<p>Select the columns you want to import.</p>", +'CSV_ImportWizard_Header': "<p>If the first row of the CSV file contains field labels, tick off the checkbox below.</p>", +'CSV_ImportWizard_Header_Settings_firstRowHeaderLabel': "Use the first row as labels?", +'CSV_ImportWizard_Title': "<p>Select the column that contains titles of the cards you are importing. (mandatory)</p>", +'CSV_ImportWizard_Notes': "<p>Select the column that represents a \"notes\" field. (optional)</p>", +'CSV_ImportWizard_Notes_Settings_noSelectionLabel': "\"notes\" field not present", +'CSV_ImportWizard_Fields': "<p>Select the correct type for each column from the drop down lists.</p>", +'CSV_ImportWizard_Fields_MissingLabelWarning': "Missing label", + +'importData_importConfirmation_title': "Import", +'importData_importConfirmation_text': "Do you want to import __numberOfRecords__ cards?", + + +// Vulnerability warning +'VulnerabilityWarning_Panel_title': "Vulnerability warning", +'VulnerabilityWarning_Panel_message': "The action as been aborted due to a catched vulnerability", +'VulnerabilityWarning_Panel_buttonLabel': "Close", + + + +// All the loginInfo panel infos + +'WELCOME_BACK': "Welcome back!", + +'currentConnectionText': "You are connected from ip __ip__, apparently from __country__, using __browser__ on __operatingSystem__.", +'latestConnectionText': "Your latest connection was __elapsedTimeDescription__ (__time__) from ip __ip__, apparently from __country__, using __browser__ on __operatingSystem__.", + +'fullLoginHistoryLinkLabel': "show login history", + +'elapsedTimeDescriptions': { + 'MORE_THAN_A_MONTH_AGO': "more than a month ago", + 'MORE_THAN_A_WEEK_AGO': "more than a week ago", + 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago", + 'YESTERDAY': "yesterday", + '*_DAYS_AGO': "__elapsed__ days ago", + 'ABOUT_AN_HOUR_AGO': "about an hour ago", + '*_HOURS_AGO': "__elapsed__ hours ago", + 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago", + 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago" +}, + +'unknown_ip': "unknown", + +'countries': { + '--': "unknown", + 'AD': "Andorra", + 'AE': "United Arab Emirates", + 'AF': "Afghanistan", + 'AG': "Antigua and Barbuda", + 'AI': "Anguilla", + 'AL': "Albania", + 'AM': "Armenia", + 'AN': "Netherlands Antilles", + 'AO': "Angola", + 'AP': "Non-Spec Asia Pas Location", + 'AR': "Argentina", + 'AS': "American Samoa", + 'AT': "Austria", + 'AU': "Australia", + 'AW': "Aruba", + 'AX': "Aland Islands", + 'AZ': "Azerbaijan", + 'BA': "Bosnia and Herzegowina", + 'BB': "Barbados", + 'BD': "Bangladesh", + 'BE': "Belgium", + 'BF': "Burkina Faso", + 'BG': "Bulgaria", + 'BH': "Bahrain", + 'BI': "Burundi", + 'BJ': "Benin", + 'BM': "Bermuda", + 'BN': "Brunei Darussalam", + 'BO': "Bolivia", + 'BR': "Brazil", + 'BS': "Bahamas", + 'BT': "Bhutan", + 'BW': "Botswana", + 'BY': "Belarus", + 'BZ': "Belize", + 'CA': "Canada", + 'CD': "Congo the Democratic Republic of the", + 'CF': "Central African Republic", + 'CH': "Switzerland", + 'CI': "Cote D'ivoire", + 'CK': "Cook Islands", + 'CL': "Chile", + 'CM': "Cameroon", + 'CN': "China", + 'CO': "Colombia", + 'CR': "Costa Rica", + 'CS': "Serbia and Montenegro", + 'CU': "Cuba", + 'CY': "Cyprus", + 'CZ': "Czech Republic", + 'DE': "Germany", + 'DJ': "Djibouti", + 'DK': "Denmark", + 'DO': "Dominican Republic", + 'DZ': "Algeria", + 'EC': "Ecuador", + 'EE': "Estonia", + 'EG': "Egypt", + 'ER': "Eritrea", + 'ES': "Spain", + 'ET': "Ethiopia", + 'EU': "European Union", + 'FI': "Finland", + 'FJ': "Fiji", + 'FM': "Micronesia Federated States of", + 'FO': "Faroe Islands", + 'FR': "France", + 'GA': "Gabon", + 'GB': "United Kingdom", + 'GD': "Grenada", + 'GE': "Georgia", + 'GF': "French Guiana", + 'GG': "Guernsey", + 'GH': "Ghana", + 'GI': "Gibraltar", + 'GL': "Greenland", + 'GM': "Gambia", + 'GP': "Guadeloupe", + 'GR': "Greece", + 'GT': "Guatemala", + 'GU': "Guam", + 'GW': "Guinea-Bissau", + 'GY': "Guyana", + 'HK': "Hong Kong", + 'HN': "Honduras", + 'HR': "Croatia (Local Name: Hrvatska)", + 'HT': "Haiti", + 'HU': "Hungary", + 'ID': "Indonesia", + 'IE': "Ireland", + 'IL': "Israel", + 'IM': "Isle of Man", + 'IN': "India", + 'IO': "British Indian Ocean Territory", + 'IQ': "Iraq", + 'IR': "Iran (Islamic Republic of)", + 'IS': "Iceland", + 'IT': "Italy", + 'JE': "Jersey", + 'JM': "Jamaica", + 'JO': "Jordan", + 'JP': "Japan", + 'KE': "Kenya", + 'KG': "Kyrgyzstan", + 'KH': "Cambodia", + 'KI': "Kiribati", + 'KN': "Saint Kitts and Nevis", + 'KR': "Korea Republic of", + 'KW': "Kuwait", + 'KY': "Cayman Islands", + 'KZ': "Kazakhstan", + 'LA': "Lao People's Democratic Republic", + 'LB': "Lebanon", + 'LC': "Saint Lucia", + 'LI': "Liechtenstein", + 'LK': "Sri Lanka", + 'LR': "Liberia", + 'LS': "Lesotho", + 'LT': "Lithuania", + 'LU': "Luxembourg", + 'LV': "Latvia", + 'LY': "Libyan Arab Jamahiriya", + 'MA': "Morocco", + 'MC': "Monaco", + 'MD': "Moldova Republic of", + 'MG': "Madagascar", + 'MH': "Marshall Islands", + 'MK': "Macedonia the Former Yugoslav Republic of", + 'ML': "Mali", + 'MM': "Myanmar", + 'MN': "Mongolia", + 'MO': "Macau", + 'MP': "Northern Mariana Islands", + 'MR': "Mauritania", + 'MS': "Montserrat", + 'MT': "Malta", + 'MU': "Mauritius", + 'MV': "Maldives", + 'MW': "Malawi", + 'MX': "Mexico", + 'MY': "Malaysia", + 'MZ': "Mozambique", + 'NA': "Namibia", + 'NC': "New Caledonia", + 'NF': "Norfolk Island", + 'NG': "Nigeria", + 'NI': "Nicaragua", + 'NL': "Netherlands", + 'NO': "Norway", + 'NP': "Nepal", + 'NR': "Nauru", + 'NU': "Niue", + 'NZ': "New Zealand", + 'OM': "Oman", + 'PA': "Panama", + 'PE': "Peru", + 'PF': "French Polynesia", + 'PG': "Papua New Guinea", + 'PH': "Philippines", + 'PK': "Pakistan", + 'PL': "Poland", + 'PR': "Puerto Rico", + 'PS': "Palestinian Territory Occupied", + 'PT': "Portugal", + 'PW': "Palau", + 'PY': "Paraguay", + 'QA': "Qatar", + 'RO': "Romania", + 'RS': "Serbia", + 'RU': "Russian Federation", + 'RW': "Rwanda", + 'SA': "Saudi Arabia", + 'SB': "Solomon Islands", + 'SC': "Seychelles", + 'SD': "Sudan", + 'SE': "Sweden", + 'SG': "Singapore", + 'SI': "Slovenia", + 'SK': "Slovakia (Slovak Republic)", + 'SL': "Sierra Leone", + 'SM': "San Marino", + 'SN': "Senegal", + 'SR': "Suriname", + 'SV': "El Salvador", + 'SY': "Syrian Arab Republic", + 'SZ': "Swaziland", + 'TC': "Turks and Caicos Islands", + 'TG': "Togo", + 'TH': "Thailand", + 'TJ': "Tajikistan", + 'TM': "Turkmenistan", + 'TN': "Tunisia", + 'TO': "Tonga", + 'TR': "Turkey", + 'TT': "Trinidad and Tobago", + 'TV': "Tuvalu", + 'TW': "Taiwan Province of China", + 'TZ': "Tanzania United Republic of", + 'UA': "Ukraine", + 'UG': "Uganda", + 'US': "United States", + 'UY': "Uruguay", + 'UZ': "Uzbekistan", + 'VA': "Holy See (Vatican City State)", + 'VE': "Venezuela", + 'VG': "Virgin Islands (British)", + 'VI': "Virgin Islands (U.S.)", + 'VN': "Viet Nam", + 'VU': "Vanuatu", + 'WF': "Wallis and Futuna Islands", + 'WS': "Samoa", + 'YE': "Yemen", + 'ZA': "South Africa", + 'ZM': "Zambia", + 'ZW': "Zimbabwe", + 'ZZ': "Reserved" +}, + +'browsers': { + 'UNKNOWN': "Unknown", + 'MSIE': "Internet Explorer", + 'FIREFOX': "Firefox", + 'OPERA': "Opera", + 'SAFARI': "Safari", + 'OMNIWEB': "OmniWeb", + 'CAMINO': "Camino", + 'CHROME': "Chrome" +}, + +'operatingSystems': { + 'UNKNOWN': "Unknown", + 'WINDOWS': "Windows", + 'MAC': "Mac", + 'LINUX': "Linux", + 'IPHONE': "iPhone", + 'MOBILE': "Mobile", + 'OPENBSD': "OpenBSD", + 'FREEBSD': "FreeBSD", + 'NETBSD': "NetBSD" +}, + + +// Calendar texts +'calendarStrings': { + 'months': { + '0': "January", + '1': "February", + '2': "March", + '3': "April", + '4': "May", + '5': "June", + '6': "July", + '7': "August", + '8': "September", + '9': "October", + '10': "November", + '11': "December" + }, + 'shortMonths': { + '0': "Jan", + '1': "Feb", + '2': "Mar", + '3': "Apr", + '4': "May", + '5': "Jun", + '6': "Jul", + '7': "Aug", + '8': "Sep", + '9': "Oct", + '10': "Nov", + '11': "Dec" + }, + + 'days': { + '0': "Sunday", + '1': "Monday", + '2': "Tuesday", + '3': "Wednesday", + '4': "Thursday", + '5': "Friday", + '6': "Saturday" + }, + + 'shortDays': { + '0': "Sun", + '1': "Mon", + '2': "Tue", + '3': "Wed", + '4': "Thu", + '5': "Fri", + '6': "Sat" + }, + + 'veryShortDays': { + '0': "Su", + '1': "Mo", + '2': "Tu", + '3': "We", + '4': "Th", + '5': "Fr", + '6': "Sa" + }, + + 'amDesignation': "am", + 'pmDesignation': "pm" + +}, + +// Date format +'fullDate_format': "l, F d, Y H:i:s", +*/ +//################################################################################ +/* +'pageHeader': { + 'donation': "donAte", + 'forum': "foRum", + 'credits': "creDits", + 'feedback': "feeDback", + 'help': "hElp" +}, + + +'bookmarkletCopy': { + 'noExceptionMessage': "The direct login configuration has been collected.", + 'exceptionMessage': "Sorry! There was an error while processing the page.", + 'copy': "copy", + 'successfulMessage': "DONE!", + 'failMessage': "Failed! :(" +}, +*/ +//################################################################################ + +'Wizards': { + 'DirectLoginWizard': { + 'LABEL': { + 'name': "label", + 'description': "Enter a name for your new direct login." + }, + 'TYPE': { + 'name': "type", + 'description': "short description of the different types of direct login available" + }, + 'CONFIGURATION': { + 'name': "config", // "bookmarklet config", + 'description': "Paste the code collected by the bookmarklet. (To install the bookmarklet drag the link below to the bookmark bar of your browser.)" + }, + 'BINDINGS': { + 'name': "bindings", + 'description': "Select the right value for each field from the drop down menus." + }, + 'FAVICON': { + 'name': "favicon", + 'description': "If you are not satisfied with the small icon for this direct login, enter the URL of a new image file (.ico, .png, .jpg)." + }, + 'DONE': { + 'name': "done", + 'description': "Congratulations! You have created a new direct login using credentials contained in your '__cardName__' card.\nEnjoy 1-clik access to '__directLoginName__'!" + } + }, + 'NewUserWizard': { + 'CREDENTIALS': { + 'name': "credentials", + 'description': "[choose you credentials]" + }, + 'CHECK_CREDENTIALS': { + 'name': "check credentials", + 'description': "[check credentials]" + }, + 'TERMS_OF_SERVICE': { + 'name': "terms of service", + 'description': "[terms of service]" + }, + 'CREATE_USER': { + 'name': "login", + 'description': "[create user]" + } //, +/* + 'LOGIN': { + 'name': "login", + 'description': "[enjoy Clipperz]" + }, +*/ + } +}, + + +'exceptionsMessages': { + 'Clipperz': { + 'Crypto': { + 'Base': { + 'exception': { + 'CorruptedMessage': "Corrupted message" + } + } + } + } +}, + + +__syntaxFix__: "syntax fix" + +} diff --git a/frontend/delta/js/Clipperz/PM/Toll.js b/frontend/delta/js/Clipperz/PM/Toll.js new file mode 100644 index 0000000..e9c3092 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/Toll.js @@ -0,0 +1,189 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } + +//============================================================================= + +Clipperz.PM.Toll = function(args) { + args = args || {}; + + this._requestType = args.requestType; + this._targetValue = args.targetValue; + this._cost = args.cost; + this._toll = null; + + return this; +} + +Clipperz.PM.Toll.prototype = MochiKit.Base.update(null, { + + 'toString': function() { + return "Clipperz.PM.Toll (" + this.requestType() + ": " + this.cost() + " - " + ((this.toll() == null)? 'UNPAID' : 'PAID') + ")"; + }, + + //------------------------------------------------------------------------- + + 'requestType': function() { + return this._requestType; + }, + + //------------------------------------------------------------------------- + + 'targetValue': function() { + return this._targetValue; + }, + + //------------------------------------------------------------------------- + + 'cost': function() { + return this._cost; + }, + + //------------------------------------------------------------------------- + + 'toll': function() { + return this._toll; + }, + + //------------------------------------------------------------------------- +/* + '__pay': function() { + var result; + var targetData; + var targetMatchSize; + var prefixMatchingBits; + var payment; + var i; + + if (this.toll() == null) { + i = 0; + targetData = new Clipperz.ByteArray("0x" + this.targetValue()); + targetMatchSize = this.cost(); + + payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + + do { + var paymentData; + + //payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + payment.increment(); + paymentData = Clipperz.Crypto.SHA.sha256(payment); +// prefixMatchingBits = this.prefixMatchingBits(targetData, paymentData); + prefixMatchingBits = Clipperz.ByteArray.prefixMatchingBits(targetData, paymentData); + i++; + } while (prefixMatchingBits < targetMatchSize); + + this._toll = payment.toHexString().substring(2) + } + + return this; + }, +*/ + //------------------------------------------------------------------------- + + 'innerDeferredPay': function (aTargetValue, aCost, aPayment) { + var deferredResult; + var result; + var payment; + var i; + + result = null; + payment = aPayment; + i = 0; + + while ((result == null) && (i < Clipperz.PM.Toll.numberOfCloseLoopIterations)) { + if (Clipperz.ByteArray.prefixMatchingBits(aTargetValue, Clipperz.Crypto.SHA.sha256(payment)) > aCost) { + result = payment; + } else { + payment.increment(); + } + + i ++; + } + + if (result == null) { + deferredResult = MochiKit.Async.callLater(Clipperz.PM.Toll.pauseBetweenEachCloseLoop, MochiKit.Base.method(this, 'innerDeferredPay', aTargetValue, aCost, aPayment)); + } else { + deferredResult = MochiKit.Async.succeed(result); + } + + return deferredResult; + }, + + 'deferredPay': function () { + var deferredResult; + var toll; + + toll = this; + deferredResult = new Clipperz.Async.Deferred("Toll.deferredPay"); +//deferredResult.addLog("--->>> deferredPay - " + this.cost()); + deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes', 32); + deferredResult.addMethod(toll, 'innerDeferredPay', new Clipperz.ByteArray("0x" + this.targetValue()), this.cost()); + deferredResult.addCallback(MochiKit.Base.bind(function(aPayment) { + var result; + + result = { + targetValue: this.targetValue(), + toll: aPayment.toHexString().substr(2) + }; + + return result; + }, this)); +//deferredResult.addLog("<<<--- deferredPay - " + this.cost()); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" + +}); + + +Clipperz.PM.Toll.validate = function(aTargetValue, aToll, aCost) { + var result; + var tollValue; + var targetValue; + var hashedTollValue; + var payedToll; + + tollValue = new Clipperz.ByteArray("0x" + aToll); + targetValue = new Clipperz.ByteArray("0x" + aTargetValue); + hashedTollValue = Clipperz.Crypto.SHA.sha256(tollValue); + + payedToll = Clipperz.ByteArray.prefixMatchingBits(targetValue, hashedTollValue); + + if (payedToll < aCost) { + result = false; + } else { + result = true; + } + + return result; +}; + +Clipperz.PM.Toll.numberOfCloseLoopIterations = 50; +Clipperz.PM.Toll.pauseBetweenEachCloseLoop = 0.5;
\ No newline at end of file diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/CardDetail.js b/frontend/delta/js/Clipperz/PM/UI/Components/CardDetail.js new file mode 100644 index 0000000..df514a2 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/Components/CardDetail.js @@ -0,0 +1,142 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.PM.UI.Components.CardDetail = React.createClass({ + + getDefaultProps: function () { + return { +// searchDelay: 0.3 + } + }, + + propTypes: { + card: React.PropTypes.object.isRequired + }, + + getInitialState: function () { + return { +// showSearch: false, +// searchTimer: null, + starred: false + }; + }, + + handleDirectLoginClick: function (aDirectLoginReference, anEvent) { + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'runDirectLogin', {record:this.props.card['reference'], directLogin:aDirectLoginReference}); + }, + + //========================================================================= + + normalizeFieldValue: function (aValue) { + var result = []; + var rows = aValue.split('\n'); + + for (var i = 0; i < rows.length; i++) { + if (i > 0) { + result.push(React.DOM.br()); + } + result.push(rows[i].replace(/[\s]/g, '\u00A0')); + } + + return result; + }, + + renderField: function (aField) { +//console.log("FIELD", aField); + var actionLabel; + + if (aField['actionType'] == 'URL') { + actionLabel = "go"; + } else if (aField['actionType'] == 'PASSWORD') { + actionLabel = "locked"; + } else if (aField['actionType'] == 'EMAIL') { + actionLabel = "email"; + } else { + actionLabel = ""; + } + + return React.DOM.div({className:'listItem ' + aField['actionType']}, [ + React.DOM.div({className:'fieldWrapper'}, [ + React.DOM.div({className:'fieldInnerWrapper'}, [ + React.DOM.div({className:'labelWrapper'}, React.DOM.span({className:'label'}, aField['label'])), + React.DOM.div({className:'valueWrapper'}, React.DOM.span({className:'value ' + aField['actionType']}, this.normalizeFieldValue(aField['value']))) + ]) + ]), + React.DOM.div({className:'actionWrapper'}, [ + React.DOM.div({className:aField['actionType']}, actionLabel) + ]) + ]); + }, + + renderDirectLogin: function (aDirectLogin) { +//console.log("DIRECT LOGIN", aDirectLogin); + return React.DOM.div({className:'listItem', onClick:MochiKit.Base.method(this, 'handleDirectLoginClick', aDirectLogin['reference'])}, [ + React.DOM.div({className:'labelWrapper'}, React.DOM.span({className:'label'}, aDirectLogin['label'])), + React.DOM.div({className:'faviconWrapper'}, React.DOM.img({className:'favicon', src:aDirectLogin['favicon']})), + React.DOM.div({className:'directLoginLinkWrapper'}, React.DOM.span({className:'directLoginLink'}, "go")) + ]); + }, + + handleBackClick: function (anEvent) { + window.history.back(); + }, + + handleStarClick: function (anEvent) { + this.setState({starred: !this.state['starred']}); + }, + + //========================================================================= + + render: function () { + var card = this.props.card; + var starredStatus = (this.state['starred'] ? "starred" : "unstarred"); + + if ((typeof(card['fields']) != 'undefined') && (card['notes'] != '')) { + card['fields'].push({ 'actionType': 'NOTES', 'isHidden': false, 'label': "notes", 'reference': "notes", 'value': card['notes'] }) + } + + return React.DOM.div({className:'cardDetail'}, [ + React.DOM.div({className:'header'}, [ + React.DOM.div({className:'titleWrapper'}, React.DOM.div({className:'title'}, card.title)), +// React.DOM.div({className:'titleWrapper'}, React.DOM.div({className:'title'}, card.title + ' ' + card.title + ' ' + card.title + ' ' + card.title)), + React.DOM.div({className:'backWrapper'}, React.DOM.a({className:'button back', onClick:this.handleBackClick}, "back")), + React.DOM.div({className:'starWrapper'}, React.DOM.a({className:'star', onClick:this.handleStarClick}, starredStatus)) + ]), + React.DOM.div({className:'content'}, [ + card.fields ? React.DOM.div({className:'fields'}, MochiKit.Base.map(this.renderField, card.fields)) : null, + card.directLogins ? React.DOM.div({className:'directLogins'}, MochiKit.Base.map(this.renderDirectLogin, card.directLogins)): null + ]), + React.DOM.div({className:'footer'}, [ +/* +// React.DOM.a({className:'cancel'}, "cancel"), +// React.DOM.a({className:'save'}, "save") + + React.DOM.a({className:'cancel button'}, "failed"), + React.DOM.a({className:'save button'}, "done") +*/ + ]) + ]); + } + + //========================================================================= +}); diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/CardList.js b/frontend/delta/js/Clipperz/PM/UI/Components/CardList.js new file mode 100644 index 0000000..66d20f1 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/Components/CardList.js @@ -0,0 +1,161 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.PM.UI.Components.CardList = React.createClass({ + + getDefaultProps: function () { + return { + selectedCard: null, + searchDelay: 0.3 + } + }, + + propTypes: { + searchDelay: React.PropTypes.number + }, + + getInitialState: function () { + return { + showSearch: false, + searchTimer: null, + searchText: '', +// passphrase: '', +// pin: '' + }; + }, + + //========================================================================= + + toggleSearch: function (anEvent) { + var showSearchBox; + + showSearchBox = !this.state.showSearch; + + this.setState({showSearch: showSearchBox}); + + if (showSearchBox) { + MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'focusOnSearchField')); + } + }, + + updateSearchText: function (anEvent) { + var searchText; + + searchText = anEvent.target.value; +//console.log(">>> updateSearchText", searchText); + + if ((this.state['searchTimer'] != null) && (searchText != this.state['searchText'])) { + this.state['searchTimer'].cancel(); + } + + if (searchText != this.state['searchText']) { + this.state['searchText'] = searchText; + this.state['searchTimer'] = MochiKit.Async.callLater(this.props['searchDelay'], MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'searchCards', searchText); + } + }, + + focusOnSearchField: function () { +console.log("focusOnSearchField", this.refs['searchField']); + this.refs['searchField'].getDOMNode.focus(); + }, + + searchBox: function () { + var result; + + if (this.state.showSearch) { + result = React.DOM.div({className:'searchBox'}, [ + React.DOM.div(null, [ + React.DOM.input({type:'search', placeholder:"search", ref:'searchField', onChange:this.updateSearchText}) + ]) + ]); + } else { + result = null; + } + + return result; + }, + + //========================================================================= + + cardItem: function (aRecordReference) { + var reference = aRecordReference['_reference']; + var selectedCard = (reference == this.props.selectedCard); + + return React.DOM.div({className:'listItem', onClick:MochiKit.Base.method(this, 'handleClickOnCardDetail', reference)}, [ + React.DOM.div({className:'labelWrapper'}, React.DOM.span({className:'label'}, aRecordReference.label)), +// React.DOM.div({className:'labelWrapper'}, React.DOM.span({className:'label'}, aRecordReference.label + ' ' + aRecordReference.label + ' ' + aRecordReference.label + ' ' + aRecordReference.label + ' ' + aRecordReference.label)), + React.DOM.div({className:'faviconWrapper'}, aRecordReference.favicon ? React.DOM.img({className:'favicon', src:aRecordReference.favicon}) : React.DOM.div({className:'favicon'}, '\u00A0')), + React.DOM.div({className:'detailLinkWrapper'}, React.DOM.span({className:'detailLink ' + (selectedCard ? 'icon-spin' : '')}, (selectedCard ? "loading" : "detail"))) + ]); + }, + + handleClickOnCardDetail: function (aRecordReference, anEvent) { + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'showRecord', aRecordReference); + }, + + cardListItems: function () { + var list; + var result; + + list = this.props['cardList']; + + if (typeof(list) != 'undefined') { + result = MochiKit.Base.map(MochiKit.Base.method(this, 'cardItem'), list); + } else { + result = null; + } + + return result; + }, + + //========================================================================= + + handleChange: function (anEvent) { +// var refs = this.refs; +// var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName].getDOMNode() == anEvent.target}, MochiKit.Base.keys(this.refs))[0]; +// var newState = {}; +// +// newState[refName] = event.target.value; +// this.setState(newState); + }, + + //========================================================================= + + render: function() { + return React.DOM.div(null, [ + React.DOM.div({className:'header'}, [ + React.DOM.a({className:'account'}, 'clipperz'), + React.DOM.div({className:'features'}, [ + React.DOM.a({className:'addCard'}, 'add'), + React.DOM.a({className:'search ' + (this.state.showSearch ? 'selected' : ''), onClick:this.toggleSearch}, 'search'), + React.DOM.a({className:'settings'}, 'settings') + ]), +// this.searchBox() + ]), + this.searchBox(), + React.DOM.div({className:'content cardList'}, this.cardListItems()), + ]); + } + + //========================================================================= +}); diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/ErrorPage.js b/frontend/delta/js/Clipperz/PM/UI/Components/ErrorPage.js new file mode 100644 index 0000000..a1979ec --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/Components/ErrorPage.js @@ -0,0 +1,46 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.PM.UI.Components.ErrorPage = React.createClass({ + + getDefaultProps: function () { + return { + template: Clipperz.PM.UI.Components.PageTemplate + } + }, + + 'propTypes': { +// type: React.PropTypes.oneOf(['PERMANENT', 'TEMPORARY']), + message: React.PropTypes.string.isRequired, + template: React.PropTypes.func + }, + + + _render: function () { + return React.DOM.div({className:'error-message'}, this.props.message); + }, + + render: function () { + return new this.props.template({'innerComponent': this._render()}); + } +}); diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/LoginForm.js b/frontend/delta/js/Clipperz/PM/UI/Components/LoginForm.js new file mode 100644 index 0000000..2b5b4a4 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/Components/LoginForm.js @@ -0,0 +1,150 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.PM.UI.Components.LoginForm = React.createClass({ + + getDefaultProps: function () { + return { + mode: 'CREDENTIALS', + isNewUserRegistrationAvailable: false, + disabled: false, + template: Clipperz.PM.UI.Components.PageTemplate + } + }, + + propTypes: { + mode: React.PropTypes.oneOf(['CREDENTIALS','PIN']), + isNewUserRegistrationAvailable: React.PropTypes.bool, + disabled: React.PropTypes.bool, + template: React.PropTypes.func + }, + + getInitialState: function () { + return { + username: '', + passphrase: '', + pin: '' + }; + }, + + //========================================================================= + + handleChange: function (anEvent) { + var refs = this.refs; + var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName].getDOMNode() == anEvent.target}, MochiKit.Base.keys(this.refs))[0]; + var newState = {}; + + newState[refName] = event.target.value; + this.setState(newState); + }, + + //========================================================================= + + handleCredentialSubmit: function (event) { + event.preventDefault(); + + this.refs['passphrase'].getDOMNode().blur(); + + var credentials = { + 'username': this.refs['username'].getDOMNode().value, + 'passphrase': this.refs['passphrase'].getDOMNode().value + } + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', credentials); + }, + + handleRegistrationLinkClick: function (event) { + event.preventDefault(); + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'showRegistrationForm'); + }, + + //------------------------------------------------------------------------- + + shouldEnableLoginButton: function () { + var result; + + return ( + ((this.state['username'] != '') && (this.state['passphrase'] != '')) + || + (this.state['pin'] != '') + ) && !this.props['disabled']; + }, + + + loginForm: function () { + registrationLink = React.DOM.div({'className':'registrationLink'}, [ + React.DOM.a({'onClick':this.handleRegistrationLinkClick}, "Need an account") + ]); + return React.DOM.div({'className':'loginForm credentials'},[ + React.DOM.form({onChange: this.handleChange, onSubmit:this.handleCredentialSubmit}, [ + React.DOM.div(null,[ + React.DOM.label({'for':'name'}, "username"), + React.DOM.input({'type':'text', 'name':'name', 'ref':'username', 'placeholder':"username", 'key':'username', 'autoCapitalize':'none'}), + React.DOM.label({'for':'passphrase'}, "passphrase"), + React.DOM.input({'type':'password', 'name':'passphrase', 'ref':'passphrase', 'placeholder':"passphrase", 'key':'passphrase'}) + ]), + React.DOM.button({'type':'submit', 'disabled':!this.shouldEnableLoginButton(), 'className':'button'}, "login") + ]), + this.props.isNewUserRegistrationAvailable ? registrationLink : null + ]); + }, + + handlePINSubmit: function (event) { + event.preventDefault(); + + this.refs['pin'].getDOMNode().blur(); + + var credentials = { + pin: this.refs['pin'].getDOMNode().value + } + + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', credentials); + }, + + pinForm: function () { + return React.DOM.div({'className':'loginForm pin'},[ + React.DOM.form({onChange: this.handleChange, onSubmit:this.handlePINSubmit}, [ + React.DOM.div(null,[ + React.DOM.label({'for':'pin'}, "pin"), + React.DOM.input({'type':'text', 'name':'pin', 'ref':'pin', placeholder:"PIN", 'key':'pin', 'autocapitalize':'none'}) + ]), + React.DOM.button({'type':'submit', 'disabled':this.props.disabled, 'className':'button'}, "login") + ]) + ]); + }, + + setInitialFocus: function () { + if (this.props.mode == 'PIN') { + this.refs['pin'].getDOMNode().select(); + } else { + if (this.refs['username'].getDOMNode().value == '') { + this.refs['username'].getDOMNode().focus(); + } else{ + this.refs['passphrase'].getDOMNode().select(); + } + } + }, + + render: function() { + return new this.props.template({'innerComponent': this.props.mode == 'PIN' ? this.pinForm() : this.loginForm()}); + } +}); diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/Overlay.js b/frontend/delta/js/Clipperz/PM/UI/Components/Overlay.js new file mode 100644 index 0000000..cc4a06c --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/Components/Overlay.js @@ -0,0 +1,122 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.Base.module('Clipperz.PM.UI.Components'); + +Clipperz.PM.UI.Components.Overlay = function(args) { + args = args || {}; + + this._defaultDelay = 2; + this._element = MochiKit.DOM.getElement('overlay'); + + return this; +} + +//============================================================================= + +Clipperz.Base.extend(Clipperz.PM.UI.Components.Overlay, Object, { + + //------------------------------------------------------------------------- + + 'toString': function () { + return "Clipperz.PM.UI.Components.Overlay component"; + }, + + 'element': function () { +// return MochiKit.DOM.getElement('overlay'); + return this._element; + }, + + 'getElement': function (aClass) { + return MochiKit.Selector.findChildElements(this.element(), ['.'+aClass])[0]; + }, + + //------------------------------------------------------------------------- + + 'show': function (aMessage) { + this.resetStatus(); + this.setMessage(aMessage); + MochiKit.DOM.removeElementClass(this.element(), 'ios-overlay-hide'); + MochiKit.DOM.addElementClass(this.element(), 'ios-overlay-show'); + }, + + 'done': function (aMessage, aDelayBeforeHiding) { + this.completed(this.showDoneIcon, aMessage, aDelayBeforeHiding); + }, + + 'failed': function (aMessage, aDelayBeforeHiding) { + this.completed(this.showFailIcon, aMessage, aDelayBeforeHiding); + }, + + //------------------------------------------------------------------------- + + 'resetStatus': function () { + MochiKit.Style.showElement(this.element()); + MochiKit.Style.showElement(this.getElement('spinner')); + MochiKit.Style.hideElement(this.getElement('done')); + MochiKit.Style.hideElement(this.getElement('failed')); + }, + + 'setMessage': function (aMessage) { + if (typeof(aMessage) != 'undefined') { + this.getElement('title').innerHTML = aMessage; + } + }, + + 'completed': function (aFunctionToShowResult, aMessage, aDelayBeforeHiding) { + var delay = aDelayBeforeHiding || this.defaultDelay(); + + this.hideSpinner(); + MochiKit.Base.bind(aFunctionToShowResult, this)(); + this.setMessage(aMessage); + + MochiKit.Async.callLater(delay, MochiKit.Base.bind(this.hide, this)) + }, + + 'hide': function () { + MochiKit.DOM.removeElementClass(this.element(), 'ios-overlay-show'); + MochiKit.DOM.addElementClass(this.element(), 'ios-overlay-hide'); + MochiKit.Async.callLater(1, MochiKit.Style.hideElement, this.element()); + }, + + 'hideSpinner': function () { + MochiKit.Style.hideElement(this.getElement('spinner')); + }, + + 'showDoneIcon': function () { + MochiKit.Style.showElement(this.getElement('done')); + }, + + 'showFailIcon': function () { + MochiKit.Style.showElement(this.getElement('failed')); + }, + + //------------------------------------------------------------------------- + + 'defaultDelay': function () { + return this._defaultDelay; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/PageTemplate.js b/frontend/delta/js/Clipperz/PM/UI/Components/PageTemplate.js new file mode 100644 index 0000000..9b7c748 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/Components/PageTemplate.js @@ -0,0 +1,33 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.PM.UI.Components.PageTemplate = React.createClass({ + render: function() { + return React.DOM.div(null, [ + React.DOM.div({'className': 'header'}, [ + React.DOM.h1(null, "clipperz") + ]), + React.DOM.div({'className': 'content'}, this.props.innerComponent) + ]) + } +}); diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/RegistrationWizard.js b/frontend/delta/js/Clipperz/PM/UI/Components/RegistrationWizard.js new file mode 100644 index 0000000..051dcc5 --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/Components/RegistrationWizard.js @@ -0,0 +1,240 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.PM.UI.Components.RegistrationWizard = React.createClass({ + + getDefaultProps: function () { + return { + steps: [ + {name:'CREDENTIALS', label:'registration', _label:'credentials', description:"Choose your credentails"}, + {name:'PASSWORD_VERIFICATION', label:'registration', _label:'verify', description:"Verify your passphrase"}, + {name:'TERMS_OF_SERVICE', label:'registration', _label:'terms', description:"Check our terms of service"} + ], + disabled: false, + template: Clipperz.PM.UI.Components.PageTemplate + } + }, + + getInitialState: function () { + return { + currentStep: this.props['steps'][0]['name'], + username: '', + passphrase: '', + verify_passphrase: '', + no_password_recovery: false, + agree_terms_of_service: false + }; + }, + + 'propTypes': { +// steps: React.PropTypes.array, + disabled: React.PropTypes.bool, + template: React.PropTypes.func + }, + + //========================================================================= + + currentStepIndex: function () { + return this.indexOfStepNamed(this.state['currentStep']); + }, + + indexOfStepNamed: function (aStepName) { + var stepConfiguration; + var result; + + stepConfiguration = this.props['steps'].filter(function (aConfig) { return aConfig['name'] == aStepName})[0]; + result = this.props['steps'].indexOf(stepConfiguration); + return result; + }, + + //========================================================================= + + statusClassForStep: function (aStep) { + var currentStepIndex = this.currentStepIndex(); + var stepIndex = this.indexOfStepNamed(aStep['name']); + var result; + + if (stepIndex < currentStepIndex) { + result = 'left'; + } else if (stepIndex == currentStepIndex) { + result = 'center'; + } else { + result = 'right'; + } + + return result; + }, + + //========================================================================= + + handleBackClick: function (anEvent) { + var nextStep; + anEvent.preventDefault(); + + if (this.currentStepIndex() > 0) { + nextStep = this.props['steps'][this.currentStepIndex() - 1]; + this.setState({currentStep: nextStep['name']}); + } else { + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'goBack'); + } + }, + + handleForwardClick: function (anEvent) { + var nextStep; + anEvent.preventDefault(); + + if (this.canMoveForward()) { + + if (this.currentStepIndex() < this.props['steps'].length - 1) { + nextStep = this.props['steps'][this.currentStepIndex() + 1]; + this.setState({currentStep: nextStep['name']}); + } else { + MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'registerNewUser', { + username: this.state['username'], + passphrase: this.state['passphrase'] + }) + } + } + }, + + //------------------------------------------------------------------------- + + canMoveForward: function () { + var result; + var currentStep; + + result = false; + currentStep = this.state['currentStep']; + if (currentStep == 'CREDENTIALS') { + result = ((this.state['username'] != '') && (this.state['passphrase'] != '')); + } else if (currentStep == 'PASSWORD_VERIFICATION') { + result = (this.state['passphrase'] == this.state['verify_passphrase']); + } else if (currentStep == 'TERMS_OF_SERVICE') { + result = (this.state['no_password_recovery'] && this.state['agree_terms_of_service']); + } + + return result && !this.props['disabled']; + }, + + //========================================================================= + + handleChange: function (anEvent) { + var refs = this.refs; + var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName].getDOMNode() == anEvent.target}, MochiKit.Base.keys(this.refs))[0]; + var newState = {}; + + if ((event.target.type == 'checkbox') || (event.target.type == 'radio')) { + newState[refName] = event.target.checked; + } else { + newState[refName] = event.target.value; + } + this.setState(newState); + }, + + //========================================================================= + + renderIndexStep: function (aStep) { + return React.DOM.div({'className':'stepIndexItem ' + this.statusClassForStep(aStep)}, '.'); + }, + + renderButtons: function () { + return [ + React.DOM.a({className:'back button step_' + (this.currentStepIndex() - 1), onClick:this.handleBackClick}, '<<'), + React.DOM.a({className:'forward button step_' + (this.currentStepIndex() + 1) + ' ' + (this.canMoveForward() ? 'enabled' : 'disabled'), onClick:this.handleForwardClick}, '>>') + ]; + }, + + render_CREDENTIALS: function () { + return React.DOM.div(null,[ + React.DOM.label({'for':'name'}, "username"), + React.DOM.input({'type':'text', 'name':'name', 'ref':'username', 'placeholder':"username", 'key':'username', 'autoCapitalize':'none'/*, value:this.state.username*/}), + React.DOM.label({'for':'passphrase'}, "passphrase"), + React.DOM.input({'type':'password', 'name':'passphrase', 'ref':'passphrase', 'placeholder':"passphrase", 'key':'passphrase'/*, value:this.state.passphrase*/}) + ]); + }, + + render_PASSWORD_VERIFICATION: function () { + return React.DOM.div(null,[ + React.DOM.label({'for':'verify_passphrase'}, "passphrase"), + React.DOM.input({'type':'password', 'name':'verify_passphrase', 'ref':'verify_passphrase', 'placeholder':"verify passphrase", 'key':'verify_passphrase'}) + ]); + }, + + render_TERMS_OF_SERVICE: function () { + return React.DOM.div(null, [ + React.DOM.div({className:'checkboxBlock'}, [ + React.DOM.label({'for':'no_password_recovery'}, "I understand that Clipperz will not be able to recover a lost passphrase."), + React.DOM.input({'type':'checkbox', 'name':'no_password_recovery', 'ref':'no_password_recovery', 'key':'no_password_recovery'}), + React.DOM.p(null, "I understand that Clipperz will not be able to recover a lost passphrase.") + ]), + React.DOM.div({className:'checkboxBlock'}, [ + React.DOM.label({'for':'agree_terms_of_service'}, "I have read and agreed to the Terms of Service."), + React.DOM.input({'type':'checkbox', 'name':'agree_terms_of_service', 'ref':'agree_terms_of_service', 'key':'agree_terms_of_service'}), + React.DOM.p(null, [ + "I have read and agreed to the ", + React.DOM.a({href:'https://clipperz.com/terms_service/', target:'_blank'}, "Terms of Service.") + ]) + ]) + ]); + }, + + renderStep: function (aStep) { + return React.DOM.div({'className':'step' + ' ' + aStep['name'] + ' ' + this.statusClassForStep(aStep) + ' step_' + this.currentStepIndex()}, [ + React.DOM.h1(null, aStep['label']), + React.DOM.p(null, aStep['description']), + this['render_' + aStep['name']].apply(), + React.DOM.div({'className':'stepIndex'}, MochiKit.Base.map(this.renderIndexStep, this.props['steps'])), + React.DOM.div({'className':'buttons'}, this.renderButtons()) + ]); + }, + + _render: function () { + return React.DOM.div({'className':'registrationForm'},[ + React.DOM.form({onChange: this.handleChange}, [ + React.DOM.div({'className':'steps'}, MochiKit.Base.map(this.renderStep, this.props['steps'])) + ]) + ]); + }, + + render: function () { + return new this.props.template({'innerComponent': this._render()}); + }, + + //========================================================================= + + setInitialFocus: function () { + this.refs['username'].getDOMNode().focus(); + }, + + componentDidUpdate: function (prevProps, prevState, rootNode) { + if (prevState['currentStep'] != this.state['currentStep']) { + if (this.state['currentStep'] == 'CREDENTIALS') { + this.refs['passphrase'].getDOMNode().select(); + } else if (this.state['currentStep'] == 'PASSWORD_VERIFICATION') { + this.refs['verify_passphrase'].getDOMNode().select(); + } + } + } + + //========================================================================= +}); diff --git a/frontend/delta/js/Clipperz/PM/UI/DirectLoginController.js b/frontend/delta/js/Clipperz/PM/UI/DirectLoginController.js new file mode 100644 index 0000000..d9dfe6d --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/DirectLoginController.js @@ -0,0 +1,256 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.Base.module('Clipperz.PM.UI'); + +Clipperz.PM.UI.DirectLoginRunner = function(args) { + this._directLogin = args['directLogin'] || Clipperz.Base.exception.raise('MandatoryParameter'); + this._target = Clipperz.PM.Crypto.randomKey(); + + return this; +} + +MochiKit.Base.update(Clipperz.PM.UI.DirectLoginRunner.prototype, { + + 'toString': function() { + return "Clipperz.PM.UI.DirectLoginRunner"; + }, + + //----------------------------------------------------------------------------- + + 'directLogin': function () { + return this._directLogin; + }, + + //----------------------------------------------------------------------------- + + 'target': function () { + return this._target; + }, + + //============================================================================= + + 'setWindowTitle': function (aWindow, aTitle) { + aWindow.document.title = aTitle; + }, + + 'setWindowBody': function (aWindow, anHTML) { + aWindow.document.body.innerHTML = anHTML; + }, + + //============================================================================= + + 'initialWindowSetup': function (aWindow) { + this.setWindowTitle(aWindow, "Loading Clipperz Direct Login"); + this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3("Loading Clipperz Direct Login ..."))); + }, + + //----------------------------------------------------------------------------- + + 'updateWindowWithDirectLoginLabel': function (aWindow, aLabel) { + var titleText; + var bodyText; + + titleText = "Loading '__label__' Direct Login".replace(/__label__/, aLabel) + bodyText = "Loading '__label__' Direct Login... ".replace(/__label__/, aLabel) + + this.setWindowTitle(aWindow, titleText); + this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3(bodyText))); + }, + + //----------------------------------------------------------------------------- + + 'updateWindowWithHTMLContent': function (aWindow, anHtml) { + this.setWindowBody(aWindow, anHtml); + }, + + //============================================================================= + + 'submitLoginForm': function(aWindow, aSubmitFunction) { + MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function () { + var formElement; + var submitButtons; + + formElement = MochiKit.DOM.getElement('directLoginForm'); + + submitButtons = MochiKit.Base.filter(function(anInputElement) { + return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit')); + }, formElement.elements); + + if (submitButtons.length == 0) { + if (typeof(formElement.submit) == 'function') { + formElement.submit(); + } else { + aSubmitFunction.apply(formElement); + } +/* + var formSubmitFunction; + + formSubmitFunction = MochiKit.Base.method(formElement, 'submit'); + if (Clipperz_IEisBroken == true) { + formElement.submit(); + } else { + formSubmitFunction(); + } +*/ + } else { + submitButtons[0].click(); + } + }, this)); + }, + + //------------------------------------------------------------------------- + + 'runSubmitFormDirectLogin': function (aWindow, someAttributes) { + var html; + var formElement; + var submitFunction; + + formElement = MochiKit.DOM.FORM({ + 'id':'directLoginForm', + 'method':someAttributes['formAttributes']['method'], + 'action':someAttributes['formAttributes']['action'] + }); + + submitFunction = formElement.submit; + + MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map(function (anInputAttributes) { + return MochiKit.DOM.INPUT({'type':'hidden', 'name':anInputAttributes[0], 'value':anInputAttributes[1]}); + }, MochiKit.Base.items(someAttributes['inputValues']))); + + html = ''; + html += '<h3>Loading ' + someAttributes['label'] + ' ...</h3>'; + html += MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV(), MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}), formElement)).innerHTML; + + this.updateWindowWithHTMLContent(aWindow, html); + this.submitLoginForm(aWindow, submitFunction); + }, + + //------------------------------------------------------------------------- + + 'runHttpAuthDirectLogin': function(aWindow, someAttributes) { + var completeUrl; + var url; + + url = someAttributes['inputValues']['url']; + + if (/^https?\:\/\//.test(url) == false) { + url = 'http://' + url; + } + + if (Clipperz_IEisBroken === true) { + completeUrl = url; + } else { + var username; + var password; + + username = someAttributes['inputValues']['username']; + password = someAttributes['inputValues']['password']; + /(^https?\:\/\/)?(.*)/.test(url); + + completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2; + } + + window.open(completeUrl, this.target()); + }, + + //============================================================================= + + 'runDirectLogin': function (aWindow) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("DirectLoginRunner.openDirectLogin", {trace:false}); + deferredResult.addMethod(this, 'initialWindowSetup', aWindow); + deferredResult.addMethod(this.directLogin(), 'label'); + deferredResult.addMethod(this, 'updateWindowWithDirectLoginLabel', aWindow); + deferredResult.collectResults({ + 'type': MochiKit.Base.method(this.directLogin(), 'type'), + 'label': MochiKit.Base.method(this.directLogin(), 'label'), + 'formAttributes': MochiKit.Base.method(this.directLogin(), 'formAttributes'), + 'inputValues': MochiKit.Base.method(this.directLogin(), 'inputValues') + }); + deferredResult.addCallback(MochiKit.Base.bind(function (someAttributes) { + switch (someAttributes['type']) { + case 'http_auth': + this.runHttpAuthDirectLogin(aWindow, someAttributes); + break; + case 'simple_url': + this.runSimpleUrlDirectLogin(aWindow, someAttributes); + break; + default: + this.runSubmitFormDirectLogin(aWindow, someAttributes); + break; + } + }, this)); + deferredResult.callback(); + + return deferredResult; + }, + + //============================================================================= + + 'run': function () { + var newWindow; + + newWindow = window.open(Clipperz.PM.Strings.getValue('directLoginJumpPageUrl'), this.target()); + + return this.runDirectLogin(newWindow); + }, + + //============================================================================= + + 'test': function () { + var iFrame; + var newWindow; + + iFrame = MochiKit.DOM.createDOM('iframe'); + MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, iFrame); + + newWindow = iFrame.contentWindow; + + return this.runDirectLogin(newWindow); + }, + + //============================================================================= + __syntaxFix__: "syntax fix" +}); + +//----------------------------------------------------------------------------- + +Clipperz.PM.UI.DirectLoginRunner.openDirectLogin = function (aDirectLogin) { + var runner; + + runner = new Clipperz.PM.UI.DirectLoginRunner({directLogin:aDirectLogin}); + return runner.run(); +}; + +//----------------------------------------------------------------------------- + +Clipperz.PM.UI.DirectLoginRunner.testDirectLogin = function (aDirectLogin) { + var runner; + + runner = new Clipperz.PM.UI.DirectLoginRunner({directLogin:aDirectLogin}); + return runner.test(); +}; + +//----------------------------------------------------------------------------- diff --git a/frontend/delta/js/Clipperz/PM/UI/MainController.js b/frontend/delta/js/Clipperz/PM/UI/MainController.js new file mode 100644 index 0000000..da7540e --- a/dev/null +++ b/frontend/delta/js/Clipperz/PM/UI/MainController.js @@ -0,0 +1,491 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.Base.module('Clipperz.PM.UI'); + +Clipperz.PM.UI.MainController = function() { + var pages; + + this._proxy = null; + this._user = null; + this._filter = ''; + +// this._currentPage = 'loadingPage'; + + this._pageStack = ['loadingPage']; + this._overlay = new Clipperz.PM.UI.Components.Overlay(); + pages = { + 'loginPage': new Clipperz.PM.UI.Components.LoginForm(), + 'registrationPage': new Clipperz.PM.UI.Components.RegistrationWizard(), + 'cardListPage': new Clipperz.PM.UI.Components.CardList(), + 'cardDetailPage': new Clipperz.PM.UI.Components.CardDetail({card: {}}), + 'errorPage': new Clipperz.PM.UI.Components.ErrorPage({message:''}) + }; + + MochiKit.Base.map(function (anId) {React.renderComponent(pages[anId], MochiKit.DOM.getElement(anId))}, MochiKit.Base.keys(pages)); + this._pages = pages; + this.registerForNotificationCenterEvents(); + + return this; +} + +MochiKit.Base.update(Clipperz.PM.UI.MainController.prototype, { + + toString: function () { + return "Clipperz.PM.UI.MainController"; + }, + + //========================================================================= + + overlay: function () { + return this._overlay; + }, + + loginForm: function () { + return this._loginForm; + }, + + registrationWizard: function () { + return this._registrationWizard; + }, + + //========================================================================= + + isOnline: function() { + return navigator.onLine; + }, + + hasLocalData: function() { + return false; + }, + + loginMode: function () { + // PIN is set using this command: + // Clipperz.PM.PIN.setCredentialsWithPIN('1234', {'username':'joe', 'passphrase':'clipperz'}); + + return Clipperz.PM.PIN.isSet() ? 'PIN' : 'CREDENTIALS'; + }, + + //========================================================================= + + pages: function () { + return this._pages; + }, + + pageStack: function () { + return this._pageStack; + }, + + //========================================================================= + + selectInitialProxy: function () { + if (this.isOnline()) { + this._proxy = Clipperz.PM.Proxy.defaultProxy; + } else { + if (this.hasLocalData()) { + this._proxy = new Clipperz.PM.Proxy.Offline({dataStore: new Clipperz.PM.Proxy.Offline.LocalStorageDataStore(), shouldPayTolls:false}); + } else { + this.showOfflineError(); + } + } + }, + + proxy: function () { + return this._proxy; + }, + + //========================================================================= + + registerForNotificationCenterEvents: function () { + var events = ['doLogin', 'registerNewUser', 'showRegistrationForm', 'goBack', 'showRecord', 'searchCards', 'runDirectLogin']; + var self = this; + + MochiKit.Base.map(function (anEvent) { + MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, anEvent, MochiKit.Base.method(self, anEvent)); + }, events); + +// MochiKit.Signal.connect(window, 'onpopstate', MochiKit.Base.method(this, 'historyGoBack')); + MochiKit.Signal.connect(window, 'onbeforeunload', MochiKit.Base.method(this, 'shouldExitApp')); + }, + + //------------------------------------------------------------------------- + + run: function (parameters) { + var shouldShowRegistrationForm; + + this.selectInitialProxy(); + shouldShowRegistrationForm = parameters['shouldShowRegistrationForm'] && this.proxy().canRegisterNewUsers(); + this.pages()['loginPage'].setProps({'mode':this.loginMode(), 'isNewUserRegistrationAvailable': this.proxy().canRegisterNewUsers()}); + + if (shouldShowRegistrationForm) { + this.showRegistrationForm(); + } else { + this.showLoginForm(); + } + this.overlay().done("", 0.5); + }, + + //------------------------------------------------------------------------- + + showLoginForm: function () { + var loginFormPage; + + loginFormPage = this.pages()['loginPage']; + loginFormPage.setProps({'mode':this.loginMode(), 'isNewUserRegistrationAvailable': this.proxy().canRegisterNewUsers()}); + this.moveInPage(this.currentPage(), 'loginPage'); + MochiKit.Async.callLater(0.5, MochiKit.Base.method(loginFormPage, 'setInitialFocus')); + }, + + showRegistrationForm: function () { + var currentPage; + var registrationPage; + + currentPage = this.currentPage(); + registrationPage = this.pages()['registrationPage']; + this.setCurrentPage('loginPage'); + registrationPage.setProps({}); + this.moveInPage(currentPage, 'registrationPage'); + MochiKit.Async.callLater(0.5, MochiKit.Base.method(registrationPage, 'setInitialFocus')); + }, + + //========================================================================= + + doLogin: function (event) { + var credentials; + var getPassphraseDelegate; + var user; + + user = null; + + this.overlay().show("logging in"); + this.pages()['loginPage'].setProps({disabled:true}); + + if ('pin' in event) { + credentials = Clipperz.PM.PIN.credentialsWithPIN(event['pin']); + } else { + credentials = event; + } + getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, credentials.passphrase); + user = new Clipperz.PM.DataModel.User({'username':credentials.username, 'getPassphraseFunction':getPassphraseDelegate}); + + deferredResult = new Clipperz.Async.Deferred('MainController.doLogin', {trace:false}); + deferredResult.addCallback(MochiKit.Async.wait, 0.1); + deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(Clipperz.PM.PIN, 'resetFailedAttemptCount'); + deferredResult.addMethod(this, 'setUser', user); + +// deferredResult.addMethod(this, 'setupApplication'); + deferredResult.addMethod(this, 'runApplication'); + deferredResult.addMethod(this.overlay(), 'done', "", 1); + deferredResult.addErrback(MochiKit.Base.method(this, 'genericErrorHandler', event)); + deferredResult.addErrback(MochiKit.Base.bind(function (anEvent, anError) { + if (anError['isPermanent'] != true) { + this.pages()['loginPage'].setProps({disabled:false, 'mode':this.loginMode()}); + this.pages()['loginPage'].setInitialFocus(); + } + return anError; + }, this, event)) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + registerNewUser: function (credentials) { + var deferredResult; + + this.overlay().show("creating user"); + + this.pages()['registrationPage'].setProps({disabled:true}); + deferredResult = new Clipperz.Async.Deferred('MainController.registerNewUser', {trace:false}); + deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, + credentials['username'], + MochiKit.Base.partial(MochiKit.Async.succeed, credentials['passphrase']) + ); + deferredResult.addMethod(this, 'doLogin', credentials); + deferredResult.addErrback(MochiKit.Base.method(this, 'genericErrorHandler', event)); + deferredResult.addErrback(MochiKit.Base.bind(function (anError) { + if (anError['isPermanent'] != true) { + this.pages()['registrationPage'].setProps({disabled:false}); + this.pages()['registrationPage'].setInitialFocus(); + } + return anError; + }, this)); + + deferredResult.callback(); + + return deferredResult; + + }, + + //------------------------------------------------------------------------- + + user: function () { + return this._user; + }, + + setUser: function (aUser) { + this._user = aUser; + return this._user; + }, + + //========================================================================= + + allCardInfo: function () { + var deferredResult; + var cardInfo; + + cardInfo = { + '_rowObject': MochiKit.Async.succeed, + '_reference': MochiKit.Base.methodcaller('reference'), + '_searchableContent': MochiKit.Base.methodcaller('searchableContent'), + 'label': MochiKit.Base.methodcaller('label'), + 'favicon': MochiKit.Base.methodcaller('favicon') + }; + + deferredResult = new Clipperz.Async.Deferred('MainController.allCardInfo', {trace:false}); + deferredResult.addMethod(this.user(), 'getRecords'); + deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("CardList.value - collectResults", cardInfo, {trace:false})); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.callback(); + + return deferredResult; + }, + + filterCards: function (someCardInfo) { + var filter; + var filterRegExp; + var result; + + filter = this.filter().replace(/[^A-Za-z0-9]/g, "\\$&"); + filterRegExp = new RegExp(filter, "i"); + result = MochiKit.Base.filter(function (aCardInfo) { return filterRegExp.test(aCardInfo['_searchableContent'])}, someCardInfo); + + return result; + }, + + sortCards: function (someCardInfo) { + return someCardInfo.sort(Clipperz.Base.caseInsensitiveKeyComparator('label')); + }, + + showRecordList: function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('MainController.showRecordList', {trace:false}); + deferredResult.addMethod(this, 'allCardInfo'); + deferredResult.addMethod(this, 'filterCards'); + deferredResult.addMethod(this, 'sortCards'); + deferredResult.addCallback(MochiKit.Base.bind(function (someRecordInfo) { + this.pages()['cardListPage'].setProps({cardList: someRecordInfo}); + }, this)); + deferredResult.callback(); + + return deferredResult; + }, + + filter: function () { + return this._filter; + }, + + setFilter: function (aValue) { + this._filter = aValue; + }, + + searchCards: function (someParameters) { +//console.log("SEARCH CARDS", someParameters); + this.setFilter(someParameters); + this.showRecordList(); + }, + + //========================================================================= + + runApplication: function () { + MochiKit.Signal.connect(window, 'onpopstate', MochiKit.Base.method(this, 'historyGoBack')); + this.moveInPage(this.currentPage(), 'cardListPage'); + return this.showRecordList(); + }, + + showRecord: function (aRecordReference) { +//console.log("Show Record", aRecordReference); + var deferredResult; + + this.pages()['cardListPage'].setProps({selectedCard:aRecordReference}); + deferredResult = new Clipperz.Async.Deferred('MainController.runApplication', {trace:false}); +// deferredResult.addMethod(this.user(), 'getRecord', aRecordReference['_reference']); + deferredResult.addMethod(this.user(), 'getRecord', aRecordReference); + deferredResult.addMethodcaller('content'); + deferredResult.addCallback(MochiKit.Base.bind(function (aCard) { +//console.log("CARD DETAILS", aCard); + this.pages()['cardDetailPage'].setProps({card: aCard}); + this.pages()['cardListPage'].setProps({selectedCard: null}); + }, this)); + deferredResult.addMethod(this, 'moveInPage', this.currentPage(), 'cardDetailPage', true); + deferredResult.callback(); + + return deferredResult; + }, + + runDirectLogin: function (someParameters) { +console.log("RUN DIRECT LOGIN", someParameters); + var deferredResult; + +// this.pages()['cardListPage'].setProps({selectedCard:aRecordReference}); + deferredResult = new Clipperz.Async.Deferred('MainController.runDirectLogin', {trace:false}); +// deferredResult.addMethod(this.user(), 'getRecord', aRecordReference['_reference']); + deferredResult.addMethod(this.user(), 'getRecord', someParameters['record']); + deferredResult.addMethodcaller('directLoginWithReference', someParameters['directLogin']); + deferredResult.addCallback(Clipperz.PM.UI.DirectLoginRunner.openDirectLogin); + deferredResult.callback(); + + return deferredResult; + }, + + shouldExitApp: function (anEvent) { +console.log("SHOULD EXIT APP"); + anEvent.preventDefault(); + anEvent.stopPropagation(); + }, + + //========================================================================= + + genericErrorHandler: function (anEvent, anError) { + var errorMessage; + var result; + + result = anError; + errorMessage = "login failed"; + + if (anError['isPermanent'] === true) { + this.pages()['errorPage'].setProps({message:anError.message}); + this.moveInPage(this.currentPage(), 'errorPage'); + errorMessage = "failure"; + } else { + if ('pin' in anEvent) { + errorCount = Clipperz.PM.PIN.recordFailedAttempt(); + if (errorCount == -1) { + errorMessage = "PIN resetted"; + } + } + } + this.overlay().failed(errorMessage, 1); + + return result; + }, + + //========================================================================= + + slidePage: function (fromPage, toPage, direction) { + var fromPosition; + var toPosition; + + if (direction == "LEFT") { + fromPosition = 'right'; + toPosition = 'left' + } else { + fromPosition = 'left'; + toPosition = 'right' + } + + MochiKit.DOM.addElementClass(fromPage, toPosition + ' transition'); + + MochiKit.DOM.addElementClass(toPage, fromPosition); + MochiKit.DOM.removeElementClass(toPage, toPosition); + MochiKit.DOM.addElementClass(toPage, 'transition'); + MochiKit.Async.callLater(0.1, function () { + MochiKit.DOM.removeElementClass(toPage, fromPosition); + }) + + MochiKit.Async.callLater(0.5, function () { + MochiKit.DOM.removeElementClass(fromPage, 'transition'); + MochiKit.DOM.removeElementClass(toPage, 'transition'); + }) + }, + + rotateInPage: function (fromPage, toPage) { + // Broken! :( + MochiKit.DOM.addElementClass(MochiKit.DOM.getElement('mainDiv'), 'show-right'); + }, + + //......................................................................... + + goBack: function () { + var fromPage; + var toPage; + + fromPage = this.pageStack().shift(); + toPage = this.currentPage(); + this.pages()[toPage].setProps({}); + this.moveOutPage(fromPage, toPage); + }, + + historyGoBack: function (anEvent) { + anEvent.preventDefault(); + anEvent.stopPropagation(); + this.goBack(); + }, + + currentPage: function () { + return this.pageStack()[0]; + }, + + setCurrentPage: function (aPage) { + this.pageStack().unshift(aPage); + }, + + moveInPage: function (fromPage, toPage, addToHistory) { + var shouldAddItemToHistory; + + shouldAddItemToHistory = typeof(addToHistory) == 'undefined' ? false : addToHistory; + + this.slidePage(MochiKit.DOM.getElement(fromPage), MochiKit.DOM.getElement(toPage), 'LEFT'); + this.setCurrentPage(toPage); + + if (shouldAddItemToHistory) { +//console.log("ADD ITEM TO HISTORY"); +//console.log("ADD ITEM TO HISTORY - window", window); +//console.log("ADD ITEM TO HISTORY - window.history", window.history); + window.history.pushState({'fromPage': fromPage, 'toPage': toPage}); +//# window.history.pushState(); +//console.log("ADDED ITEM TO HISTORY"); + } else { +//console.log("Skip HISTORY"); + } + }, + + moveOutPage: function (fromPage, toPage) { + this.slidePage(MochiKit.DOM.getElement(fromPage), MochiKit.DOM.getElement(toPage), 'RIGHT'); + this.setCurrentPage(toPage); + }, + + //========================================================================= +/* + wrongAppVersion: function (anError) { +// this.pages()['errorPage'].setProps({message:anError.message}); +// this.moveInPage('errorPage', this.currentPage()); + }, +*/ + //========================================================================= + __syntaxFix__: "syntax fix" +}); diff --git a/frontend/delta/js/Clipperz/Set.js b/frontend/delta/js/Clipperz/Set.js new file mode 100644 index 0000000..b3831a4 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Set.js @@ -0,0 +1,162 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + + +if (typeof(Clipperz) == 'undefined') { + Clipperz = {}; +} + +//############################################################################# + +Clipperz.Set = function(args) { + args = args || {}; +// MochiKit.Base.bindMethods(this); + + if (args.items != null) { + this._items = args.items.slice(); + } else { + this._items = []; + } + + return this; +} + +//============================================================================= + +Clipperz.Set.prototype = MochiKit.Base.update(null, { + + //------------------------------------------------------------------------- + + 'toString': function() { + return "Clipperz.Set"; + }, + + //------------------------------------------------------------------------- + + 'items': function() { + return this._items; + }, + + //------------------------------------------------------------------------- + + 'popAnItem': function() { + var result; + + if (this.size() > 0) { + result = this.items().pop(); + } else { + result = null; + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'allItems': function() { + return this.items(); + }, + + //------------------------------------------------------------------------- + + 'contains': function(anItem) { + return (this.indexOf(anItem) != -1); + }, + + //------------------------------------------------------------------------- + + 'indexOf': function(anItem) { + var result; + var i, c; + + result = -1; + + c = this.items().length; + for (i=0; (i<c) && (result == -1); i++) { + if (this.items()[i] === anItem) { + result = i; + } + } + + return result; + }, + + //------------------------------------------------------------------------- + + 'add': function(anItem) { + if (anItem.constructor == Array) { + MochiKit.Base.map(MochiKit.Base.bind(this,add, this), anItem); + } else { + if (! this.contains(anItem)) { + this.items().push(anItem); + } + } + }, + + //------------------------------------------------------------------------- + + 'debug': function() { + var i, c; + + result = -1; + + c = this.items().length; + for (i=0; i<c; i++) { + alert("[" + i + "] " + this.items()[i].label); + } + }, + + //------------------------------------------------------------------------- + + 'remove': function(anItem) { + if (anItem.constructor == Array) { + MochiKit.Base.map(MochiKit.Base.bind(this.remove, this), anItem); + } else { + var itemIndex; + + itemIndex = this.indexOf(anItem); + if (itemIndex != -1) { + this.items().splice(itemIndex, 1); + } + } + }, + + //------------------------------------------------------------------------- + + 'size': function() { + return this.items().length; + }, + + //------------------------------------------------------------------------- + + 'empty': function() { + this.items().splice(0, this.items().length); + }, + + //------------------------------------------------------------------------- + + __syntaxFix__: "syntax fix" + + //------------------------------------------------------------------------- +}); + diff --git a/frontend/delta/js/Clipperz/Signal.js b/frontend/delta/js/Clipperz/Signal.js new file mode 100644 index 0000000..f9b74c9 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Signal.js @@ -0,0 +1,66 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Signal) == 'undefined') { Clipperz.Signal = {}; } + +Clipperz.Signal.VERSION = "0.1"; +Clipperz.Signal.NAME = "Clipperz.Signal"; + +MochiKit.Base.update(Clipperz.Signal, { + + //------------------------------------------------------------------------- + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- + + 'fireNativeEvent': function(element, eventName) { + if (element.fireEvent) { + // MSIE + element.fireEvent(eventName); + } else { + // W3C + var event; + + event = document.createEvent("HTMLEvents"); + event.initEvent(eventName.replace(/^on/, ""), true, true); + element.dispatchEvent(event); + } + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +Clipperz.Signal.NotificationCenter = {}; + diff --git a/frontend/delta/js/Clipperz/Style.js b/frontend/delta/js/Clipperz/Style.js new file mode 100644 index 0000000..acbe71b --- a/dev/null +++ b/frontend/delta/js/Clipperz/Style.js @@ -0,0 +1,89 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Style) == 'undefined') { Clipperz.Style = {}; } + +Clipperz.Style.VERSION = "0.1"; +Clipperz.Style.NAME = "Clipperz.DOM"; + +MochiKit.Base.update(Clipperz.Style, { + + //------------------------------------------------------------------------- + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- + + 'applyZebraStylesToTable': function(aTable) { + var tbody; + var tbodyRows; + var i,c; + + tbody = MochiKit.DOM.getFirstElementByTagAndClassName('tbody', null, aTable); + tbodyRows = tbody.childNodes; +// tbodyRows = MochiKit.DOM.getElementsByTagAndClassName('tr', null, tbody) + c = tbodyRows.length; + for (i=0; i<c; i++) { + var element; + + element = YAHOO.Element.get(tbodyRows[i]); + element.addClass(((i%2 == 0) ? "zebra_odd": "zebra_even")); + element.removeClass(((i%2 == 1) ? "zebra_odd": "zebra_even")); + } + }, + + //------------------------------------------------------------------------- + + 'getSizeAndPosition': function (anElement) { + var result; + + if (anElement != null) { + result = { dimensions:MochiKit.Style.getElementDimensions(anElement), position:MochiKit.Style.getElementPosition(anElement)}; + } else { + result = { dimensions:MochiKit.Style.getViewportDimensions(), position:MochiKit.Style.getViewportPosition()}; + } + + return result; + }, + + 'setBackgroundGradient': function (anElement, someParameters) { +// background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333)); +// background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955); + MochiKit.Style.setStyle(anElement, {'background': '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + someParameters['from'] + '), to(' + someParameters['to'] + '), color-stop(1,#333333))'}); + MochiKit.Style.setStyle(anElement, {'background': '-moz-linear-gradient(0% 100% 90deg,' + someParameters['to'] + ', ' + someParameters['from'] + ')'}); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + diff --git a/frontend/delta/js/Clipperz/Visual.js b/frontend/delta/js/Clipperz/Visual.js new file mode 100644 index 0000000..93ed725 --- a/dev/null +++ b/frontend/delta/js/Clipperz/Visual.js @@ -0,0 +1,363 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; } + +Clipperz.Visual.VERSION = "0.1"; +Clipperz.Visual.NAME = "Clipperz.Visual"; + +MochiKit.Base.update(Clipperz.Visual, { + + //------------------------------------------------------------------------- + + '__repr__': function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }, + + //------------------------------------------------------------------------- + + 'toString': function () { + return this.__repr__(); + }, + + //------------------------------------------------------------------------- + + 'deferredResize': function (anElement, someOptions) { + var deferredResult; + var moveTransition; + var scaleTransition; + var duration; + + duration = someOptions.duration || 0.5; + + deferredResult = new Clipperz.Async.Deferred("Visual.deferredResize", {trace:false}); + deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); + + moveTransition = MochiKit.Visual.Transitions.linear; //MochiKit.Visual.Transitions.sinoidal; + scaleTransition = MochiKit.Visual.Transitions.linear; //MochiKit.Visual.Transitions.sinoidal; + + MochiKit.Style.setElementPosition(anElement, {x:someOptions.from.position.x, y:someOptions.from.position.y }, 'px'); + + new MochiKit.Visual.Parallel([ + new MochiKit.Visual.Move(anElement, {x:someOptions.to.position.x, y:someOptions.to.position.y, mode:'absolute', transition:moveTransition, sync:true}), + new Clipperz.Visual.Resize(anElement, {fromSize:{h:someOptions.from.dimensions.h, w:someOptions.from.dimensions.w}, toSize:{h:someOptions.to.dimensions.h, w:someOptions.to.dimensions.w}, transition:scaleTransition, scaleContent:false, scaleFromCenter:false, restoreAfterFinish:true, sync:true}) + ], {duration:duration, afterFinish:MochiKit.Base.method(deferredResult, 'callback')}) + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredAnimation': function (anAnimation, someParameters, someOptions) { + var deferredResult; + var afterFinishCallback; + var options; + + deferredResult = new Clipperz.Async.Deferred("Clipperz.Visual.deferredAnimation", {trace:false}); + deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); + + if (MochiKit.Base.isUndefinedOrNull(someOptions)) { + options = {} + } else { + options = someOptions; + } + + if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) { + options['afterFinish'] = MochiKit.Base.noop; + } + + MochiKit.Base.update(options, { + 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback')) + }); + + new anAnimation(someParameters, options); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredAnimations': function (aSinchronizationType, someAnimations, someOptions) { + var deferredResult; + var options; + + deferredResult = new Clipperz.Async.Deferred("Visual.deferredParallelAnimations", {trace:false}); + deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); + + options = someOptions; + if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) { + options['afterFinish'] = MochiKit.Base.noop; + } + MochiKit.Base.update(options, { + 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback')) + }); + + new aSinchronizationType(someAnimations, options) + + return deferredResult; + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" + +}); + +//############################################################################# + +/** @id Clipperz.Visual.Resize */ +Clipperz.Visual.Resize = function (element, percent, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, percent, options); + } + this.__init__(element, percent, options); +}; + +Clipperz.Visual.Resize.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(Clipperz.Visual.Resize.prototype, { + __class__ : Clipperz.Visual.Resize, + + __init__: function (element, options) { + this.element = MochiKit.DOM.getElement(element); + options = MochiKit.Base.update({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or {} with provided values + syntax_fix: 'syntax fix' + }, options); + + this.start(options); + }, + + setup: function () { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = MochiKit.Style.getStyle(this.element, 'position'); + + var ma = MochiKit.Base.map; + var b = MochiKit.Base.bind; + this.originalStyle = {}; + ma(b(function (k) { this.originalStyle[k] = this.element.style[k]; }, this), ['top', 'left', 'width', 'height', 'fontSize']); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = MochiKit.Style.getStyle(this.element, 'font-size') || '100%'; + ma(b(function (fontSizeType) { + if (fontSize.indexOf(fontSizeType) > 0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }, this), ['em', 'px', '%']); + + this.factor = 1; + + this.dims = [this.options.fromSize.h, this.options.fromSize.w]; + }, + + update: function (position) { + this.setDimensions( (this.options.toSize.h - this.options.fromSize.h) * position + this.options.fromSize.h, + (this.options.toSize.w - this.options.fromSize.w) * position + this.options.fromSize.w); + }, + + finish: function () { + if (this.restoreAfterFinish) { + MochiKit.Style.setStyle(this.element, this.originalStyle); + } + }, + + setDimensions: function (height, width) { + var d = {}; + var r = Math.round; + if (/MSIE/.test(navigator.userAgent)) { + r = Math.ceil; + } + if (this.options.scaleX) { + d.width = r(width) + 'px'; + } + if (this.options.scaleY) { + d.height = r(height) + 'px'; + } + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) { + d.top = this.originalTop - topd + 'px'; + } + if (this.options.scaleX) { + d.left = this.originalLeft - leftd + 'px'; + } + } else { + if (this.options.scaleY) { + d.top = -topd + 'px'; + } + if (this.options.scaleX) { + d.left = -leftd + 'px'; + } + } + } + MochiKit.Style.setStyle(this.element, d); + } +}); + +//============================================================================= + +Clipperz.Visual.squize = function (element, /* optional */ options) { + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + + element = d.getElement(element); + options = MochiKit.Base.update({ + moveTransition: v.Transitions.sinoidal, + scaleTransition: v.Transitions.sinoidal, + opacityTransition: v.Transitions.none, + scaleContent: true, + scaleFromCenter: false, + scaleX: true, + scaleY: true + }, options); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: s.getStyle(element, 'opacity') + }; + + var dims = s.getElementDimensions(element, true); + var moveX, moveY; + + moveX = options.scaleX ? dims.w/2 : 0; + moveY = options.scaleY ? dims.h/2 : 0; + + var elemClip; + + var optionsParallel = MochiKit.Base.update({ + beforeStartInternal: function (effect) { + s.makePositioned(effect.effects[0].element); + elemClip = s.makeClipping(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + s.undoClipping(effect.effects[0].element, elemClip); + s.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options); + + return new v.Parallel( + [new v.Opacity(element, { + sync: true, to: 0.0, from: 1.0, + transition: options.opacityTransition + }), + new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { + scaleMode: {originalHeight: dims.h, originalWidth: dims.w}, + sync: true, transition: options.scaleTransition, + scaleContent: options.scaleContent, + scaleFromCenter: options.scaleFromCenter, + restoreAfterFinish: true, + scaleX: options.scaleX, + scaleY: options.scaleY + }), + new v.Move(element, { + x: moveX, y: moveY, sync: true, transition: options.moveTransition + }) + ], optionsParallel + ); +}; + +//----------------------------------------------------------------------------- + +Clipperz.Visual.expand = function (element, /* optional */ options) { + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + + element = d.getElement(element); + options = MochiKit.Base.update({ +// direction: 'center', + moveTransition: v.Transitions.sinoidal, + scaleTransition: v.Transitions.sinoidal, + opacityTransition: v.Transitions.none, + scaleContent: true, + scaleFromCenter: false, + scaleX: true, + scaleY: true + }, options); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: s.getStyle(element, 'opacity') + }; + + var dims = s.getElementDimensions(element, true); + var moveX, moveY; + + moveX = options.scaleX ? dims.w/2 : 0; + moveY = options.scaleY ? dims.h/2 : 0; + + var elemClip; + + var optionsParallel = MochiKit.Base.update({ + beforeStartInternal: function (effect) { + s.makePositioned(effect.effects[0].element); + elemClip = s.makeClipping(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + s.undoClipping(effect.effects[0].element, elemClip); + s.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options); + + return new v.Parallel( + [new v.Opacity(element, { + sync: true, to: 0.0, from: 1.0, + transition: options.opacityTransition + }), + new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { + scaleMode: {originalHeight: dims.h, originalWidth: dims.w}, + sync: true, transition: options.scaleTransition, + scaleContent: options.scaleContent, + scaleFromCenter: options.scaleFromCenter, + restoreAfterFinish: true, + scaleX: options.scaleX, + scaleY: options.scaleY + }), + new v.Move(element, { + x: moveX, y: moveY, sync: true, transition: options.moveTransition + }) + ], optionsParallel + ); +}; + +//============================================================================= + diff --git a/frontend/delta/js/Clipperz/YUI/DomHelper.js b/frontend/delta/js/Clipperz/YUI/DomHelper.js new file mode 100644 index 0000000..0a1f9fe --- a/dev/null +++ b/frontend/delta/js/Clipperz/YUI/DomHelper.js @@ -0,0 +1,471 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
+if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
+
+
+/**
+ * @class Clipperz.ext.DomHelper
+ * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM.
+ * For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
+ * @singleton
+ */
+Clipperz.YUI.DomHelper = new function(){
+ /**@private*/
+ var d = document;
+ var tempTableEl = null;
+ /** True to force the use of DOM instead of html fragments @type Boolean */
+ this.useDom = false;
+ var emptyTags = /^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i;
+ /**
+ * Applies a style specification to an element
+ * @param {String/HTMLElement} el The element to apply styles to
+ * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or
+ * a function which returns such a specification.
+ */
+ this.applyStyles = function(el, styles){
+ if(styles){
+ var D = YAHOO.util.Dom;
+ if (typeof styles == "string"){
+ var re = /\s?([a-z\-]*)\:([^;]*);?/gi;
+ var matches;
+ while ((matches = re.exec(styles)) != null){
+ D.setStyle(el, matches[1], matches[2]);
+ }
+ }else if (typeof styles == "object"){
+ for (var style in styles){
+ D.setStyle(el, style, styles[style]);
+ }
+ }else if (typeof styles == "function"){
+ Clipperz.YUI.DomHelper.applyStyles(el, styles.call());
+ }
+ }
+ };
+
+ // build as innerHTML where available
+ /** @ignore */
+ var createHtml = function(o){
+ var b = '';
+
+ if(typeof(o['html']) != 'undefined') {
+ o['html'] = Clipperz.Base.sanitizeString(o['html']);
+ } else if (typeof(o['htmlString']) != 'undefined') {
+ o['html'] = o['htmlString'];
+ delete o.htmlString;
+ }
+
+ if (MochiKit.Base.isArrayLike(o)) {
+ for (var i = 0, l = o.length; i < l; i++) {
+ b += createHtml(o[i]);
+ }
+ return b;
+ }
+
+ b += '<' + o.tag;
+ for(var attr in o){
+ if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue;
+ if(attr == 'style'){
+ var s = o['style'];
+ if(typeof s == 'function'){
+ s = s.call();
+ }
+ if(typeof s == 'string'){
+ b += ' style="' + s + '"';
+ }else if(typeof s == 'object'){
+ b += ' style="';
+ for(var key in s){
+ if(typeof s[key] != 'function'){
+ b += key + ':' + s[key] + ';';
+ }
+ }
+ b += '"';
+ }
+ }else{
+ if(attr == 'cls'){
+ b += ' class="' + o['cls'] + '"';
+ }else if(attr == 'htmlFor'){
+ b += ' for="' + o['htmlFor'] + '"';
+ }else{
+ b += ' ' + attr + '="' + o[attr] + '"';
+ }
+ }
+ }
+ if(emptyTags.test(o.tag)){
+ b += ' />';
+ }else{
+ b += '>';
+ if(o.children){
+ for(var i = 0, len = o.children.length; i < len; i++) {
+ b += createHtml(o.children[i], b);
+ }
+ }
+ if(o.html){
+ b += o.html;
+ }
+ b += '</' + o.tag + '>';
+ }
+ return b;
+ }
+
+ // build as dom
+ /** @ignore */
+ var createDom = function(o, parentNode){
+ var el = d.createElement(o.tag);
+ var useSet = el.setAttribute ? true : false; // In IE some elements don't have setAttribute
+ for(var attr in o){
+ if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue;
+ if(attr=='cls'){
+ el.className = o['cls'];
+ }else{
+ if(useSet) el.setAttribute(attr, o[attr]);
+ else el[attr] = o[attr];
+ }
+ }
+ Clipperz.YUI.DomHelper.applyStyles(el, o.style);
+ if(o.children){
+ for(var i = 0, len = o.children.length; i < len; i++) {
+ createDom(o.children[i], el);
+ }
+ }
+ if(o.html){
+ el.innerHTML = o.html;
+ }
+ if(parentNode){
+ parentNode.appendChild(el);
+ }
+ return el;
+ };
+
+ /**
+ * @ignore
+ * Nasty code for IE's broken table implementation
+ */
+ var insertIntoTable = function(tag, where, el, html){
+ if(!tempTableEl){
+ tempTableEl = document.createElement('div');
+ }
+ var nodes;
+ if(tag == 'table' || tag == 'tbody'){
+ tempTableEl.innerHTML = '<table><tbody>'+html+'</tbody></table>';
+ nodes = tempTableEl.firstChild.firstChild.childNodes;
+ }else{
+ tempTableEl.innerHTML = '<table><tbody><tr>'+html+'</tr></tbody></table>';
+ nodes = tempTableEl.firstChild.firstChild.firstChild.childNodes;
+ }
+ if (where == 'beforebegin') {
+ nodes.reverse();
+// el.parentNode.insertBefore(node, el);
+ MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el)}, nodes);
+ } else if (where == 'afterbegin') {
+ nodes.reverse();
+// el.insertBefore(node, el.firstChild);
+ MochiKit.Base.map(function(aNode) {el.insertBefore(aNode, el.firstChild)}, nodes);
+ } else if (where == 'beforeend') {
+// el.appendChild(node);
+ MochiKit.Base.map(function(aNode) {el.appendChild(aNode)}, nodes);
+ } else if (where == 'afterend') {
+// el.parentNode.insertBefore(node, el.nextSibling);
+ MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el.nextSibling)}, nodes);
+ }
+
+ return nodes;
+ }
+
+ /**
+ * Inserts an HTML fragment into the Dom
+ * @param {String} where Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd.
+ * @param {HTMLElement} el The context element
+ * @param {String} html The HTML fragmenet
+ * @return {HTMLElement} The new node
+ */
+ this.insertHtml = function(where, el, html){
+ where = where.toLowerCase();
+// if(el.insertAdjacentHTML){
+ if(Clipperz_IEisBroken){
+ var tag = el.tagName.toLowerCase();
+ if(tag == 'table' || tag == 'tbody' || tag == 'tr'){
+ return insertIntoTable(tag, where, el, html);
+ }
+ switch(where){
+ case 'beforebegin':
+ el.insertAdjacentHTML(where, html);
+ return el.previousSibling;
+ case 'afterbegin':
+ el.insertAdjacentHTML(where, html);
+ return el.firstChild;
+ case 'beforeend':
+ el.insertAdjacentHTML(where, html);
+ return el.lastChild;
+ case 'afterend':
+ el.insertAdjacentHTML(where, html);
+ return el.nextSibling;
+ }
+ throw 'Illegal insertion point -> "' + where + '"';
+ }
+ var range = el.ownerDocument.createRange();
+ var frag;
+ switch(where){
+ case 'beforebegin':
+ range.setStartBefore(el);
+ frag = range.createContextualFragment(html);
+ el.parentNode.insertBefore(frag, el);
+ return el.previousSibling;
+ case 'afterbegin':
+ if(el.firstChild){ // faster
+ range.setStartBefore(el.firstChild);
+ }else{
+ range.selectNodeContents(el);
+ range.collapse(true);
+ }
+ frag = range.createContextualFragment(html);
+ el.insertBefore(frag, el.firstChild);
+ return el.firstChild;
+ case 'beforeend':
+ if(el.lastChild){
+ range.setStartAfter(el.lastChild); // faster
+ }else{
+ range.selectNodeContents(el);
+ range.collapse(false);
+ }
+ frag = range.createContextualFragment(html);
+ el.appendChild(frag);
+ return el.lastChild;
+ case 'afterend':
+ range.setStartAfter(el);
+ frag = range.createContextualFragment(html);
+ el.parentNode.insertBefore(frag, el.nextSibling);
+ return el.nextSibling;
+ }
+ throw 'Illegal insertion point -> "' + where + '"';
+ };
+
+ /**
+ * Creates new Dom element(s) and inserts them before el
+ * @param {String/HTMLElement/Element} el The context element
+ * @param {Object} o The Dom object spec (and children)
+ * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
+ * @return {HTMLElement} The new node
+ */
+ this.insertBefore = function(el, o, returnElement){
+ el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
+ var newNode;
+ if(this.useDom){
+ newNode = createDom(o, null);
+ el.parentNode.insertBefore(newNode, el);
+ }else{
+ var html = createHtml(o);
+ newNode = this.insertHtml('beforeBegin', el, html);
+ }
+ return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
+ };
+
+ /**
+ * Creates new Dom element(s) and inserts them after el
+ * @param {String/HTMLElement/Element} el The context element
+ * @param {Object} o The Dom object spec (and children)
+ * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
+ * @return {HTMLElement} The new node
+ */
+ this.insertAfter = function(el, o, returnElement){
+ el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
+ var newNode;
+ if(this.useDom){
+ newNode = createDom(o, null);
+ el.parentNode.insertBefore(newNode, el.nextSibling);
+ }else{
+ var html = createHtml(o);
+ newNode = this.insertHtml('afterEnd', el, html);
+ }
+ return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
+ };
+
+ /**
+ * Creates new Dom element(s) and appends them to el
+ * @param {String/HTMLElement/Element} el The context element
+ * @param {Object} o The Dom object spec (and children)
+ * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
+ * @return {HTMLElement} The new node
+ */
+ this.append = function(el, o, returnElement){
+ el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
+ var newNode;
+ if(this.useDom){
+ newNode = createDom(o, null);
+ el.appendChild(newNode);
+ }else{
+ var html = createHtml(o);
+ newNode = this.insertHtml('beforeEnd', el, html);
+ }
+ return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
+ };
+
+ /**
+ * Creates new Dom element(s) and overwrites the contents of el with them
+ * @param {String/HTMLElement/Element} el The context element
+ * @param {Object} o The Dom object spec (and children)
+ * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
+ * @return {HTMLElement} The new node
+ */
+ this.overwrite = function(el, o, returnElement){
+ el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
+ el.innerHTML = createHtml(o);
+ return returnElement ? YAHOO.Element.get(el.firstChild, true) : el.firstChild;
+ };
+
+ /**
+ * Creates a new Clipperz.YUI.DomHelper.Template from the Dom object spec
+ * @param {Object} o The Dom object spec (and children)
+ * @return {Clipperz.YUI.DomHelper.Template} The new template
+ */
+ this.createTemplate = function(o){
+ var html = createHtml(o);
+ return new Clipperz.YUI.DomHelper.Template(html);
+ };
+}();
+
+/**
+* @class Clipperz.YUI.DomHelper.Template
+* Represents an HTML fragment template.
+* For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
+* <br>
+* <b>This class is also available as Clipperz.YUI.Template</b>.
+* @constructor
+* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('')
+*/
+Clipperz.YUI.DomHelper.Template = function(html){
+ if(html instanceof Array){
+ html = html.join('');
+ }else if(arguments.length > 1){
+ html = Array.prototype.join.call(arguments, '');
+ }
+ /**@private*/
+ this.html = html;
+};
+Clipperz.YUI.DomHelper.Template.prototype = {
+ /**
+ * Returns an HTML fragment of this template with the specified values applied
+ * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+ * @return {String}
+ */
+ applyTemplate : function(values){
+ if(this.compiled){
+ return this.compiled(values);
+ }
+ var empty = '';
+ var fn = function(match, index){
+ if(typeof values[index] != 'undefined'){
+ return values[index];
+ }else{
+ return empty;
+ }
+ }
+ return this.html.replace(this.re, fn);
+ },
+
+ /**
+ * The regular expression used to match template variables
+ * @type RegExp
+ * @property
+ */
+ re : /\{([\w|-]+)\}/g,
+
+ /**
+ * Compiles the template into an internal function, eliminating the RegEx overhead
+ */
+ compile : function(){
+ var body = ["this.compiled = function(values){ return ['"];
+ body.push(this.html.replace(this.re, "', values['$1'], '"));
+ body.push("'].join('');};");
+ eval(body.join(''));
+ return this;
+ },
+
+ /**
+ * Applies the supplied values to the template and inserts the new node(s) before el
+ * @param {String/HTMLElement/Element} el The context element
+ * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+ * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
+ * @return {HTMLElement} The new node
+ */
+ insertBefore: function(el, values, returnElement){
+ el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
+ var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values));
+ return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
+ },
+
+ /**
+ * Applies the supplied values to the template and inserts the new node(s) after el
+ * @param {String/HTMLElement/Element} el The context element
+ * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+ * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
+ * @return {HTMLElement} The new node
+ */
+ insertAfter : function(el, values, returnElement){
+ el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
+ var newNode = Clipperz.YUI.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values));
+ return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
+ },
+
+ /**
+ * Applies the supplied values to the template and append the new node(s) to el
+ * @param {String/HTMLElement/Element} el The context element
+ * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+ * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
+ * @return {HTMLElement} The new node
+ */
+ append : function(el, values, returnElement){
+ var sanitizedValues;
+ var key;
+
+ sanitizedValues = {};
+ for (key in values) {
+ sanitizedValues[key] = Clipperz.Base.sanitizeString(values[key]);
+ }
+ el = (typeof el == 'string') ? YAHOO.util.Dom.get(el) : el;
+ var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(sanitizedValues));
+
+ return newNode;
+ },
+
+ /**
+ * Applies the supplied values to the template and overwrites the content of el with the new node(s)
+ * @param {String/HTMLElement/Element} el The context element
+ * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+ * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
+ * @return {HTMLElement} The new node
+ */
+ overwrite : function(el, values, returnElement){
+ el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
+ el.innerHTML = '';
+ var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values));
+ return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
+ }
+};
+/**
+ * Alias for applyTemplate
+ * @method
+ */
+Clipperz.YUI.DomHelper.Template.prototype.apply = Clipperz.YUI.DomHelper.Template.prototype.applyTemplate;
+
+Clipperz.YUI.Template = Clipperz.YUI.DomHelper.Template;
diff --git a/frontend/delta/js/Clipperz/YUI/DomQuery.js b/frontend/delta/js/Clipperz/YUI/DomQuery.js new file mode 100644 index 0000000..c1af0ca --- a/dev/null +++ b/frontend/delta/js/Clipperz/YUI/DomQuery.js @@ -0,0 +1,709 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } +if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; } + + +/* + * yui-ext 0.40 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class Clipperz.YUI.DomQuery + * Provides high performance selector/xpath processing by compiling queries into reusable functions. + * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in). + * @singleton + */ +Clipperz.YUI.DomQuery = function(){ + var cache = {}, simpleCache = {}, valueCache = {}; + var nonSpace = /\S/; + var trimRe = /^\s*(.*?)\s*$/; + var tplRe = /\{(\d+)\}/g; + var modeRe = /^(\s?[\/>]\s?|\s|$)/; + var clsRes = {}; + + function child(p, index){ + var i = 0; + var n = p.firstChild; + while(n){ + if(n.nodeType == 1){ + i++; + if(i == index){ + return n; + } + } + n = n.nextSibling; + } + return null; + }; + + function next(d){ + var n = d.nextSibling; + while(n && n.nodeType != 1){ + n = n.nextSibling; + } + return n; + }; + + function prev(d){ + var n = d.previousSibling; + while(n && n.nodeType != 1){ + n = n.previousSibling; + } + return n; + }; + + function clean(d){ + var n = d.firstChild, ni = -1; + while(n){ + var nx = n.nextSibling; + if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){ + d.removeChild(n); + }else{ + n.nodeIndex = ++ni; + } + n = nx; + } + return this; + }; + + function byClassName(c, a, v){ + if(!v){ + return c; + } + var re = clsRes[v]; + if(!re){ + re = new RegExp('(?:^|\\s)(?:' + v + ')(?:\\s|$)'); + clsRes[v] = re; + } + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(re.test(ci.className)){ + r[r.length] = ci; + } + } + return r; + }; + + function convert(c){ + if(c.slice){ + return c; + } + var r = []; + for(var i = 0, l = c.length; i < l; i++){ + r[r.length] = c[i]; + } + return r; + }; + + function attrValue(n, attr){ + if(!n.tagName && typeof n.length != 'undefined'){ + n = n[0]; + } + if(!n){ + return null; + } + if(attr == 'for'){ + return n.htmlFor; + } + if(attr == 'class' || attr == 'className'){ + return n.className; + } + return n.getAttribute(attr) || n[attr]; + + }; + + function getNodes(ns, mode, tagName){ + var result = [], cs; + if(!ns){ + return result; + } + mode = mode ? mode.replace(trimRe, '$1') : ''; + tagName = tagName || '*'; + if(ns.tagName || ns == document){ + ns = [ns]; + } + if(mode != '/' && mode != '>'){ + for(var i = 0, ni; ni = ns[i]; i++){ + cs = ni.getElementsByTagName(tagName); + result = concat(result, cs); + } + }else{ + for(var i = 0, ni; ni = ns[i]; i++){ + var cn = ni.getElementsByTagName(tagName); + for(var j = 0, cj; cj = cn[j]; j++){ + if(cj.parentNode == ni){ + result[result.length] = cj; + } + } + } + + } + return result; + }; + + function concat(a, b){ + if(b.slice){ + return a.concat(b); + } + for(var i = 0, l = b.length; i < l; i++){ + a[a.length] = b[i]; + } + return a; + } + + function byTag(cs, tagName){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!tagName){ + return cs; + } + var r = []; tagName = tagName.toLowerCase(); + for(var i = 0, ci; ci = cs[i]; i++){ + if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){ + r[r.length] = ci; + } + } + return r; + }; + + function byId(cs, attr, id){ + if(cs.tagName || cs == document){ + cs = [cs]; + } + if(!id){ + return cs; + } + var r = []; + for(var i = 0, l = cs.length; i < l; i++){ + var ci = cs[i]; + if(ci && ci.id == id){ + r[r.length] = ci; + } + } + return r; + }; + + function byAttribute(cs, attr, value, op, custom){ + var r = [], st = custom=='{'; + var f = Clipperz.YUI.DomQuery.operators[op]; + for(var i = 0, l = cs.length; i < l; i++){ + var a; + if(st){ + a = Clipperz.YUI.DomQuery.getStyle(cs[i], attr); + } + else if(attr == 'class' || attr == 'className'){ + a = cs[i].className; + }else if(attr == 'for'){ + a = cs[i].htmlFor; + }else{ + a = cs[i].getAttribute(attr); + } + if((f && f(a, value)) || (!f && a)){ + r[r.length] = cs[i]; + } + } + return r; + }; + + function byPseudo(cs, name, value){ + return Clipperz.YUI.DomQuery.pseudos[name](cs, value); + }; + + // This is for IE MSXML which does not support expandos. + // IE runs the same speed using setAttribute, however FF slows way down + // and Safari completely fails so they need to continue to use expandos. + // Branched at load time for faster execution. + var isIE = window.ActiveXObject; + var addAttr = isIE ? + function(n, a, v){ + n.setAttribute(a, v); + } : + function(n, a, v){ + n[a] = v; + }; + var getAttr = isIE ? + function(n, a){ + return n.getAttribute(a); + } : + function(n, a){ + return n[a]; + }; + var clearAttr = isIE ? + function(n, a){ + n.removeAttribute(a); + } : + function(n, a, v){ + delete n[a]; + }; + + function nodup(cs){ + if(!cs.length){ + return cs; + } + addAttr(cs[0], '_nodup', true); + var r = [cs[0]]; + for(var i = 1, len = cs.length; i < len; i++){ + var c = cs[i]; + if(!getAttr(c, '_nodup')){ + addAttr(c, '_nodup', true); + r[r.length] = c; + } + } + for(var i = 0, len = cs.length; i < len; i++){ + clearAttr(cs[i], '_nodup'); + } + return r; + } + + function quickDiff(c1, c2){ + if(!c1.length){ + return c2; + } + for(var i = 0, len = c1.length; i < len; i++){ + addAttr(c1[i], '_qdiff', true); + } + var r = []; + for(var i = 0, len = c2.length; i < len; i++){ + if(!getAttr(c2[i], '_qdiff')){ + r[r.length] = c2[i]; + } + } + for(var i = 0, len = c1.length; i < len; i++){ + clearAttr(c1[i], '_qdiff'); + } + return r; + } + + function quickId(ns, mode, root, id){ + if(ns == root){ + var d = root.ownerDocument || root; + return d.getElementById(id); + } + ns = getNodes(ns, mode, '*'); + return byId(ns, null, id); + } + + return { + getStyle : function(el, name){ + return YAHOO.util.Dom.getStyle(el, name); + }, + /** + * Compiles a selector/xpath query into a reusable function. The returned function + * takes one parameter "root" (optional), which is the context node from where the query should start. + * @param {String} selector The selector/xpath query + * @param {String} type (optional) Either 'select' (the default) or 'simple' for a simple selector match + * @return {Function} + */ + compile : function(path, type){ + // strip leading slashes + while(path.substr(0, 1)=='/'){ + path = path.substr(1); + } + type = type || 'select'; + + var fn = ['var f = function(root){\n var mode; var n = root || document;\n']; + var q = path, mode, lq; + var tk = Clipperz.YUI.DomQuery.matchers; + var tklen = tk.length; + var mm; + while(q && lq != q){ + lq = q; + var tm = q.match(/^(#)?([\w-\*]+)/); + if(type == 'select'){ + if(tm){ + if(tm[1] == '#'){ + fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ''); + }else{ + fn[fn.length] = 'n = getNodes(n, mode, "*");'; + } + }else{ + if(tm){ + if(tm[1] == '#'){ + fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");'; + }else{ + fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");'; + } + q = q.replace(tm[0], ''); + } + } + while(!(mm = q.match(modeRe))){ + var matched = false; + for(var j = 0; j < tklen; j++){ + var t = tk[j]; + var m = q.match(t.re); + if(m){ + fn[fn.length] = t.select.replace(tplRe, function(x, i){ + return m[i]; + }); + q = q.replace(m[0], ''); + matched = true; + break; + } + } + // prevent infinite loop on bad selector + if(!matched){ + throw 'Error parsing selector, parsing failed at "' + q + '"'; + } + } + if(mm[1]){ + fn[fn.length] = 'mode="'+mm[1]+'";'; + q = q.replace(mm[1], ''); + } + } + fn[fn.length] = 'return nodup(n);\n}'; + eval(fn.join('')); + return f; + }, + + /** + * Selects a group of elements. + * @param {String} selector The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @return {Array} + */ + select : function(path, root, type){ + if(!root || root == document){ + root = document; + } + if(typeof root == 'string'){ + root = document.getElementById(root); + } + var paths = path.split(','); + var results = []; + for(var i = 0, len = paths.length; i < len; i++){ + var p = paths[i].replace(trimRe, '$1'); + if(!cache[p]){ + cache[p] = Clipperz.YUI.DomQuery.compile(p); + if(!cache[p]){ + throw p + ' is not a valid selector'; + } + } + var result = cache[p](root); + if(result && result != document){ + results = results.concat(result); + } + } + return results; + }, + + /** + * Selects a single element. + * @param {String} selector The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @return {Element} + */ + selectNode : function(path, root){ + return Clipperz.YUI.DomQuery.select(path, root)[0]; + }, + + /** + * Selects the value of a node, optionally replacing null with the defaultValue. + * @param {String} selector The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @param {String} defaultValue + */ + selectValue : function(path, root, defaultValue){ + path = path.replace(trimRe, '$1'); + if(!valueCache[path]){ + valueCache[path] = Clipperz.YUI.DomQuery.compile(path, 'simple'); + } + var n = valueCache[path](root); + n = n[0] ? n[0] : n; + var v = (n && n.firstChild ? n.firstChild.nodeValue : null); + return (v === null ? defaultValue : v); + }, + + /** + * Selects the value of a node, parsing integers and floats. + * @param {String} selector The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @param {Number} defaultValue + * @return {Number} + */ + selectNumber : function(path, root, defaultValue){ + var v = Clipperz.YUI.DomQuery.selectValue(path, root, defaultValue || 0); + return parseFloat(v); + }, + + /** + * Returns true if the passed element(s) match the passed simple selector (e.g. div.some-class or span:first-child) + * @param {String/HTMLElement/Array} el An element id, element or array of elements + * @param {String} selector The simple selector to test + * @return {Boolean} + */ + is : function(el, ss){ + if(typeof el == 'string'){ + el = document.getElementById(el); + } + var isArray = (el instanceof Array); + var result = Clipperz.YUI.DomQuery.filter(isArray ? el : [el], ss); + return isArray ? (result.length == el.length) : (result.length > 0); + }, + + /** + * Filters an array of elements to only include matches of a simple selector (e.g. div.some-class or span:first-child) + * @param {Array} el An array of elements to filter + * @param {String} selector The simple selector to test + * @param {Boolean} nonMatches If true, it returns the elements that DON'T match + * the selector instead of the ones that match + * @return {Array} + */ + filter : function(els, ss, nonMatches){ + ss = ss.replace(trimRe, '$1'); + if(!simpleCache[ss]){ + simpleCache[ss] = Clipperz.YUI.DomQuery.compile(ss, 'simple'); + } + var result = simpleCache[ss](els); + return nonMatches ? quickDiff(result, els) : result; + }, + + /** + * Collection of matching regular expressions and code snippets. + */ + matchers : [{ + re: /^\.([\w-]+)/, + select: 'n = byClassName(n, null, "{1}");' + }, { + re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/, + select: 'n = byPseudo(n, "{1}", "{2}");' + },{ + re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/, + select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");' + }, { + re: /^#([\w-]+)/, + select: 'n = byId(n, null, "{1}");' + },{ + re: /^@([\w-]+)/, + select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};' + } + ], + + /** + * Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *= and %=. + * New operators can be added as long as the match the format <i>c</i>= where <i>c<i> is any character other than space, > <. + */ + operators : { + '=' : function(a, v){ + return a == v; + }, + '!=' : function(a, v){ + return a != v; + }, + '^=' : function(a, v){ + return a && a.substr(0, v.length) == v; + }, + '$=' : function(a, v){ + return a && a.substr(a.length-v.length) == v; + }, + '*=' : function(a, v){ + return a && a.indexOf(v) !== -1; + }, + '%=' : function(a, v){ + return (a % v) == 0; + } + }, + + /** + * Collection of "pseudo class" processors. Each processor is passed the current nodeset (array) + * and the argument (if any) supplied in the selector. + */ + pseudos : { + 'first-child' : function(c){ + var r = []; + for(var i = 0, l = c.length; i < l; i++){ + var ci = c[i]; + if(!prev(ci)){ + r[r.length] = ci; + } + } + return r; + }, + + 'last-child' : function(c){ + var r = []; + for(var i = 0, l = c.length; i < l; i++){ + var ci = c[i]; + if(!next(ci)){ + r[r.length] = ci; + } + } + return r; + }, + + 'nth-child' : function(c, a){ + var r = []; + if(a != 'odd' && a != 'even'){ + for(var i = 0, ci; ci = c[i]; i++){ + var m = child(ci.parentNode, a); + if(m == ci){ + r[r.length] = m; + } + } + return r; + } + var p; + // first let's clean up the parent nodes + for(var i = 0, l = c.length; i < l; i++){ + var cp = c[i].parentNode; + if(cp != p){ + clean(cp); + p = cp; + } + } + // then lets see if we match + for(var i = 0, l = c.length; i < l; i++){ + var ci = c[i], m = false; + if(a == 'odd'){ + m = ((ci.nodeIndex+1) % 2 == 1); + }else if(a == 'even'){ + m = ((ci.nodeIndex+1) % 2 == 0); + } + if(m){ + r[r.length] = ci; + } + } + return r; + }, + + 'only-child' : function(c){ + var r = []; + for(var i = 0, l = c.length; i < l; i++){ + var ci = c[i]; + if(!prev(ci) && !next(ci)){ + r[r.length] = ci; + } + } + return r; + }, + + 'empty' : function(c){ + var r = []; + for(var i = 0, l = c.length; i < l; i++){ + var ci = c[i]; + if(!ci.firstChild){ + r[r.length] = ci; + } + } + return r; + }, + + 'contains' : function(c, v){ + var r = []; + for(var i = 0, l = c.length; i < l; i++){ + var ci = c[i]; + if(ci.innerHTML.indexOf(v) !== -1){ + r[r.length] = ci; + } + } + return r; + }, + + 'checked' : function(c){ + var r = []; + for(var i = 0, l = c.length; i < l; i++){ + if(c[i].checked == 'checked'){ + r[r.length] = c[i]; + } + } + return r; + }, + + 'not' : function(c, ss){ + return Clipperz.YUI.DomQuery.filter(c, ss, true); + }, + + 'odd' : function(c){ + return this['nth-child'](c, 'odd'); + }, + + 'even' : function(c){ + return this['nth-child'](c, 'even'); + }, + + 'nth' : function(c, a){ + return c[a-1]; + }, + + 'first' : function(c){ + return c[0]; + }, + + 'last' : function(c){ + return c[c.length-1]; + }, + + 'has' : function(c, ss){ + var s = Clipperz.YUI.DomQuery.select; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + if(s(ss, ci).length > 0){ + r[r.length] = ci; + } + } + return r; + }, + + 'next' : function(c, ss){ + var is = Clipperz.YUI.DomQuery.is; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var n = next(ci); + if(n && is(n, ss)){ + r[r.length] = ci; + } + } + return r; + }, + + 'prev' : function(c, ss){ + var is = Clipperz.YUI.DomQuery.is; + var r = []; + for(var i = 0, ci; ci = c[i]; i++){ + var n = prev(ci); + if(n && is(n, ss)){ + r[r.length] = ci; + } + } + return r; + } + } + }; +}(); + +/** + * Selects an array of DOM nodes by CSS/XPath selector. Shorthand of {@link Clipperz.YUI.DomQuery#select} + * @param {String} path The selector/xpath query + * @param {Node} root (optional) The start of the query (defaults to document). + * @return {Array} + * @member Ext + * @method query + */ +Clipperz.YUI.query = Clipperz.YUI.DomQuery.select; diff --git a/frontend/delta/js/Clipperz/YUI/Utils.js b/frontend/delta/js/Clipperz/YUI/Utils.js new file mode 100644 index 0000000..4def842 --- a/dev/null +++ b/frontend/delta/js/Clipperz/YUI/Utils.js @@ -0,0 +1,93 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +if (typeof YAHOO == 'undefined') { YAHOO = {}; }; +if (typeof YAHOO.util == 'undefined') { YAHOO.util = {}; }; +if (typeof YAHOO.util.Dom == 'undefined') { YAHOO.util.Dom = {}; }; + +YAHOO.extend = function(subc, superc, overrides) { + var F = function() {}; + F.prototype=superc.prototype; + subc.prototype=new F(); + subc.prototype.constructor=subc; + subc.superclass=superc.prototype; + if (superc.prototype.constructor == Object.prototype.constructor) { + superc.prototype.constructor=superc; + } + + if (overrides) { + for (var i in overrides) { + subc.prototype[i]=overrides[i]; + } + } +}; + +YAHOO.override = function(origclass, overrides){ + if(overrides){ + var p = origclass.prototype; + for(var method in overrides){ + p[method] = overrides[method]; + } + } +}; + +YAHOO.extendX = function(subclass, superclass, overrides){ + YAHOO.extend(subclass, superclass); + subclass.override = function(o){ + YAHOO.override(subclass, o); + }; + if(!subclass.prototype.override){ + subclass.prototype.override = function(o){ + for(var method in o){ + this[method] = o[method]; + } + }; + } + if(overrides){ + subclass.override(overrides); + }; + +}; + +YAHOO.util.Dom.get = function(el) { + if (!el) { return null; } // nothing to work with + + if (typeof el != 'string' && !(el instanceof Array) ) { // assuming HTMLElement or HTMLCollection, so pass back as is + return el; + } + + if (typeof el == 'string') { // ID + return document.getElementById(el); + } + else { // array of ID's and/or elements + var collection = []; + for (var i = 0, len = el.length; i < len; ++i) { + collection[collection.length] = YAHOO.util.Dom.get(el[i]); + } + + return collection; + } + + return null; // safety, should never happen +}; + diff --git a/frontend/delta/js/Cubiq/add2home.js b/frontend/delta/js/Cubiq/add2home.js new file mode 100644 index 0000000..7ecb3c0 --- a/dev/null +++ b/frontend/delta/js/Cubiq/add2home.js @@ -0,0 +1,365 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*! + * Add to Homescreen v2.0.8 ~ Copyright (c) 2013 Matteo Spinelli, http://cubiq.org + * Released under MIT license, http://cubiq.org/license + */ +var addToHome = (function (w) { + var nav = w.navigator, + isIDevice = 'platform' in nav && (/iphone|ipod|ipad/gi).test(nav.platform), + isIPad, + isRetina, + isSafari, + isStandalone, + OSVersion, + startX = 0, + startY = 0, + lastVisit = 0, + isExpired, + isSessionActive, + isReturningVisitor, + balloon, + overrideChecks, + + positionInterval, + closeTimeout, + + options = { + autostart: true, // Automatically open the balloon + returningVisitor: false, // Show the balloon to returning visitors only (setting this to true is highly recommended) + animationIn: 'drop', // drop || bubble || fade + animationOut: 'fade', // drop || bubble || fade + startDelay: 2000, // 2 seconds from page load before the balloon appears + lifespan: 15000, // 15 seconds before it is automatically destroyed + bottomOffset: 14, // Distance of the balloon from bottom + expire: 0, // Minutes to wait before showing the popup again (0 = always displayed) + message: '', // Customize your message or force a language ('' = automatic) + touchIcon: false, // Display the touch icon + arrow: true, // Display the balloon arrow + hookOnLoad: true, // Should we hook to onload event? (really advanced usage) + closeButton: true, // Let the user close the balloon + iterations: 100 // Internal/debug use + }, + + intl = { + ar: '<span dir="rtl">قم بتثبيت هذا التطبيق على <span dir="ltr">%device:</span>انقر<span dir="ltr">%icon</span> ،<strong>ثم اضفه الى الشاشة الرئيسية.</strong></span>', + ca_es: 'Per instal·lar aquesta aplicació al vostre %device premeu %icon i llavors <strong>Afegir a pantalla d\'inici</strong>.', + cs_cz: 'Pro instalaci aplikace na Váš %device, stiskněte %icon a v nabídce <strong>Přidat na plochu</strong>.', + da_dk: 'Tilføj denne side til din %device: tryk på %icon og derefter <strong>Føj til hjemmeskærm</strong>.', + de_de: 'Installieren Sie diese App auf Ihrem %device: %icon antippen und dann <strong>Zum Home-Bildschirm</strong>.', + el_gr: 'Εγκαταστήσετε αυτήν την Εφαρμογή στήν συσκευή σας %device: %icon μετά πατάτε <strong>Προσθήκη σε Αφετηρία</strong>.', + en_us: 'Install this web app on your %device: tap %icon and then <strong>Add to Home Screen</strong>.', + es_es: 'Para instalar esta app en su %device, pulse %icon y seleccione <strong>Añadir a pantalla de inicio</strong>.', + fi_fi: 'Asenna tämä web-sovellus laitteeseesi %device: paina %icon ja sen jälkeen valitse <strong>Lisää Koti-valikkoon</strong>.', + fr_fr: 'Ajoutez cette application sur votre %device en cliquant sur %icon, puis <strong>Ajouter à l\'écran d\'accueil</strong>.', + he_il: '<span dir="rtl">התקן אפליקציה זו על ה-%device שלך: הקש %icon ואז <strong>הוסף למסך הבית</strong>.</span>', + hr_hr: 'Instaliraj ovu aplikaciju na svoj %device: klikni na %icon i odaberi <strong>Dodaj u početni zaslon</strong>.', + hu_hu: 'Telepítse ezt a web-alkalmazást az Ön %device-jára: nyomjon a %icon-ra majd a <strong>Főképernyőhöz adás</strong> gombra.', + it_it: 'Installa questa applicazione sul tuo %device: premi su %icon e poi <strong>Aggiungi a Home</strong>.', + ja_jp: 'このウェブアプリをあなたの%deviceにインストールするには%iconをタップして<strong>ホーム画面に追加</strong>を選んでください。', + ko_kr: '%device에 웹앱을 설치하려면 %icon을 터치 후 "홈화면에 추가"를 선택하세요', + nb_no: 'Installer denne appen på din %device: trykk på %icon og deretter <strong>Legg til på Hjem-skjerm</strong>', + nl_nl: 'Installeer deze webapp op uw %device: tik %icon en dan <strong>Voeg toe aan beginscherm</strong>.', + pl_pl: 'Aby zainstalować tę aplikacje na %device: naciśnij %icon a następnie <strong>Dodaj jako ikonę</strong>.', + pt_br: 'Instale este aplicativo em seu %device: aperte %icon e selecione <strong>Adicionar à Tela Inicio</strong>.', + pt_pt: 'Para instalar esta aplicação no seu %device, prima o %icon e depois em <strong>Adicionar ao ecrã principal</strong>.', + ru_ru: 'Установите это веб-приложение на ваш %device: нажмите %icon, затем <strong>Добавить в «Домой»</strong>.', + sv_se: 'Lägg till denna webbapplikation på din %device: tryck på %icon och därefter <strong>Lägg till på hemskärmen</strong>.', + th_th: 'ติดตั้งเว็บแอพฯ นี้บน %device ของคุณ: แตะ %icon และ <strong>เพิ่มที่หน้าจอโฮม</strong>', + tr_tr: 'Bu uygulamayı %device\'a eklemek için %icon simgesine sonrasında <strong>Ana Ekrana Ekle</strong> düğmesine basın.', + uk_ua: 'Встановіть цей веб сайт на Ваш %device: натисніть %icon, а потім <strong>На початковий екран</strong>.', + zh_cn: '您可以将此应用程式安装到您的 %device 上。请按 %icon 然后点选<strong>添加至主屏幕</strong>。', + zh_tw: '您可以將此應用程式安裝到您的 %device 上。請按 %icon 然後點選<strong>加入主畫面螢幕</strong>。' + }; + + function init () { + // Preliminary check, all further checks are performed on iDevices only + if ( !isIDevice ) return; + + var now = Date.now(), + i; + + // Merge local with global options + if ( w.addToHomeConfig ) { + for ( i in w.addToHomeConfig ) { + options[i] = w.addToHomeConfig[i]; + } + } + if ( !options.autostart ) options.hookOnLoad = false; + + isIPad = (/ipad/gi).test(nav.platform); + isRetina = w.devicePixelRatio && w.devicePixelRatio > 1; + isSafari = (/Safari/i).test(nav.appVersion) && !(/CriOS/i).test(nav.appVersion); + isStandalone = nav.standalone; + OSVersion = nav.appVersion.match(/OS (\d+_\d+)/i); + OSVersion = OSVersion && OSVersion[1] ? +OSVersion[1].replace('_', '.') : 0; + + lastVisit = +w.localStorage.getItem('addToHome'); + + isSessionActive = w.sessionStorage.getItem('addToHomeSession'); + isReturningVisitor = options.returningVisitor ? lastVisit && lastVisit + 28*24*60*60*1000 > now : true; + + if ( !lastVisit ) lastVisit = now; + + // If it is expired we need to reissue a new balloon + isExpired = isReturningVisitor && lastVisit <= now; + + if ( options.hookOnLoad ) w.addEventListener('load', loaded, false); + else if ( !options.hookOnLoad && options.autostart ) loaded(); + } + + function loaded () { + w.removeEventListener('load', loaded, false); + + if ( !isReturningVisitor ) w.localStorage.setItem('addToHome', Date.now()); + else if ( options.expire && isExpired ) w.localStorage.setItem('addToHome', Date.now() + options.expire * 60000); + + if ( !overrideChecks && ( !isSafari || !isExpired || isSessionActive || isStandalone || !isReturningVisitor ) ) return; + + var touchIcon = '', + platform = nav.platform.split(' ')[0], + language = nav.language.replace('-', '_'); + + balloon = document.createElement('div'); + balloon.id = 'addToHomeScreen'; + balloon.style.cssText += 'left:-9999px;-webkit-transition-property:-webkit-transform,opacity;-webkit-transition-duration:0;-webkit-transform:translate3d(0,0,0);position:' + (OSVersion < 5 ? 'absolute' : 'fixed'); + + // Localize message + if ( options.message in intl ) { // You may force a language despite the user's locale + language = options.message; + options.message = ''; + } + if ( options.message === '' ) { // We look for a suitable language (defaulted to en_us) + options.message = language in intl ? intl[language] : intl['en_us']; + } + + if ( options.touchIcon ) { + touchIcon = isRetina ? + document.querySelector('head link[rel^=apple-touch-icon][sizes="114x114"],head link[rel^=apple-touch-icon][sizes="144x144"],head link[rel^=apple-touch-icon]') : + document.querySelector('head link[rel^=apple-touch-icon][sizes="57x57"],head link[rel^=apple-touch-icon]'); + + if ( touchIcon ) { + touchIcon = '<span style="background-image:url(' + touchIcon.href + ')" class="addToHomeTouchIcon"></span>'; + } + } + + balloon.className = (isIPad ? 'addToHomeIpad' : 'addToHomeIphone') + (touchIcon ? ' addToHomeWide' : ''); + balloon.innerHTML = touchIcon + + options.message.replace('%device', platform).replace('%icon', OSVersion >= 4.2 ? '<span class="addToHomeShare' + (OSVersion >= 7 ? ' addToHomeShareOS7' : '') + '"></span>' : '<span class="addToHomePlus">+</span>') + + (options.arrow ? '<span class="addToHomeArrow"></span>' : '') + + (options.closeButton ? '<span class="addToHomeClose">\u00D7</span>' : ''); + + document.body.appendChild(balloon); + + // Add the close action + if ( options.closeButton ) balloon.addEventListener('click', clicked, false); + + if ( !isIPad && OSVersion >= 6 ) window.addEventListener('orientationchange', orientationCheck, false); + + setTimeout(show, options.startDelay); + } + + function show () { + var duration, + iPadXShift = 208; + + // Set the initial position + if ( isIPad ) { + if ( OSVersion < 5 ) { + startY = w.scrollY; + startX = w.scrollX; + } else if ( OSVersion < 6 ) { + iPadXShift = 160; + } + + balloon.style.top = startY + options.bottomOffset + 'px'; + balloon.style.left = startX + iPadXShift - Math.round(balloon.offsetWidth / 2) + 'px'; + + switch ( options.animationIn ) { + case 'drop': + duration = '0.6s'; + balloon.style.webkitTransform = 'translate3d(0,' + -(w.scrollY + options.bottomOffset + balloon.offsetHeight) + 'px,0)'; + break; + case 'bubble': + duration = '0.6s'; + balloon.style.opacity = '0'; + balloon.style.webkitTransform = 'translate3d(0,' + (startY + 50) + 'px,0)'; + break; + default: + duration = '1s'; + balloon.style.opacity = '0'; + } + } else { + startY = w.innerHeight + w.scrollY; + + if ( OSVersion < 5 ) { + startX = Math.round((w.innerWidth - balloon.offsetWidth) / 2) + w.scrollX; + balloon.style.left = startX + 'px'; + balloon.style.top = startY - balloon.offsetHeight - options.bottomOffset + 'px'; + } else { + balloon.style.left = '50%'; + balloon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 ? 40 : 0 ) + 'px'; + balloon.style.bottom = options.bottomOffset + 'px'; + } + + switch (options.animationIn) { + case 'drop': + duration = '1s'; + balloon.style.webkitTransform = 'translate3d(0,' + -(startY + options.bottomOffset) + 'px,0)'; + break; + case 'bubble': + duration = '0.6s'; + balloon.style.webkitTransform = 'translate3d(0,' + (balloon.offsetHeight + options.bottomOffset + 50) + 'px,0)'; + break; + default: + duration = '1s'; + balloon.style.opacity = '0'; + } + } + + balloon.offsetHeight; // repaint trick + balloon.style.webkitTransitionDuration = duration; + balloon.style.opacity = '1'; + balloon.style.webkitTransform = 'translate3d(0,0,0)'; + balloon.addEventListener('webkitTransitionEnd', transitionEnd, false); + + closeTimeout = setTimeout(close, options.lifespan); + } + + function manualShow (override) { + if ( !isIDevice || balloon ) return; + + overrideChecks = override; + loaded(); + } + + function close () { + clearInterval( positionInterval ); + clearTimeout( closeTimeout ); + closeTimeout = null; + + // check if the popup is displayed and prevent errors + if ( !balloon ) return; + + var posY = 0, + posX = 0, + opacity = '1', + duration = '0'; + + if ( options.closeButton ) balloon.removeEventListener('click', clicked, false); + if ( !isIPad && OSVersion >= 6 ) window.removeEventListener('orientationchange', orientationCheck, false); + + if ( OSVersion < 5 ) { + posY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY; + posX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth)/2) - startX; + } + + balloon.style.webkitTransitionProperty = '-webkit-transform,opacity'; + + switch ( options.animationOut ) { + case 'drop': + if ( isIPad ) { + duration = '0.4s'; + opacity = '0'; + posY += 50; + } else { + duration = '0.6s'; + posY += balloon.offsetHeight + options.bottomOffset + 50; + } + break; + case 'bubble': + if ( isIPad ) { + duration = '0.8s'; + posY -= balloon.offsetHeight + options.bottomOffset + 50; + } else { + duration = '0.4s'; + opacity = '0'; + posY -= 50; + } + break; + default: + duration = '0.8s'; + opacity = '0'; + } + + balloon.addEventListener('webkitTransitionEnd', transitionEnd, false); + balloon.style.opacity = opacity; + balloon.style.webkitTransitionDuration = duration; + balloon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)'; + } + + + function clicked () { + w.sessionStorage.setItem('addToHomeSession', '1'); + isSessionActive = true; + close(); + } + + function transitionEnd () { + balloon.removeEventListener('webkitTransitionEnd', transitionEnd, false); + + balloon.style.webkitTransitionProperty = '-webkit-transform'; + balloon.style.webkitTransitionDuration = '0.2s'; + + // We reached the end! + if ( !closeTimeout ) { + balloon.parentNode.removeChild(balloon); + balloon = null; + return; + } + + // On iOS 4 we start checking the element position + if ( OSVersion < 5 && closeTimeout ) positionInterval = setInterval(setPosition, options.iterations); + } + + function setPosition () { + var matrix = new WebKitCSSMatrix(w.getComputedStyle(balloon, null).webkitTransform), + posY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY, + posX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth) / 2) - startX; + + // Screen didn't move + if ( posY == matrix.m42 && posX == matrix.m41 ) return; + + balloon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)'; + } + + // Clear local and session storages (this is useful primarily in development) + function reset () { + w.localStorage.removeItem('addToHome'); + w.sessionStorage.removeItem('addToHomeSession'); + } + + function orientationCheck () { + balloon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 ? 40 : 0 ) + 'px'; + } + + // Bootstrap! + init(); + + return { + show: manualShow, + close: close, + reset: reset + }; +})(window); diff --git a/frontend/delta/js/MochiKit/Async.js b/frontend/delta/js/MochiKit/Async.js new file mode 100644 index 0000000..a76aaa2 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Async.js @@ -0,0 +1,733 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Async 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Async', '1.5', ['Base']); + +/** @id MochiKit.Async.Deferred */ +MochiKit.Async.Deferred = function (/* optional */ canceller) { + this.chain = []; + this.id = this._nextId(); + this.fired = -1; + this.paused = 0; + this.results = [null, null]; + this.canceller = canceller; + this.silentlyCancelled = false; + this.chained = false; + this.finalized = false; +}; + +MochiKit.Async.Deferred.prototype = { + /** @id MochiKit.Async.Deferred.prototype.repr */ + repr: function () { + return 'Deferred(' + this.id + ', ' + this.state() + ')'; + }, + + toString: MochiKit.Base.forwardCall("repr"), + + _nextId: MochiKit.Base.counter(), + + /** @id MochiKit.Async.Deferred.prototype.state */ + state: function () { + if (this.fired == -1) { + return 'unfired'; + } else if (this.fired === 0) { + return 'success'; + } else { + return 'error'; + } + }, + + /** @id MochiKit.Async.Deferred.prototype.cancel */ + cancel: function (e) { + var self = MochiKit.Async; + if (this.fired == -1) { + if (this.canceller) { + this.canceller(this); + } else { + this.silentlyCancelled = true; + } + if (this.fired == -1) { + if (typeof(e) === 'string') { + e = new self.GenericError(e); + } else if (!(e instanceof Error)) { + e = new self.CancelledError(this); + } + this.errback(e); + } + } else if ((this.fired === 0) && (this.results[0] instanceof self.Deferred)) { + this.results[0].cancel(e); + } + }, + + _resback: function (res) { + /*** + + The primitive that means either callback or errback + + ***/ + this.fired = ((res instanceof Error) ? 1 : 0); + this.results[this.fired] = res; + if (this.paused === 0) { + this._fire(); + } + }, + + _check: function () { + if (this.fired != -1) { + if (!this.silentlyCancelled) { + throw new MochiKit.Async.AlreadyCalledError(this); + } + this.silentlyCancelled = false; + return; + } + }, + + /** @id MochiKit.Async.Deferred.prototype.callback */ + callback: function (res) { + this._check(); + if (res instanceof MochiKit.Async.Deferred) { + throw new Error("Deferred instances can only be chained if they are the result of a callback"); + } + this._resback(res); + }, + + /** @id MochiKit.Async.Deferred.prototype.errback */ + errback: function (res) { + this._check(); + var self = MochiKit.Async; + if (res instanceof self.Deferred) { + throw new Error("Deferred instances can only be chained if they are the result of a callback"); + } + if (!(res instanceof Error)) { + res = new self.GenericError(res); + } + this._resback(res); + }, + + /** @id MochiKit.Async.Deferred.prototype.addBoth */ + addBoth: function (fn) { + if (arguments.length > 1) { + fn = MochiKit.Base.partial.apply(null, arguments); + } + return this.addCallbacks(fn, fn); + }, + + /** @id MochiKit.Async.Deferred.prototype.addCallback */ + addCallback: function (fn) { + if (arguments.length > 1) { + fn = MochiKit.Base.partial.apply(null, arguments); + } + return this.addCallbacks(fn, null); + }, + + /** @id MochiKit.Async.Deferred.prototype.addErrback */ + addErrback: function (fn) { + if (arguments.length > 1) { + fn = MochiKit.Base.partial.apply(null, arguments); + } + return this.addCallbacks(null, fn); + }, + + /** @id MochiKit.Async.Deferred.prototype.addCallbacks */ + addCallbacks: function (cb, eb) { + if (this.chained) { + throw new Error("Chained Deferreds can not be re-used"); + } + if (this.finalized) { + throw new Error("Finalized Deferreds can not be re-used"); + } + this.chain.push([cb, eb]); + if (this.fired >= 0) { + this._fire(); + } + return this; + }, + + /** @id MochiKit.Async.Deferred.prototype.setFinalizer */ + setFinalizer: function (fn) { + if (this.chained) { + throw new Error("Chained Deferreds can not be re-used"); + } + if (this.finalized) { + throw new Error("Finalized Deferreds can not be re-used"); + } + if (arguments.length > 1) { + fn = MochiKit.Base.partial.apply(null, arguments); + } + this._finalizer = fn; + if (this.fired >= 0) { + this._fire(); + } + return this; + }, + + _fire: function () { + /*** + + Used internally to exhaust the callback sequence when a result + is available. + + ***/ + var chain = this.chain; + var fired = this.fired; + var res = this.results[fired]; + var self = this; + var cb = null; + while (chain.length > 0 && this.paused === 0) { + // Array + var pair = chain.shift(); + var f = pair[fired]; + if (f === null) { + continue; + } + try { + res = f(res); + fired = ((res instanceof Error) ? 1 : 0); + if (res instanceof MochiKit.Async.Deferred) { + cb = function (res) { + self.paused--; + self._resback(res); + }; + this.paused++; + } + } catch (err) { + fired = 1; + if (!(err instanceof Error)) { + err = new MochiKit.Async.GenericError(err); + } + res = err; + } + } + this.fired = fired; + this.results[fired] = res; + if (this.chain.length == 0 && this.paused === 0 && this._finalizer) { + this.finalized = true; + this._finalizer(res); + } + if (cb && this.paused) { + // this is for "tail recursion" in case the dependent deferred + // is already fired + res.addBoth(cb); + res.chained = true; + } + } +}; + +MochiKit.Base.update(MochiKit.Async, { + /** @id MochiKit.Async.evalJSONRequest */ + evalJSONRequest: function (req) { + return MochiKit.Base.evalJSON(req.responseText); + }, + + /** @id MochiKit.Async.succeed */ + succeed: function (/* optional */result) { + var d = new MochiKit.Async.Deferred(); + d.callback.apply(d, arguments); + return d; + }, + + /** @id MochiKit.Async.fail */ + fail: function (/* optional */result) { + var d = new MochiKit.Async.Deferred(); + d.errback.apply(d, arguments); + return d; + }, + + /** @id MochiKit.Async.getXMLHttpRequest */ + getXMLHttpRequest: function () { + var self = arguments.callee; + if (!self.XMLHttpRequest) { + var tryThese = [ + function () { return new XMLHttpRequest(); }, + function () { return new ActiveXObject('Msxml2.XMLHTTP'); }, + function () { return new ActiveXObject('Microsoft.XMLHTTP'); }, + function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }, + function () { + throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest"); + } + ]; + for (var i = 0; i < tryThese.length; i++) { + var func = tryThese[i]; + try { + self.XMLHttpRequest = func; + return func(); + } catch (e) { + // pass + } + } + } + return self.XMLHttpRequest(); + }, + + _xhr_onreadystatechange: function (d) { + // MochiKit.Logging.logDebug('this.readyState', this.readyState); + var m = MochiKit.Base; + if (this.readyState == 4) { + // IE SUCKS + try { + this.onreadystatechange = null; + } catch (e) { + try { + this.onreadystatechange = m.noop; + } catch (e) { + } + } + var status = null; + try { + status = this.status; + if (!status && (this.response || m.isNotEmpty(this.responseText))) { + // 0 or undefined seems to mean cached or local + status = 304; + } + } catch (e) { + // pass + // MochiKit.Logging.logDebug('error getting status?', repr(items(e))); + } + // 200 is OK, 201 is CREATED, 204 is NO CONTENT + // 304 is NOT MODIFIED, 1223 is apparently a bug in IE + if (status == 200 || status == 201 || status == 204 || + status == 304 || status == 1223) { + d.callback(this); + } else { + var err = new MochiKit.Async.XMLHttpRequestError(this, "Request failed"); + if (err.number) { + // XXX: This seems to happen on page change + d.errback(err); + } else { + // XXX: this seems to happen when the server is unreachable + d.errback(err); + } + } + } + }, + + _xhr_canceller: function (req) { + // IE SUCKS + try { + req.onreadystatechange = null; + } catch (e) { + try { + req.onreadystatechange = MochiKit.Base.noop; + } catch (e) { + } + } + req.abort(); + }, + + + /** @id MochiKit.Async.sendXMLHttpRequest */ + sendXMLHttpRequest: function (req, /* optional */ sendContent) { + if (typeof(sendContent) == "undefined" || sendContent === null) { + sendContent = ""; + } + + var m = MochiKit.Base; + var self = MochiKit.Async; + var d = new self.Deferred(m.partial(self._xhr_canceller, req)); + + try { + req.onreadystatechange = m.bind(self._xhr_onreadystatechange, + req, d); + req.send(sendContent); + } catch (e) { + try { + req.onreadystatechange = null; + } catch (ignore) { + // pass + } + d.errback(e); + } + + return d; + + }, + + /** @id MochiKit.Async.doXHR */ + doXHR: function (url, opts) { + /* + Work around a Firefox bug by dealing with XHR during + the next event loop iteration. Maybe it's this one: + https://bugzilla.mozilla.org/show_bug.cgi?id=249843 + */ + var self = MochiKit.Async; + return self.callLater(0, self._doXHR, url, opts); + }, + + _doXHR: function (url, opts) { + var m = MochiKit.Base; + opts = m.update({ + method: 'GET', + sendContent: '' + /* + queryString: undefined, + username: undefined, + password: undefined, + headers: undefined, + mimeType: undefined, + responseType: undefined, + withCredentials: undefined + */ + }, opts); + var self = MochiKit.Async; + var req = self.getXMLHttpRequest(); + if (opts.queryString) { + var qs = m.queryString(opts.queryString); + if (qs) { + url += "?" + qs; + } + } + // Safari will send undefined:undefined, so we have to check. + // We can't use apply, since the function is native. + if ('username' in opts) { + req.open(opts.method, url, true, opts.username, opts.password); + } else { + req.open(opts.method, url, true); + } + if (req.overrideMimeType && opts.mimeType) { + req.overrideMimeType(opts.mimeType); + } + req.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + if (opts.headers) { + var headers = opts.headers; + if (!m.isArrayLike(headers)) { + headers = m.items(headers); + } + for (var i = 0; i < headers.length; i++) { + var header = headers[i]; + var name = header[0]; + var value = header[1]; + req.setRequestHeader(name, value); + } + } + if ("responseType" in opts && "responseType" in req) { + req.responseType = opts.responseType; + } + if (opts.withCredentials) { + req.withCredentials = 'true'; + } + return self.sendXMLHttpRequest(req, opts.sendContent); + }, + + _buildURL: function (url/*, ...*/) { + if (arguments.length > 1) { + var m = MochiKit.Base; + var qs = m.queryString.apply(null, m.extend(null, arguments, 1)); + if (qs) { + return url + "?" + qs; + } + } + return url; + }, + + /** @id MochiKit.Async.doSimpleXMLHttpRequest */ + doSimpleXMLHttpRequest: function (url/*, ...*/) { + var self = MochiKit.Async; + url = self._buildURL.apply(self, arguments); + return self.doXHR(url); + }, + + /** @id MochiKit.Async.loadJSONDoc */ + loadJSONDoc: function (url/*, ...*/) { + var self = MochiKit.Async; + url = self._buildURL.apply(self, arguments); + var d = self.doXHR(url, { + 'mimeType': 'text/plain', + 'headers': [['Accept', 'application/json']] + }); + d = d.addCallback(self.evalJSONRequest); + return d; + }, + + /** @id MochiKit.Async.loadScript */ + loadScript: function (url) { + var d = new MochiKit.Async.Deferred(); + var script = document.createElement("script"); + script.type = "text/javascript"; + script.src = url; + script.onload = function () { + script.onload = null; + script.onerror = null; + script.onreadystatechange = null; + script = null; + d.callback(); + }; + script.onerror = function (msg) { + script.onload = null; + script.onerror = null; + script.onreadystatechange = null; + script = null; + msg = "Failed to load script at " + url + ": " + msg; + d.errback(new URIError(msg, url)); + } + script.onreadystatechange = function () { + if (script.readyState == "loaded" || script.readyState == "complete") { + script.onload(); + } else { + // IE doesn't bother to report errors... + MochiKit.Async.callLater(10, script.onerror, "Script loading timed out") + } + }; + document.getElementsByTagName("head")[0].appendChild(script); + return d; + }, + + /** @id MochiKit.Async.wait */ + wait: function (seconds, /* optional */value) { + var d = new MochiKit.Async.Deferred(); + var cb = MochiKit.Base.bind("callback", d, value); + var timeout = setTimeout(cb, Math.floor(seconds * 1000)); + d.canceller = function () { + try { + clearTimeout(timeout); + } catch (e) { + // pass + } + }; + return d; + }, + + /** @id MochiKit.Async.callLater */ + callLater: function (seconds, func) { + var m = MochiKit.Base; + var pfunc = m.partial.apply(m, m.extend(null, arguments, 1)); + return MochiKit.Async.wait(seconds).addCallback( + function (res) { return pfunc(); } + ); + } +}); + + +/** @id MochiKit.Async.DeferredLock */ +MochiKit.Async.DeferredLock = function () { + this.waiting = []; + this.locked = false; + this.id = this._nextId(); +}; + +MochiKit.Async.DeferredLock.prototype = { + __class__: MochiKit.Async.DeferredLock, + /** @id MochiKit.Async.DeferredLock.prototype.acquire */ + acquire: function () { + var d = new MochiKit.Async.Deferred(); + if (this.locked) { + this.waiting.push(d); + } else { + this.locked = true; + d.callback(this); + } + return d; + }, + /** @id MochiKit.Async.DeferredLock.prototype.release */ + release: function () { + if (!this.locked) { + throw TypeError("Tried to release an unlocked DeferredLock"); + } + this.locked = false; + if (this.waiting.length > 0) { + this.locked = true; + this.waiting.shift().callback(this); + } + }, + _nextId: MochiKit.Base.counter(), + repr: function () { + var state; + if (this.locked) { + state = 'locked, ' + this.waiting.length + ' waiting'; + } else { + state = 'unlocked'; + } + return 'DeferredLock(' + this.id + ', ' + state + ')'; + }, + toString: MochiKit.Base.forwardCall("repr") + +}; + +/** @id MochiKit.Async.DeferredList */ +MochiKit.Async.DeferredList = function (list, /* optional */fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) { + + // call parent constructor + MochiKit.Async.Deferred.apply(this, [canceller]); + + this.list = list; + var resultList = []; + this.resultList = resultList; + + this.finishedCount = 0; + this.fireOnOneCallback = fireOnOneCallback; + this.fireOnOneErrback = fireOnOneErrback; + this.consumeErrors = consumeErrors; + + var cb = MochiKit.Base.bind(this._cbDeferred, this); + for (var i = 0; i < list.length; i++) { + var d = list[i]; + resultList.push(undefined); + d.addCallback(cb, i, true); + d.addErrback(cb, i, false); + } + + if (list.length === 0 && !fireOnOneCallback) { + this.callback(this.resultList); + } + +}; + +MochiKit.Async.DeferredList.prototype = new MochiKit.Async.Deferred(); +MochiKit.Async.DeferredList.prototype.constructor = MochiKit.Async.DeferredList; + +MochiKit.Async.DeferredList.prototype._cbDeferred = function (index, succeeded, result) { + this.resultList[index] = [succeeded, result]; + this.finishedCount += 1; + if (this.fired == -1) { + if (succeeded && this.fireOnOneCallback) { + this.callback([index, result]); + } else if (!succeeded && this.fireOnOneErrback) { + this.errback(result); + } else if (this.finishedCount == this.list.length) { + this.callback(this.resultList); + } + } + if (!succeeded && this.consumeErrors) { + result = null; + } + return result; +}; + +/** @id MochiKit.Async.gatherResults */ +MochiKit.Async.gatherResults = function (deferredList) { + var d = new MochiKit.Async.DeferredList(deferredList, false, true, false); + d.addCallback(function (results) { + var ret = []; + for (var i = 0; i < results.length; i++) { + ret.push(results[i][1]); + } + return ret; + }); + return d; +}; + +/** @id MochiKit.Async.maybeDeferred */ +MochiKit.Async.maybeDeferred = function (func) { + var self = MochiKit.Async; + var result; + try { + var r = func.apply(null, MochiKit.Base.extend([], arguments, 1)); + if (r instanceof self.Deferred) { + result = r; + } else if (r instanceof Error) { + result = self.fail(r); + } else { + result = self.succeed(r); + } + } catch (e) { + result = self.fail(e); + } + return result; +}; + + +MochiKit.Async.__new__ = function () { + var m = MochiKit.Base; + var ne = m.partial(m._newNamedError, this); + + ne("AlreadyCalledError", + /** @id MochiKit.Async.AlreadyCalledError */ + function (deferred) { + /*** + + Raised by the Deferred if callback or errback happens + after it was already fired. + + ***/ + this.deferred = deferred; + } + ); + + ne("CancelledError", + /** @id MochiKit.Async.CancelledError */ + function (deferred) { + /*** + + Raised by the Deferred cancellation mechanism. + + ***/ + this.deferred = deferred; + } + ); + + ne("BrowserComplianceError", + /** @id MochiKit.Async.BrowserComplianceError */ + function (msg) { + /*** + + Raised when the JavaScript runtime is not capable of performing + the given function. Technically, this should really never be + raised because a non-conforming JavaScript runtime probably + isn't going to support exceptions in the first place. + + ***/ + this.message = msg; + } + ); + + ne("GenericError", + /** @id MochiKit.Async.GenericError */ + function (msg) { + this.message = msg; + } + ); + + ne("XMLHttpRequestError", + /** @id MochiKit.Async.XMLHttpRequestError */ + function (req, msg) { + /*** + + Raised when an XMLHttpRequest does not complete for any reason. + + ***/ + this.req = req; + this.message = msg; + try { + // Strange but true that this can raise in some cases. + this.number = req.status; + } catch (e) { + // pass + } + } + ); + + m.nameFunctions(this); +}; + +MochiKit.Async.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Async); diff --git a/frontend/delta/js/MochiKit/Base.js b/frontend/delta/js/MochiKit/Base.js new file mode 100644 index 0000000..c55f5c3 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Base.js @@ -0,0 +1,1523 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Base 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + + +// MochiKit module (namespace) +var MochiKit = MochiKit || {}; +if (typeof(MochiKit.__export__) == "undefined") { + MochiKit.__export__ = true; +} +MochiKit.NAME = "MochiKit"; +MochiKit.VERSION = "1.5"; +MochiKit.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; +MochiKit.toString = function () { + return this.__repr__(); +}; + + +// MochiKit.Base module +MochiKit.Base = MochiKit.Base || {}; + +/** + * Creates a new module in a parent namespace. This function will + * create a new empty module object with "NAME", "VERSION", + * "toString" and "__repr__" properties. This object will be inserted into the parent object + * using the specified name (i.e. parent[name] = module). It will + * also verify that all the dependency modules are defined in the + * parent, or an error will be thrown. + * + * @param {Object} parent the parent module (use "this" or "window" for + * a global module) + * @param {String} name the module name, e.g. "Base" + * @param {String} version the module version, e.g. "1.5" + * @param {Array} [deps] the array of module dependencies (as strings) + */ +MochiKit.Base.module = function (parent, name, version, deps) { + var module = parent[name] = parent[name] || {}; + var prefix = (parent.NAME ? parent.NAME + "." : ""); + module.NAME = prefix + name; + module.VERSION = version; + module.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }; + module.toString = function () { + return this.__repr__(); + }; + for (var i = 0; deps != null && i < deps.length; i++) { + if (!(deps[i] in parent)) { + throw module.NAME + ' depends on ' + prefix + deps[i] + '!'; + } + } + return module; +}; + +MochiKit.Base.module(MochiKit, "Base", "1.5", []); + +/** @id MochiKit.Base.update */ +MochiKit.Base.update = function (self, obj/*, ... */) { + if (self === null || self === undefined) { + self = {}; + } + for (var i = 1; i < arguments.length; i++) { + var o = arguments[i]; + if (typeof(o) != 'undefined' && o !== null) { + for (var k in o) { + self[k] = o[k]; + } + } + } + return self; +}; + +MochiKit.Base.update(MochiKit.Base, { + /** @id MochiKit.Base.camelize */ + camelize: function (selector) { + /* from dojo.style.toCamelCase */ + var arr = selector.split('-'); + var cc = arr[0]; + for (var i = 1; i < arr.length; i++) { + cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1); + } + return cc; + }, + + /** @id MochiKit.Base.counter */ + counter: function (n/* = 1 */) { + if (arguments.length === 0) { + n = 1; + } + return function () { + return n++; + }; + }, + + /** @id MochiKit.Base.clone */ + clone: function (obj) { + var me = arguments.callee; + if (arguments.length == 1) { + me.prototype = obj; + return new me(); + } + }, + + _flattenArray: function (res, lst) { + for (var i = 0; i < lst.length; i++) { + var o = lst[i]; + if (o instanceof Array) { + arguments.callee(res, o); + } else { + res.push(o); + } + } + return res; + }, + + /** @id MochiKit.Base.flattenArray */ + flattenArray: function (lst) { + return MochiKit.Base._flattenArray([], lst); + }, + + /** @id MochiKit.Base.flattenArguments */ + flattenArguments: function (lst/* ...*/) { + var res = []; + var m = MochiKit.Base; + var args = m.extend(null, arguments); + while (args.length) { + var o = args.shift(); + if (o && typeof(o) == "object" && typeof(o.length) == "number") { + for (var i = o.length - 1; i >= 0; i--) { + args.unshift(o[i]); + } + } else { + res.push(o); + } + } + return res; + }, + + /** @id MochiKit.Base.extend */ + extend: function (self, obj, /* optional */skip) { + // Extend an array with an array-like object starting + // from the skip index + if (!skip) { + skip = 0; + } + if (obj) { + // allow iterable fall-through, but skip the full isArrayLike + // check for speed, this is called often. + var l = obj.length; + if (typeof(l) != 'number' /* !isArrayLike(obj) */) { + if (typeof(MochiKit.Iter) != "undefined") { + obj = MochiKit.Iter.list(obj); + l = obj.length; + } else { + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); + } + } + if (!self) { + self = []; + } + for (var i = skip; i < l; i++) { + self.push(obj[i]); + } + } + // This mutates, but it's convenient to return because + // it's often used like a constructor when turning some + // ghetto array-like to a real array + return self; + }, + + + /** @id MochiKit.Base.updatetree */ + updatetree: function (self, obj/*, ...*/) { + if (self === null || self === undefined) { + self = {}; + } + for (var i = 1; i < arguments.length; i++) { + var o = arguments[i]; + if (typeof(o) != 'undefined' && o !== null) { + for (var k in o) { + var v = o[k]; + if (typeof(self[k]) == 'object' && typeof(v) == 'object') { + arguments.callee(self[k], v); + } else { + self[k] = v; + } + } + } + } + return self; + }, + + /** @id MochiKit.Base.setdefault */ + setdefault: function (self, obj/*, ...*/) { + if (self === null || self === undefined) { + self = {}; + } + for (var i = 1; i < arguments.length; i++) { + var o = arguments[i]; + for (var k in o) { + if (!(k in self)) { + self[k] = o[k]; + } + } + } + return self; + }, + + /** @id MochiKit.Base.keys */ + keys: function (obj) { + var rval = []; + for (var prop in obj) { + rval.push(prop); + } + return rval; + }, + + /** @id MochiKit.Base.values */ + values: function (obj) { + var rval = []; + for (var prop in obj) { + rval.push(obj[prop]); + } + return rval; + }, + + /** @id MochiKit.Base.items */ + items: function (obj) { + var rval = []; + var e; + for (var prop in obj) { + var v; + try { + v = obj[prop]; + } catch (e) { + continue; + } + rval.push([prop, v]); + } + return rval; + }, + + + _newNamedError: function (module, name, func) { + func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name); + func.prototype.constructor = func; + module[name] = func; + }, + + + /** @id MochiKit.Base.operator */ + operator: { + // unary logic operators + /** @id MochiKit.Base.truth */ + truth: function (a) { return !!a; }, + /** @id MochiKit.Base.lognot */ + lognot: function (a) { return !a; }, + /** @id MochiKit.Base.identity */ + identity: function (a) { return a; }, + + // bitwise unary operators + /** @id MochiKit.Base.not */ + not: function (a) { return ~a; }, + /** @id MochiKit.Base.neg */ + neg: function (a) { return -a; }, + + // binary operators + /** @id MochiKit.Base.add */ + add: function (a, b) { return a + b; }, + /** @id MochiKit.Base.sub */ + sub: function (a, b) { return a - b; }, + /** @id MochiKit.Base.div */ + div: function (a, b) { return a / b; }, + /** @id MochiKit.Base.mod */ + mod: function (a, b) { return a % b; }, + /** @id MochiKit.Base.mul */ + mul: function (a, b) { return a * b; }, + + // bitwise binary operators + /** @id MochiKit.Base.and */ + and: function (a, b) { return a & b; }, + /** @id MochiKit.Base.or */ + or: function (a, b) { return a | b; }, + /** @id MochiKit.Base.xor */ + xor: function (a, b) { return a ^ b; }, + /** @id MochiKit.Base.lshift */ + lshift: function (a, b) { return a << b; }, + /** @id MochiKit.Base.rshift */ + rshift: function (a, b) { return a >> b; }, + /** @id MochiKit.Base.zrshift */ + zrshift: function (a, b) { return a >>> b; }, + + // near-worthless built-in comparators + /** @id MochiKit.Base.eq */ + eq: function (a, b) { return a == b; }, + /** @id MochiKit.Base.ne */ + ne: function (a, b) { return a != b; }, + /** @id MochiKit.Base.gt */ + gt: function (a, b) { return a > b; }, + /** @id MochiKit.Base.ge */ + ge: function (a, b) { return a >= b; }, + /** @id MochiKit.Base.lt */ + lt: function (a, b) { return a < b; }, + /** @id MochiKit.Base.le */ + le: function (a, b) { return a <= b; }, + + // strict built-in comparators + seq: function (a, b) { return a === b; }, + sne: function (a, b) { return a !== b; }, + + // compare comparators + /** @id MochiKit.Base.ceq */ + ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; }, + /** @id MochiKit.Base.cne */ + cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; }, + /** @id MochiKit.Base.cgt */ + cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; }, + /** @id MochiKit.Base.cge */ + cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; }, + /** @id MochiKit.Base.clt */ + clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; }, + /** @id MochiKit.Base.cle */ + cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; }, + + // binary logical operators + /** @id MochiKit.Base.logand */ + logand: function (a, b) { return a && b; }, + /** @id MochiKit.Base.logor */ + logor: function (a, b) { return a || b; }, + /** @id MochiKit.Base.contains */ + contains: function (a, b) { return b in a; } + }, + + /** @id MochiKit.Base.forwardCall */ + forwardCall: function (func) { + return function () { + return this[func].apply(this, arguments); + }; + }, + + /** @id MochiKit.Base.itemgetter */ + itemgetter: function (func) { + return function (arg) { + return arg[func]; + }; + }, + + /** @id MochiKit.Base.bool */ + bool: function (value) { + if (typeof(value) === "boolean" || value instanceof Boolean) { + return value.valueOf(); + } else if (typeof(value) === "string" || value instanceof String) { + return value.length > 0 && value != "false" && value != "null" && + value != "undefined" && value != "0"; + } else if (typeof(value) === "number" || value instanceof Number) { + return !isNaN(value) && value != 0; + } else if (value != null && typeof(value.length) === "number") { + return value.length !== 0; + } else { + return value != null; + } + }, + + /** @id MochiKit.Base.typeMatcher */ + typeMatcher: function (/* typ */) { + var types = {}; + for (var i = 0; i < arguments.length; i++) { + var typ = arguments[i]; + types[typ] = typ; + } + return function () { + for (var i = 0; i < arguments.length; i++) { + if (!(typeof(arguments[i]) in types)) { + return false; + } + } + return true; + }; + }, + + /** @id MochiKit.Base.isNull */ + isNull: function (/* ... */) { + for (var i = 0; i < arguments.length; i++) { + if (arguments[i] !== null) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Base.isUndefinedOrNull */ + isUndefinedOrNull: function (/* ... */) { + for (var i = 0; i < arguments.length; i++) { + var o = arguments[i]; + if (!(typeof(o) == 'undefined' || o === null)) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Base.isEmpty */ + isEmpty: function (obj) { + return !MochiKit.Base.isNotEmpty.apply(this, arguments); + }, + + /** @id MochiKit.Base.isNotEmpty */ + isNotEmpty: function (obj) { + for (var i = 0; i < arguments.length; i++) { + var o = arguments[i]; + if (!(o && o.length)) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Base.isArrayLike */ + isArrayLike: function () { + for (var i = 0; i < arguments.length; i++) { + var o = arguments[i]; + var typ = typeof(o); + if ( + (typ != 'object' && !(typ == 'function' && typeof(o.item) == 'function')) || + o === null || + typeof(o.length) != 'number' || + o.nodeType === 3 || + o.nodeType === 4 + ) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Base.isDateLike */ + isDateLike: function () { + for (var i = 0; i < arguments.length; i++) { + var o = arguments[i]; + if (typeof(o) != "object" || o === null + || typeof(o.getTime) != 'function') { + return false; + } + } + return true; + }, + + + /** @id MochiKit.Base.xmap */ + xmap: function (fn/*, obj... */) { + if (fn === null) { + return MochiKit.Base.extend(null, arguments, 1); + } + var rval = []; + for (var i = 1; i < arguments.length; i++) { + rval.push(fn(arguments[i])); + } + return rval; + }, + + /** @id MochiKit.Base.map */ + map: function (fn, lst/*, lst... */) { + var m = MochiKit.Base; + var itr = MochiKit.Iter; + var isArrayLike = m.isArrayLike; + if (arguments.length <= 2) { + // allow an iterable to be passed + if (!isArrayLike(lst)) { + if (itr) { + // fast path for map(null, iterable) + lst = itr.list(lst); + if (fn === null) { + return lst; + } + } else { + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); + } + } + // fast path for map(null, lst) + if (fn === null) { + return m.extend(null, lst); + } + // disabled fast path for map(fn, lst) + /* + if (false && typeof(Array.prototype.map) == 'function') { + // Mozilla fast-path + return Array.prototype.map.call(lst, fn); + } + */ + var rval = []; + for (var i = 0; i < lst.length; i++) { + rval.push(fn(lst[i])); + } + return rval; + } else { + // default for map(null, ...) is zip(...) + if (fn === null) { + fn = Array; + } + var length = null; + for (var i = 1; i < arguments.length; i++) { + // allow iterables to be passed + if (!isArrayLike(arguments[i])) { + if (itr) { + return itr.list(itr.imap.apply(null, arguments)); + } else { + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); + } + } + // find the minimum length + var l = arguments[i].length; + if (length === null || length > l) { + length = l; + } + } + rval = []; + for (var i = 0; i < length; i++) { + var args = []; + for (var j = 1; j < arguments.length; j++) { + args.push(arguments[j][i]); + } + rval.push(fn.apply(this, args)); + } + return rval; + } + }, + + /** @id MochiKit.Base.xfilter */ + xfilter: function (fn/*, obj... */) { + var rval = []; + if (fn === null) { + fn = MochiKit.Base.operator.truth; + } + for (var i = 1; i < arguments.length; i++) { + var o = arguments[i]; + if (fn(o)) { + rval.push(o); + } + } + return rval; + }, + + /** @id MochiKit.Base.filter */ + filter: function (fn, lst, self) { + var rval = []; + // allow an iterable to be passed + var m = MochiKit.Base; + if (!m.isArrayLike(lst)) { + if (MochiKit.Iter) { + lst = MochiKit.Iter.list(lst); + } else { + throw new TypeError("Argument not an array-like and MochiKit.Iter not present"); + } + } + if (fn === null) { + fn = m.operator.truth; + } + if (typeof(Array.prototype.filter) == 'function') { + // Mozilla fast-path + return Array.prototype.filter.call(lst, fn, self); + } else if (typeof(self) == 'undefined' || self === null) { + for (var i = 0; i < lst.length; i++) { + var o = lst[i]; + if (fn(o)) { + rval.push(o); + } + } + } else { + for (var i = 0; i < lst.length; i++) { + o = lst[i]; + if (fn.call(self, o)) { + rval.push(o); + } + } + } + return rval; + }, + + + _wrapDumbFunction: function (func) { + return function () { + // fast path! + switch (arguments.length) { + case 0: return func(); + case 1: return func(arguments[0]); + case 2: return func(arguments[0], arguments[1]); + case 3: return func(arguments[0], arguments[1], arguments[2]); + } + var args = []; + for (var i = 0; i < arguments.length; i++) { + args.push("arguments[" + i + "]"); + } + return eval("(func(" + args.join(",") + "))"); + }; + }, + + /** @id MochiKit.Base.methodcaller */ + methodcaller: function (func/*, args... */) { + var args = MochiKit.Base.extend(null, arguments, 1); + if (typeof(func) == "function") { + return function (obj) { + return func.apply(obj, args); + }; + } else { + return function (obj) { + return obj[func].apply(obj, args); + }; + } + }, + + /** @id MochiKit.Base.method */ + method: function (self, func) { + var m = MochiKit.Base; + return m.bind.apply(this, m.extend([func, self], arguments, 2)); + }, + + /** @id MochiKit.Base.compose */ + compose: function (f1, f2/*, f3, ... fN */) { + var fnlist = []; + var m = MochiKit.Base; + if (arguments.length === 0) { + throw new TypeError("compose() requires at least one argument"); + } + for (var i = 0; i < arguments.length; i++) { + var fn = arguments[i]; + if (typeof(fn) != "function") { + throw new TypeError(m.repr(fn) + " is not a function"); + } + fnlist.push(fn); + } + return function () { + var args = arguments; + for (var i = fnlist.length - 1; i >= 0; i--) { + args = [fnlist[i].apply(this, args)]; + } + return args[0]; + }; + }, + + /** @id MochiKit.Base.bind */ + bind: function (func, self/* args... */) { + if (typeof(func) == "string") { + func = self[func]; + } + var im_func = func.im_func; + var im_preargs = func.im_preargs; + var im_self = func.im_self; + var m = MochiKit.Base; + if (typeof(func) == "function" && typeof(func.apply) == "undefined") { + // this is for cases where JavaScript sucks ass and gives you a + // really dumb built-in function like alert() that doesn't have + // an apply + func = m._wrapDumbFunction(func); + } + if (typeof(im_func) != 'function') { + im_func = func; + } + if (typeof(self) != 'undefined') { + im_self = self; + } + if (typeof(im_preargs) == 'undefined') { + im_preargs = []; + } else { + im_preargs = im_preargs.slice(); + } + m.extend(im_preargs, arguments, 2); + var newfunc = function () { + var args = arguments; + var me = arguments.callee; + if (me.im_preargs.length > 0) { + args = m.concat(me.im_preargs, args); + } + var self = me.im_self; + if (!self) { + self = this; + } + return me.im_func.apply(self, args); + }; + newfunc.im_self = im_self; + newfunc.im_func = im_func; + newfunc.im_preargs = im_preargs; + if (typeof(im_func.NAME) == 'string') { + newfunc.NAME = "bind(" + im_func.NAME + ",...)"; + } + return newfunc; + }, + + /** @id MochiKit.Base.bindLate */ + bindLate: function (func, self/* args... */) { + var m = MochiKit.Base; + var args = arguments; + if (typeof(func) === "string") { + args = m.extend([m.forwardCall(func)], arguments, 1); + return m.bind.apply(this, args); + } + return m.bind.apply(this, args); + }, + + /** @id MochiKit.Base.bindMethods */ + bindMethods: function (self) { + var bind = MochiKit.Base.bind; + for (var k in self) { + var func = self[k]; + if (typeof(func) == 'function') { + self[k] = bind(func, self); + } + } + }, + + /** @id MochiKit.Base.registerComparator */ + registerComparator: function (name, check, comparator, /* optional */ override) { + MochiKit.Base.comparatorRegistry.register(name, check, comparator, override); + }, + + _primitives: {'boolean': true, 'string': true, 'number': true}, + + /** @id MochiKit.Base.compare */ + compare: function (a, b) { + if (a == b) { + return 0; + } + var aIsNull = (typeof(a) == 'undefined' || a === null); + var bIsNull = (typeof(b) == 'undefined' || b === null); + if (aIsNull && bIsNull) { + return 0; + } else if (aIsNull) { + return -1; + } else if (bIsNull) { + return 1; + } + var m = MochiKit.Base; + // bool, number, string have meaningful comparisons + var prim = m._primitives; + if (!(typeof(a) in prim && typeof(b) in prim)) { + try { + return m.comparatorRegistry.match(a, b); + } catch (e) { + if (e != m.NotFound) { + throw e; + } + } + } + if (a < b) { + return -1; + } else if (a > b) { + return 1; + } + // These types can't be compared + var repr = m.repr; + throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared"); + }, + + /** @id MochiKit.Base.compareDateLike */ + compareDateLike: function (a, b) { + return MochiKit.Base.compare(a.getTime(), b.getTime()); + }, + + /** @id MochiKit.Base.compareArrayLike */ + compareArrayLike: function (a, b) { + var compare = MochiKit.Base.compare; + var count = a.length; + var rval = 0; + if (count > b.length) { + rval = 1; + count = b.length; + } else if (count < b.length) { + rval = -1; + } + for (var i = 0; i < count; i++) { + var cmp = compare(a[i], b[i]); + if (cmp) { + return cmp; + } + } + return rval; + }, + + /** @id MochiKit.Base.registerRepr */ + registerRepr: function (name, check, wrap, /* optional */override) { + MochiKit.Base.reprRegistry.register(name, check, wrap, override); + }, + + /** @id MochiKit.Base.repr */ + repr: function (o) { + if (typeof(o) == "undefined") { + return "undefined"; + } else if (o === null) { + return "null"; + } + try { + if (typeof(o.__repr__) == 'function') { + return o.__repr__(); + } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) { + return o.repr(); + } + return MochiKit.Base.reprRegistry.match(o); + } catch (e) { + try { + if (typeof(o.NAME) == 'string' && ( + o.toString == Function.prototype.toString || + o.toString == Object.prototype.toString + )) { + return o.NAME; + } + } catch (ignore) { + } + } + try { + var ostring = (o + ""); + } catch (e) { + return "[" + typeof(o) + "]"; + } + if (typeof(o) == "function") { + ostring = ostring.replace(/^\s+/, "").replace(/\s+/g, " "); + ostring = ostring.replace(/,(\S)/, ", $1"); + var idx = ostring.indexOf("{"); + if (idx != -1) { + ostring = ostring.substr(0, idx) + "{...}"; + } + } + return ostring; + }, + + /** @id MochiKit.Base.reprArrayLike */ + reprArrayLike: function (o) { + var m = MochiKit.Base; + return "[" + m.map(m.repr, o).join(", ") + "]"; + }, + + /** @id MochiKit.Base.reprString */ + reprString: function (o) { + return ('"' + o.replace(/(["\\])/g, '\\$1') + '"' + ).replace(/[\f]/g, "\\f" + ).replace(/[\b]/g, "\\b" + ).replace(/[\n]/g, "\\n" + ).replace(/[\t]/g, "\\t" + ).replace(/[\v]/g, "\\v" + ).replace(/[\r]/g, "\\r"); + }, + + /** @id MochiKit.Base.reprNumber */ + reprNumber: function (o) { + return o + ""; + }, + + /** @id MochiKit.Base.registerJSON */ + registerJSON: function (name, check, wrap, /* optional */override) { + MochiKit.Base.jsonRegistry.register(name, check, wrap, override); + }, + + + /** @id MochiKit.Base.evalJSON */ + evalJSON: function (jsonText) { + return eval("(" + MochiKit.Base._filterJSON(jsonText) + ")"); + }, + + _filterJSON: function (s) { + var m = s.match(/^\s*\/\*(.*)\*\/\s*$/); + return (m) ? m[1] : s; + }, + + /** @id MochiKit.Base.serializeJSON */ + serializeJSON: function (o) { + var objtype = typeof(o); + if (objtype == "number" || objtype == "boolean") { + return o + ""; + } else if (o === null) { + return "null"; + } else if (objtype == "string") { + var res = ""; + for (var i = 0; i < o.length; i++) { + var c = o.charAt(i); + if (c == '\"') { + res += '\\"'; + } else if (c == '\\') { + res += '\\\\'; + } else if (c == '\b') { + res += '\\b'; + } else if (c == '\f') { + res += '\\f'; + } else if (c == '\n') { + res += '\\n'; + } else if (c == '\r') { + res += '\\r'; + } else if (c == '\t') { + res += '\\t'; + } else if (o.charCodeAt(i) <= 0x1F) { + var hex = o.charCodeAt(i).toString(16); + if (hex.length < 2) { + hex = '0' + hex; + } + res += '\\u00' + hex.toUpperCase(); + } else { + res += c; + } + } + return '"' + res + '"'; + } + // recurse + var me = arguments.callee; + // short-circuit for objects that support "json" serialization + // if they return "self" then just pass-through... + var newObj; + if (typeof(o.toJSON) == "function") { + newObj = o.toJSON(); + if (o !== newObj) { + return me(newObj); + } + } + if (typeof(o.__json__) == "function") { + newObj = o.__json__(); + if (o !== newObj) { + return me(newObj); + } + } + if (typeof(o.json) == "function") { + newObj = o.json(); + if (o !== newObj) { + return me(newObj); + } + } + // array + if (objtype != "function" && typeof(o.length) == "number") { + var res = []; + for (var i = 0; i < o.length; i++) { + var val = me(o[i]); + if (typeof(val) != "string") { + // skip non-serializable values + continue; + } + res.push(val); + } + return "[" + res.join(", ") + "]"; + } + // look in the registry + var m = MochiKit.Base; + try { + newObj = m.jsonRegistry.match(o); + if (o !== newObj) { + return me(newObj); + } + } catch (e) { + if (e != m.NotFound) { + // something really bad happened + throw e; + } + } + // undefined is outside of the spec + if (objtype == "undefined") { + throw new TypeError("undefined can not be serialized as JSON"); + } + // it's a function with no adapter, bad + if (objtype == "function") { + return null; + } + // generic object code path + res = []; + for (var k in o) { + var useKey; + if (typeof(k) == "number") { + useKey = '"' + k + '"'; + } else if (typeof(k) == "string") { + useKey = me(k); + } else { + // skip non-string or number keys + continue; + } + val = me(o[k]); + if (typeof(val) != "string") { + // skip non-serializable values + continue; + } + res.push(useKey + ":" + val); + } + return "{" + res.join(", ") + "}"; + }, + + + /** @id MochiKit.Base.objEqual */ + objEqual: function (a, b) { + return (MochiKit.Base.compare(a, b) === 0); + }, + + /** @id MochiKit.Base.arrayEqual */ + arrayEqual: function (self, arr) { + if (self.length != arr.length) { + return false; + } + return (MochiKit.Base.compare(self, arr) === 0); + }, + + /** @id MochiKit.Base.concat */ + concat: function (/* lst... */) { + var rval = []; + var extend = MochiKit.Base.extend; + for (var i = 0; i < arguments.length; i++) { + extend(rval, arguments[i]); + } + return rval; + }, + + /** @id MochiKit.Base.keyComparator */ + keyComparator: function (key/* ... */) { + // fast-path for single key comparisons + var m = MochiKit.Base; + var compare = m.compare; + if (arguments.length == 1) { + return function (a, b) { + return compare(a[key], b[key]); + }; + } + var compareKeys = m.extend(null, arguments); + return function (a, b) { + var rval = 0; + // keep comparing until something is inequal or we run out of + // keys to compare + for (var i = 0; (rval === 0) && (i < compareKeys.length); i++) { + var key = compareKeys[i]; + rval = compare(a[key], b[key]); + } + return rval; + }; + }, + + /** @id MochiKit.Base.reverseKeyComparator */ + reverseKeyComparator: function (key) { + var comparator = MochiKit.Base.keyComparator.apply(this, arguments); + return function (a, b) { + return comparator(b, a); + }; + }, + + /** @id MochiKit.Base.partial */ + partial: function (func) { + var m = MochiKit.Base; + return m.bind.apply(this, m.extend([func, undefined], arguments, 1)); + }, + + /** @id MochiKit.Base.listMinMax */ + listMinMax: function (which, lst) { + if (lst.length === 0) { + return null; + } + var cur = lst[0]; + var compare = MochiKit.Base.compare; + for (var i = 1; i < lst.length; i++) { + var o = lst[i]; + if (compare(o, cur) == which) { + cur = o; + } + } + return cur; + }, + + /** @id MochiKit.Base.objMax */ + objMax: function (/* obj... */) { + return MochiKit.Base.listMinMax(1, arguments); + }, + + /** @id MochiKit.Base.objMin */ + objMin: function (/* obj... */) { + return MochiKit.Base.listMinMax(-1, arguments); + }, + + /** @id MochiKit.Base.findIdentical */ + findIdentical: function (lst, value, start/* = 0 */, /* optional */end) { + if (typeof(end) == "undefined" || end === null) { + end = lst.length; + } + if (typeof(start) == "undefined" || start === null) { + start = 0; + } + for (var i = start; i < end; i++) { + if (lst[i] === value) { + return i; + } + } + return -1; + }, + + /** @id MochiKit.Base.mean */ + mean: function(/* lst... */) { + /* http://www.nist.gov/dads/HTML/mean.html */ + var sum = 0; + + var m = MochiKit.Base; + var args = m.extend(null, arguments); + var count = args.length; + + while (args.length) { + var o = args.shift(); + if (o && typeof(o) == "object" && typeof(o.length) == "number") { + count += o.length - 1; + for (var i = o.length - 1; i >= 0; i--) { + sum += o[i]; + } + } else { + sum += o; + } + } + + if (count <= 0) { + throw new TypeError('mean() requires at least one argument'); + } + + return sum/count; + }, + + /** @id MochiKit.Base.median */ + median: function(/* lst... */) { + /* http://www.nist.gov/dads/HTML/median.html */ + var data = MochiKit.Base.flattenArguments(arguments); + if (data.length === 0) { + throw new TypeError('median() requires at least one argument'); + } + data.sort(MochiKit.Base.compare); + if (data.length % 2 == 0) { + var upper = data.length / 2; + return (data[upper] + data[upper - 1]) / 2; + } else { + return data[(data.length - 1) / 2]; + } + }, + + /** @id MochiKit.Base.findValue */ + findValue: function (lst, value, start/* = 0 */, /* optional */end) { + if (typeof(end) == "undefined" || end === null) { + end = lst.length; + } + if (typeof(start) == "undefined" || start === null) { + start = 0; + } + var cmp = MochiKit.Base.compare; + for (var i = start; i < end; i++) { + if (cmp(lst[i], value) === 0) { + return i; + } + } + return -1; + }, + + /** @id MochiKit.Base.nodeWalk */ + nodeWalk: function (node, visitor) { + var nodes = [node]; + var extend = MochiKit.Base.extend; + while (nodes.length) { + var res = visitor(nodes.shift()); + if (res) { + extend(nodes, res); + } + } + }, + + + /** @id MochiKit.Base.nameFunctions */ + nameFunctions: function (namespace) { + var base = namespace.NAME; + if (typeof(base) == 'undefined') { + base = ''; + } else { + base = base + '.'; + } + for (var name in namespace) { + var o = namespace[name]; + if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') { + try { + o.NAME = base + name; + } catch (e) { + // pass + } + } + } + }, + + + /** @id MochiKit.Base.queryString */ + queryString: function (names, values) { + // check to see if names is a string or a DOM element, and if + // MochiKit.DOM is available. If so, drop it like it's a form + // Ugliest conditional in MochiKit? Probably! + if (typeof(MochiKit.DOM) != "undefined" && arguments.length == 1 + && (typeof(names) == "string" || ( + typeof(names.nodeType) != "undefined" && names.nodeType > 0 + )) + ) { + var kv = MochiKit.DOM.formContents(names); + names = kv[0]; + values = kv[1]; + } else if (arguments.length == 1) { + // Allow the return value of formContents to be passed directly + if (typeof(names.length) == "number" && names.length == 2) { + return arguments.callee(names[0], names[1]); + } + var o = names; + names = []; + values = []; + for (var k in o) { + var v = o[k]; + if (typeof(v) == "function") { + continue; + } else if (MochiKit.Base.isArrayLike(v)){ + for (var i = 0; i < v.length; i++) { + names.push(k); + values.push(v[i]); + } + } else { + names.push(k); + values.push(v); + } + } + } + var rval = []; + var len = Math.min(names.length, values.length); + var urlEncode = MochiKit.Base.urlEncode; + for (var i = 0; i < len; i++) { + v = values[i]; + if (typeof(v) != 'undefined' && v !== null) { + rval.push(urlEncode(names[i]) + "=" + urlEncode(v)); + } + } + return rval.join("&"); + }, + + + /** @id MochiKit.Base.parseQueryString */ + parseQueryString: function (encodedString, useArrays) { + // strip a leading '?' from the encoded string + var qstr = (encodedString.charAt(0) == "?") + ? encodedString.substring(1) + : encodedString; + var pairs = qstr.replace(/\+/g, "%20").split(/\&\;|\&\#38\;|\&|\&/); + var o = {}; + var decode; + if (typeof(decodeURIComponent) != "undefined") { + decode = decodeURIComponent; + } else { + decode = unescape; + } + if (useArrays) { + for (var i = 0; i < pairs.length; i++) { + var pair = pairs[i].split("="); + var name = decode(pair.shift()); + if (!name) { + continue; + } + var arr = o[name]; + if (!(arr instanceof Array)) { + arr = []; + o[name] = arr; + } + arr.push(decode(pair.join("="))); + } + } else { + for (var i = 0; i < pairs.length; i++) { + pair = pairs[i].split("="); + var name = pair.shift(); + if (!name) { + continue; + } + o[decode(name)] = decode(pair.join("=")); + } + } + return o; + } +}); + +/** @id MochiKit.Base.AdapterRegistry */ +MochiKit.Base.AdapterRegistry = function () { + this.pairs = []; +}; + +MochiKit.Base.AdapterRegistry.prototype = { + /** @id MochiKit.Base.AdapterRegistry.prototype.register */ + register: function (name, check, wrap, /* optional */ override) { + if (override) { + this.pairs.unshift([name, check, wrap]); + } else { + this.pairs.push([name, check, wrap]); + } + }, + + /** @id MochiKit.Base.AdapterRegistry.prototype.match */ + match: function (/* ... */) { + for (var i = 0; i < this.pairs.length; i++) { + var pair = this.pairs[i]; + if (pair[1].apply(this, arguments)) { + return pair[2].apply(this, arguments); + } + } + throw MochiKit.Base.NotFound; + }, + + /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */ + unregister: function (name) { + for (var i = 0; i < this.pairs.length; i++) { + var pair = this.pairs[i]; + if (pair[0] == name) { + this.pairs.splice(i, 1); + return true; + } + } + return false; + } +}; + +/** + * Exports all symbols from one or more modules into the specified + * namespace (or scope). This is similar to MochiKit.Base.update(), + * except for special handling of the "__export__" flag, contained + * sub-modules (exported recursively), and names starting with "_". + * + * @param {Object} namespace the object or scope to modify + * @param {Object} module the module to export + */ +MochiKit.Base.moduleExport = function (namespace, module/*, ...*/) { + var SKIP = { toString: true, NAME: true, VERSION: true }; + var mods = MochiKit.Base.extend([], arguments, 1); + while ((module = mods.shift()) != null) { + for (var k in module) { + var v = module[k]; + if (v != null) { + var flagSet = (typeof(v.__export__) == 'boolean'); + var nameValid = (k[0] !== "_" && !SKIP[k]); + if (flagSet ? v.__export__ : nameValid) { + if (typeof(v) == 'object' && v.NAME && v.VERSION) { + mods.push(v); + } else { + namespace[k] = module[k]; + } + } + } + } + } + return namespace; +}; + +/** + * Identical to moduleExport, but also considers the global and + * module-specific "__export__" flag. + */ +MochiKit.Base._exportSymbols = function (namespace, module) { + if (MochiKit.__export__ !== false && module.__export__ !== false) { + MochiKit.Base.moduleExport(namespace, module); + } +}; + +/** + * Creates a deprecated function alias in the specified module. The + * deprecated function will forward all calls and arguments to a + * target function, while also logging a debug message on the first + * call (if MochiKit.Logging is loaded). The destination function may + * be located in another module, which must be loaded, or an + * exception will be thrown. + * + * @param {Object/String} module the source module or module name + * (e.g. 'DOM' or 'MochiKit.DOM') + * @param {String} name the deprecated function name (e.g. 'getStyle') + * @param {String} target the fully qualified name of the target + * function (e.g. 'MochiKit.Style.getStyle') + * @param {String} version the first version when the source function + * was deprecated (e.g. '1.4') + * @param {Boolean} [exportable] the exportable function flag, + * defaults to false + */ +MochiKit.Base._deprecated = function (module, name, target, version, exportable) { + if (typeof(module) === 'string') { + if (module.indexOf('MochiKit.') === 0) { + module = module.substring(9); + } + module = MochiKit[module]; + } + var targetModule = target.split('.')[1]; + var targetName = target.split('.')[2]; + var func = function () { + var self = arguments.callee; + var msg = module.NAME + '.' + name + ' is deprecated since version ' + + version + '. Use ' + target + ' instead.'; + if (self.logged !== true) { + self.logged = true; + if (MochiKit.Logging) { + MochiKit.Logging.logDebug(msg); + } else if (console && console.log) { + console.log(msg); + } + } + if (!MochiKit[targetModule]) { + throw new Error(msg); + } + return MochiKit[targetModule][targetName].apply(this, arguments); + }; + func.__export__ = (exportable === true); + module[name] = func; +}; + +MochiKit.Base.__new__ = function () { + var m = this; + + /** @id MochiKit.Base.noop */ + m.noop = m.operator.identity; + + // Backwards compat + m._deprecated(m, 'forward', 'MochiKit.Base.forwardCall', '1.3'); + m._deprecated(m, 'find', 'MochiKit.Base.findValue', '1.3'); + + if (typeof(encodeURIComponent) != "undefined") { + /** @id MochiKit.Base.urlEncode */ + m.urlEncode = function (unencoded) { + return encodeURIComponent(unencoded).replace(/\'/g, '%27'); + }; + } else { + m.urlEncode = function (unencoded) { + return escape(unencoded + ).replace(/\+/g, '%2B' + ).replace(/\"/g,'%22' + ).replace(/\'/g, '%27'); + }; + } + + /** @id MochiKit.Base.NamedError */ + m.NamedError = function (name) { + this.message = name; + this.name = name; + }; + m.NamedError.prototype = new Error(); + m.NamedError.prototype.constructor = m.NamedError; + m.update(m.NamedError.prototype, { + repr: function () { + if (this.message && this.message != this.name) { + return this.name + "(" + m.repr(this.message) + ")"; + } else { + return this.name + "()"; + } + }, + toString: m.forwardCall("repr") + }); + + /** @id MochiKit.Base.NotFound */ + m.NotFound = new m.NamedError("MochiKit.Base.NotFound"); + + + /** @id MochiKit.Base.listMax */ + m.listMax = m.partial(m.listMinMax, 1); + /** @id MochiKit.Base.listMin */ + m.listMin = m.partial(m.listMinMax, -1); + + /** @id MochiKit.Base.isCallable */ + m.isCallable = m.typeMatcher('function'); + /** @id MochiKit.Base.isUndefined */ + m.isUndefined = m.typeMatcher('undefined'); + /** @id MochiKit.Base.isValue */ + m.isValue = m.typeMatcher('boolean', 'number', 'string'); + + /** @id MochiKit.Base.merge */ + m.merge = m.partial(m.update, null); + /** @id MochiKit.Base.zip */ + m.zip = m.partial(m.map, null); + + /** @id MochiKit.Base.average */ + m.average = m.mean; + + /** @id MochiKit.Base.comparatorRegistry */ + m.comparatorRegistry = new m.AdapterRegistry(); + m.registerComparator("dateLike", m.isDateLike, m.compareDateLike); + m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike); + + /** @id MochiKit.Base.reprRegistry */ + m.reprRegistry = new m.AdapterRegistry(); + m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike); + m.registerRepr("string", m.typeMatcher("string"), m.reprString); + m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber); + + /** @id MochiKit.Base.jsonRegistry */ + m.jsonRegistry = new m.AdapterRegistry(); + + m.nameFunctions(this); + +}; + +MochiKit.Base.__new__(); + +// +// XXX: Internet Explorer blows +// +if (MochiKit.__export__) { + compare = MochiKit.Base.compare; + compose = MochiKit.Base.compose; + serializeJSON = MochiKit.Base.serializeJSON; + mean = MochiKit.Base.mean; + median = MochiKit.Base.median; +} + +MochiKit.Base._exportSymbols(this, MochiKit.Base); diff --git a/frontend/delta/js/MochiKit/Color.js b/frontend/delta/js/MochiKit/Color.js new file mode 100644 index 0000000..f421737 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Color.js @@ -0,0 +1,846 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Color 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Color', '1.5', ['Base', 'DOM', 'Style']); + +/** @id MochiKit.Color.Color */ +MochiKit.Color.Color = function (red, green, blue, alpha) { + if (typeof(alpha) == 'undefined' || alpha === null) { + alpha = 1.0; + } + this.rgb = { + r: red, + g: green, + b: blue, + a: alpha + }; +}; + + +// Prototype methods + +MochiKit.Color.Color.prototype = { + + __class__: MochiKit.Color.Color, + + /** @id MochiKit.Color.Color.prototype.colorWithAlpha */ + colorWithAlpha: function (alpha) { + var rgb = this.rgb; + var m = MochiKit.Color; + return m.Color.fromRGB(rgb.r, rgb.g, rgb.b, alpha); + }, + + /** @id MochiKit.Color.Color.prototype.colorWithHue */ + colorWithHue: function (hue) { + // get an HSL model, and set the new hue... + var hsl = this.asHSL(); + hsl.h = hue; + var m = MochiKit.Color; + // convert back to RGB... + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.colorWithSaturation */ + colorWithSaturation: function (saturation) { + // get an HSL model, and set the new hue... + var hsl = this.asHSL(); + hsl.s = saturation; + var m = MochiKit.Color; + // convert back to RGB... + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.colorWithLightness */ + colorWithLightness: function (lightness) { + // get an HSL model, and set the new hue... + var hsl = this.asHSL(); + hsl.l = lightness; + var m = MochiKit.Color; + // convert back to RGB... + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.darkerColorWithLevel */ + darkerColorWithLevel: function (level) { + var hsl = this.asHSL(); + hsl.l = Math.max(hsl.l - level, 0); + var m = MochiKit.Color; + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.lighterColorWithLevel */ + lighterColorWithLevel: function (level) { + var hsl = this.asHSL(); + hsl.l = Math.min(hsl.l + level, 1); + var m = MochiKit.Color; + return m.Color.fromHSL(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.blendedColor */ + blendedColor: function (other, /* optional */ fraction) { + if (typeof(fraction) == 'undefined' || fraction === null) { + fraction = 0.5; + } + var sf = 1.0 - fraction; + var s = this.rgb; + var d = other.rgb; + var df = fraction; + return MochiKit.Color.Color.fromRGB( + (s.r * sf) + (d.r * df), + (s.g * sf) + (d.g * df), + (s.b * sf) + (d.b * df), + (s.a * sf) + (d.a * df) + ); + }, + + /** @id MochiKit.Color.Color.prototype.compareRGB */ + compareRGB: function (other) { + var a = this.asRGB(); + var b = other.asRGB(); + return MochiKit.Base.compare( + [a.r, a.g, a.b, a.a], + [b.r, b.g, b.b, b.a] + ); + }, + + /** @id MochiKit.Color.Color.prototype.isLight */ + isLight: function () { + return this.asHSL().l > 0.5; + }, + + /** @id MochiKit.Color.Color.prototype.isDark */ + isDark: function () { + return (!this.isLight()); + }, + + /** @id MochiKit.Color.Color.prototype.toHSLString */ + toHSLString: function () { + var c = this.asHSL(); + var ccc = MochiKit.Color.clampColorComponent; + var rval = this._hslString; + if (!rval) { + var mid = ( + ccc(c.h, 360).toFixed(0) + + "," + ccc(c.s, 100).toPrecision(4) + "%" + + "," + ccc(c.l, 100).toPrecision(4) + "%" + ); + var a = c.a; + if (a >= 1) { + a = 1; + rval = "hsl(" + mid + ")"; + } else { + if (a <= 0) { + a = 0; + } + rval = "hsla(" + mid + "," + a + ")"; + } + this._hslString = rval; + } + return rval; + }, + + /** @id MochiKit.Color.Color.prototype.toRGBString */ + toRGBString: function () { + var c = this.rgb; + var ccc = MochiKit.Color.clampColorComponent; + var rval = this._rgbString; + if (!rval) { + var mid = ( + ccc(c.r, 255).toFixed(0) + + "," + ccc(c.g, 255).toFixed(0) + + "," + ccc(c.b, 255).toFixed(0) + ); + if (c.a != 1) { + rval = "rgba(" + mid + "," + c.a + ")"; + } else { + rval = "rgb(" + mid + ")"; + } + this._rgbString = rval; + } + return rval; + }, + + /** @id MochiKit.Color.Color.prototype.asRGB */ + asRGB: function () { + return MochiKit.Base.clone(this.rgb); + }, + + /** @id MochiKit.Color.Color.prototype.toHexString */ + toHexString: function () { + var m = MochiKit.Color; + var c = this.rgb; + var ccc = MochiKit.Color.clampColorComponent; + var rval = this._hexString; + if (!rval) { + rval = ("#" + + m.toColorPart(ccc(c.r, 255)) + + m.toColorPart(ccc(c.g, 255)) + + m.toColorPart(ccc(c.b, 255)) + ); + this._hexString = rval; + } + return rval; + }, + + /** @id MochiKit.Color.Color.prototype.asHSV */ + asHSV: function () { + var hsv = this.hsv; + var c = this.rgb; + if (typeof(hsv) == 'undefined' || hsv === null) { + hsv = MochiKit.Color.rgbToHSV(this.rgb); + this.hsv = hsv; + } + return MochiKit.Base.clone(hsv); + }, + + /** @id MochiKit.Color.Color.prototype.asHSL */ + asHSL: function () { + var hsl = this.hsl; + var c = this.rgb; + if (typeof(hsl) == 'undefined' || hsl === null) { + hsl = MochiKit.Color.rgbToHSL(this.rgb); + this.hsl = hsl; + } + return MochiKit.Base.clone(hsl); + }, + + /** @id MochiKit.Color.Color.prototype.toString */ + toString: function () { + return this.toRGBString(); + }, + + /** @id MochiKit.Color.Color.prototype.repr */ + repr: function () { + var c = this.rgb; + var col = [c.r, c.g, c.b, c.a]; + return this.__class__.NAME + "(" + col.join(", ") + ")"; + } + +}; + +// Constructor methods + +MochiKit.Base.update(MochiKit.Color.Color, { + /** @id MochiKit.Color.Color.fromRGB */ + fromRGB: function (red, green, blue, alpha) { + // designated initializer + var Color = MochiKit.Color.Color; + if (arguments.length == 1) { + var rgb = red; + red = rgb.r; + green = rgb.g; + blue = rgb.b; + if (typeof(rgb.a) == 'undefined') { + alpha = undefined; + } else { + alpha = rgb.a; + } + } + return new Color(red, green, blue, alpha); + }, + + /** @id MochiKit.Color.Color.fromHSL */ + fromHSL: function (hue, saturation, lightness, alpha) { + var m = MochiKit.Color; + return m.Color.fromRGB(m.hslToRGB.apply(m, arguments)); + }, + + /** @id MochiKit.Color.Color.fromHSV */ + fromHSV: function (hue, saturation, value, alpha) { + var m = MochiKit.Color; + return m.Color.fromRGB(m.hsvToRGB.apply(m, arguments)); + }, + + /** @id MochiKit.Color.Color.fromName */ + fromName: function (name) { + var Color = MochiKit.Color.Color; + // Opera 9 seems to "quote" named colors(?!) + if (name.charAt(0) == '"') { + name = name.substr(1, name.length - 2); + } + var htmlColor = Color._namedColors[name.toLowerCase()]; + if (typeof(htmlColor) == 'string') { + return Color.fromHexString(htmlColor); + } else if (name == "transparent") { + return Color.transparentColor(); + } + return null; + }, + + /** @id MochiKit.Color.Color.fromString */ + fromString: function (colorString) { + var self = MochiKit.Color.Color; + var three = colorString.substr(0, 3); + if (three == "rgb") { + return self.fromRGBString(colorString); + } else if (three == "hsl") { + return self.fromHSLString(colorString); + } else if (colorString.charAt(0) == "#") { + return self.fromHexString(colorString); + } + return self.fromName(colorString); + }, + + + /** @id MochiKit.Color.Color.fromHexString */ + fromHexString: function (hexCode) { + if (hexCode.charAt(0) == '#') { + hexCode = hexCode.substring(1); + } + var components = []; + var i, hex; + if (hexCode.length == 3) { + for (i = 0; i < 3; i++) { + hex = hexCode.substr(i, 1); + components.push(parseInt(hex + hex, 16) / 255.0); + } + } else { + for (i = 0; i < 6; i += 2) { + hex = hexCode.substr(i, 2); + components.push(parseInt(hex, 16) / 255.0); + } + } + var Color = MochiKit.Color.Color; + return Color.fromRGB.apply(Color, components); + }, + + + _fromColorString: function (pre, method, scales, colorCode) { + // parses either HSL or RGB + if (colorCode.indexOf(pre) === 0) { + colorCode = colorCode.substring(colorCode.indexOf("(", 3) + 1, colorCode.length - 1); + } + var colorChunks = colorCode.split(/\s*,\s*/); + var colorFloats = []; + for (var i = 0; i < colorChunks.length; i++) { + var c = colorChunks[i]; + var val; + var three = c.substring(c.length - 3); + if (c.charAt(c.length - 1) == '%') { + val = 0.01 * parseFloat(c.substring(0, c.length - 1)); + } else if (three == "deg") { + val = parseFloat(c) / 360.0; + } else if (three == "rad") { + val = parseFloat(c) / (Math.PI * 2); + } else { + val = scales[i] * parseFloat(c); + } + colorFloats.push(val); + } + return this[method].apply(this, colorFloats); + }, + + /** @id MochiKit.Color.Color.fromComputedStyle */ + fromComputedStyle: function (elem, style) { + var d = MochiKit.DOM; + var cls = MochiKit.Color.Color; + for (elem = d.getElement(elem); elem; elem = elem.parentNode) { + var actualColor = MochiKit.Style.getStyle.apply(d, arguments); + if (!actualColor) { + continue; + } + var color = cls.fromString(actualColor); + if (!color) { + break; + } + if (color.asRGB().a > 0) { + return color; + } + } + return null; + }, + + /** @id MochiKit.Color.Color.fromBackground */ + fromBackground: function (elem) { + var cls = MochiKit.Color.Color; + return cls.fromComputedStyle( + elem, "backgroundColor", "background-color") || cls.whiteColor(); + }, + + /** @id MochiKit.Color.Color.fromText */ + fromText: function (elem) { + var cls = MochiKit.Color.Color; + return cls.fromComputedStyle( + elem, "color", "color") || cls.blackColor(); + }, + + /** @id MochiKit.Color.Color.namedColors */ + namedColors: function () { + return MochiKit.Base.clone(MochiKit.Color.Color._namedColors); + } +}); + + +// Module level functions + +MochiKit.Base.update(MochiKit.Color, { + /** @id MochiKit.Color.clampColorComponent */ + clampColorComponent: function (v, scale) { + v *= scale; + if (v < 0) { + return 0; + } else if (v > scale) { + return scale; + } else { + return v; + } + }, + + _hslValue: function (n1, n2, hue) { + if (hue > 6.0) { + hue -= 6.0; + } else if (hue < 0.0) { + hue += 6.0; + } + var val; + if (hue < 1.0) { + val = n1 + (n2 - n1) * hue; + } else if (hue < 3.0) { + val = n2; + } else if (hue < 4.0) { + val = n1 + (n2 - n1) * (4.0 - hue); + } else { + val = n1; + } + return val; + }, + + /** @id MochiKit.Color.hsvToRGB */ + hsvToRGB: function (hue, saturation, value, alpha) { + if (arguments.length == 1) { + var hsv = hue; + hue = hsv.h; + saturation = hsv.s; + value = hsv.v; + alpha = hsv.a; + } + var red; + var green; + var blue; + if (saturation === 0) { + red = value; + green = value; + blue = value; + } else { + var i = Math.floor(hue * 6); + var f = (hue * 6) - i; + var p = value * (1 - saturation); + var q = value * (1 - (saturation * f)); + var t = value * (1 - (saturation * (1 - f))); + switch (i) { + case 1: red = q; green = value; blue = p; break; + case 2: red = p; green = value; blue = t; break; + case 3: red = p; green = q; blue = value; break; + case 4: red = t; green = p; blue = value; break; + case 5: red = value; green = p; blue = q; break; + case 6: // fall through + case 0: red = value; green = t; blue = p; break; + } + } + return { + r: red, + g: green, + b: blue, + a: alpha + }; + }, + + /** @id MochiKit.Color.hslToRGB */ + hslToRGB: function (hue, saturation, lightness, alpha) { + if (arguments.length == 1) { + var hsl = hue; + hue = hsl.h; + saturation = hsl.s; + lightness = hsl.l; + alpha = hsl.a; + } + var red; + var green; + var blue; + if (saturation === 0) { + red = lightness; + green = lightness; + blue = lightness; + } else { + var m2; + if (lightness <= 0.5) { + m2 = lightness * (1.0 + saturation); + } else { + m2 = lightness + saturation - (lightness * saturation); + } + var m1 = (2.0 * lightness) - m2; + var f = MochiKit.Color._hslValue; + var h6 = hue * 6.0; + red = f(m1, m2, h6 + 2); + green = f(m1, m2, h6); + blue = f(m1, m2, h6 - 2); + } + return { + r: red, + g: green, + b: blue, + a: alpha + }; + }, + + /** @id MochiKit.Color.rgbToHSV */ + rgbToHSV: function (red, green, blue, alpha) { + if (arguments.length == 1) { + var rgb = red; + red = rgb.r; + green = rgb.g; + blue = rgb.b; + alpha = rgb.a; + } + var max = Math.max(Math.max(red, green), blue); + var min = Math.min(Math.min(red, green), blue); + var hue; + var saturation; + var value = max; + if (min == max) { + hue = 0; + saturation = 0; + } else { + var delta = (max - min); + saturation = delta / max; + + if (red == max) { + hue = (green - blue) / delta; + } else if (green == max) { + hue = 2 + ((blue - red) / delta); + } else { + hue = 4 + ((red - green) / delta); + } + hue /= 6; + if (hue < 0) { + hue += 1; + } + if (hue > 1) { + hue -= 1; + } + } + return { + h: hue, + s: saturation, + v: value, + a: alpha + }; + }, + + /** @id MochiKit.Color.rgbToHSL */ + rgbToHSL: function (red, green, blue, alpha) { + if (arguments.length == 1) { + var rgb = red; + red = rgb.r; + green = rgb.g; + blue = rgb.b; + alpha = rgb.a; + } + var max = Math.max(red, Math.max(green, blue)); + var min = Math.min(red, Math.min(green, blue)); + var hue; + var saturation; + var lightness = (max + min) / 2.0; + var delta = max - min; + if (delta === 0) { + hue = 0; + saturation = 0; + } else { + if (lightness <= 0.5) { + saturation = delta / (max + min); + } else { + saturation = delta / (2 - max - min); + } + if (red == max) { + hue = (green - blue) / delta; + } else if (green == max) { + hue = 2 + ((blue - red) / delta); + } else { + hue = 4 + ((red - green) / delta); + } + hue /= 6; + if (hue < 0) { + hue += 1; + } + if (hue > 1) { + hue -= 1; + } + + } + return { + h: hue, + s: saturation, + l: lightness, + a: alpha + }; + }, + + /** @id MochiKit.Color.toColorPart */ + toColorPart: function (num) { + num = Math.round(num); + var digits = num.toString(16); + if (num < 16) { + return '0' + digits; + } + return digits; + }, + + __new__: function () { + var m = MochiKit.Base; + /** @id MochiKit.Color.Color.fromRGBString */ + this.Color.fromRGBString = m.bind( + this.Color._fromColorString, this.Color, "rgb", "fromRGB", + [1.0/255.0, 1.0/255.0, 1.0/255.0, 1] + ); + /** @id MochiKit.Color.Color.fromHSLString */ + this.Color.fromHSLString = m.bind( + this.Color._fromColorString, this.Color, "hsl", "fromHSL", + [1.0/360.0, 0.01, 0.01, 1] + ); + + var third = 1.0 / 3.0; + /** @id MochiKit.Color.colors */ + var colors = { + // NSColor colors plus transparent + /** @id MochiKit.Color.blackColor */ + black: [0, 0, 0], + /** @id MochiKit.Color.blueColor */ + blue: [0, 0, 1], + /** @id MochiKit.Color.brownColor */ + brown: [0.6, 0.4, 0.2], + /** @id MochiKit.Color.cyanColor */ + cyan: [0, 1, 1], + /** @id MochiKit.Color.darkGrayColor */ + darkGray: [third, third, third], + /** @id MochiKit.Color.grayColor */ + gray: [0.5, 0.5, 0.5], + /** @id MochiKit.Color.greenColor */ + green: [0, 1, 0], + /** @id MochiKit.Color.lightGrayColor */ + lightGray: [2 * third, 2 * third, 2 * third], + /** @id MochiKit.Color.magentaColor */ + magenta: [1, 0, 1], + /** @id MochiKit.Color.orangeColor */ + orange: [1, 0.5, 0], + /** @id MochiKit.Color.purpleColor */ + purple: [0.5, 0, 0.5], + /** @id MochiKit.Color.redColor */ + red: [1, 0, 0], + /** @id MochiKit.Color.transparentColor */ + transparent: [0, 0, 0, 0], + /** @id MochiKit.Color.whiteColor */ + white: [1, 1, 1], + /** @id MochiKit.Color.yellowColor */ + yellow: [1, 1, 0] + }; + + for (var k in colors) { + var name = k + "Color"; + var value = this.Color.fromRGB.apply(this.Color, colors[k]); + this.Color[name] = m.partial(m.operator.identity, value); + } + + var isColor = function () { + for (var i = 0; i < arguments.length; i++) { + if (!(arguments[i] instanceof MochiKit.Color.Color)) { + return false; + } + } + return true; + }; + + var compareColor = function (a, b) { + return a.compareRGB(b); + }; + + m.nameFunctions(this); + + m.registerComparator(this.Color.NAME, isColor, compareColor); + } +}); + +MochiKit.Color.__new__(); + +// Full table of css3 X11 colors <http://www.w3.org/TR/css3-color/#X11COLORS> + +MochiKit.Color.Color._namedColors = { + aliceblue: "#f0f8ff", + antiquewhite: "#faebd7", + aqua: "#00ffff", + aquamarine: "#7fffd4", + azure: "#f0ffff", + beige: "#f5f5dc", + bisque: "#ffe4c4", + black: "#000000", + blanchedalmond: "#ffebcd", + blue: "#0000ff", + blueviolet: "#8a2be2", + brown: "#a52a2a", + burlywood: "#deb887", + cadetblue: "#5f9ea0", + chartreuse: "#7fff00", + chocolate: "#d2691e", + coral: "#ff7f50", + cornflowerblue: "#6495ed", + cornsilk: "#fff8dc", + crimson: "#dc143c", + cyan: "#00ffff", + darkblue: "#00008b", + darkcyan: "#008b8b", + darkgoldenrod: "#b8860b", + darkgray: "#a9a9a9", + darkgreen: "#006400", + darkgrey: "#a9a9a9", + darkkhaki: "#bdb76b", + darkmagenta: "#8b008b", + darkolivegreen: "#556b2f", + darkorange: "#ff8c00", + darkorchid: "#9932cc", + darkred: "#8b0000", + darksalmon: "#e9967a", + darkseagreen: "#8fbc8f", + darkslateblue: "#483d8b", + darkslategray: "#2f4f4f", + darkslategrey: "#2f4f4f", + darkturquoise: "#00ced1", + darkviolet: "#9400d3", + deeppink: "#ff1493", + deepskyblue: "#00bfff", + dimgray: "#696969", + dimgrey: "#696969", + dodgerblue: "#1e90ff", + firebrick: "#b22222", + floralwhite: "#fffaf0", + forestgreen: "#228b22", + fuchsia: "#ff00ff", + gainsboro: "#dcdcdc", + ghostwhite: "#f8f8ff", + gold: "#ffd700", + goldenrod: "#daa520", + gray: "#808080", + green: "#008000", + greenyellow: "#adff2f", + grey: "#808080", + honeydew: "#f0fff0", + hotpink: "#ff69b4", + indianred: "#cd5c5c", + indigo: "#4b0082", + ivory: "#fffff0", + khaki: "#f0e68c", + lavender: "#e6e6fa", + lavenderblush: "#fff0f5", + lawngreen: "#7cfc00", + lemonchiffon: "#fffacd", + lightblue: "#add8e6", + lightcoral: "#f08080", + lightcyan: "#e0ffff", + lightgoldenrodyellow: "#fafad2", + lightgray: "#d3d3d3", + lightgreen: "#90ee90", + lightgrey: "#d3d3d3", + lightpink: "#ffb6c1", + lightsalmon: "#ffa07a", + lightseagreen: "#20b2aa", + lightskyblue: "#87cefa", + lightslategray: "#778899", + lightslategrey: "#778899", + lightsteelblue: "#b0c4de", + lightyellow: "#ffffe0", + lime: "#00ff00", + limegreen: "#32cd32", + linen: "#faf0e6", + magenta: "#ff00ff", + maroon: "#800000", + mediumaquamarine: "#66cdaa", + mediumblue: "#0000cd", + mediumorchid: "#ba55d3", + mediumpurple: "#9370db", + mediumseagreen: "#3cb371", + mediumslateblue: "#7b68ee", + mediumspringgreen: "#00fa9a", + mediumturquoise: "#48d1cc", + mediumvioletred: "#c71585", + midnightblue: "#191970", + mintcream: "#f5fffa", + mistyrose: "#ffe4e1", + moccasin: "#ffe4b5", + navajowhite: "#ffdead", + navy: "#000080", + oldlace: "#fdf5e6", + olive: "#808000", + olivedrab: "#6b8e23", + orange: "#ffa500", + orangered: "#ff4500", + orchid: "#da70d6", + palegoldenrod: "#eee8aa", + palegreen: "#98fb98", + paleturquoise: "#afeeee", + palevioletred: "#db7093", + papayawhip: "#ffefd5", + peachpuff: "#ffdab9", + peru: "#cd853f", + pink: "#ffc0cb", + plum: "#dda0dd", + powderblue: "#b0e0e6", + purple: "#800080", + red: "#ff0000", + rosybrown: "#bc8f8f", + royalblue: "#4169e1", + saddlebrown: "#8b4513", + salmon: "#fa8072", + sandybrown: "#f4a460", + seagreen: "#2e8b57", + seashell: "#fff5ee", + sienna: "#a0522d", + silver: "#c0c0c0", + skyblue: "#87ceeb", + slateblue: "#6a5acd", + slategray: "#708090", + slategrey: "#708090", + snow: "#fffafa", + springgreen: "#00ff7f", + steelblue: "#4682b4", + tan: "#d2b48c", + teal: "#008080", + thistle: "#d8bfd8", + tomato: "#ff6347", + turquoise: "#40e0d0", + violet: "#ee82ee", + wheat: "#f5deb3", + white: "#ffffff", + whitesmoke: "#f5f5f5", + yellow: "#ffff00", + yellowgreen: "#9acd32" +}; + +MochiKit.Base._exportSymbols(this, MochiKit.Color); diff --git a/frontend/delta/js/MochiKit/DOM.js b/frontend/delta/js/MochiKit/DOM.js new file mode 100644 index 0000000..23d996b --- a/dev/null +++ b/frontend/delta/js/MochiKit/DOM.js @@ -0,0 +1,1202 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.DOM 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'DOM', '1.5', ['Base']); + +MochiKit.Base.update(MochiKit.DOM, { + + /** @id MochiKit.DOM.currentWindow */ + currentWindow: function () { + return MochiKit.DOM._window; + }, + + /** @id MochiKit.DOM.currentDocument */ + currentDocument: function () { + return MochiKit.DOM._document; + }, + + /** @id MochiKit.DOM.withWindow */ + withWindow: function (win, func) { + var self = MochiKit.DOM; + var oldDoc = self._document; + var oldWin = self._window; + var rval; + try { + self._window = win; + self._document = win.document; + rval = func(); + } catch (e) { + self._window = oldWin; + self._document = oldDoc; + throw e; + } + self._window = oldWin; + self._document = oldDoc; + return rval; + }, + + /** @id MochiKit.DOM.formContents */ + formContents: function (elem/* = document.body */) { + var names = []; + var values = []; + var m = MochiKit.Base; + var self = MochiKit.DOM; + if (typeof(elem) == "undefined" || elem === null) { + elem = self._document.body; + } else { + elem = self.getElement(elem); + } + m.nodeWalk(elem, function (elem) { + var name = elem.name; + if (m.isNotEmpty(name)) { + var tagName = elem.tagName.toUpperCase(); + if (tagName === "INPUT" + && (elem.type == "radio" || elem.type == "checkbox") + && !elem.checked + ) { + return null; + } + if (tagName === "SELECT") { + if (elem.type == "select-one") { + if (elem.selectedIndex >= 0) { + var opt = elem.options[elem.selectedIndex]; + var v = opt.value; + if (!v) { + var h = opt.outerHTML; + // internet explorer sure does suck. + if (h && !h.match(/^[^>]+\svalue\s*=/i)) { + v = opt.text; + } + } + names.push(name); + values.push(v); + return null; + } + // no form elements? + names.push(name); + values.push(""); + return null; + } else { + var opts = elem.options; + if (!opts.length) { + names.push(name); + values.push(""); + return null; + } + for (var i = 0; i < opts.length; i++) { + var opt = opts[i]; + if (!opt.selected) { + continue; + } + var v = opt.value; + if (!v) { + var h = opt.outerHTML; + // internet explorer sure does suck. + if (h && !h.match(/^[^>]+\svalue\s*=/i)) { + v = opt.text; + } + } + names.push(name); + values.push(v); + } + return null; + } + } + if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" + || tagName === "DIV" + ) { + return elem.childNodes; + } + names.push(name); + values.push(elem.value || ''); + return null; + } + return elem.childNodes; + }); + return [names, values]; + }, + + /** @id MochiKit.DOM.withDocument */ + withDocument: function (doc, func) { + var self = MochiKit.DOM; + var oldDoc = self._document; + var rval; + try { + self._document = doc; + rval = func(); + } catch (e) { + self._document = oldDoc; + throw e; + } + self._document = oldDoc; + return rval; + }, + + /** @id MochiKit.DOM.registerDOMConverter */ + registerDOMConverter: function (name, check, wrap, /* optional */override) { + MochiKit.DOM.domConverters.register(name, check, wrap, override); + }, + + /** @id MochiKit.DOM.coerceToDOM */ + coerceToDOM: function (node, ctx) { + var m = MochiKit.Base; + var im = MochiKit.Iter; + var self = MochiKit.DOM; + if (im) { + var iter = im.iter; + var repeat = im.repeat; + } + var map = m.map; + var domConverters = self.domConverters; + var coerceToDOM = arguments.callee; + var NotFound = m.NotFound; + while (true) { + if (typeof(node) == 'undefined' || node === null) { + return null; + } + // this is a safari childNodes object, avoiding crashes w/ attr + // lookup + if (typeof(node) == "function" && + typeof(node.length) == "number" && + !(node instanceof Function)) { + node = im ? im.list(node) : m.extend(null, node); + } + if (typeof(node.nodeType) != 'undefined' && node.nodeType > 0) { + return node; + } + if (typeof(node) == 'number' || typeof(node) == 'boolean') { + node = node.toString(); + // FALL THROUGH + } + if (typeof(node) == 'string') { + return self._document.createTextNode(node); + } + if (typeof(node.__dom__) == 'function') { + node = node.__dom__(ctx); + continue; + } + if (typeof(node.dom) == 'function') { + node = node.dom(ctx); + continue; + } + if (typeof(node) == 'function') { + node = node.apply(ctx, [ctx]); + continue; + } + + if (im) { + // iterable + var iterNodes = null; + try { + iterNodes = iter(node); + } catch (e) { + // pass + } + if (iterNodes) { + return map(coerceToDOM, iterNodes, repeat(ctx)); + } + } else if (m.isArrayLike(node)) { + var func = function (n) { return coerceToDOM(n, ctx); }; + return map(func, node); + } + + // adapter + try { + node = domConverters.match(node, ctx); + continue; + } catch (e) { + if (e != NotFound) { + throw e; + } + } + + // fallback + return self._document.createTextNode(node.toString()); + } + // mozilla warnings aren't too bright + return undefined; + }, + + /** @id MochiKit.DOM.isChildNode */ + isChildNode: function (node, maybeparent) { + var self = MochiKit.DOM; + if (typeof(node) == "string") { + node = self.getElement(node); + } + if (typeof(maybeparent) == "string") { + maybeparent = self.getElement(maybeparent); + } + if (typeof(node) == 'undefined' || node === null) { + return false; + } + while (node != null && node !== self._document) { + if (node === maybeparent) { + return true; + } + node = node.parentNode; + } + return false; + }, + + /** @id MochiKit.DOM.setNodeAttribute */ + setNodeAttribute: function (node, attr, value) { + var o = {}; + o[attr] = value; + try { + return MochiKit.DOM.updateNodeAttributes(node, o); + } catch (e) { + // pass + } + return null; + }, + + /** @id MochiKit.DOM.getNodeAttribute */ + getNodeAttribute: function (node, attr) { + var self = MochiKit.DOM; + var rename = self.attributeArray.renames[attr]; + var ignoreValue = self.attributeArray.ignoreAttr[attr]; + node = self.getElement(node); + try { + if (rename) { + return node[rename]; + } + var value = node.getAttribute(attr); + if (value != ignoreValue) { + return value; + } + } catch (e) { + // pass + } + return null; + }, + + /** @id MochiKit.DOM.removeNodeAttribute */ + removeNodeAttribute: function (node, attr) { + var self = MochiKit.DOM; + var rename = self.attributeArray.renames[attr]; + node = self.getElement(node); + try { + if (rename) { + return node[rename]; + } + return node.removeAttribute(attr); + } catch (e) { + // pass + } + return null; + }, + + /** @id MochiKit.DOM.updateNodeAttributes */ + updateNodeAttributes: function (node, attrs) { + var elem = node; + var self = MochiKit.DOM; + var base = MochiKit.Base; + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + if (attrs) { + if (self.attributeArray.compliant) { + // not IE, good. + for (var k in attrs) { + var v = attrs[k]; + if (typeof(v) == 'object' && typeof(elem[k]) == 'object') { + if (k == "style" && MochiKit.Style) { + MochiKit.Style.setStyle(elem, v); + } else { + base.updatetree(elem[k], v); + } + } else if (k.substring(0, 2) == "on") { + if (typeof(v) == "string") { + v = new Function(v); + } + elem[k] = v; + } else { + elem.setAttribute(k, v); + } + if (base.isValue(elem[k]) && elem[k] != v) { + // Also set property for weird attributes (see #302 & #335) + elem[k] = v; + } + } + } else { + // IE is insane in the membrane + var renames = self.attributeArray.renames; + for (var k in attrs) { + v = attrs[k]; + var renamed = renames[k]; + if (k == "style" && typeof(v) == "string") { + elem.style.cssText = v; + } else if (typeof(renamed) == "string") { + elem[renamed] = v; + } else if (typeof(elem[k]) == 'object' + && typeof(v) == 'object') { + if (k == "style" && MochiKit.Style) { + MochiKit.Style.setStyle(elem, v); + } else { + base.updatetree(elem[k], v); + } + } else if (k.substring(0, 2) == "on") { + if (typeof(v) == "string") { + v = new Function(v); + } + elem[k] = v; + } else { + elem.setAttribute(k, v); + } + if (base.isValue(elem[k]) && elem[k] != v) { + // Also set property for weird attributes (see #302 & #335) + elem[k] = v; + } + } + } + } + return elem; + }, + + /** @id MochiKit.DOM.appendChildNodes */ + appendChildNodes: function (node/*, nodes...*/) { + var elem = node; + var self = MochiKit.DOM; + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + var nodeStack = [ + self.coerceToDOM( + MochiKit.Base.extend(null, arguments, 1), + elem + ) + ]; + var concat = MochiKit.Base.concat; + while (nodeStack.length) { + var n = nodeStack.shift(); + if (typeof(n) == 'undefined' || n === null) { + // pass + } else if (typeof(n.nodeType) == 'number') { + elem.appendChild(n); + } else { + nodeStack = concat(n, nodeStack); + } + } + return elem; + }, + + + /** @id MochiKit.DOM.insertSiblingNodesBefore */ + insertSiblingNodesBefore: function (node/*, nodes...*/) { + var elem = node; + var self = MochiKit.DOM; + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + var nodeStack = [ + self.coerceToDOM( + MochiKit.Base.extend(null, arguments, 1), + elem + ) + ]; + var parentnode = elem.parentNode; + var concat = MochiKit.Base.concat; + while (nodeStack.length) { + var n = nodeStack.shift(); + if (typeof(n) == 'undefined' || n === null) { + // pass + } else if (typeof(n.nodeType) == 'number') { + parentnode.insertBefore(n, elem); + } else { + nodeStack = concat(n, nodeStack); + } + } + return parentnode; + }, + + /** @id MochiKit.DOM.insertSiblingNodesAfter */ + insertSiblingNodesAfter: function (node/*, nodes...*/) { + var elem = node; + var self = MochiKit.DOM; + + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + var nodeStack = [ + self.coerceToDOM( + MochiKit.Base.extend(null, arguments, 1), + elem + ) + ]; + + if (elem.nextSibling) { + return self.insertSiblingNodesBefore(elem.nextSibling, nodeStack); + } + else { + return self.appendChildNodes(elem.parentNode, nodeStack); + } + }, + + /** @id MochiKit.DOM.replaceChildNodes */ + replaceChildNodes: function (node/*, nodes...*/) { + var elem = node; + var self = MochiKit.DOM; + if (typeof(node) == 'string') { + elem = self.getElement(node); + arguments[0] = elem; + } + var child; + while ((child = elem.firstChild)) { + elem.removeChild(child); + } + if (arguments.length < 2) { + return elem; + } else { + return self.appendChildNodes.apply(this, arguments); + } + }, + + /** @id MochiKit.DOM.createDOM */ + createDOM: function (name, attrs/*, nodes... */) { + var elem; + var self = MochiKit.DOM; + var m = MochiKit.Base; + if (typeof(attrs) == "string" || typeof(attrs) == "number") { + var args = m.extend([name, null], arguments, 1); + return arguments.callee.apply(this, args); + } + if (typeof(name) == 'string') { + // Internet Explorer is dumb + var xhtml = self._xhtml; + if (attrs && !self.attributeArray.compliant) { + // http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/name_2.asp + var contents = ""; + if ('name' in attrs) { + contents += ' name="' + self.escapeHTML(attrs.name) + '"'; + } + if (name == 'input' && 'type' in attrs) { + contents += ' type="' + self.escapeHTML(attrs.type) + '"'; + } + if (contents) { + name = "<" + name + contents + ">"; + xhtml = false; + } + } + var d = self._document; + if (xhtml && d === document) { + elem = d.createElementNS("http://www.w3.org/1999/xhtml", name); + } else { + elem = d.createElement(name); + } + } else { + elem = name; + } + if (attrs) { + self.updateNodeAttributes(elem, attrs); + } + if (arguments.length <= 2) { + return elem; + } else { + var args = m.extend([elem], arguments, 2); + return self.appendChildNodes.apply(this, args); + } + }, + + /** @id MochiKit.DOM.createDOMFunc */ + createDOMFunc: function (/* tag, attrs, *nodes */) { + var m = MochiKit.Base; + return m.partial.apply( + this, + m.extend([MochiKit.DOM.createDOM], arguments) + ); + }, + + /** @id MochiKit.DOM.removeElement */ + removeElement: function (elem) { + var self = MochiKit.DOM; + if (typeof(elem) == "string") { + elem = self.getElement(elem); + } + var e = self.coerceToDOM(elem); + e.parentNode.removeChild(e); + return e; + }, + + /** @id MochiKit.DOM.swapDOM */ + swapDOM: function (dest, src) { + var self = MochiKit.DOM; + dest = self.getElement(dest); + var parent = dest.parentNode; + if (src) { + if (typeof(src) == "string") { + src = self.getElement(src); + } + src = self.coerceToDOM(src, parent); + parent.replaceChild(src, dest); + } else { + parent.removeChild(dest); + } + return src; + }, + + /** @id MochiKit.DOM.getElement */ + getElement: function (id) { + var self = MochiKit.DOM; + if (arguments.length == 1) { + return ((typeof(id) == "string") ? + self._document.getElementById(id) : id); + } else { + return MochiKit.Base.map(self.getElement, arguments); + } + }, + + /** @id MochiKit.DOM.getElementsByTagAndClassName */ + getElementsByTagAndClassName: function (tagName, className, + /* optional */parent) { + var self = MochiKit.DOM; + if (typeof(tagName) == 'undefined' || tagName === null) { + tagName = '*'; + } + if (typeof(parent) == 'undefined' || parent === null) { + parent = self._document; + } + parent = self.getElement(parent); + if (parent == null) { + return []; + } + var children = (parent.getElementsByTagName(tagName) + || self._document.all); + if (typeof(className) == 'undefined' || className === null) { + return MochiKit.Base.extend(null, children); + } + + var elements = []; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var cls = child.className; + if (typeof(cls) != "string") { + cls = child.getAttribute("class"); + } + if (typeof(cls) == "string") { + var classNames = cls.split(' '); + for (var j = 0; j < classNames.length; j++) { + if (classNames[j] == className) { + elements.push(child); + break; + } + } + } + } + + return elements; + }, + + _newCallStack: function (path, once) { + var rval = function () { + var callStack = arguments.callee.callStack; + for (var i = 0; i < callStack.length; i++) { + if (callStack[i].apply(this, arguments) === false) { + break; + } + } + if (once) { + try { + this[path] = null; + } catch (e) { + // pass + } + } + }; + rval.callStack = []; + return rval; + }, + + /** @id MochiKit.DOM.addToCallStack */ + addToCallStack: function (target, path, func, once) { + var self = MochiKit.DOM; + var existing = target[path]; + var regfunc = existing; + if (!(typeof(existing) == 'function' + && typeof(existing.callStack) == "object" + && existing.callStack !== null)) { + regfunc = self._newCallStack(path, once); + if (typeof(existing) == 'function') { + regfunc.callStack.push(existing); + } + target[path] = regfunc; + } + regfunc.callStack.push(func); + }, + + /** @id MochiKit.DOM.addLoadEvent */ + addLoadEvent: function (func) { + var self = MochiKit.DOM; + self.addToCallStack(self._window, "onload", func, true); + + }, + + /** @id MochiKit.DOM.focusOnLoad */ + focusOnLoad: function (element) { + var self = MochiKit.DOM; + self.addLoadEvent(function () { + element = self.getElement(element); + if (element) { + element.focus(); + } + }); + }, + + /** @id MochiKit.DOM.setElementClass */ + setElementClass: function (element, className) { + var self = MochiKit.DOM; + var obj = self.getElement(element); + if (self.attributeArray.compliant) { + obj.setAttribute("class", className); + } else { + obj.setAttribute("className", className); + } + }, + + /** @id MochiKit.DOM.toggleElementClass */ + toggleElementClass: function (className/*, element... */) { + var self = MochiKit.DOM; + for (var i = 1; i < arguments.length; i++) { + var obj = self.getElement(arguments[i]); + if (!self.addElementClass(obj, className)) { + self.removeElementClass(obj, className); + } + } + }, + + /** @id MochiKit.DOM.addElementClass */ + addElementClass: function (element, className) { + var self = MochiKit.DOM; + var obj = self.getElement(element); + var cls = obj.className; + if (typeof(cls) != "string") { + cls = obj.getAttribute("class"); + } + // trivial case, no className yet + if (typeof(cls) != "string" || cls.length === 0) { + self.setElementClass(obj, className); + return true; + } + // the other trivial case, already set as the only class + if (cls == className) { + return false; + } + var classes = cls.split(" "); + for (var i = 0; i < classes.length; i++) { + // already present + if (classes[i] == className) { + return false; + } + } + // append class + self.setElementClass(obj, cls + " " + className); + return true; + }, + + /** @id MochiKit.DOM.removeElementClass */ + removeElementClass: function (element, className) { + var self = MochiKit.DOM; + var obj = self.getElement(element); + var cls = obj.className; + if (typeof(cls) != "string") { + cls = obj.getAttribute("class"); + } + // trivial case, no className yet + if (typeof(cls) != "string" || cls.length === 0) { + return false; + } + // other trivial case, set only to className + if (cls == className) { + self.setElementClass(obj, ""); + return true; + } + var classes = cls.split(" "); + for (var i = 0; i < classes.length; i++) { + // already present + if (classes[i] == className) { + // only check sane case where the class is used once + classes.splice(i, 1); + self.setElementClass(obj, classes.join(" ")); + return true; + } + } + // not found + return false; + }, + + /** @id MochiKit.DOM.swapElementClass */ + swapElementClass: function (element, fromClass, toClass) { + var obj = MochiKit.DOM.getElement(element); + var res = MochiKit.DOM.removeElementClass(obj, fromClass); + if (res) { + MochiKit.DOM.addElementClass(obj, toClass); + } + return res; + }, + + /** @id MochiKit.DOM.hasElementClass */ + hasElementClass: function (element, className/*...*/) { + var obj = MochiKit.DOM.getElement(element); + if (obj == null) { + return false; + } + var cls = obj.className; + if (typeof(cls) != "string" && typeof(obj.getAttribute) == "function") { + cls = obj.getAttribute("class"); + } + if (typeof(cls) != "string") { + return false; + } + var classes = cls.split(" "); + for (var i = 1; i < arguments.length; i++) { + var good = false; + for (var j = 0; j < classes.length; j++) { + if (classes[j] == arguments[i]) { + good = true; + break; + } + } + if (!good) { + return false; + } + } + return true; + }, + + /** @id MochiKit.DOM.escapeHTML */ + escapeHTML: function (s) { + return s.replace(/&/g, "&" + ).replace(/"/g, """ + ).replace(/</g, "<" + ).replace(/>/g, ">"); + }, + + /** @id MochiKit.DOM.toHTML */ + toHTML: function (dom) { + return MochiKit.DOM.emitHTML(dom).join(""); + }, + + /** @id MochiKit.DOM.emitHTML */ + emitHTML: function (dom, /* optional */lst) { + if (typeof(lst) == 'undefined' || lst === null) { + lst = []; + } + // queue is the call stack, we're doing this non-recursively + var queue = [dom]; + var self = MochiKit.DOM; + var escapeHTML = self.escapeHTML; + var attributeArray = self.attributeArray; + while (queue.length) { + dom = queue.pop(); + if (typeof(dom) == 'string') { + lst.push(dom); + } else if (dom.nodeType == 1) { + // we're not using higher order stuff here + // because safari has heisenbugs.. argh. + // + // I think it might have something to do with + // garbage collection and function calls. + lst.push('<' + dom.tagName.toLowerCase()); + var attributes = []; + var domAttr = attributeArray(dom); + for (var i = 0; i < domAttr.length; i++) { + var a = domAttr[i]; + attributes.push([ + " ", + a.name, + '="', + escapeHTML(a.value), + '"' + ]); + } + attributes.sort(); + for (i = 0; i < attributes.length; i++) { + var attrs = attributes[i]; + for (var j = 0; j < attrs.length; j++) { + lst.push(attrs[j]); + } + } + if (dom.hasChildNodes()) { + lst.push(">"); + // queue is the FILO call stack, so we put the close tag + // on first + queue.push("</" + dom.tagName.toLowerCase() + ">"); + var cnodes = dom.childNodes; + for (i = cnodes.length - 1; i >= 0; i--) { + queue.push(cnodes[i]); + } + } else { + lst.push('/>'); + } + } else if (dom.nodeType == 3) { + lst.push(escapeHTML(dom.nodeValue)); + } + } + return lst; + }, + + /** @id MochiKit.DOM.scrapeText */ + scrapeText: function (node, /* optional */asArray) { + var rval = []; + (function (node) { + var cn = node.childNodes; + if (cn) { + for (var i = 0; i < cn.length; i++) { + arguments.callee.call(this, cn[i]); + } + } + var nodeValue = node.nodeValue; + if (typeof(nodeValue) == 'string') { + rval.push(nodeValue); + } + })(MochiKit.DOM.getElement(node)); + if (asArray) { + return rval; + } else { + return rval.join(""); + } + }, + + /** @id MochiKit.DOM.removeEmptyTextNodes */ + removeEmptyTextNodes: function (element) { + element = MochiKit.DOM.getElement(element); + for (var i = 0; i < element.childNodes.length; i++) { + var node = element.childNodes[i]; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) { + node.parentNode.removeChild(node); + } + } + }, + + /** @id MochiKit.DOM.getFirstElementByTagAndClassName */ + getFirstElementByTagAndClassName: function (tagName, className, + /* optional */parent) { + var self = MochiKit.DOM; + if (typeof(tagName) == 'undefined' || tagName === null) { + tagName = '*'; + } + if (typeof(parent) == 'undefined' || parent === null) { + parent = self._document; + } + parent = self.getElement(parent); + if (parent == null) { + return null; + } + var children = (parent.getElementsByTagName(tagName) + || self._document.all); + if (children.length <= 0) { + return null; + } else if (typeof(className) == 'undefined' || className === null) { + return children[0]; + } + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var cls = child.className; + if (typeof(cls) != "string") { + cls = child.getAttribute("class"); + } + if (typeof(cls) == "string") { + var classNames = cls.split(' '); + for (var j = 0; j < classNames.length; j++) { + if (classNames[j] == className) { + return child; + } + } + } + } + return null; + }, + + /** @id MochiKit.DOM.getFirstParentByTagAndClassName */ + getFirstParentByTagAndClassName: function (elem, tagName, className) { + var self = MochiKit.DOM; + elem = self.getElement(elem); + if (typeof(tagName) == 'undefined' || tagName === null) { + tagName = '*'; + } else { + tagName = tagName.toUpperCase(); + } + if (typeof(className) == 'undefined' || className === null) { + className = null; + } + if (elem) { + elem = elem.parentNode; + } + while (elem && elem.tagName) { + var curTagName = elem.tagName.toUpperCase(); + if ((tagName === '*' || tagName == curTagName) && + (className === null || self.hasElementClass(elem, className))) { + return elem; + } + elem = elem.parentNode; + } + return null; + }, + + __new__: function (win) { + + var m = MochiKit.Base; + if (typeof(document) != "undefined") { + this._document = document; + var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + this._xhtml = (document.documentElement && + document.createElementNS && + document.documentElement.namespaceURI === kXULNSURI); + } else if (MochiKit.MockDOM) { + this._document = MochiKit.MockDOM.document; + } + this._window = win; + + this.domConverters = new m.AdapterRegistry(); + + var __tmpElement = this._document.createElement("span"); + var attributeArray; + if (__tmpElement && __tmpElement.attributes && + __tmpElement.attributes.length > 0) { + // for braindead browsers (IE) that insert extra junk + var filter = m.filter; + attributeArray = function (node) { + /*** + + Return an array of attributes for a given node, + filtering out attributes that don't belong for + that are inserted by "Certain Browsers". + + ***/ + return filter(attributeArray.ignoreAttrFilter, node.attributes); + }; + attributeArray.ignoreAttr = {}; + var attrs = __tmpElement.attributes; + var ignoreAttr = attributeArray.ignoreAttr; + for (var i = 0; i < attrs.length; i++) { + var a = attrs[i]; + ignoreAttr[a.name] = a.value; + } + attributeArray.ignoreAttrFilter = function (a) { + return (attributeArray.ignoreAttr[a.name] != a.value); + }; + attributeArray.compliant = false; + attributeArray.renames = { + "class": "className", + "checked": "defaultChecked", + "usemap": "useMap", + "for": "htmlFor", + "readonly": "readOnly", + "colspan": "colSpan", + "rowspan": "rowSpan", + "bgcolor": "bgColor", + "cellspacing": "cellSpacing", + "cellpadding": "cellPadding" + }; + } else { + attributeArray = function (node) { + return node.attributes; + }; + attributeArray.compliant = true; + attributeArray.ignoreAttr = {}; + attributeArray.renames = {}; + } + attributeArray.__export__ = false; + this.attributeArray = attributeArray; + + // Backwards compatibility aliases + /** @id MochiKit.DOM.computedStyle */ + m._deprecated(this, 'computedStyle', 'MochiKit.Style.getStyle', '1.4', true); + /** @id MochiKit.DOM.elementDimensions */ + m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.4'); + /** @id MochiKit.DOM.elementPosition */ + m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.4'); + /** @id MochiKit.DOM.getViewportDimensions */ + m._deprecated(this, 'getViewportDimensions', 'MochiKit.Style.getViewportDimensions', '1.4'); + /** @id MochiKit.DOM.hideElement */ + m._deprecated(this, 'hideElement', 'MochiKit.Style.hideElement', '1.4'); + /** @id MochiKit.DOM.makeClipping */ + m._deprecated(this, 'makeClipping', 'MochiKit.Style.makeClipping', '1.4.1'); + /** @id MochiKit.DOM.makePositioned */ + m._deprecated(this, 'makePositioned', 'MochiKit.Style.makePositioned', '1.4.1'); + /** @id MochiKit.DOM.setElementDimensions */ + m._deprecated(this, 'setElementDimensions', 'MochiKit.Style.setElementDimensions', '1.4'); + /** @id MochiKit.DOM.setElementPosition */ + m._deprecated(this, 'setElementPosition', 'MochiKit.Style.setElementPosition', '1.4'); + /** @id MochiKit.DOM.setDisplayForElement */ + m._deprecated(this, 'setDisplayForElement', 'MochiKit.Style.setDisplayForElement', '1.4'); + /** @id MochiKit.DOM.setOpacity */ + m._deprecated(this, 'setOpacity', 'MochiKit.Style.setOpacity', '1.4'); + /** @id MochiKit.DOM.showElement */ + m._deprecated(this, 'showElement', 'MochiKit.Style.showElement', '1.4'); + /** @id MochiKit.DOM.undoClipping */ + m._deprecated(this, 'undoClipping', 'MochiKit.Style.undoClipping', '1.4.1'); + /** @id MochiKit.DOM.undoPositioned */ + m._deprecated(this, 'undoPositioned', 'MochiKit.Style.undoPositioned', '1.4.1'); + /** @id MochiKit.DOM.Coordinates */ + m._deprecated(this, 'Coordinates', 'MochiKit.Style.Coordinates', '1.4'); + /** @id MochiKit.DOM.Dimensions */ + m._deprecated(this, 'Dimensions', 'MochiKit.Style.Dimensions', '1.4'); + + // shorthand for createDOM syntax + var createDOMFunc = this.createDOMFunc; + /** @id MochiKit.DOM.A */ + this.A = createDOMFunc("a"); + /** @id MochiKit.DOM.ARTICLE */ + this.ARTICLE = createDOMFunc("article"); + /** @id MochiKit.DOM.ASIDE */ + this.ASIDE = createDOMFunc("aside"); + /** @id MochiKit.DOM.BR */ + this.BR = createDOMFunc("br"); + /** @id MochiKit.DOM.BUTTON */ + this.BUTTON = createDOMFunc("button"); + /** @id MochiKit.DOM.CANVAS */ + this.CANVAS = createDOMFunc("canvas"); + /** @id MochiKit.DOM.CAPTION */ + this.CAPTION = createDOMFunc("caption"); + /** @id MochiKit.DOM.DD */ + this.DD = createDOMFunc("dd"); + /** @id MochiKit.DOM.DIV */ + this.DIV = createDOMFunc("div"); + /** @id MochiKit.DOM.DL */ + this.DL = createDOMFunc("dl"); + /** @id MochiKit.DOM.DT */ + this.DT = createDOMFunc("dt"); + /** @id MochiKit.DOM.FIELDSET */ + this.FIELDSET = createDOMFunc("fieldset"); + /** @id MochiKit.DOM.FIGURE */ + this.FIGURE = createDOMFunc("figure"); + /** @id MochiKit.DOM.FIGCAPTION */ + this.FIGCAPTION = createDOMFunc("figcaption"); + /** @id MochiKit.DOM.FOOTER */ + this.FOOTER = createDOMFunc("footer"); + /** @id MochiKit.DOM.FORM */ + this.FORM = createDOMFunc("form"); + /** @id MochiKit.DOM.H1 */ + this.H1 = createDOMFunc("h1"); + /** @id MochiKit.DOM.H2 */ + this.H2 = createDOMFunc("h2"); + /** @id MochiKit.DOM.H3 */ + this.H3 = createDOMFunc("h3"); + /** @id MochiKit.DOM.H4 */ + this.H4 = createDOMFunc("h4"); + /** @id MochiKit.DOM.H5 */ + this.H5 = createDOMFunc("h5"); + /** @id MochiKit.DOM.H6 */ + this.H6 = createDOMFunc("h6"); + /** @id MochiKit.DOM.HEADER */ + this.HEADER = createDOMFunc("header"); + /** @id MochiKit.DOM.HGROUP */ + this.HGROUP = createDOMFunc("hgroup"); + /** @id MochiKit.DOM.HR */ + this.HR = createDOMFunc("hr"); + /** @id MochiKit.DOM.IFRAME */ + this.IFRAME = createDOMFunc("iframe"); + /** @id MochiKit.DOM.IMG */ + this.IMG = createDOMFunc("img"); + /** @id MochiKit.DOM.INPUT */ + this.INPUT = createDOMFunc("input"); + /** @id MochiKit.DOM.LABEL */ + this.LABEL = createDOMFunc("label"); + /** @id MochiKit.DOM.LEGEND */ + this.LEGEND = createDOMFunc("legend"); + /** @id MochiKit.DOM.LI */ + this.LI = createDOMFunc("li"); + /** @id MochiKit.DOM.LINK */ + this.LINK = createDOMFunc("link"); + /** @id MochiKit.DOM.MARK */ + this.MARK = createDOMFunc("mark"); + /** @id MochiKit.DOM.METER */ + this.METER = createDOMFunc("meter"); + /** @id MochiKit.DOM.NAV */ + this.NAV = createDOMFunc("nav"); + /** @id MochiKit.DOM.OL */ + this.OL = createDOMFunc("ol"); + /** @id MochiKit.DOM.OPTGROUP */ + this.OPTGROUP = createDOMFunc("optgroup"); + /** @id MochiKit.DOM.OPTION */ + this.OPTION = createDOMFunc("option"); + /** @id MochiKit.DOM.P */ + this.P = createDOMFunc("p"); + /** @id MochiKit.DOM.PRE */ + this.PRE = createDOMFunc("pre"); + /** @id MochiKit.DOM.PROGRESS */ + this.PROGRESS = createDOMFunc("progress"); + /** @id MochiKit.DOM.SCRIPT */ + this.SCRIPT = createDOMFunc("script"); + /** @id MochiKit.DOM.SECTION */ + this.SECTION = createDOMFunc("section"); + /** @id MochiKit.DOM.SELECT */ + this.SELECT = createDOMFunc("select"); + /** @id MochiKit.DOM.SPAN */ + this.SPAN = createDOMFunc("span"); + /** @id MochiKit.DOM.STRONG */ + this.STRONG = createDOMFunc("strong"); + /** @id MochiKit.DOM.STYLE */ + this.STYLE = createDOMFunc("style"); + /** @id MochiKit.DOM.TABLE */ + this.TABLE = createDOMFunc("table"); + /** @id MochiKit.DOM.TBODY */ + this.TBODY = createDOMFunc("tbody"); + /** @id MochiKit.DOM.TD */ + this.TD = createDOMFunc("td"); + /** @id MochiKit.DOM.TEXTAREA */ + this.TEXTAREA = createDOMFunc("textarea"); + /** @id MochiKit.DOM.TFOOT */ + this.TFOOT = createDOMFunc("tfoot"); + /** @id MochiKit.DOM.TH */ + this.TH = createDOMFunc("th"); + /** @id MochiKit.DOM.THEAD */ + this.THEAD = createDOMFunc("thead"); + /** @id MochiKit.DOM.TR */ + this.TR = createDOMFunc("tr"); + /** @id MochiKit.DOM.TT */ + this.TT = createDOMFunc("tt"); + /** @id MochiKit.DOM.UL */ + this.UL = createDOMFunc("ul"); + /** @id MochiKit.DOM.NBSP */ + this.NBSP = "\u00a0"; + /** @id MochiKit.DOM.$ */ + this.$ = this.getElement; + + m.nameFunctions(this); + } +}); + + +MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window)); + +// +// XXX: Internet Explorer blows +// +if (MochiKit.__export__) { + withWindow = MochiKit.DOM.withWindow; + withDocument = MochiKit.DOM.withDocument; +} + +MochiKit.Base._exportSymbols(this, MochiKit.DOM); diff --git a/frontend/delta/js/MochiKit/DateTime.js b/frontend/delta/js/MochiKit/DateTime.js new file mode 100644 index 0000000..24ca087 --- a/dev/null +++ b/frontend/delta/js/MochiKit/DateTime.js @@ -0,0 +1,199 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.DateTime 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'DateTime', '1.5', ['Base']); + +/** @id MochiKit.DateTime.isoDate */ +MochiKit.DateTime.isoDate = function (str) { + str = str + ""; + if (typeof(str) != "string" || str.length === 0) { + return null; + } + var iso = str.split('-'); + if (iso.length === 0) { + return null; + } + var date = new Date(parseInt(iso[0], 10), parseInt(iso[1], 10) - 1, parseInt(iso[2], 10)); + date.setFullYear(iso[0]); + date.setMonth(iso[1] - 1); + date.setDate(iso[2]); + return date; +}; + +MochiKit.DateTime._isoRegexp = /(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/; + +/** @id MochiKit.DateTime.isoTimestamp */ +MochiKit.DateTime.isoTimestamp = function (str) { + str = str + ""; + if (typeof(str) != "string" || str.length === 0) { + return null; + } + var res = str.match(MochiKit.DateTime._isoRegexp); + if (typeof(res) == "undefined" || res === null) { + return null; + } + var year, month, day, hour, min, sec, msec; + year = parseInt(res[1], 10); + if (typeof(res[2]) == "undefined" || res[2] === '') { + return new Date(year); + } + month = parseInt(res[2], 10) - 1; + day = parseInt(res[3], 10); + if (typeof(res[4]) == "undefined" || res[4] === '') { + return new Date(year, month, day); + } + hour = parseInt(res[4], 10); + min = parseInt(res[5], 10); + sec = (typeof(res[6]) != "undefined" && res[6] !== '') ? parseInt(res[6], 10) : 0; + if (typeof(res[7]) != "undefined" && res[7] !== '') { + msec = Math.round(1000.0 * parseFloat("0." + res[7])); + } else { + msec = 0; + } + if ((typeof(res[8]) == "undefined" || res[8] === '') && (typeof(res[9]) == "undefined" || res[9] === '')) { + return new Date(year, month, day, hour, min, sec, msec); + } + var ofs; + if (typeof(res[9]) != "undefined" && res[9] !== '') { + ofs = parseInt(res[10], 10) * 3600000; + if (typeof(res[11]) != "undefined" && res[11] !== '') { + ofs += parseInt(res[11], 10) * 60000; + } + if (res[9] == "-") { + ofs = -ofs; + } + } else { + ofs = 0; + } + return new Date(Date.UTC(year, month, day, hour, min, sec, msec) - ofs); +}; + +/** @id MochiKit.DateTime.toISOTime */ +MochiKit.DateTime.toISOTime = function (date, realISO/* = false */) { + if (typeof(date) == "undefined" || date === null) { + return null; + } + var _padTwo = MochiKit.DateTime._padTwo; + if (realISO) { + // adjust date for UTC timezone + date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000)); + } + var lst = [ + (realISO ? _padTwo(date.getHours()) : date.getHours()), + _padTwo(date.getMinutes()), + _padTwo(date.getSeconds()) + ]; + return lst.join(":") + (realISO ? "Z" : ""); +}; + +/** @id MochiKit.DateTime.toISOTimeStamp */ +MochiKit.DateTime.toISOTimestamp = function (date, realISO/* = false*/) { + if (typeof(date) == "undefined" || date === null) { + return null; + } + var time = MochiKit.DateTime.toISOTime(date, realISO); + var sep = realISO ? "T" : " "; + if (realISO) { + // adjust date for UTC timezone + date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000)); + } + return MochiKit.DateTime.toISODate(date) + sep + time; +}; + +/** @id MochiKit.DateTime.toISODate */ +MochiKit.DateTime.toISODate = function (date) { + if (typeof(date) == "undefined" || date === null) { + return null; + } + var _padTwo = MochiKit.DateTime._padTwo; + var _padFour = MochiKit.DateTime._padFour; + return [ + _padFour(date.getFullYear()), + _padTwo(date.getMonth() + 1), + _padTwo(date.getDate()) + ].join("-"); +}; + +/** @id MochiKit.DateTime.americanDate */ +MochiKit.DateTime.americanDate = function (d) { + d = d + ""; + if (typeof(d) != "string" || d.length === 0) { + return null; + } + var a = d.split('/'); + return new Date(a[2], a[0] - 1, a[1]); +}; + +MochiKit.DateTime._padTwo = function (n) { + return (n > 9) ? n : "0" + n; +}; + +MochiKit.DateTime._padFour = function(n) { + switch(n.toString().length) { + case 1: return "000" + n; break; + case 2: return "00" + n; break; + case 3: return "0" + n; break; + case 4: + default: + return n; + } +}; + +/** @id MochiKit.DateTime.toPaddedAmericanDate */ +MochiKit.DateTime.toPaddedAmericanDate = function (d) { + if (typeof(d) == "undefined" || d === null) { + return null; + } + var _padTwo = MochiKit.DateTime._padTwo; + return [ + _padTwo(d.getMonth() + 1), + _padTwo(d.getDate()), + d.getFullYear() + ].join('/'); +}; + +/** @id MochiKit.DateTime.toAmericanDate */ +MochiKit.DateTime.toAmericanDate = function (d) { + if (typeof(d) == "undefined" || d === null) { + return null; + } + return [d.getMonth() + 1, d.getDate(), d.getFullYear()].join('/'); +}; + +MochiKit.DateTime.__new__ = function () { + MochiKit.Base.nameFunctions(this); +}; + +MochiKit.DateTime.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.DateTime); diff --git a/frontend/delta/js/MochiKit/DragAndDrop.js b/frontend/delta/js/MochiKit/DragAndDrop.js new file mode 100644 index 0000000..850e6bb --- a/dev/null +++ b/frontend/delta/js/MochiKit/DragAndDrop.js @@ -0,0 +1,789 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** +MochiKit.DragAndDrop 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) + Mochi-ized By Thomas Herve (_firstname_@nimail.org) + +***/ + +MochiKit.Base.module(MochiKit, 'DragAndDrop', '1.5', ['Base', 'Iter', 'DOM', 'Signal', 'Visual', 'Position']); + +MochiKit.DragAndDrop.Droppables = { + /*** + + Manage all droppables. Shouldn't be used, use the Droppable object instead. + + ***/ + drops: [], + + remove: function (element) { + this.drops = MochiKit.Base.filter(function (d) { + return d.element != MochiKit.DOM.getElement(element); + }, this.drops); + }, + + register: function (drop) { + this.drops.push(drop); + }, + + unregister: function (drop) { + this.drops = MochiKit.Base.filter(function (d) { + return d != drop; + }, this.drops); + }, + + prepare: function (element) { + MochiKit.Base.map(function (drop) { + if (drop.isAccepted(element)) { + if (drop.options.activeclass) { + MochiKit.DOM.addElementClass(drop.element, + drop.options.activeclass); + } + drop.options.onactive(drop.element, element); + } + }, this.drops); + }, + + findDeepestChild: function (drops) { + var deepest = drops[0]; + + for (var i = 1; i < drops.length; ++i) { + if (MochiKit.DOM.isChildNode(drops[i].element, deepest.element)) { + deepest = drops[i]; + } + } + return deepest; + }, + + show: function (point, element) { + if (!this.drops.length) { + return; + } + var affected = []; + + if (this.last_active) { + this.last_active.deactivate(); + } + MochiKit.Iter.forEach(this.drops, function (drop) { + if (drop.isAffected(point, element)) { + affected.push(drop); + } + }); + if (affected.length > 0) { + var drop = this.findDeepestChild(affected); + MochiKit.Position.within(drop.element, point.page.x, point.page.y); + drop.options.onhover(element, drop.element, + MochiKit.Position.overlap(drop.options.overlap, drop.element)); + drop.activate(); + } + }, + + fire: function (event, element) { + if (!this.last_active) { + return; + } + MochiKit.Position.prepare(); + + if (this.last_active.isAffected(event.mouse(), element)) { + this.last_active.options.ondrop(element, + this.last_active.element, event); + } + }, + + reset: function (element) { + MochiKit.Base.map(function (drop) { + if (drop.options.activeclass) { + MochiKit.DOM.removeElementClass(drop.element, + drop.options.activeclass); + } + drop.options.ondesactive(drop.element, element); + }, this.drops); + if (this.last_active) { + this.last_active.deactivate(); + } + } +}; + +/** @id MochiKit.DragAndDrop.Droppable */ +MochiKit.DragAndDrop.Droppable = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.DragAndDrop.Droppable.prototype = { + /*** + + A droppable object. Simple use is to create giving an element: + + new MochiKit.DragAndDrop.Droppable('myelement'); + + Generally you'll want to define the 'ondrop' function and maybe the + 'accept' option to filter draggables. + + ***/ + __class__: MochiKit.DragAndDrop.Droppable, + + __init__: function (element, /* optional */options) { + var d = MochiKit.DOM; + var b = MochiKit.Base; + this.element = d.getElement(element); + this.options = b.update({ + + /** @id MochiKit.DragAndDrop.greedy */ + greedy: true, + + /** @id MochiKit.DragAndDrop.hoverclass */ + hoverclass: null, + + /** @id MochiKit.DragAndDrop.activeclass */ + activeclass: null, + + /** @id MochiKit.DragAndDrop.hoverfunc */ + hoverfunc: b.noop, + + /** @id MochiKit.DragAndDrop.accept */ + accept: null, + + /** @id MochiKit.DragAndDrop.onactive */ + onactive: b.noop, + + /** @id MochiKit.DragAndDrop.ondesactive */ + ondesactive: b.noop, + + /** @id MochiKit.DragAndDrop.onhover */ + onhover: b.noop, + + /** @id MochiKit.DragAndDrop.ondrop */ + ondrop: b.noop, + + /** @id MochiKit.DragAndDrop.containment */ + containment: [], + tree: false + }, options); + + // cache containers + this.options._containers = []; + b.map(MochiKit.Base.bind(function (c) { + this.options._containers.push(d.getElement(c)); + }, this), this.options.containment); + + MochiKit.Style.makePositioned(this.element); // fix IE + + MochiKit.DragAndDrop.Droppables.register(this); + }, + + /** @id MochiKit.DragAndDrop.isContained */ + isContained: function (element) { + if (this.options._containers.length) { + var containmentNode; + if (this.options.tree) { + containmentNode = element.treeNode; + } else { + containmentNode = element.parentNode; + } + return MochiKit.Iter.some(this.options._containers, function (c) { + return containmentNode == c; + }); + } else { + return true; + } + }, + + /** @id MochiKit.DragAndDrop.isAccepted */ + isAccepted: function (element) { + return ((!this.options.accept) || MochiKit.Iter.some( + this.options.accept, function (c) { + return MochiKit.DOM.hasElementClass(element, c); + })); + }, + + /** @id MochiKit.DragAndDrop.isAffected */ + isAffected: function (point, element) { + return ((this.element != element) && + this.isContained(element) && + this.isAccepted(element) && + MochiKit.Position.within(this.element, point.page.x, + point.page.y)); + }, + + /** @id MochiKit.DragAndDrop.deactivate */ + deactivate: function () { + /*** + + A droppable is deactivate when a draggable has been over it and left. + + ***/ + if (this.options.hoverclass) { + MochiKit.DOM.removeElementClass(this.element, + this.options.hoverclass); + } + this.options.hoverfunc(this.element, false); + MochiKit.DragAndDrop.Droppables.last_active = null; + }, + + /** @id MochiKit.DragAndDrop.activate */ + activate: function () { + /*** + + A droppable is active when a draggable is over it. + + ***/ + if (this.options.hoverclass) { + MochiKit.DOM.addElementClass(this.element, this.options.hoverclass); + } + this.options.hoverfunc(this.element, true); + MochiKit.DragAndDrop.Droppables.last_active = this; + }, + + /** @id MochiKit.DragAndDrop.destroy */ + destroy: function () { + /*** + + Delete this droppable. + + ***/ + MochiKit.DragAndDrop.Droppables.unregister(this); + }, + + /** @id MochiKit.DragAndDrop.repr */ + repr: function () { + return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]"; + } +}; + +MochiKit.DragAndDrop.Draggables = { + /*** + + Manage draggables elements. Not intended to direct use. + + ***/ + drags: [], + + register: function (draggable) { + if (this.drags.length === 0) { + var conn = MochiKit.Signal.connect; + this.eventMouseUp = conn(document, 'onmouseup', this, this.endDrag); + this.eventMouseMove = conn(document, 'onmousemove', this, + this.updateDrag); + this.eventKeypress = conn(document, 'onkeypress', this, + this.keyPress); + } + this.drags.push(draggable); + }, + + unregister: function (draggable) { + this.drags = MochiKit.Base.filter(function (d) { + return d != draggable; + }, this.drags); + if (this.drags.length === 0) { + var disc = MochiKit.Signal.disconnect; + disc(this.eventMouseUp); + disc(this.eventMouseMove); + disc(this.eventKeypress); + } + }, + + activate: function (draggable) { + // allows keypress events if window is not currently focused + // fails for Safari + window.focus(); + this.activeDraggable = draggable; + }, + + deactivate: function () { + this.activeDraggable = null; + }, + + updateDrag: function (event) { + if (!this.activeDraggable) { + return; + } + var pointer = event.mouse(); + // Mozilla-based browsers fire successive mousemove events with + // the same coordinates, prevent needless redrawing (moz bug?) + if (this._lastPointer && + this._lastPointer.page.x == pointer.page.x && + this._lastPointer.page.y == pointer.page.y) { + return; + } + this._lastPointer = pointer; + this.activeDraggable.updateDrag(event, pointer); + }, + + endDrag: function (event) { + if (!this.activeDraggable) { + return; + } + this._lastPointer = null; + this.activeDraggable.endDrag(event); + this.activeDraggable = null; + }, + + keyPress: function (event) { + if (this.activeDraggable) { + this.activeDraggable.keyPress(event); + } + }, + + notify: function (eventName, draggable, event) { + MochiKit.Signal.signal(this, eventName, draggable, event); + } +}; + +/** @id MochiKit.DragAndDrop.Draggable */ +MochiKit.DragAndDrop.Draggable = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.DragAndDrop.Draggable.prototype = { + /*** + + A draggable object. Simple instantiate : + + new MochiKit.DragAndDrop.Draggable('myelement'); + + ***/ + __class__ : MochiKit.DragAndDrop.Draggable, + + __init__: function (element, /* optional */options) { + var v = MochiKit.Visual; + var b = MochiKit.Base; + options = b.update({ + + /** @id MochiKit.DragAndDrop.handle */ + handle: false, + + /** @id MochiKit.DragAndDrop.starteffect */ + starteffect: function (innerelement) { + this._savedOpacity = MochiKit.Style.getStyle(innerelement, 'opacity') || 1.0; + new v.Opacity(innerelement, {duration:0.2, from:this._savedOpacity, to:0.7}); + }, + /** @id MochiKit.DragAndDrop.reverteffect */ + reverteffect: function (innerelement, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2) + + Math.abs(left_offset^2))*0.02; + return new v.Move(innerelement, + {x: -left_offset, y: -top_offset, duration: dur}); + }, + + /** @id MochiKit.DragAndDrop.endeffect */ + endeffect: function (innerelement) { + new v.Opacity(innerelement, {duration:0.2, from:0.7, to:this._savedOpacity}); + }, + + /** @id MochiKit.DragAndDrop.onchange */ + onchange: b.noop, + + /** @id MochiKit.DragAndDrop.zindex */ + zindex: 1000, + + /** @id MochiKit.DragAndDrop.revert */ + revert: false, + + /** @id MochiKit.DragAndDrop.scroll */ + scroll: false, + + /** @id MochiKit.DragAndDrop.scrollSensitivity */ + scrollSensitivity: 20, + + /** @id MochiKit.DragAndDrop.scrollSpeed */ + scrollSpeed: 15, + // false, or xy or [x, y] or function (x, y){return [x, y];} + + /** @id MochiKit.DragAndDrop.snap */ + snap: false + }, options); + + var d = MochiKit.DOM; + this.element = d.getElement(element); + + if (options.handle && (typeof(options.handle) == 'string')) { + this.handle = d.getFirstElementByTagAndClassName(null, + options.handle, this.element); + } + if (!this.handle) { + this.handle = d.getElement(options.handle); + } + if (!this.handle) { + this.handle = this.element; + } + + if (options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { + options.scroll = d.getElement(options.scroll); + this._isScrollChild = MochiKit.DOM.isChildNode(this.element, options.scroll); + } + + MochiKit.Style.makePositioned(this.element); // fix IE + + this.delta = this.currentDelta(); + this.options = options; + this.dragging = false; + + this.eventMouseDown = MochiKit.Signal.connect(this.handle, + 'onmousedown', this, this.initDrag); + MochiKit.DragAndDrop.Draggables.register(this); + }, + + /** @id MochiKit.DragAndDrop.destroy */ + destroy: function () { + MochiKit.Signal.disconnect(this.eventMouseDown); + MochiKit.DragAndDrop.Draggables.unregister(this); + }, + + /** @id MochiKit.DragAndDrop.currentDelta */ + currentDelta: function () { + var s = MochiKit.Style.getStyle; + return [ + parseInt(s(this.element, 'left') || '0', 10), + parseInt(s(this.element, 'top') || '0', 10)]; + }, + + /** @id MochiKit.DragAndDrop.initDrag */ + initDrag: function (event) { + if (!event.mouse().button.left) { + return; + } + // abort on form elements, fixes a Firefox issue + var src = event.target(); + var tagName = (src.tagName || '').toUpperCase(); + if (tagName === 'INPUT' || tagName === 'SELECT' || + tagName === 'OPTION' || tagName === 'BUTTON' || + tagName === 'TEXTAREA') { + return; + } + + if (this._revert) { + this._revert.cancel(); + this._revert = null; + } + + var pointer = event.mouse(); + var pos = MochiKit.Position.cumulativeOffset(this.element); + this.offset = [pointer.page.x - pos.x, pointer.page.y - pos.y]; + + MochiKit.DragAndDrop.Draggables.activate(this); + event.stop(); + }, + + /** @id MochiKit.DragAndDrop.startDrag */ + startDrag: function (event) { + this.dragging = true; + if (this.options.selectclass) { + MochiKit.DOM.addElementClass(this.element, + this.options.selectclass); + } + if (this.options.zindex) { + this.originalZ = MochiKit.Style.getStyle(this.element, 'z-index'); + this.element.style.zIndex = this.options.zindex; + } + + if (this.options.ghosting) { + this._clone = this.element.cloneNode(true); + this.ghostPosition = MochiKit.Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + if (this.options.scroll) { + if (this.options.scroll == window) { + var where = this._getWindowScroll(this.options.scroll); + this.originalScrollLeft = where.left; + this.originalScrollTop = where.top; + } else { + this.originalScrollLeft = this.options.scroll.scrollLeft; + this.originalScrollTop = this.options.scroll.scrollTop; + } + } + + MochiKit.DragAndDrop.Droppables.prepare(this.element); + MochiKit.DragAndDrop.Draggables.notify('start', this, event); + if (this.options.starteffect) { + this.options.starteffect(this.element); + } + }, + + /** @id MochiKit.DragAndDrop.updateDrag */ + updateDrag: function (event, pointer) { + if (!this.dragging) { + this.startDrag(event); + } + MochiKit.Position.prepare(); + MochiKit.DragAndDrop.Droppables.show(pointer, this.element); + MochiKit.DragAndDrop.Draggables.notify('drag', this, event); + this.draw(pointer); + this.options.onchange(this); + + if (this.options.scroll) { + this.stopScrolling(); + var p, q; + if (this.options.scroll == window) { + var s = this._getWindowScroll(this.options.scroll); + p = new MochiKit.Style.Coordinates(s.left, s.top); + q = new MochiKit.Style.Coordinates(s.left + s.width, + s.top + s.height); + } else { + p = MochiKit.Position.page(this.options.scroll); + p.x += this.options.scroll.scrollLeft; + p.y += this.options.scroll.scrollTop; + p.x += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0); + p.y += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0); + q = new MochiKit.Style.Coordinates(p.x + this.options.scroll.offsetWidth, + p.y + this.options.scroll.offsetHeight); + } + var speed = [0, 0]; + if (pointer.page.x > (q.x - this.options.scrollSensitivity)) { + speed[0] = pointer.page.x - (q.x - this.options.scrollSensitivity); + } else if (pointer.page.x < (p.x + this.options.scrollSensitivity)) { + speed[0] = pointer.page.x - (p.x + this.options.scrollSensitivity); + } + if (pointer.page.y > (q.y - this.options.scrollSensitivity)) { + speed[1] = pointer.page.y - (q.y - this.options.scrollSensitivity); + } else if (pointer.page.y < (p.y + this.options.scrollSensitivity)) { + speed[1] = pointer.page.y - (p.y + this.options.scrollSensitivity); + } + this.startScrolling(speed); + } + + // fix AppleWebKit rendering + if (/AppleWebKit/.test(navigator.appVersion)) { + window.scrollBy(0, 0); + } + event.stop(); + }, + + /** @id MochiKit.DragAndDrop.finishDrag */ + finishDrag: function (event, success) { + var dr = MochiKit.DragAndDrop; + this.dragging = false; + if (this.options.selectclass) { + MochiKit.DOM.removeElementClass(this.element, + this.options.selectclass); + } + + if (this.options.ghosting) { + // XXX: from a user point of view, it would be better to remove + // the node only *after* the MochiKit.Visual.Move end when used + // with revert. + MochiKit.Position.relativize(this.element, this.ghostPosition); + MochiKit.DOM.removeElement(this._clone); + this._clone = null; + } + + if (success) { + dr.Droppables.fire(event, this.element); + } + dr.Draggables.notify('end', this, event); + + var revert = this.options.revert; + if (revert && typeof(revert) == 'function') { + revert = revert(this.element); + } + + var d = this.currentDelta(); + if (revert && this.options.reverteffect) { + this._revert = this.options.reverteffect(this.element, + d[1] - this.delta[1], d[0] - this.delta[0]); + } else { + this.delta = d; + } + + if (this.options.zindex) { + this.element.style.zIndex = this.originalZ; + } + + if (this.options.endeffect) { + this.options.endeffect(this.element); + } + + dr.Draggables.deactivate(); + dr.Droppables.reset(this.element); + }, + + /** @id MochiKit.DragAndDrop.keyPress */ + keyPress: function (event) { + if (event.key().string != "KEY_ESCAPE") { + return; + } + this.finishDrag(event, false); + event.stop(); + }, + + /** @id MochiKit.DragAndDrop.endDrag */ + endDrag: function (event) { + if (!this.dragging) { + return; + } + this.stopScrolling(); + this.finishDrag(event, true); + event.stop(); + }, + + /** @id MochiKit.DragAndDrop.draw */ + draw: function (point) { + var pos = MochiKit.Position.cumulativeOffset(this.element); + var d = this.currentDelta(); + pos.x -= d[0]; + pos.y -= d[1]; + + if (this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { + pos.x -= this.options.scroll.scrollLeft - this.originalScrollLeft; + pos.y -= this.options.scroll.scrollTop - this.originalScrollTop; + } + + var p = [point.page.x - pos.x - this.offset[0], + point.page.y - pos.y - this.offset[1]]; + + if (this.options.snap) { + if (typeof(this.options.snap) == 'function') { + p = this.options.snap(p[0], p[1]); + } else { + if (this.options.snap instanceof Array) { + var i = -1; + p = MochiKit.Base.map(MochiKit.Base.bind(function (v) { + i += 1; + return Math.round(v/this.options.snap[i]) * + this.options.snap[i]; + }, this), p); + } else { + p = MochiKit.Base.map(MochiKit.Base.bind(function (v) { + return Math.round(v/this.options.snap) * + this.options.snap; + }, this), p); + } + } + } + var style = this.element.style; + if ((!this.options.constraint) || + (this.options.constraint == 'horizontal')) { + style.left = p[0] + 'px'; + } + if ((!this.options.constraint) || + (this.options.constraint == 'vertical')) { + style.top = p[1] + 'px'; + } + if (style.visibility == 'hidden') { + style.visibility = ''; // fix gecko rendering + } + }, + + /** @id MochiKit.DragAndDrop.stopScrolling */ + stopScrolling: function () { + if (this.scrollInterval) { + clearInterval(this.scrollInterval); + this.scrollInterval = null; + MochiKit.DragAndDrop.Draggables._lastScrollPointer = null; + } + }, + + /** @id MochiKit.DragAndDrop.startScrolling */ + startScrolling: function (speed) { + if (!speed[0] && !speed[1]) { + return; + } + this.scrollSpeed = [speed[0] * this.options.scrollSpeed, + speed[1] * this.options.scrollSpeed]; + this.lastScrolled = new Date(); + this.scrollInterval = setInterval(MochiKit.Base.bind(this.scroll, this), 10); + }, + + /** @id MochiKit.DragAndDrop.scroll */ + scroll: function () { + var current = new Date(); + var delta = current - this.lastScrolled; + this.lastScrolled = current; + + if (this.options.scroll == window) { + var s = this._getWindowScroll(this.options.scroll); + if (this.scrollSpeed[0] || this.scrollSpeed[1]) { + var dm = delta / 1000; + this.options.scroll.scrollTo(s.left + dm * this.scrollSpeed[0], + s.top + dm * this.scrollSpeed[1]); + } + } else { + this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; + this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; + } + + var d = MochiKit.DragAndDrop; + + MochiKit.Position.prepare(); + d.Droppables.show(d.Draggables._lastPointer, this.element); + d.Draggables.notify('drag', this); + if (this._isScrollChild) { + d.Draggables._lastScrollPointer = d.Draggables._lastScrollPointer || d.Draggables._lastPointer; + d.Draggables._lastScrollPointer.x += this.scrollSpeed[0] * delta / 1000; + d.Draggables._lastScrollPointer.y += this.scrollSpeed[1] * delta / 1000; + if (d.Draggables._lastScrollPointer.x < 0) { + d.Draggables._lastScrollPointer.x = 0; + } + if (d.Draggables._lastScrollPointer.y < 0) { + d.Draggables._lastScrollPointer.y = 0; + } + this.draw(d.Draggables._lastScrollPointer); + } + + this.options.onchange(this); + }, + + _getWindowScroll: function (win) { + var vp, w, h; + MochiKit.DOM.withWindow(win, function () { + vp = MochiKit.Style.getViewportPosition(win.document); + }); + if (win.innerWidth) { + w = win.innerWidth; + h = win.innerHeight; + } else if (win.document.documentElement && win.document.documentElement.clientWidth) { + w = win.document.documentElement.clientWidth; + h = win.document.documentElement.clientHeight; + } else { + w = win.document.body.offsetWidth; + h = win.document.body.offsetHeight; + } + return {top: vp.y, left: vp.x, width: w, height: h}; + }, + + /** @id MochiKit.DragAndDrop.repr */ + repr: function () { + return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]"; + } +}; + +MochiKit.DragAndDrop.__new__ = function () { + MochiKit.Base.nameFunctions(this); +}; + +MochiKit.DragAndDrop.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.DragAndDrop); diff --git a/frontend/delta/js/MochiKit/Format.js b/frontend/delta/js/MochiKit/Format.js new file mode 100644 index 0000000..0e7af50 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Format.js @@ -0,0 +1,332 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Format 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Format', '1.5', ['Base']); + +MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) { + return function (num) { + num = parseFloat(num); + if (typeof(num) == "undefined" || num === null || isNaN(num)) { + return placeholder; + } + var curheader = header; + var curfooter = footer; + if (num < 0) { + num = -num; + } else { + curheader = curheader.replace(/-/, ""); + } + var me = arguments.callee; + var fmt = MochiKit.Format.formatLocale(locale); + if (isPercent) { + num = num * 100.0; + curfooter = fmt.percent + curfooter; + } + num = MochiKit.Format.roundToFixed(num, precision); + var parts = num.split(/\./); + var whole = parts[0]; + var frac = (parts.length == 1) ? "" : parts[1]; + var res = ""; + while (whole.length < leadingZeros) { + whole = "0" + whole; + } + if (separatorAt) { + while (whole.length > separatorAt) { + var i = whole.length - separatorAt; + //res = res + fmt.separator + whole.substring(i, whole.length); + res = fmt.separator + whole.substring(i, whole.length) + res; + whole = whole.substring(0, i); + } + } + res = whole + res; + if (precision > 0) { + while (frac.length < trailingZeros) { + frac = frac + "0"; + } + res = res + fmt.decimal + frac; + } + return curheader + res + curfooter; + }; +}; + +/** @id MochiKit.Format.numberFormatter */ +MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) { + // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html + // | 0 | leading or trailing zeros + // | # | just the number + // | , | separator + // | . | decimal separator + // | % | Multiply by 100 and format as percent + if (typeof(placeholder) == "undefined") { + placeholder = ""; + } + var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/); + if (!match) { + throw TypeError("Invalid pattern"); + } + var header = pattern.substr(0, match.index); + var footer = pattern.substr(match.index + match[0].length); + if (header.search(/-/) == -1) { + header = header + "-"; + } + var whole = match[1]; + var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : ""; + var isPercent = (typeof(match[3]) == "string" && match[3] != ""); + var tmp = whole.split(/,/); + var separatorAt; + if (typeof(locale) == "undefined") { + locale = "default"; + } + if (tmp.length == 1) { + separatorAt = null; + } else { + separatorAt = tmp[1].length; + } + var leadingZeros = whole.length - whole.replace(/0/g, "").length; + var trailingZeros = frac.length - frac.replace(/0/g, "").length; + var precision = frac.length; + var rval = MochiKit.Format._numberFormatter( + placeholder, header, footer, locale, isPercent, precision, + leadingZeros, separatorAt, trailingZeros + ); + var m = MochiKit.Base; + if (m) { + var fn = arguments.callee; + var args = m.concat(arguments); + rval.repr = function () { + return [ + self.NAME, + "(", + m.map(m.repr, args).join(", "), + ")" + ].join(""); + }; + } + return rval; +}; + +/** @id MochiKit.Format.formatLocale */ +MochiKit.Format.formatLocale = function (locale) { + if (typeof(locale) == "undefined" || locale === null) { + locale = "default"; + } + if (typeof(locale) == "string") { + var rval = MochiKit.Format.LOCALE[locale]; + if (typeof(rval) == "string") { + rval = arguments.callee(rval); + MochiKit.Format.LOCALE[locale] = rval; + } + return rval; + } else { + return locale; + } +}; + +/** @id MochiKit.Format.twoDigitAverage */ +MochiKit.Format.twoDigitAverage = function (numerator, denominator) { + if (denominator) { + var res = numerator / denominator; + if (!isNaN(res)) { + return MochiKit.Format.twoDigitFloat(res); + } + } + return "0"; +}; + +/** @id MochiKit.Format.twoDigitFloat */ +MochiKit.Format.twoDigitFloat = function (aNumber) { + var res = MochiKit.Format.roundToFixed(aNumber, 2); + if (res.indexOf(".00") > 0) { + return res.substring(0, res.length - 3); + } else if (res.charAt(res.length - 1) == "0") { + return res.substring(0, res.length - 1); + } else { + return res; + } +}; + +/** @id MochiKit.Format.lstrip */ +MochiKit.Format.lstrip = function (str, /* optional */chars) { + str = str + ""; + if (typeof(str) != "string") { + return null; + } + if (!chars) { + return str.replace(/^\s+/, ""); + } else { + return str.replace(new RegExp("^[" + chars + "]+"), ""); + } +}; + +/** @id MochiKit.Format.rstrip */ +MochiKit.Format.rstrip = function (str, /* optional */chars) { + str = str + ""; + if (typeof(str) != "string") { + return null; + } + if (!chars) { + return str.replace(/\s+$/, ""); + } else { + return str.replace(new RegExp("[" + chars + "]+$"), ""); + } +}; + +/** @id MochiKit.Format.strip */ +MochiKit.Format.strip = function (str, /* optional */chars) { + var self = MochiKit.Format; + return self.rstrip(self.lstrip(str, chars), chars); +}; + +/** @id MochiKit.Format.truncToFixed */ +MochiKit.Format.truncToFixed = function (aNumber, precision) { + var fixed = MochiKit.Format._numberToFixed(aNumber, precision); + var fracPos = fixed.indexOf("."); + if (fracPos > 0 && fracPos + precision + 1 < fixed.length) { + fixed = fixed.substring(0, fracPos + precision + 1); + fixed = MochiKit.Format._shiftNumber(fixed, 0); + } + return fixed; +}; + +/** @id MochiKit.Format.roundToFixed */ +MochiKit.Format.roundToFixed = function (aNumber, precision) { + var fixed = MochiKit.Format._numberToFixed(aNumber, precision); + var fracPos = fixed.indexOf("."); + if (fracPos > 0 && fracPos + precision + 1 < fixed.length) { + var str = MochiKit.Format._shiftNumber(fixed, precision); + str = MochiKit.Format._numberToFixed(Math.round(parseFloat(str)), 0); + fixed = MochiKit.Format._shiftNumber(str, -precision); + } + return fixed; +}; + +/** + * Converts a number to a fixed format string. This function handles + * conversion of exponents by shifting the decimal point to the left + * or the right. It also guarantees a specified minimum number of + * fractional digits (but no maximum). + * + * @param {Number} aNumber the number to convert + * @param {Number} precision the minimum number of decimal digits + * + * @return {String} the fixed format number string + */ +MochiKit.Format._numberToFixed = function (aNumber, precision) { + var str = aNumber.toString(); + var parts = str.split(/[eE]/); + var exp = (parts.length === 1) ? 0 : parseInt(parts[1], 10) || 0; + var fixed = MochiKit.Format._shiftNumber(parts[0], exp); + parts = fixed.split(/\./); + var whole = parts[0]; + var frac = (parts.length === 1) ? "" : parts[1]; + while (frac.length < precision) { + frac += "0"; + } + if (frac.length > 0) { + return whole + "." + frac; + } else { + return whole; + } +}; + +/** + * Shifts the decimal dot location in a fixed format number string. + * This function handles negative values and will add and remove + * leading and trailing zeros as needed. + * + * @param {String} num the fixed format number string + * @param {Number} exp the base-10 exponent to apply + * + * @return {String} the new fixed format number string + */ +MochiKit.Format._shiftNumber = function (num, exp) { + var pos = num.indexOf("."); + if (pos < 0) { + pos = num.length; + } else { + num = num.substring(0, pos) + num.substring(pos + 1); + } + pos += exp; + while (pos <= 0 || (pos <= 1 && num.charAt(0) === "-")) { + if (num.charAt(0) === "-") { + num = "-0" + num.substring(1); + } else { + num = "0" + num; + } + pos++; + } + while (pos > num.length) { + num += "0"; + } + if (pos < num.length) { + num = num.substring(0, pos) + "." + num.substring(pos); + } + while (/^0[^.]/.test(num)) { + num = num.substring(1); + } + while (/^-0[^.]/.test(num)) { + num = "-" + num.substring(2); + } + return num; +}; + +/** @id MochiKit.Format.percentFormat */ +MochiKit.Format.percentFormat = function (aNumber) { + return MochiKit.Format.twoDigitFloat(100 * aNumber) + '%'; +}; + +MochiKit.Format.LOCALE = { + en_US: {separator: ",", decimal: ".", percent: "%"}, + de_DE: {separator: ".", decimal: ",", percent: "%"}, + pt_BR: {separator: ".", decimal: ",", percent: "%"}, + fr_FR: {separator: " ", decimal: ",", percent: "%"}, + "default": "en_US", + __export__: false +}; + +MochiKit.Format.__new__ = function () { + MochiKit.Base.nameFunctions(this); + var base = this.NAME + "."; + var k, v, o; + for (k in this.LOCALE) { + o = this.LOCALE[k]; + if (typeof(o) == "object") { + o.repr = function () { return this.NAME; }; + o.NAME = base + "LOCALE." + k; + } + } +}; + +MochiKit.Format.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Format); diff --git a/frontend/delta/js/MochiKit/Iter.js b/frontend/delta/js/MochiKit/Iter.js new file mode 100644 index 0000000..8f7ea3d --- a/dev/null +++ b/frontend/delta/js/MochiKit/Iter.js @@ -0,0 +1,811 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Iter 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Iter', '1.5', ['Base']); + +MochiKit.Base.update(MochiKit.Iter, { + /** @id MochiKit.Iter.registerIteratorFactory */ + registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) { + MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override); + }, + + /** @id MochiKit.Iter.isIterable */ + isIterable: function(o) { + return o != null && + (typeof(o.next) == "function" || typeof(o.iter) == "function"); + }, + + /** @id MochiKit.Iter.iter */ + iter: function (iterable, /* optional */ sentinel) { + var self = MochiKit.Iter; + if (arguments.length == 2) { + return self.takewhile( + function (a) { return a != sentinel; }, + iterable + ); + } + if (typeof(iterable.next) == 'function') { + return iterable; + } else if (typeof(iterable.iter) == 'function') { + return iterable.iter(); + /* + } else if (typeof(iterable.__iterator__) == 'function') { + // + // XXX: We can't support JavaScript 1.7 __iterator__ directly + // because of Object.prototype.__iterator__ + // + return iterable.__iterator__(); + */ + } + + try { + return self.iteratorRegistry.match(iterable); + } catch (e) { + var m = MochiKit.Base; + if (e == m.NotFound) { + e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable"); + } + throw e; + } + }, + + /** @id MochiKit.Iter.count */ + count: function (n) { + if (!n) { + n = 0; + } + var m = MochiKit.Base; + return { + repr: function () { return "count(" + n + ")"; }, + toString: m.forwardCall("repr"), + next: m.counter(n) + }; + }, + + /** @id MochiKit.Iter.cycle */ + cycle: function (p) { + var self = MochiKit.Iter; + var m = MochiKit.Base; + var lst = []; + var iterator = self.iter(p); + return { + repr: function () { return "cycle(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + try { + var rval = iterator.next(); + lst.push(rval); + return rval; + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + if (lst.length === 0) { + this.next = function () { + throw self.StopIteration; + }; + } else { + var i = -1; + this.next = function () { + i = (i + 1) % lst.length; + return lst[i]; + }; + } + return this.next(); + } + } + }; + }, + + /** @id MochiKit.Iter.repeat */ + repeat: function (elem, /* optional */n) { + var m = MochiKit.Base; + if (typeof(n) == 'undefined') { + return { + repr: function () { + return "repeat(" + m.repr(elem) + ")"; + }, + toString: m.forwardCall("repr"), + next: function () { + return elem; + } + }; + } + return { + repr: function () { + return "repeat(" + m.repr(elem) + ", " + n + ")"; + }, + toString: m.forwardCall("repr"), + next: function () { + if (n <= 0) { + throw MochiKit.Iter.StopIteration; + } + n -= 1; + return elem; + } + }; + }, + + /** @id MochiKit.Iter.next */ + next: function (iterator) { + return iterator.next(); + }, + + /** @id MochiKit.Iter.izip */ + izip: function (p, q/*, ...*/) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + var next = self.next; + var iterables = m.map(self.iter, arguments); + return { + repr: function () { return "izip(...)"; }, + toString: m.forwardCall("repr"), + next: function () { return m.map(next, iterables); } + }; + }, + + /** @id MochiKit.Iter.ifilter */ + ifilter: function (pred, seq) { + var m = MochiKit.Base; + seq = MochiKit.Iter.iter(seq); + if (pred === null) { + pred = m.operator.truth; + } + return { + repr: function () { return "ifilter(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + while (true) { + var rval = seq.next(); + if (pred(rval)) { + return rval; + } + } + // mozilla warnings aren't too bright + return undefined; + } + }; + }, + + /** @id MochiKit.Iter.ifilterfalse */ + ifilterfalse: function (pred, seq) { + var m = MochiKit.Base; + seq = MochiKit.Iter.iter(seq); + if (pred === null) { + pred = m.operator.truth; + } + return { + repr: function () { return "ifilterfalse(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + while (true) { + var rval = seq.next(); + if (!pred(rval)) { + return rval; + } + } + // mozilla warnings aren't too bright + return undefined; + } + }; + }, + + /** @id MochiKit.Iter.islice */ + islice: function (seq/*, [start,] stop[, step] */) { + var self = MochiKit.Iter; + var m = MochiKit.Base; + seq = self.iter(seq); + var start = 0; + var stop = 0; + var step = 1; + var i = -1; + if (arguments.length == 2) { + stop = arguments[1]; + } else if (arguments.length == 3) { + start = arguments[1]; + stop = arguments[2]; + } else { + start = arguments[1]; + stop = arguments[2]; + step = arguments[3]; + } + return { + repr: function () { + return "islice(" + ["...", start, stop, step].join(", ") + ")"; + }, + toString: m.forwardCall("repr"), + next: function () { + if (start >= stop) { + throw self.StopIteration; + } + + var rval; + while (i < start) { + rval = seq.next(); + i++; + } + start += step; + return rval; + } + }; + }, + + /** @id MochiKit.Iter.imap */ + imap: function (fun, p, q/*, ...*/) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + var iterables = m.map(self.iter, m.extend(null, arguments, 1)); + var map = m.map; + var next = self.next; + return { + repr: function () { return "imap(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + return fun.apply(this, map(next, iterables)); + } + }; + }, + + /** @id MochiKit.Iter.applymap */ + applymap: function (fun, seq, self) { + seq = MochiKit.Iter.iter(seq); + var m = MochiKit.Base; + return { + repr: function () { return "applymap(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + return fun.apply(self, seq.next()); + } + }; + }, + + /** @id MochiKit.Iter.chain */ + chain: function (p, q/*, ...*/) { + // dumb fast path + var self = MochiKit.Iter; + var m = MochiKit.Base; + if (arguments.length == 1) { + return self.iter(arguments[0]); + } + var argiter = m.map(self.iter, arguments); + return { + repr: function () { return "chain(...)"; }, + toString: m.forwardCall("repr"), + next: function () { + while (argiter.length > 1) { + try { + return argiter[0].next(); + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + argiter.shift(); + } + } + if (argiter.length == 1) { + // optimize last element + var arg = argiter.shift(); + this.next = m.bind("next", arg); + return this.next(); + } + throw self.StopIteration; + } + }; + }, + + /** @id MochiKit.Iter.takewhile */ + takewhile: function (pred, seq) { + var self = MochiKit.Iter; + seq = self.iter(seq); + return { + repr: function () { return "takewhile(...)"; }, + toString: MochiKit.Base.forwardCall("repr"), + next: function () { + var rval = seq.next(); + if (!pred(rval)) { + this.next = function () { + throw self.StopIteration; + }; + this.next(); + } + return rval; + } + }; + }, + + /** @id MochiKit.Iter.dropwhile */ + dropwhile: function (pred, seq) { + seq = MochiKit.Iter.iter(seq); + var m = MochiKit.Base; + var bind = m.bind; + return { + "repr": function () { return "dropwhile(...)"; }, + "toString": m.forwardCall("repr"), + "next": function () { + while (true) { + var rval = seq.next(); + if (!pred(rval)) { + break; + } + } + this.next = bind("next", seq); + return rval; + } + }; + }, + + _tee: function (ident, sync, iterable) { + sync.pos[ident] = -1; + var m = MochiKit.Base; + var listMin = m.listMin; + return { + repr: function () { return "tee(" + ident + ", ...)"; }, + toString: m.forwardCall("repr"), + next: function () { + var rval; + var i = sync.pos[ident]; + + if (i == sync.max) { + rval = iterable.next(); + sync.deque.push(rval); + sync.max += 1; + sync.pos[ident] += 1; + } else { + rval = sync.deque[i - sync.min]; + sync.pos[ident] += 1; + if (i == sync.min && listMin(sync.pos) != sync.min) { + sync.min += 1; + sync.deque.shift(); + } + } + return rval; + } + }; + }, + + /** @id MochiKit.Iter.tee */ + tee: function (iterable, n/* = 2 */) { + var rval = []; + var sync = { + "pos": [], + "deque": [], + "max": -1, + "min": -1 + }; + if (arguments.length == 1 || typeof(n) == "undefined" || n === null) { + n = 2; + } + var self = MochiKit.Iter; + iterable = self.iter(iterable); + var _tee = self._tee; + for (var i = 0; i < n; i++) { + rval.push(_tee(i, sync, iterable)); + } + return rval; + }, + + /** @id MochiKit.Iter.list */ + list: function (iterable) { + // Fast-path for Array and Array-like + var rval; + if (iterable instanceof Array) { + return iterable.slice(); + } + // this is necessary to avoid a Safari crash + if (typeof(iterable) == "function" && + !(iterable instanceof Function) && + typeof(iterable.length) == 'number') { + rval = []; + for (var i = 0; i < iterable.length; i++) { + rval.push(iterable[i]); + } + return rval; + } + + var self = MochiKit.Iter; + iterable = self.iter(iterable); + rval = []; + var a_val; + try { + while (true) { + a_val = iterable.next(); + rval.push(a_val); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + return rval; + } + // mozilla warnings aren't too bright + return undefined; + }, + + + /** @id MochiKit.Iter.reduce */ + reduce: function (fn, iterable, /* optional */initial) { + var i = 0; + var x = initial; + var self = MochiKit.Iter; + iterable = self.iter(iterable); + if (arguments.length < 3) { + try { + x = iterable.next(); + } catch (e) { + if (e == self.StopIteration) { + e = new TypeError("reduce() of empty sequence with no initial value"); + } + throw e; + } + i++; + } + try { + while (true) { + x = fn(x, iterable.next()); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + return x; + }, + + /** @id MochiKit.Iter.range */ + range: function (/* [start,] stop[, step] */) { + var start = 0; + var stop = 0; + var step = 1; + if (arguments.length == 1) { + stop = arguments[0]; + } else if (arguments.length == 2) { + start = arguments[0]; + stop = arguments[1]; + } else if (arguments.length == 3) { + start = arguments[0]; + stop = arguments[1]; + step = arguments[2]; + } else { + throw new TypeError("range() takes 1, 2, or 3 arguments!"); + } + if (step === 0) { + throw new TypeError("range() step must not be 0"); + } + return { + next: function () { + if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) { + throw MochiKit.Iter.StopIteration; + } + var rval = start; + start += step; + return rval; + }, + repr: function () { + return "range(" + [start, stop, step].join(", ") + ")"; + }, + toString: MochiKit.Base.forwardCall("repr") + }; + }, + + /** @id MochiKit.Iter.sum */ + sum: function (iterable, start/* = 0 */) { + if (typeof(start) == "undefined" || start === null) { + start = 0; + } + var x = start; + var self = MochiKit.Iter; + iterable = self.iter(iterable); + try { + while (true) { + x += iterable.next(); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + return x; + }, + + /** @id MochiKit.Iter.exhaust */ + exhaust: function (iterable) { + var self = MochiKit.Iter; + iterable = self.iter(iterable); + try { + while (true) { + iterable.next(); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + }, + + /** @id MochiKit.Iter.forEach */ + forEach: function (iterable, func, /* optional */obj) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + if (arguments.length > 2) { + func = m.bind(func, obj); + } + // fast path for array + if (m.isArrayLike(iterable) && !self.isIterable(iterable)) { + try { + for (var i = 0; i < iterable.length; i++) { + func(iterable[i]); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + } else { + self.exhaust(self.imap(func, iterable)); + } + }, + + /** @id MochiKit.Iter.every */ + every: function (iterable, func) { + var self = MochiKit.Iter; + try { + self.ifilterfalse(func, iterable).next(); + return false; + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + return true; + } + }, + + /** @id MochiKit.Iter.sorted */ + sorted: function (iterable, /* optional */cmp) { + var rval = MochiKit.Iter.list(iterable); + if (arguments.length == 1) { + cmp = MochiKit.Base.compare; + } + rval.sort(cmp); + return rval; + }, + + /** @id MochiKit.Iter.reversed */ + reversed: function (iterable) { + var rval = MochiKit.Iter.list(iterable); + rval.reverse(); + return rval; + }, + + /** @id MochiKit.Iter.some */ + some: function (iterable, func) { + var self = MochiKit.Iter; + try { + self.ifilter(func, iterable).next(); + return true; + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + return false; + } + }, + + /** @id MochiKit.Iter.iextend */ + iextend: function (lst, iterable) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + if (m.isArrayLike(iterable) && !self.isIterable(iterable)) { + // fast-path for array-like + for (var i = 0; i < iterable.length; i++) { + lst.push(iterable[i]); + } + } else { + iterable = self.iter(iterable); + try { + while (true) { + lst.push(iterable.next()); + } + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + } + } + return lst; + }, + + /** @id MochiKit.Iter.groupby */ + groupby: function(iterable, /* optional */ keyfunc) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + if (arguments.length < 2) { + keyfunc = m.operator.identity; + } + iterable = self.iter(iterable); + + // shared + var pk = undefined; + var k = undefined; + var v; + + function fetch() { + v = iterable.next(); + k = keyfunc(v); + }; + + function eat() { + var ret = v; + v = undefined; + return ret; + }; + + var first = true; + var compare = m.compare; + return { + repr: function () { return "groupby(...)"; }, + next: function() { + // iterator-next + + // iterate until meet next group + while (compare(k, pk) === 0) { + fetch(); + if (first) { + first = false; + break; + } + } + pk = k; + return [k, { + next: function() { + // subiterator-next + if (v == undefined) { // Is there something to eat? + fetch(); + } + if (compare(k, pk) !== 0) { + throw self.StopIteration; + } + return eat(); + } + }]; + } + }; + }, + + /** @id MochiKit.Iter.groupby_as_array */ + groupby_as_array: function (iterable, /* optional */ keyfunc) { + var m = MochiKit.Base; + var self = MochiKit.Iter; + if (arguments.length < 2) { + keyfunc = m.operator.identity; + } + + iterable = self.iter(iterable); + var result = []; + var first = true; + var prev_key; + var compare = m.compare; + while (true) { + try { + var value = iterable.next(); + var key = keyfunc(value); + } catch (e) { + if (e == self.StopIteration) { + break; + } + throw e; + } + if (first || compare(key, prev_key) !== 0) { + var values = []; + result.push([key, values]); + } + values.push(value); + first = false; + prev_key = key; + } + return result; + }, + + /** @id MochiKit.Iter.arrayLikeIter */ + arrayLikeIter: function (iterable) { + var i = 0; + return { + repr: function () { return "arrayLikeIter(...)"; }, + toString: MochiKit.Base.forwardCall("repr"), + next: function () { + if (i >= iterable.length) { + throw MochiKit.Iter.StopIteration; + } + return iterable[i++]; + } + }; + }, + + /** @id MochiKit.Iter.hasIterateNext */ + hasIterateNext: function (iterable) { + return (iterable && typeof(iterable.iterateNext) == "function"); + }, + + /** @id MochiKit.Iter.iterateNextIter */ + iterateNextIter: function (iterable) { + return { + repr: function () { return "iterateNextIter(...)"; }, + toString: MochiKit.Base.forwardCall("repr"), + next: function () { + var rval = iterable.iterateNext(); + if (rval === null || rval === undefined) { + throw MochiKit.Iter.StopIteration; + } + return rval; + } + }; + } +}); + + +MochiKit.Iter.__new__ = function () { + var m = MochiKit.Base; + // Re-use StopIteration if exists (e.g. SpiderMonkey) + if (typeof(StopIteration) != "undefined") { + this.StopIteration = StopIteration; + } else { + /** @id MochiKit.Iter.StopIteration */ + this.StopIteration = new m.NamedError("StopIteration"); + } + this.iteratorRegistry = new m.AdapterRegistry(); + // Register the iterator factory for arrays + this.registerIteratorFactory( + "arrayLike", + m.isArrayLike, + this.arrayLikeIter + ); + + this.registerIteratorFactory( + "iterateNext", + this.hasIterateNext, + this.iterateNextIter + ); + + m.nameFunctions(this); + +}; + +MochiKit.Iter.__new__(); + +// +// XXX: Internet Explorer blows +// +if (MochiKit.__export__) { + reduce = MochiKit.Iter.reduce; +} + +MochiKit.Base._exportSymbols(this, MochiKit.Iter); diff --git a/frontend/delta/js/MochiKit/Logging.js b/frontend/delta/js/MochiKit/Logging.js new file mode 100644 index 0000000..34070bc --- a/dev/null +++ b/frontend/delta/js/MochiKit/Logging.js @@ -0,0 +1,285 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Logging 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Logging', '1.5', ['Base']); + + /** @id MochiKit.Logging.LogMessage */ +MochiKit.Logging.LogMessage = function (num, level, info) { + this.num = num; + this.level = level; + this.info = info; + this.timestamp = new Date(); +}; + +MochiKit.Logging.LogMessage.prototype = { + /** @id MochiKit.Logging.LogMessage.prototype.repr */ + repr: function () { + var m = MochiKit.Base; + return 'LogMessage(' + + m.map( + m.repr, + [this.num, this.level, this.info] + ).join(', ') + ')'; + }, + /** @id MochiKit.Logging.LogMessage.prototype.toString */ + toString: MochiKit.Base.forwardCall("repr") +}; + +MochiKit.Base.update(MochiKit.Logging, { + /** @id MochiKit.Logging.logLevelAtLeast */ + logLevelAtLeast: function (minLevel) { + var self = MochiKit.Logging; + if (typeof(minLevel) == 'string') { + minLevel = self.LogLevel[minLevel]; + } + return function (msg) { + var msgLevel = msg.level; + if (typeof(msgLevel) == 'string') { + msgLevel = self.LogLevel[msgLevel]; + } + return msgLevel >= minLevel; + }; + }, + + /** @id MochiKit.Logging.isLogMessage */ + isLogMessage: function (/* ... */) { + var LogMessage = MochiKit.Logging.LogMessage; + for (var i = 0; i < arguments.length; i++) { + if (!(arguments[i] instanceof LogMessage)) { + return false; + } + } + return true; + }, + + /** @id MochiKit.Logging.compareLogMessage */ + compareLogMessage: function (a, b) { + return MochiKit.Base.compare([a.level, a.info], [b.level, b.info]); + }, + + /** @id MochiKit.Logging.alertListener */ + alertListener: function (msg) { + alert( + "num: " + msg.num + + "\nlevel: " + msg.level + + "\ninfo: " + msg.info.join(" ") + ); + } + +}); + +/** @id MochiKit.Logging.Logger */ +MochiKit.Logging.Logger = function (/* optional */maxSize) { + this.counter = 0; + if (typeof(maxSize) == 'undefined' || maxSize === null) { + maxSize = -1; + } + this.maxSize = maxSize; + this._messages = []; + this.listeners = {}; + this.useNativeConsole = false; +}; + +MochiKit.Logging.Logger.prototype = { + /** @id MochiKit.Logging.Logger.prototype.clear */ + clear: function () { + this._messages.splice(0, this._messages.length); + }, + + /** @id MochiKit.Logging.Logger.prototype.logToConsole */ + logToConsole: function (msg) { + if (typeof(window) != "undefined" && window.console + && window.console.log) { + // Safari and FireBug 0.4 + // Percent replacement is a workaround for cute Safari crashing bug + window.console.log(msg.replace(/%/g, '\uFF05')); + } else if (typeof(opera) != "undefined" && opera.postError) { + // Opera + opera.postError(msg); + } else if (typeof(Debug) != "undefined" && Debug.writeln) { + // IE Web Development Helper (?) + // http://www.nikhilk.net/Entry.aspx?id=93 + Debug.writeln(msg); + } else if (typeof(debug) != "undefined" && debug.trace) { + // Atlas framework (?) + // http://www.nikhilk.net/Entry.aspx?id=93 + debug.trace(msg); + } + }, + + /** @id MochiKit.Logging.Logger.prototype.dispatchListeners */ + dispatchListeners: function (msg) { + for (var k in this.listeners) { + var pair = this.listeners[k]; + if (pair.ident != k || (pair[0] && !pair[0](msg))) { + continue; + } + pair[1](msg); + } + }, + + /** @id MochiKit.Logging.Logger.prototype.addListener */ + addListener: function (ident, filter, listener) { + if (typeof(filter) == 'string') { + filter = MochiKit.Logging.logLevelAtLeast(filter); + } + var entry = [filter, listener]; + entry.ident = ident; + this.listeners[ident] = entry; + }, + + /** @id MochiKit.Logging.Logger.prototype.removeListener */ + removeListener: function (ident) { + delete this.listeners[ident]; + }, + + /** @id MochiKit.Logging.Logger.prototype.baseLog */ + baseLog: function (level, message/*, ...*/) { + if (typeof(level) == "number") { + if (level >= MochiKit.Logging.LogLevel.FATAL) { + level = 'FATAL'; + } else if (level >= MochiKit.Logging.LogLevel.ERROR) { + level = 'ERROR'; + } else if (level >= MochiKit.Logging.LogLevel.WARNING) { + level = 'WARNING'; + } else if (level >= MochiKit.Logging.LogLevel.INFO) { + level = 'INFO'; + } else { + level = 'DEBUG'; + } + } + var msg = new MochiKit.Logging.LogMessage( + this.counter, + level, + MochiKit.Base.extend(null, arguments, 1) + ); + this._messages.push(msg); + this.dispatchListeners(msg); + if (this.useNativeConsole) { + this.logToConsole(msg.level + ": " + msg.info.join(" ")); + } + this.counter += 1; + while (this.maxSize >= 0 && this._messages.length > this.maxSize) { + this._messages.shift(); + } + }, + + /** @id MochiKit.Logging.Logger.prototype.getMessages */ + getMessages: function (howMany) { + var firstMsg = 0; + if (!(typeof(howMany) == 'undefined' || howMany === null)) { + firstMsg = Math.max(0, this._messages.length - howMany); + } + return this._messages.slice(firstMsg); + }, + + /** @id MochiKit.Logging.Logger.prototype.getMessageText */ + getMessageText: function (howMany) { + if (typeof(howMany) == 'undefined' || howMany === null) { + howMany = 30; + } + var messages = this.getMessages(howMany); + if (messages.length) { + var lst = MochiKit.Base.map(function (m) { + return '\n [' + m.num + '] ' + m.level + ': ' + m.info.join(' '); + }, messages); + lst.unshift('LAST ' + messages.length + ' MESSAGES:'); + return lst.join(''); + } + return ''; + }, + + /** @id MochiKit.Logging.Logger.prototype.debuggingBookmarklet */ + debuggingBookmarklet: function (inline) { + if (typeof(MochiKit.LoggingPane) == "undefined") { + alert(this.getMessageText()); + } else { + MochiKit.LoggingPane.createLoggingPane(inline || false); + } + } +}; + +MochiKit.Logging.__new__ = function () { + this.LogLevel = { + ERROR: 40, + FATAL: 50, + WARNING: 30, + INFO: 20, + DEBUG: 10 + }; + + var m = MochiKit.Base; + m.registerComparator("LogMessage", + this.isLogMessage, + this.compareLogMessage + ); + + var partial = m.partial; + + var Logger = this.Logger; + var baseLog = Logger.prototype.baseLog; + m.update(this.Logger.prototype, { + debug: partial(baseLog, 'DEBUG'), + log: partial(baseLog, 'INFO'), + error: partial(baseLog, 'ERROR'), + fatal: partial(baseLog, 'FATAL'), + warning: partial(baseLog, 'WARNING') + }); + + // indirectly find logger so it can be replaced + var self = this; + var connectLog = function (name) { + return function () { + self.logger[name].apply(self.logger, arguments); + }; + }; + + /** @id MochiKit.Logging.log */ + this.log = connectLog('log'); + /** @id MochiKit.Logging.logError */ + this.logError = connectLog('error'); + /** @id MochiKit.Logging.logDebug */ + this.logDebug = connectLog('debug'); + /** @id MochiKit.Logging.logFatal */ + this.logFatal = connectLog('fatal'); + /** @id MochiKit.Logging.logWarning */ + this.logWarning = connectLog('warning'); + this.logger = new Logger(); + this.logger.useNativeConsole = true; + + m.nameFunctions(this); +}; + +MochiKit.Logging.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Logging); diff --git a/frontend/delta/js/MochiKit/LoggingPane.js b/frontend/delta/js/MochiKit/LoggingPane.js new file mode 100644 index 0000000..e35aee8 --- a/dev/null +++ b/frontend/delta/js/MochiKit/LoggingPane.js @@ -0,0 +1,353 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.LoggingPane 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'LoggingPane', '1.5', ['Base', 'Logging']); + +/** @id MochiKit.LoggingPane.createLoggingPane */ +MochiKit.LoggingPane.createLoggingPane = function (inline/* = false */) { + var m = MochiKit.LoggingPane; + inline = !(!inline); + if (m._loggingPane && m._loggingPane.inline != inline) { + m._loggingPane.closePane(); + m._loggingPane = null; + } + if (!m._loggingPane || m._loggingPane.closed) { + m._loggingPane = new m.LoggingPane(inline, MochiKit.Logging.logger); + } + return m._loggingPane; +}; + +/** + * @id MochiKit.LoggingPane.LoggingPane + * @constructor + */ +MochiKit.LoggingPane.LoggingPane = function (inline/* = false */, logger/* = MochiKit.Logging.logger */) { + + /* Use a div if inline, pop up a window if not */ + /* Create the elements */ + if (typeof(logger) == "undefined" || logger === null) { + logger = MochiKit.Logging.logger; + } + this.logger = logger; + var update = MochiKit.Base.update; + var updatetree = MochiKit.Base.updatetree; + var bind = MochiKit.Base.bind; + var clone = MochiKit.Base.clone; + var win = window; + var uid = "_MochiKit_LoggingPane"; + if (typeof(MochiKit.DOM) != "undefined") { + win = MochiKit.DOM.currentWindow(); + } + if (!inline) { + // name the popup with the base URL for uniqueness + var url = win.location.href.split("?")[0].replace(/[#:\/.><&%-]/g, "_"); + var name = uid + "_" + url; + var nwin = win.open("", name, "dependent,resizable,height=200"); + if (!nwin) { + alert("Not able to open debugging window due to pop-up blocking."); + return undefined; + } + nwin.document.write( + '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ' + + '"http://www.w3.org/TR/html4/loose.dtd">' + + '<html><head><title>[MochiKit.LoggingPane]</title></head>' + + '<body></body></html>' + ); + nwin.document.close(); + nwin.document.title += ' ' + win.document.title; + win = nwin; + } + var doc = win.document; + this.doc = doc; + + // Connect to the debug pane if it already exists (i.e. in a window orphaned by the page being refreshed) + var debugPane = doc.getElementById(uid); + var existing_pane = !!debugPane; + if (debugPane && typeof(debugPane.loggingPane) != "undefined") { + debugPane.loggingPane.logger = this.logger; + debugPane.loggingPane.buildAndApplyFilter(); + return debugPane.loggingPane; + } + + if (existing_pane) { + // clear any existing contents + var child; + while ((child = debugPane.firstChild)) { + debugPane.removeChild(child); + } + } else { + debugPane = doc.createElement("div"); + debugPane.id = uid; + } + debugPane.loggingPane = this; + var levelFilterField = doc.createElement("input"); + var infoFilterField = doc.createElement("input"); + var filterButton = doc.createElement("button"); + var loadButton = doc.createElement("button"); + var clearButton = doc.createElement("button"); + var closeButton = doc.createElement("button"); + var logPaneArea = doc.createElement("div"); + var logPane = doc.createElement("div"); + + /* Set up the functions */ + var listenerId = uid + "_Listener"; + this.colorTable = clone(this.colorTable); + var messages = []; + var messageFilter = null; + + /** @id MochiKit.LoggingPane.messageLevel */ + var messageLevel = function (msg) { + var level = msg.level; + if (typeof(level) == "number") { + level = MochiKit.Logging.LogLevel[level]; + } + return level; + }; + + /** @id MochiKit.LoggingPane.messageText */ + var messageText = function (msg) { + return msg.info.join(" "); + }; + + /** @id MochiKit.LoggingPane.addMessageText */ + var addMessageText = bind(function (msg) { + var level = messageLevel(msg); + var text = messageText(msg); + var c = this.colorTable[level]; + var p = doc.createElement("span"); + p.className = "MochiKit-LogMessage MochiKit-LogLevel-" + level; + p.style.cssText = "margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: " + c; + p.appendChild(doc.createTextNode(level + ": " + text)); + logPane.appendChild(p); + logPane.appendChild(doc.createElement("br")); + if (logPaneArea.offsetHeight > logPaneArea.scrollHeight) { + logPaneArea.scrollTop = 0; + } else { + logPaneArea.scrollTop = logPaneArea.scrollHeight; + } + }, this); + + /** @id MochiKit.LoggingPane.addMessage */ + var addMessage = function (msg) { + messages[messages.length] = msg; + addMessageText(msg); + }; + + /** @id MochiKit.LoggingPane.buildMessageFilter */ + var buildMessageFilter = function () { + var levelre, infore; + try { + /* Catch any exceptions that might arise due to invalid regexes */ + levelre = new RegExp(levelFilterField.value); + infore = new RegExp(infoFilterField.value); + } catch(e) { + /* If there was an error with the regexes, do no filtering */ + MochiKit.Logging.logDebug("Error in filter regex: " + e.message); + return null; + } + + return function (msg) { + return ( + levelre.test(messageLevel(msg)) && + infore.test(messageText(msg)) + ); + }; + }; + + /** @id MochiKit.LoggingPane.clearMessagePane */ + var clearMessagePane = function () { + while (logPane.firstChild) { + logPane.removeChild(logPane.firstChild); + } + }; + + /** @id MochiKit.LoggingPane.clearMessages */ + var clearMessages = function () { + messages = []; + clearMessagePane(); + }; + + /** @id MochiKit.LoggingPane.closePane */ + var closePane = bind(function () { + if (this.closed) { + return; + } + this.closed = true; + if (MochiKit.LoggingPane._loggingPane == this) { + MochiKit.LoggingPane._loggingPane = null; + } + this.logger.removeListener(listenerId); + try { + try { + debugPane.loggingPane = null; + } catch(e) { MochiKit.Logging.logFatal("Bookmarklet was closed incorrectly."); } + if (inline) { + debugPane.parentNode.removeChild(debugPane); + } else { + this.win.close(); + } + } catch(e) {} + }, this); + + /** @id MochiKit.LoggingPane.filterMessages */ + var filterMessages = function () { + clearMessagePane(); + + for (var i = 0; i < messages.length; i++) { + var msg = messages[i]; + if (messageFilter === null || messageFilter(msg)) { + addMessageText(msg); + } + } + }; + + this.buildAndApplyFilter = function () { + messageFilter = buildMessageFilter(); + + filterMessages(); + + this.logger.removeListener(listenerId); + this.logger.addListener(listenerId, messageFilter, addMessage); + }; + + + /** @id MochiKit.LoggingPane.loadMessages */ + var loadMessages = bind(function () { + messages = this.logger.getMessages(); + filterMessages(); + }, this); + + /** @id MochiKit.LoggingPane.filterOnEnter */ + var filterOnEnter = bind(function (event) { + event = event || window.event; + var key = event.which || event.keyCode; + if (key == 13) { + this.buildAndApplyFilter(); + } + }, this); + + /* Create the debug pane */ + var style = "display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: " + this.logFont; + if (inline) { + style += "; height: 10em; border-top: 2px solid black"; + } else { + style += "; height: 100%;"; + } + debugPane.style.cssText = style; + + if (!existing_pane) { + doc.body.appendChild(debugPane); + } + + /* Create the filter fields */ + style = {"cssText": "width: 33%; display: inline; font: " + this.logFont}; + + updatetree(levelFilterField, { + "value": "FATAL|ERROR|WARNING|INFO|DEBUG", + "onkeypress": filterOnEnter, + "style": style + }); + debugPane.appendChild(levelFilterField); + + updatetree(infoFilterField, { + "value": ".*", + "onkeypress": filterOnEnter, + "style": style + }); + debugPane.appendChild(infoFilterField); + + /* Create the buttons */ + style = "width: 8%; display:inline; font: " + this.logFont; + + filterButton.appendChild(doc.createTextNode("Filter")); + filterButton.onclick = bind("buildAndApplyFilter", this); + filterButton.style.cssText = style; + debugPane.appendChild(filterButton); + + loadButton.appendChild(doc.createTextNode("Load")); + loadButton.onclick = loadMessages; + loadButton.style.cssText = style; + debugPane.appendChild(loadButton); + + clearButton.appendChild(doc.createTextNode("Clear")); + clearButton.onclick = clearMessages; + clearButton.style.cssText = style; + debugPane.appendChild(clearButton); + + closeButton.appendChild(doc.createTextNode("Close")); + closeButton.onclick = closePane; + closeButton.style.cssText = style; + debugPane.appendChild(closeButton); + + /* Create the logging pane */ + logPaneArea.style.cssText = "overflow: auto; width: 100%"; + logPane.style.cssText = "width: 100%; height: " + (inline ? "8em" : "100%"); + + logPaneArea.appendChild(logPane); + debugPane.appendChild(logPaneArea); + + this.buildAndApplyFilter(); + loadMessages(); + + if (inline) { + this.win = undefined; + } else { + this.win = win; + } + this.inline = inline; + this.closePane = closePane; + this.closed = false; + + + return this; +}; + +MochiKit.LoggingPane.LoggingPane.prototype = { + "logFont": "8pt Verdana,sans-serif", + "colorTable": { + "ERROR": "red", + "FATAL": "darkred", + "WARNING": "blue", + "INFO": "black", + "DEBUG": "green" + } +}; + +MochiKit.LoggingPane.__new__ = function () { + MochiKit.Base.nameFunctions(this); + MochiKit.LoggingPane._loggingPane = null; +}; + +MochiKit.LoggingPane.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.LoggingPane); diff --git a/frontend/delta/js/MochiKit/MochiKit.js b/frontend/delta/js/MochiKit/MochiKit.js new file mode 100644 index 0000000..5fac077 --- a/dev/null +++ b/frontend/delta/js/MochiKit/MochiKit.js @@ -0,0 +1,156 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.MochiKit 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +var MochiKit = MochiKit || {}; + +/** @id MochiKit.MochiKit */ +MochiKit.MochiKit = MochiKit.MochiKit || {}; + +MochiKit.MochiKit.NAME = "MochiKit.MochiKit"; +MochiKit.MochiKit.VERSION = "1.5"; +MochiKit.MochiKit.__export__ = false; +MochiKit.MochiKit.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +/** @id MochiKit.MochiKit.toString */ +MochiKit.MochiKit.toString = function () { + return this.__repr__(); +}; + +/** @id MochiKit.MochiKit.SUBMODULES */ +MochiKit.MochiKit.SUBMODULES = [ + "Base", + "Iter", + "Logging", + "DateTime", + "Format", + "Text", + "Async", + "DOM", + "Selector", + "Style", + "LoggingPane", + "Color", + "Signal", + "Position", + "Visual", + "DragAndDrop", + "Sortable" +]; + +(function () { + if (typeof(document) == "undefined") { + return; + } + var scripts = document.getElementsByTagName("script"); + var kXHTMLNSURI = "http://www.w3.org/1999/xhtml"; + var kSVGNSURI = "http://www.w3.org/2000/svg"; + var kXLINKNSURI = "http://www.w3.org/1999/xlink"; + var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + var base = null; + var baseElem = null; + var allScripts = {}; + var i; + var src; + for (i = 0; i < scripts.length; i++) { + src = null; + switch (scripts[i].namespaceURI) { + case kSVGNSURI: + src = scripts[i].getAttributeNS(kXLINKNSURI, "href"); + break; + /* + case null: // HTML + case '': // HTML + case kXHTMLNSURI: + case kXULNSURI: + */ + default: + src = scripts[i].getAttribute("src"); + break; + } + if (!src) { + continue; + } + allScripts[src] = true; + if (src.match(/MochiKit.js(\?.*)?$/)) { + base = src.substring(0, src.lastIndexOf('MochiKit.js')); + baseElem = scripts[i]; + } + } + if (base === null) { + return; + } + var modules = MochiKit.MochiKit.SUBMODULES; + for (var i = 0; i < modules.length; i++) { + if (MochiKit[modules[i]]) { + continue; + } + var uri = base + modules[i] + '.js'; + if (uri in allScripts) { + continue; + } + if (baseElem.namespaceURI == kSVGNSURI || + baseElem.namespaceURI == kXULNSURI) { + // SVG, XUL + /* + SVG does not support document.write, so if Safari wants to + support SVG tests it should fix its deferred loading bug + (see following below). + */ + var s = document.createElementNS(baseElem.namespaceURI, 'script'); + s.setAttribute("id", "MochiKit_" + base + modules[i]); + if (baseElem.namespaceURI == kSVGNSURI) { + s.setAttributeNS(kXLINKNSURI, 'href', uri); + } else { + s.setAttribute('src', uri); + } + s.setAttribute("type", "application/x-javascript"); + baseElem.parentNode.appendChild(s); + } else { + // HTML, XHTML + /* + DOM can not be used here because Safari does + deferred loading of scripts unless they are + in the document or inserted with document.write + + This is not XHTML compliant. If you want XHTML + compliance then you must use the packed version of MochiKit + or include each script individually (basically unroll + these document.write calls into your XHTML source) + */ + document.write('<' + baseElem.nodeName + ' src="' + uri + + '" type="text/javascript"></script>'); + } + }; +})(); diff --git a/frontend/delta/js/MochiKit/MockDOM.js b/frontend/delta/js/MochiKit/MockDOM.js new file mode 100644 index 0000000..6df7922 --- a/dev/null +++ b/frontend/delta/js/MochiKit/MockDOM.js @@ -0,0 +1,135 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.MockDOM 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +var MochiKit = MochiKit || {}; + +MochiKit.MockDOM = MochiKit.MockDOM || {}; + +MochiKit.MockDOM.NAME = "MochiKit.MockDOM"; +MochiKit.MockDOM.VERSION = "1.5"; +MochiKit.MockDOM.__export__ = false; + +MochiKit.MockDOM.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; +}; + +/** @id MochiKit.MockDOM.toString */ +MochiKit.MockDOM.toString = function () { + return this.__repr__(); +}; + +/** @id MochiKit.MockDOM.createDocument */ +MochiKit.MockDOM.createDocument = function () { + var doc = new MochiKit.MockDOM.MockElement("DOCUMENT"); + doc.body = doc.createElement("BODY"); + doc.appendChild(doc.body); + return doc; +}; + +/** @id MochiKit.MockDOM.MockElement */ +MochiKit.MockDOM.MockElement = function (name, data, ownerDocument) { + this.tagName = this.nodeName = name.toUpperCase(); + this.ownerDocument = ownerDocument || null; + if (name == "DOCUMENT") { + this.nodeType = 9; + this.childNodes = []; + } else if (typeof(data) == "string") { + this.nodeValue = data; + this.nodeType = 3; + } else { + this.nodeType = 1; + this.childNodes = []; + } + if (name.substring(0, 1) == "<") { + var nameattr = name.substring( + name.indexOf('"') + 1, name.lastIndexOf('"')); + name = name.substring(1, name.indexOf(" ")); + this.tagName = this.nodeName = name.toUpperCase(); + this.setAttribute("name", nameattr); + } +}; + +MochiKit.MockDOM.MockElement.prototype = { + /** @id MochiKit.MockDOM.MockElement.prototype.createElement */ + createElement: function (tagName) { + return new MochiKit.MockDOM.MockElement(tagName, null, this.nodeType == 9 ? this : this.ownerDocument); + }, + /** @id MochiKit.MockDOM.MockElement.prototype.createTextNode */ + createTextNode: function (text) { + return new MochiKit.MockDOM.MockElement("text", text, this.nodeType == 9 ? this : this.ownerDocument); + }, + /** @id MochiKit.MockDOM.MockElement.prototype.setAttribute */ + setAttribute: function (name, value) { + this[name] = value; + }, + /** @id MochiKit.MockDOM.MockElement.prototype.getAttribute */ + getAttribute: function (name) { + return this[name]; + }, + /** @id MochiKit.MockDOM.MockElement.prototype.appendChild */ + appendChild: function (child) { + this.childNodes.push(child); + }, + /** @id MochiKit.MockDOM.MockElement.prototype.toString */ + toString: function () { + return "MockElement(" + this.tagName + ")"; + }, + /** @id MochiKit.MockDOM.MockElement.prototype.getElementsByTagName */ + getElementsByTagName: function (tagName) { + var foundElements = []; + MochiKit.Base.nodeWalk(this, function(node){ + if (tagName == '*' || tagName == node.tagName) { + foundElements.push(node); + return node.childNodes; + } + }); + return foundElements; + } +}; + + /** @id MochiKit.MockDOM.EXPORT_OK */ +MochiKit.MockDOM.EXPORT_OK = [ + "mockElement", + "createDocument" +]; + + /** @id MochiKit.MockDOM.EXPORT */ +MochiKit.MockDOM.EXPORT = [ + "document" +]; + +MochiKit.MockDOM.__new__ = function () { + this.document = this.createDocument(); +}; + +MochiKit.MockDOM.__new__(); diff --git a/frontend/delta/js/MochiKit/Position.js b/frontend/delta/js/MochiKit/Position.js new file mode 100644 index 0000000..e5f4543 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Position.js @@ -0,0 +1,241 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Position 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005-2006 Bob Ippolito and others. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Position', '1.5', ['Base', 'DOM', 'Style']); + +MochiKit.Base.update(MochiKit.Position, { + // Don't export from this module + __export__: false, + + // set to true if needed, warning: firefox performance problems + // NOT neeeded for page scrolling, only if draggable contained in + // scrollable elements + includeScrollOffsets: false, + + /** @id MochiKit.Position.prepare */ + prepare: function () { + var deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + var deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY); + }, + + /** @id MochiKit.Position.cumulativeOffset */ + cumulativeOffset: function (element) { + var valueT = 0; + var valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return new MochiKit.Style.Coordinates(valueL, valueT); + }, + + /** @id MochiKit.Position.realOffset */ + realOffset: function (element) { + var valueT = 0; + var valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return new MochiKit.Style.Coordinates(valueL, valueT); + }, + + /** @id MochiKit.Position.within */ + within: function (element, x, y) { + if (this.includeScrollOffsets) { + return this.withinIncludingScrolloffsets(element, x, y); + } + this.xcomp = x; + this.ycomp = y; + this.offset = this.cumulativeOffset(element); + if (element.style.position == "fixed") { + this.offset.x += this.windowOffset.x; + this.offset.y += this.windowOffset.y; + } + + return (y >= this.offset.y && + y < this.offset.y + element.offsetHeight && + x >= this.offset.x && + x < this.offset.x + element.offsetWidth); + }, + + /** @id MochiKit.Position.withinIncludingScrolloffsets */ + withinIncludingScrolloffsets: function (element, x, y) { + var offsetcache = this.realOffset(element); + + this.xcomp = x + offsetcache.x - this.windowOffset.x; + this.ycomp = y + offsetcache.y - this.windowOffset.y; + this.offset = this.cumulativeOffset(element); + + return (this.ycomp >= this.offset.y && + this.ycomp < this.offset.y + element.offsetHeight && + this.xcomp >= this.offset.x && + this.xcomp < this.offset.x + element.offsetWidth); + }, + + // within must be called directly before + /** @id MochiKit.Position.overlap */ + overlap: function (mode, element) { + if (!mode) { + return 0; + } + if (mode == 'vertical') { + return ((this.offset.y + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + } + if (mode == 'horizontal') { + return ((this.offset.x + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + } + }, + + /** @id MochiKit.Position.absolutize */ + absolutize: function (element) { + element = MochiKit.DOM.getElement(element); + if (element.style.position == 'absolute') { + return; + } + MochiKit.Position.prepare(); + + var offsets = MochiKit.Position.positionedOffset(element); + var width = element.clientWidth; + var height = element.clientHeight; + + var oldStyle = { + 'position': element.style.position, + 'left': offsets.x - parseFloat(element.style.left || 0), + 'top': offsets.y - parseFloat(element.style.top || 0), + 'width': element.style.width, + 'height': element.style.height + }; + + element.style.position = 'absolute'; + element.style.top = offsets.y + 'px'; + element.style.left = offsets.x + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + + return oldStyle; + }, + + /** @id MochiKit.Position.positionedOffset */ + positionedOffset: function (element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + var p = MochiKit.Style.getStyle(element, 'position'); + if (p == 'relative' || p == 'absolute') { + break; + } + } + } while (element); + return new MochiKit.Style.Coordinates(valueL, valueT); + }, + + /** @id MochiKit.Position.relativize */ + relativize: function (element, oldPos) { + element = MochiKit.DOM.getElement(element); + if (element.style.position == 'relative') { + return; + } + MochiKit.Position.prepare(); + + var top = parseFloat(element.style.top || 0) - + (oldPos['top'] || 0); + var left = parseFloat(element.style.left || 0) - + (oldPos['left'] || 0); + + element.style.position = oldPos['position']; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = oldPos['width']; + element.style.height = oldPos['height']; + }, + + /** @id MochiKit.Position.clone */ + clone: function (source, target) { + source = MochiKit.DOM.getElement(source); + target = MochiKit.DOM.getElement(target); + target.style.position = 'absolute'; + var offsets = this.cumulativeOffset(source); + target.style.top = offsets.y + 'px'; + target.style.left = offsets.x + 'px'; + target.style.width = source.offsetWidth + 'px'; + target.style.height = source.offsetHeight + 'px'; + }, + + /** @id MochiKit.Position.page */ + page: function (forElement) { + var valueT = 0; + var valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent == document.body && MochiKit.Style.getStyle(element, 'position') == 'absolute') { + break; + } + } while (element = element.offsetParent); + + element = forElement; + do { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } while (element = element.parentNode); + + return new MochiKit.Style.Coordinates(valueL, valueT); + } +}); + +MochiKit.Position.__new__ = function (win) { + MochiKit.Base.nameFunctions(this); +}; + +MochiKit.Position.__new__(this); + +MochiKit.Base._exportSymbols(this, MochiKit.Position); diff --git a/frontend/delta/js/MochiKit/Selector.js b/frontend/delta/js/MochiKit/Selector.js new file mode 100644 index 0000000..2719b13 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Selector.js @@ -0,0 +1,416 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Selector 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Selector', '1.5', ['Base', 'DOM', 'Iter']); + +MochiKit.Selector.Selector = function (expression) { + this.params = {classNames: [], pseudoClassNames: []}; + this.expression = expression.toString().replace(/(^\s+|\s+$)/g, ''); + this.parseExpression(); + this.compileMatcher(); +}; + +MochiKit.Selector.Selector.prototype = { + /*** + + Selector class: convenient object to make CSS selections. + + ***/ + __class__: MochiKit.Selector.Selector, + + /** @id MochiKit.Selector.Selector.prototype.parseExpression */ + parseExpression: function () { + function abort(message) { + throw 'Parse error in selector: ' + message; + } + + if (this.expression == '') { + abort('empty expression'); + } + + var repr = MochiKit.Base.repr; + var params = this.params; + var expr = this.expression; + var match, modifier, clause, rest; + while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!^$*]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { + params.attributes = params.attributes || []; + params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); + expr = match[1]; + } + + if (expr == '*') { + return this.params.wildcard = true; + } + + while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+(?:\([^)]*\))?)(.*)/i)) { + modifier = match[1]; + clause = match[2]; + rest = match[3]; + switch (modifier) { + case '#': + params.id = clause; + break; + case '.': + params.classNames.push(clause); + break; + case ':': + params.pseudoClassNames.push(clause); + break; + case '': + case undefined: + params.tagName = clause.toUpperCase(); + break; + default: + abort(repr(expr)); + } + expr = rest; + } + + if (expr.length > 0) { + abort(repr(expr)); + } + }, + + /** @id MochiKit.Selector.Selector.prototype.buildMatchExpression */ + buildMatchExpression: function () { + var repr = MochiKit.Base.repr; + var params = this.params; + var conditions = []; + var clause, i; + + function childElements(element) { + return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, " + element + ".childNodes)"; + } + + if (params.wildcard) { + conditions.push('true'); + } + if (clause = params.id) { + conditions.push('element.id == ' + repr(clause)); + } + if (clause = params.tagName) { + conditions.push('element.tagName.toUpperCase() == ' + repr(clause)); + } + if ((clause = params.classNames).length > 0) { + for (i = 0; i < clause.length; i++) { + conditions.push('MochiKit.DOM.hasElementClass(element, ' + repr(clause[i]) + ')'); + } + } + if ((clause = params.pseudoClassNames).length > 0) { + for (i = 0; i < clause.length; i++) { + var match = clause[i].match(/^([^(]+)(?:\((.*)\))?$/); + var pseudoClass = match[1]; + var pseudoClassArgument = match[2]; + switch (pseudoClass) { + case 'root': + conditions.push('element.nodeType == 9 || element === element.ownerDocument.documentElement'); break; + case 'nth-child': + case 'nth-last-child': + case 'nth-of-type': + case 'nth-last-of-type': + match = pseudoClassArgument.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/); + if (!match) { + throw "Invalid argument to pseudo element nth-child: " + pseudoClassArgument; + } + var a, b; + if (match[0] == 'odd') { + a = 2; + b = 1; + } else if (match[0] == 'even') { + a = 2; + b = 0; + } else { + a = match[2] && parseInt(match, 10) || null; + b = parseInt(match[3], 10); + } + conditions.push('this.nthChild(element,' + a + ',' + b + + ',' + !!pseudoClass.match('^nth-last') // Reverse + + ',' + !!pseudoClass.match('of-type$') // Restrict to same tagName + + ')'); + break; + case 'first-child': + conditions.push('this.nthChild(element, null, 1)'); + break; + case 'last-child': + conditions.push('this.nthChild(element, null, 1, true)'); + break; + case 'first-of-type': + conditions.push('this.nthChild(element, null, 1, false, true)'); + break; + case 'last-of-type': + conditions.push('this.nthChild(element, null, 1, true, true)'); + break; + case 'only-child': + conditions.push(childElements('element.parentNode') + '.length == 1'); + break; + case 'only-of-type': + conditions.push('MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, ' + childElements('element.parentNode') + ').length == 1'); + break; + case 'empty': + conditions.push('element.childNodes.length == 0'); + break; + case 'enabled': + conditions.push('(this.isUIElement(element) && element.disabled === false)'); + break; + case 'disabled': + conditions.push('(this.isUIElement(element) && element.disabled === true)'); + break; + case 'checked': + conditions.push('(this.isUIElement(element) && element.checked === true)'); + break; + case 'not': + var subselector = new MochiKit.Selector.Selector(pseudoClassArgument); + conditions.push('!( ' + subselector.buildMatchExpression() + ')'); + break; + } + } + } + if (clause = params.attributes) { + MochiKit.Base.map(function (attribute) { + var value = 'MochiKit.DOM.getNodeAttribute(element, ' + repr(attribute.name) + ')'; + var splitValueBy = function (delimiter) { + return value + '.split(' + repr(delimiter) + ')'; + }; + conditions.push(value + ' != null'); + switch (attribute.operator) { + case '=': + conditions.push(value + ' == ' + repr(attribute.value)); + break; + case '~=': + conditions.push('MochiKit.Base.findValue(' + splitValueBy(' ') + ', ' + repr(attribute.value) + ') > -1'); + break; + case '^=': + conditions.push(value + '.substring(0, ' + attribute.value.length + ') == ' + repr(attribute.value)); + break; + case '$=': + conditions.push(value + '.substring(' + value + '.length - ' + attribute.value.length + ') == ' + repr(attribute.value)); + break; + case '*=': + conditions.push(value + '.match(' + repr(attribute.value) + ')'); + break; + case '|=': + conditions.push(splitValueBy('-') + '[0].toUpperCase() == ' + repr(attribute.value.toUpperCase())); + break; + case '!=': + conditions.push(value + ' != ' + repr(attribute.value)); + break; + case '': + case undefined: + // Condition already added above + break; + default: + throw 'Unknown operator ' + attribute.operator + ' in selector'; + } + }, clause); + } + + return conditions.join(' && '); + }, + + /** @id MochiKit.Selector.Selector.prototype.compileMatcher */ + compileMatcher: function () { + var code = 'return (!element.tagName) ? false : ' + + this.buildMatchExpression() + ';'; + this.match = new Function('element', code); + }, + + /** @id MochiKit.Selector.Selector.prototype.nthChild */ + nthChild: function (element, a, b, reverse, sametag){ + var siblings = MochiKit.Base.filter(function (node) { + return node.nodeType == 1; + }, element.parentNode.childNodes); + if (sametag) { + siblings = MochiKit.Base.filter(function (node) { + return node.tagName == element.tagName; + }, siblings); + } + if (reverse) { + siblings = MochiKit.Iter.reversed(siblings); + } + if (a) { + var actualIndex = MochiKit.Base.findIdentical(siblings, element); + return ((actualIndex + 1 - b) / a) % 1 == 0; + } else { + return b == MochiKit.Base.findIdentical(siblings, element) + 1; + } + }, + + /** @id MochiKit.Selector.Selector.prototype.isUIElement */ + isUIElement: function (element) { + return MochiKit.Base.findValue(['input', 'button', 'select', 'option', 'textarea', 'object'], + element.tagName.toLowerCase()) > -1; + }, + + /** @id MochiKit.Selector.Selector.prototype.findElements */ + findElements: function (scope, axis) { + var element; + + if (axis == undefined) { + axis = ""; + } + + function inScope(element, scope) { + if (axis == "") { + return MochiKit.DOM.isChildNode(element, scope); + } else if (axis == ">") { + return element.parentNode === scope; + } else if (axis == "+") { + return element === nextSiblingElement(scope); + } else if (axis == "~") { + var sibling = scope; + while (sibling = nextSiblingElement(sibling)) { + if (element === sibling) { + return true; + } + } + return false; + } else { + throw "Invalid axis: " + axis; + } + } + + if (element = MochiKit.DOM.getElement(this.params.id)) { + if (this.match(element)) { + if (!scope || inScope(element, scope)) { + return [element]; + } + } + } + + function nextSiblingElement(node) { + node = node.nextSibling; + while (node && node.nodeType != 1) { + node = node.nextSibling; + } + return node; + } + + if (axis == "") { + scope = (scope || MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName || '*'); + } else if (axis == ">") { + if (!scope) { + throw "> combinator not allowed without preceeding expression"; + } + scope = MochiKit.Base.filter(function (node) { + return node.nodeType == 1; + }, scope.childNodes); + } else if (axis == "+") { + if (!scope) { + throw "+ combinator not allowed without preceeding expression"; + } + scope = nextSiblingElement(scope) && [nextSiblingElement(scope)]; + } else if (axis == "~") { + if (!scope) { + throw "~ combinator not allowed without preceeding expression"; + } + var newscope = []; + while (nextSiblingElement(scope)) { + scope = nextSiblingElement(scope); + newscope.push(scope); + } + scope = newscope; + } + + if (!scope) { + return []; + } + + var results = MochiKit.Base.filter(MochiKit.Base.bind(function (scopeElt) { + return this.match(scopeElt); + }, this), scope); + + return results; + }, + + /** @id MochiKit.Selector.Selector.prototype.repr */ + repr: function () { + return 'Selector(' + this.expression + ')'; + }, + + toString: MochiKit.Base.forwardCall("repr") +}; + +MochiKit.Base.update(MochiKit.Selector, { + + /** @id MochiKit.Selector.findChildElements */ + findChildElements: function (element, expressions) { + element = MochiKit.DOM.getElement(element); + var uniq = function(arr) { + var res = []; + for (var i = 0; i < arr.length; i++) { + if (MochiKit.Base.findIdentical(res, arr[i]) < 0) { + res.push(arr[i]); + } + } + return res; + }; + return MochiKit.Base.flattenArray(MochiKit.Base.map(function (expression) { + try { + var res = element.querySelectorAll(expression); + return Array.prototype.slice.call(res, 0); + } catch (ignore) { + // No querySelectorAll or extended expression syntax used + } + var nextScope = ""; + var reducer = function (results, expr) { + var match = expr.match(/^[>+~]$/); + if (match) { + nextScope = match[0]; + return results; + } else { + var selector = new MochiKit.Selector.Selector(expr); + var elements = MochiKit.Iter.reduce(function (elements, result) { + return MochiKit.Base.extend(elements, selector.findElements(result || element, nextScope)); + }, results, []); + nextScope = ""; + return elements; + } + }; + var exprs = expression.replace(/(^\s+|\s+$)/g, '').split(/\s+/); + return uniq(MochiKit.Iter.reduce(reducer, exprs, [null])); + }, expressions)); + }, + + findDocElements: function () { + return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(), arguments); + }, + + __new__: function () { + this.$$ = this.findDocElements; + MochiKit.Base.nameFunctions(this); + } +}); + +MochiKit.Selector.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Selector); diff --git a/frontend/delta/js/MochiKit/Signal.js b/frontend/delta/js/MochiKit/Signal.js new file mode 100644 index 0000000..58d0363 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Signal.js @@ -0,0 +1,924 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Signal 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Signal', '1.5', ['Base', 'DOM']); + +MochiKit.Signal._observers = []; + +/** @id MochiKit.Signal.Event */ +MochiKit.Signal.Event = function (src, e) { + this._event = e || window.event; + this._src = src; +}; +MochiKit.Signal.Event.__export__ = false; + +MochiKit.Base.update(MochiKit.Signal.Event.prototype, { + + __repr__: function () { + var repr = MochiKit.Base.repr; + var str = '{event(): ' + repr(this.event()) + + ', src(): ' + repr(this.src()) + + ', type(): ' + repr(this.type()) + + ', target(): ' + repr(this.target()); + + if (this.type() && + this.type().indexOf('key') === 0 || + this.type().indexOf('mouse') === 0 || + this.type().indexOf('click') != -1 || + this.type() == 'contextmenu') { + str += ', modifier(): ' + '{alt: ' + repr(this.modifier().alt) + + ', ctrl: ' + repr(this.modifier().ctrl) + + ', meta: ' + repr(this.modifier().meta) + + ', shift: ' + repr(this.modifier().shift) + + ', any: ' + repr(this.modifier().any) + '}'; + } + + if (this.type() && this.type().indexOf('key') === 0) { + str += ', key(): {code: ' + repr(this.key().code) + + ', string: ' + repr(this.key().string) + '}'; + } + + if (this.type() && ( + this.type().indexOf('mouse') === 0 || + this.type().indexOf('click') != -1 || + this.type() == 'contextmenu')) { + + str += ', mouse(): {page: ' + repr(this.mouse().page) + + ', client: ' + repr(this.mouse().client); + + if (this.type() != 'mousemove' && this.type() != 'mousewheel') { + str += ', button: {left: ' + repr(this.mouse().button.left) + + ', middle: ' + repr(this.mouse().button.middle) + + ', right: ' + repr(this.mouse().button.right) + '}'; + } + if (this.type() == 'mousewheel') { + str += ', wheel: ' + repr(this.mouse().wheel); + } + str += '}'; + } + if (this.type() == 'mouseover' || this.type() == 'mouseout' || + this.type() == 'mouseenter' || this.type() == 'mouseleave') { + str += ', relatedTarget(): ' + repr(this.relatedTarget()); + } + str += '}'; + return str; + }, + + /** @id MochiKit.Signal.Event.prototype.toString */ + toString: function () { + return this.__repr__(); + }, + + /** @id MochiKit.Signal.Event.prototype.src */ + src: function () { + return this._src; + }, + + /** @id MochiKit.Signal.Event.prototype.event */ + event: function () { + return this._event; + }, + + /** @id MochiKit.Signal.Event.prototype.type */ + type: function () { + if (this._event.type === "DOMMouseScroll") { + return "mousewheel"; + } else { + return this._event.type || undefined; + } + }, + + /** @id MochiKit.Signal.Event.prototype.target */ + target: function () { + return this._event.target || this._event.srcElement; + }, + + _relatedTarget: null, + /** @id MochiKit.Signal.Event.prototype.relatedTarget */ + relatedTarget: function () { + if (this._relatedTarget !== null) { + return this._relatedTarget; + } + + var elem = null; + if (this.type() == 'mouseover' || this.type() == 'mouseenter') { + elem = (this._event.relatedTarget || + this._event.fromElement); + } else if (this.type() == 'mouseout' || this.type() == 'mouseleave') { + elem = (this._event.relatedTarget || + this._event.toElement); + } + try { + if (elem !== null && elem.nodeType !== null) { + this._relatedTarget = elem; + return elem; + } + } catch (ignore) { + // Firefox 3 throws a permission denied error when accessing + // any property on XUL elements (e.g. scrollbars)... + } + + return undefined; + }, + + _modifier: null, + /** @id MochiKit.Signal.Event.prototype.modifier */ + modifier: function () { + if (this._modifier !== null) { + return this._modifier; + } + var m = {}; + m.alt = this._event.altKey; + m.ctrl = this._event.ctrlKey; + m.meta = this._event.metaKey || false; // IE and Opera punt here + m.shift = this._event.shiftKey; + m.any = m.alt || m.ctrl || m.shift || m.meta; + this._modifier = m; + return m; + }, + + _key: null, + /** @id MochiKit.Signal.Event.prototype.key */ + key: function () { + if (this._key !== null) { + return this._key; + } + var k = {}; + if (this.type() && this.type().indexOf('key') === 0) { + + /* + + If you're looking for a special key, look for it in keydown or + keyup, but never keypress. If you're looking for a Unicode + chracter, look for it with keypress, but never keyup or + keydown. + + Notes: + + FF key event behavior: + key event charCode keyCode + DOWN ku,kd 0 40 + DOWN kp 0 40 + ESC ku,kd 0 27 + ESC kp 0 27 + a ku,kd 0 65 + a kp 97 0 + shift+a ku,kd 0 65 + shift+a kp 65 0 + 1 ku,kd 0 49 + 1 kp 49 0 + shift+1 ku,kd 0 0 + shift+1 kp 33 0 + + IE key event behavior: + (IE doesn't fire keypress events for special keys.) + key event keyCode + DOWN ku,kd 40 + DOWN kp undefined + ESC ku,kd 27 + ESC kp 27 + a ku,kd 65 + a kp 97 + shift+a ku,kd 65 + shift+a kp 65 + 1 ku,kd 49 + 1 kp 49 + shift+1 ku,kd 49 + shift+1 kp 33 + + Safari key event behavior: + (Safari sets charCode and keyCode to something crazy for + special keys.) + key event charCode keyCode + DOWN ku,kd 63233 40 + DOWN kp 63233 63233 + ESC ku,kd 27 27 + ESC kp 27 27 + a ku,kd 97 65 + a kp 97 97 + shift+a ku,kd 65 65 + shift+a kp 65 65 + 1 ku,kd 49 49 + 1 kp 49 49 + shift+1 ku,kd 33 49 + shift+1 kp 33 33 + + */ + + /* look for special keys here */ + if (this.type() == 'keydown' || this.type() == 'keyup') { + k.code = this._event.keyCode; + k.string = (MochiKit.Signal._specialKeys[k.code] || + 'KEY_UNKNOWN'); + this._key = k; + return k; + + /* look for characters here */ + } else if (this.type() == 'keypress') { + + /* + + Special key behavior: + + IE: does not fire keypress events for special keys + FF: sets charCode to 0, and sets the correct keyCode + Safari: sets keyCode and charCode to something stupid + + */ + + k.code = 0; + k.string = ''; + + if (typeof(this._event.charCode) != 'undefined' && + this._event.charCode !== 0 && + !MochiKit.Signal._specialMacKeys[this._event.charCode]) { + k.code = this._event.charCode; + k.string = String.fromCharCode(k.code); + } else if (this._event.keyCode && + typeof(this._event.charCode) == 'undefined') { // IE + k.code = this._event.keyCode; + k.string = String.fromCharCode(k.code); + } + + this._key = k; + return k; + } + } + return undefined; + }, + + _mouse: null, + /** @id MochiKit.Signal.Event.prototype.mouse */ + mouse: function () { + if (this._mouse !== null) { + return this._mouse; + } + + var m = {}; + var e = this._event; + + if (this.type() && ( + this.type().indexOf('mouse') === 0 || + this.type().indexOf('drag') === 0 || + this.type().indexOf('click') != -1 || + this.type() == 'contextmenu')) { + + m.client = { x: 0, y: 0 }; + if (e.clientX || e.clientY) { + m.client.x = (!e.clientX || e.clientX < 0) ? 0 : e.clientX; + m.client.y = (!e.clientY || e.clientY < 0) ? 0 : e.clientY; + } + + m.page = { x: 0, y: 0 }; + if (e.pageX || e.pageY) { + m.page.x = (!e.pageX || e.pageX < 0) ? 0 : e.pageX; + m.page.y = (!e.pageY || e.pageY < 0) ? 0 : e.pageY; + } else { + /* + + The IE shortcut can be off by two. We fix it. See: + http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp + + This is similar to the method used in + MochiKit.Style.getElementPosition(). + + */ + var de = MochiKit.DOM._document.documentElement; + var b = MochiKit.DOM._document.body; + + m.page.x = e.clientX + + (de.scrollLeft || b.scrollLeft) - + (de.clientLeft || 0); + + m.page.y = e.clientY + + (de.scrollTop || b.scrollTop) - + (de.clientTop || 0); + + } + if (this.type() != 'mousemove' && this.type() != 'mousewheel') { + m.button = {}; + m.button.left = false; + m.button.right = false; + m.button.middle = false; + + /* we could check e.button, but which is more consistent */ + if (e.which) { + m.button.left = (e.which == 1); + m.button.middle = (e.which == 2); + m.button.right = (e.which == 3); + + /* + + Mac browsers and right click: + + - Safari doesn't fire any click events on a right + click: + http://bugs.webkit.org/show_bug.cgi?id=6595 + + - Firefox fires the event, and sets ctrlKey = true + + - Opera fires the event, and sets metaKey = true + + oncontextmenu is fired on right clicks between + browsers and across platforms. + + */ + + } else { + m.button.left = !!(e.button & 1); + m.button.right = !!(e.button & 2); + m.button.middle = !!(e.button & 4); + } + } + if (this.type() == 'mousewheel') { + m.wheel = { x: 0, y: 0 }; + if (e.wheelDeltaX || e.wheelDeltaY) { + m.wheel.x = e.wheelDeltaX / -40 || 0; + m.wheel.y = e.wheelDeltaY / -40 || 0; + } else if (e.wheelDelta) { + m.wheel.y = e.wheelDelta / -40; + } else { + m.wheel.y = e.detail || 0; + } + } + this._mouse = m; + return m; + } + return undefined; + }, + + /** @id MochiKit.Signal.Event.prototype.stop */ + stop: function () { + this.stopPropagation(); + this.preventDefault(); + }, + + /** @id MochiKit.Signal.Event.prototype.stopPropagation */ + stopPropagation: function () { + if (this._event.stopPropagation) { + this._event.stopPropagation(); + } else { + this._event.cancelBubble = true; + } + }, + + /** @id MochiKit.Signal.Event.prototype.preventDefault */ + preventDefault: function () { + if (this._event.preventDefault) { + this._event.preventDefault(); + } else if (this._confirmUnload === null) { + this._event.returnValue = false; + } + }, + + _confirmUnload: null, + + /** @id MochiKit.Signal.Event.prototype.confirmUnload */ + confirmUnload: function (msg) { + if (this.type() == 'beforeunload') { + this._confirmUnload = msg; + this._event.returnValue = msg; + } + } +}); + +/* Safari sets keyCode to these special values onkeypress. */ +MochiKit.Signal._specialMacKeys = { + 3: 'KEY_ENTER', + 63289: 'KEY_NUM_PAD_CLEAR', + 63276: 'KEY_PAGE_UP', + 63277: 'KEY_PAGE_DOWN', + 63275: 'KEY_END', + 63273: 'KEY_HOME', + 63234: 'KEY_ARROW_LEFT', + 63232: 'KEY_ARROW_UP', + 63235: 'KEY_ARROW_RIGHT', + 63233: 'KEY_ARROW_DOWN', + 63302: 'KEY_INSERT', + 63272: 'KEY_DELETE' +}; + +/* for KEY_F1 - KEY_F12 */ +(function () { + var _specialMacKeys = MochiKit.Signal._specialMacKeys; + for (var i = 63236; i <= 63242; i++) { + // no F0 + _specialMacKeys[i] = 'KEY_F' + (i - 63236 + 1); + } +})(); + +/* Standard keyboard key codes. */ +MochiKit.Signal._specialKeys = { + 8: 'KEY_BACKSPACE', + 9: 'KEY_TAB', + 12: 'KEY_NUM_PAD_CLEAR', // weird, for Safari and Mac FF only + 13: 'KEY_ENTER', + 16: 'KEY_SHIFT', + 17: 'KEY_CTRL', + 18: 'KEY_ALT', + 19: 'KEY_PAUSE', + 20: 'KEY_CAPS_LOCK', + 27: 'KEY_ESCAPE', + 32: 'KEY_SPACEBAR', + 33: 'KEY_PAGE_UP', + 34: 'KEY_PAGE_DOWN', + 35: 'KEY_END', + 36: 'KEY_HOME', + 37: 'KEY_ARROW_LEFT', + 38: 'KEY_ARROW_UP', + 39: 'KEY_ARROW_RIGHT', + 40: 'KEY_ARROW_DOWN', + 44: 'KEY_PRINT_SCREEN', + 45: 'KEY_INSERT', + 46: 'KEY_DELETE', + 59: 'KEY_SEMICOLON', // weird, for Safari and IE only + 91: 'KEY_WINDOWS_LEFT', + 92: 'KEY_WINDOWS_RIGHT', + 93: 'KEY_SELECT', + 106: 'KEY_NUM_PAD_ASTERISK', + 107: 'KEY_NUM_PAD_PLUS_SIGN', + 109: 'KEY_NUM_PAD_HYPHEN-MINUS', + 110: 'KEY_NUM_PAD_FULL_STOP', + 111: 'KEY_NUM_PAD_SOLIDUS', + 144: 'KEY_NUM_LOCK', + 145: 'KEY_SCROLL_LOCK', + 186: 'KEY_SEMICOLON', + 187: 'KEY_EQUALS_SIGN', + 188: 'KEY_COMMA', + 189: 'KEY_HYPHEN-MINUS', + 190: 'KEY_FULL_STOP', + 191: 'KEY_SOLIDUS', + 192: 'KEY_GRAVE_ACCENT', + 219: 'KEY_LEFT_SQUARE_BRACKET', + 220: 'KEY_REVERSE_SOLIDUS', + 221: 'KEY_RIGHT_SQUARE_BRACKET', + 222: 'KEY_APOSTROPHE' + // undefined: 'KEY_UNKNOWN' +}; + +(function () { + /* for KEY_0 - KEY_9 */ + var _specialKeys = MochiKit.Signal._specialKeys; + for (var i = 48; i <= 57; i++) { + _specialKeys[i] = 'KEY_' + (i - 48); + } + + /* for KEY_A - KEY_Z */ + for (i = 65; i <= 90; i++) { + _specialKeys[i] = 'KEY_' + String.fromCharCode(i); + } + + /* for KEY_NUM_PAD_0 - KEY_NUM_PAD_9 */ + for (i = 96; i <= 105; i++) { + _specialKeys[i] = 'KEY_NUM_PAD_' + (i - 96); + } + + /* for KEY_F1 - KEY_F12 */ + for (i = 112; i <= 123; i++) { + // no F0 + _specialKeys[i] = 'KEY_F' + (i - 112 + 1); + } +})(); + +/* Internal object to keep track of created signals. */ +MochiKit.Signal.Ident = function (ident) { + this.source = ident.source; + this.signal = ident.signal; + this.listener = ident.listener; + this.isDOM = ident.isDOM; + this.objOrFunc = ident.objOrFunc; + this.funcOrStr = ident.funcOrStr; + this.connected = ident.connected; +}; +MochiKit.Signal.Ident.__export__ = false; +MochiKit.Signal.Ident.prototype = {}; + +MochiKit.Base.update(MochiKit.Signal, { + + _unloadCache: function () { + var self = MochiKit.Signal; + var observers = self._observers; + + for (var i = 0; i < observers.length; i++) { + if (observers[i].signal !== 'onload' && observers[i].signal !== 'onunload') { + self._disconnect(observers[i]); + } + } + }, + + _listener: function (src, sig, func, obj, isDOM) { + var self = MochiKit.Signal; + var E = self.Event; + if (!isDOM) { + /* We don't want to re-bind already bound methods */ + if (typeof(func.im_self) == 'undefined') { + return MochiKit.Base.bindLate(func, obj); + } else { + return func; + } + } + obj = obj || src; + if (typeof(func) == "string") { + if (sig === 'onload' || sig === 'onunload') { + return function (nativeEvent) { + obj[func].apply(obj, [new E(src, nativeEvent)]); + + var ident = new MochiKit.Signal.Ident({ + source: src, signal: sig, objOrFunc: obj, funcOrStr: func}); + + MochiKit.Signal._disconnect(ident); + }; + } else { + return function (nativeEvent) { + obj[func].apply(obj, [new E(src, nativeEvent)]); + }; + } + } else { + if (sig === 'onload' || sig === 'onunload') { + return function (nativeEvent) { + func.apply(obj, [new E(src, nativeEvent)]); + + var ident = new MochiKit.Signal.Ident({ + source: src, signal: sig, objOrFunc: func}); + + MochiKit.Signal._disconnect(ident); + }; + } else { + return function (nativeEvent) { + func.apply(obj, [new E(src, nativeEvent)]); + }; + } + } + }, + + _browserAlreadyHasMouseEnterAndLeave: function () { + return /MSIE/.test(navigator.userAgent); + }, + + _browserLacksMouseWheelEvent: function () { + return /Gecko\//.test(navigator.userAgent); + }, + + _mouseEnterListener: function (src, sig, func, obj) { + var E = MochiKit.Signal.Event; + return function (nativeEvent) { + var e = new E(src, nativeEvent); + try { + e.relatedTarget().nodeName; + } catch (err) { + /* probably hit a permission denied error; possibly one of + * firefox's screwy anonymous DIVs inside an input element. + * Allow this event to propogate up. + */ + return; + } + e.stop(); + if (MochiKit.DOM.isChildNode(e.relatedTarget(), src)) { + /* We've moved between our node and a child. Ignore. */ + return; + } + e.type = function () { return sig; }; + if (typeof(func) == "string") { + return obj[func].apply(obj, [e]); + } else { + return func.apply(obj, [e]); + } + }; + }, + + _getDestPair: function (objOrFunc, funcOrStr) { + var obj = null; + var func = null; + if (typeof(funcOrStr) != 'undefined') { + obj = objOrFunc; + func = funcOrStr; + if (typeof(funcOrStr) == 'string') { + if (typeof(objOrFunc[funcOrStr]) != "function") { + throw new Error("'funcOrStr' must be a function on 'objOrFunc'"); + } + } else if (typeof(funcOrStr) != 'function') { + throw new Error("'funcOrStr' must be a function or string"); + } + } else if (typeof(objOrFunc) != "function") { + throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given"); + } else { + func = objOrFunc; + } + return [obj, func]; + }, + + /** @id MochiKit.Signal.connect */ + connect: function (src, sig, objOrFunc/* optional */, funcOrStr) { + if (typeof(src) == "string") { + src = MochiKit.DOM.getElement(src); + } + var self = MochiKit.Signal; + + if (typeof(sig) != 'string') { + throw new Error("'sig' must be a string"); + } + + var destPair = self._getDestPair(objOrFunc, funcOrStr); + var obj = destPair[0]; + var func = destPair[1]; + if (typeof(obj) == 'undefined' || obj === null) { + obj = src; + } + + var isDOM = !!(src.addEventListener || src.attachEvent); + if (isDOM && (sig === "onmouseenter" || sig === "onmouseleave") + && !self._browserAlreadyHasMouseEnterAndLeave()) { + var listener = self._mouseEnterListener(src, sig.substr(2), func, obj); + if (sig === "onmouseenter") { + sig = "onmouseover"; + } else { + sig = "onmouseout"; + } + } else if (isDOM && sig == "onmousewheel" && self._browserLacksMouseWheelEvent()) { + var listener = self._listener(src, sig, func, obj, isDOM); + sig = "onDOMMouseScroll"; + } else { + var listener = self._listener(src, sig, func, obj, isDOM); + } + + if (src.addEventListener) { + src.addEventListener(sig.substr(2), listener, false); + } else if (src.attachEvent) { + src.attachEvent(sig, listener); // useCapture unsupported + } + + var ident = new MochiKit.Signal.Ident({ + source: src, + signal: sig, + listener: listener, + isDOM: isDOM, + objOrFunc: objOrFunc, + funcOrStr: funcOrStr, + connected: true + }); + self._observers.push(ident); + + if (!isDOM && typeof(src.__connect__) == 'function') { + var args = MochiKit.Base.extend([ident], arguments, 1); + src.__connect__.apply(src, args); + } + + return ident; + }, + + /** @id MochiKit.Signal.connectOnce */ + connectOnce: function (src, sig, objOrFunc/* optional */, funcOrStr) { + var self = MochiKit.Signal; + var ident1 = self.connect(src, sig, objOrFunc, funcOrStr); + var ident2; + ident2 = self.connect(src, sig, function() { + self.disconnect(ident1); + self.disconnect(ident2); + }); + return ident1; + }, + + _disconnect: function (ident) { + // already disconnected + if (!ident.connected) { + return; + } + ident.connected = false; + var src = ident.source; + var sig = ident.signal; + var listener = ident.listener; + // check isDOM + if (!ident.isDOM) { + if (typeof(src.__disconnect__) == 'function') { + src.__disconnect__(ident, sig, ident.objOrFunc, ident.funcOrStr); + } + return; + } + if (src.removeEventListener) { + src.removeEventListener(sig.substr(2), listener, false); + } else if (src.detachEvent) { + src.detachEvent(sig, listener); // useCapture unsupported + } else { + throw new Error("'src' must be a DOM element"); + } + }, + + /** @id MochiKit.Signal.disconnect */ + disconnect: function (ident) { + var self = MochiKit.Signal; + var observers = self._observers; + var m = MochiKit.Base; + if (arguments.length > 1) { + // compatibility API + var src = arguments[0]; + if (typeof(src) == "string") { + src = MochiKit.DOM.getElement(src); + } + var sig = arguments[1]; + var obj = arguments[2]; + var func = arguments[3]; + for (var i = observers.length - 1; i >= 0; i--) { + var o = observers[i]; + if (o.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) { + self._disconnect(o); + if (self._lock === 0) { + observers.splice(i, 1); + } else { + self._dirty = true; + } + return true; + } + } + } else { + var idx = m.findIdentical(observers, ident); + if (idx >= 0) { + self._disconnect(ident); + if (self._lock === 0) { + observers.splice(idx, 1); + } else { + self._dirty = true; + } + return true; + } + } + return false; + }, + + /** @id MochiKit.Signal.disconnectAllTo */ + disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) { + var self = MochiKit.Signal; + var observers = self._observers; + var disconnect = self._disconnect; + var lock = self._lock; + var dirty = self._dirty; + if (typeof(funcOrStr) === 'undefined') { + funcOrStr = null; + } + for (var i = observers.length - 1; i >= 0; i--) { + var ident = observers[i]; + if (ident.objOrFunc === objOrFunc && + (funcOrStr === null || ident.funcOrStr === funcOrStr)) { + disconnect(ident); + if (lock === 0) { + observers.splice(i, 1); + } else { + dirty = true; + } + } + } + self._dirty = dirty; + }, + + /** @id MochiKit.Signal.disconnectAll */ + disconnectAll: function (src/* optional */, sig) { + if (typeof(src) == "string") { + src = MochiKit.DOM.getElement(src); + } + var m = MochiKit.Base; + var signals = m.flattenArguments(m.extend(null, arguments, 1)); + var self = MochiKit.Signal; + var disconnect = self._disconnect; + var observers = self._observers; + var i, ident; + var lock = self._lock; + var dirty = self._dirty; + if (signals.length === 0) { + // disconnect all + for (i = observers.length - 1; i >= 0; i--) { + ident = observers[i]; + if (ident.source === src) { + disconnect(ident); + if (lock === 0) { + observers.splice(i, 1); + } else { + dirty = true; + } + } + } + } else { + var sigs = {}; + for (i = 0; i < signals.length; i++) { + sigs[signals[i]] = true; + } + for (i = observers.length - 1; i >= 0; i--) { + ident = observers[i]; + if (ident.source === src && ident.signal in sigs) { + disconnect(ident); + if (lock === 0) { + observers.splice(i, 1); + } else { + dirty = true; + } + } + } + } + self._dirty = dirty; + }, + + /** @id MochiKit.Signal.signal */ + signal: function (src, sig) { + var self = MochiKit.Signal; + var observers = self._observers; + if (typeof(src) == "string") { + src = MochiKit.DOM.getElement(src); + } + var args = MochiKit.Base.extend(null, arguments, 2); + var errors = []; + self._lock++; + for (var i = 0; i < observers.length; i++) { + var ident = observers[i]; + if (ident.source === src && ident.signal === sig && + ident.connected) { + try { + if (ident.isDOM && ident.funcOrStr != null) { + var obj = ident.objOrFunc; + obj[ident.funcOrStr].apply(obj, args); + } else if (ident.isDOM) { + ident.objOrFunc.apply(src, args); + } else { + ident.listener.apply(src, args); + } + } catch (e) { + errors.push(e); + } + } + } + self._lock--; + if (self._lock === 0 && self._dirty) { + self._dirty = false; + for (var i = observers.length - 1; i >= 0; i--) { + if (!observers[i].connected) { + observers.splice(i, 1); + } + } + } + if (errors.length == 1) { + throw errors[0]; + } else if (errors.length > 1) { + var e = new Error("Multiple errors thrown in handling 'sig', see errors property"); + e.errors = errors; + throw e; + } + } + +}); + +MochiKit.Signal.__new__ = function (win) { + var m = MochiKit.Base; + this._document = document; + this._window = win; + this._lock = 0; + this._dirty = false; + + try { + this.connect(window, 'onunload', this._unloadCache); + } catch (e) { + // pass: might not be a browser + } + + m.nameFunctions(this); +}; + +MochiKit.Signal.__new__(this); + +// +// XXX: Internet Explorer blows +// +if (MochiKit.__export__) { + connect = MochiKit.Signal.connect; + disconnect = MochiKit.Signal.disconnect; + disconnectAll = MochiKit.Signal.disconnectAll; + signal = MochiKit.Signal.signal; +} + +MochiKit.Base._exportSymbols(this, MochiKit.Signal); diff --git a/frontend/delta/js/MochiKit/Sortable.js b/frontend/delta/js/MochiKit/Sortable.js new file mode 100644 index 0000000..49ea390 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Sortable.js @@ -0,0 +1,592 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** +Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) + Mochi-ized By Thomas Herve (_firstname_@nimail.org) + +See scriptaculous.js for full license. + +***/ + +MochiKit.Base.module(MochiKit, 'Sortable', '1.5', ['Base', 'Iter', 'DOM', 'Position', 'DragAndDrop']); + +MochiKit.Base.update(MochiKit.Sortable, { + __export__: false, + + /*** + + Manage sortables. Mainly use the create function to add a sortable. + + ***/ + sortables: {}, + + _findRootElement: function (element) { + while (element.tagName.toUpperCase() != "BODY") { + if (element.id && MochiKit.Sortable.sortables[element.id]) { + return element; + } + element = element.parentNode; + } + }, + + _createElementId: function(element) { + if (element.id == null || element.id == "") { + var d = MochiKit.DOM; + var id; + var count = 1; + while (d.getElement(id = "sortable" + count) != null) { + count += 1; + } + d.setNodeAttribute(element, "id", id); + } + }, + + /** @id MochiKit.Sortable.options */ + options: function (element) { + element = MochiKit.Sortable._findRootElement(MochiKit.DOM.getElement(element)); + if (!element) { + return; + } + return MochiKit.Sortable.sortables[element.id]; + }, + + /** @id MochiKit.Sortable.destroy */ + destroy: function (element){ + var s = MochiKit.Sortable.options(element); + var b = MochiKit.Base; + var d = MochiKit.DragAndDrop; + + if (s) { + MochiKit.Signal.disconnect(s.startHandle); + MochiKit.Signal.disconnect(s.endHandle); + b.map(function (dr) { + d.Droppables.remove(dr); + }, s.droppables); + b.map(function (dr) { + dr.destroy(); + }, s.draggables); + + delete MochiKit.Sortable.sortables[s.element.id]; + } + }, + + /** @id MochiKit.Sortable.create */ + create: function (element, options) { + element = MochiKit.DOM.getElement(element); + var self = MochiKit.Sortable; + self._createElementId(element); + + /** @id MochiKit.Sortable.options */ + options = MochiKit.Base.update({ + + /** @id MochiKit.Sortable.element */ + element: element, + + /** @id MochiKit.Sortable.tag */ + tag: 'li', // assumes li children, override with tag: 'tagname' + + /** @id MochiKit.Sortable.dropOnEmpty */ + dropOnEmpty: false, + + /** @id MochiKit.Sortable.tree */ + tree: false, + + /** @id MochiKit.Sortable.treeTag */ + treeTag: 'ul', + + /** @id MochiKit.Sortable.overlap */ + overlap: 'vertical', // one of 'vertical', 'horizontal' + + /** @id MochiKit.Sortable.constraint */ + constraint: 'vertical', // one of 'vertical', 'horizontal', false + // also takes array of elements (or ids); or false + + /** @id MochiKit.Sortable.containment */ + containment: [element], + + /** @id MochiKit.Sortable.handle */ + handle: false, // or a CSS class + + /** @id MochiKit.Sortable.only */ + only: false, + + /** @id MochiKit.Sortable.hoverclass */ + hoverclass: null, + + /** @id MochiKit.Sortable.ghosting */ + ghosting: false, + + /** @id MochiKit.Sortable.scroll */ + scroll: false, + + /** @id MochiKit.Sortable.scrollSensitivity */ + scrollSensitivity: 20, + + /** @id MochiKit.Sortable.scrollSpeed */ + scrollSpeed: 15, + + /** @id MochiKit.Sortable.format */ + format: /^[^_]*_(.*)$/, + + /** @id MochiKit.Sortable.onChange */ + onChange: MochiKit.Base.noop, + + /** @id MochiKit.Sortable.onUpdate */ + onUpdate: MochiKit.Base.noop, + + /** @id MochiKit.Sortable.accept */ + accept: null + }, options); + + // clear any old sortable with same element + self.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + ghosting: options.ghosting, + scroll: options.scroll, + scrollSensitivity: options.scrollSensitivity, + scrollSpeed: options.scrollSpeed, + constraint: options.constraint, + handle: options.handle + }; + + if (options.starteffect) { + options_for_draggable.starteffect = options.starteffect; + } + + if (options.reverteffect) { + options_for_draggable.reverteffect = options.reverteffect; + } else if (options.ghosting) { + options_for_draggable.reverteffect = function (innerelement) { + innerelement.style.top = 0; + innerelement.style.left = 0; + }; + } + + if (options.endeffect) { + options_for_draggable.endeffect = options.endeffect; + } + + if (options.zindex) { + options_for_draggable.zindex = options.zindex; + } + + // build options for the droppables + var options_for_droppable = { + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass, + onhover: self.onHover, + tree: options.tree, + accept: options.accept + }; + + var options_for_tree = { + onhover: self.onEmptyHover, + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass, + accept: options.accept + }; + + // fix for gecko engine + MochiKit.DOM.removeEmptyTextNodes(element); + + options.draggables = []; + options.droppables = []; + + // drop on empty handling + if (options.dropOnEmpty || options.tree) { + new MochiKit.DragAndDrop.Droppable(element, options_for_tree); + options.droppables.push(element); + } + MochiKit.Base.map(function (e) { + // handles are per-draggable + var handle = options.handle ? + MochiKit.DOM.getFirstElementByTagAndClassName(null, + options.handle, e) : e; + options.draggables.push( + new MochiKit.DragAndDrop.Draggable(e, + MochiKit.Base.update(options_for_draggable, + {handle: handle}))); + new MochiKit.DragAndDrop.Droppable(e, options_for_droppable); + if (options.tree) { + e.treeNode = element; + } + options.droppables.push(e); + }, (self.findElements(element, options) || [])); + + if (options.tree) { + MochiKit.Base.map(function (e) { + new MochiKit.DragAndDrop.Droppable(e, options_for_tree); + e.treeNode = element; + options.droppables.push(e); + }, (self.findTreeElements(element, options) || [])); + } + + // keep reference + self.sortables[element.id] = options; + + options.lastValue = self.serialize(element); + options.startHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'start', + MochiKit.Base.partial(self.onStart, element)); + options.endHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'end', + MochiKit.Base.partial(self.onEnd, element)); + }, + + /** @id MochiKit.Sortable.onStart */ + onStart: function (element, draggable) { + var self = MochiKit.Sortable; + var options = self.options(element); + options.lastValue = self.serialize(options.element); + }, + + /** @id MochiKit.Sortable.onEnd */ + onEnd: function (element, draggable) { + var self = MochiKit.Sortable; + self.unmark(); + var options = self.options(element); + if (options.lastValue != self.serialize(options.element)) { + options.onUpdate(options.element); + } + }, + + // return all suitable-for-sortable elements in a guaranteed order + + /** @id MochiKit.Sortable.findElements */ + findElements: function (element, options) { + return MochiKit.Sortable.findChildren(element, options.only, options.tree, options.tag); + }, + + /** @id MochiKit.Sortable.findTreeElements */ + findTreeElements: function (element, options) { + return MochiKit.Sortable.findChildren( + element, options.only, options.tree ? true : false, options.treeTag); + }, + + /** @id MochiKit.Sortable.findChildren */ + findChildren: function (element, only, recursive, tagName) { + if (!element.hasChildNodes()) { + return null; + } + tagName = tagName.toUpperCase(); + if (only) { + only = MochiKit.Base.flattenArray([only]); + } + var elements = []; + MochiKit.Base.map(function (e) { + if (e.tagName && + e.tagName.toUpperCase() == tagName && + (!only || + MochiKit.Iter.some(only, function (c) { + return MochiKit.DOM.hasElementClass(e, c); + }))) { + elements.push(e); + } + if (recursive) { + var grandchildren = MochiKit.Sortable.findChildren(e, only, recursive, tagName); + if (grandchildren && grandchildren.length > 0) { + elements = elements.concat(grandchildren); + } + } + }, element.childNodes); + return elements; + }, + + /** @id MochiKit.Sortable.onHover */ + onHover: function (element, dropon, overlap) { + if (MochiKit.DOM.isChildNode(dropon, element)) { + return; + } + var self = MochiKit.Sortable; + + if (overlap > .33 && overlap < .66 && self.options(dropon).tree) { + return; + } else if (overlap > 0.5) { + self.mark(dropon, 'before'); + if (dropon.previousSibling != element) { + var oldParentNode = element.parentNode; + element.style.visibility = 'hidden'; // fix gecko rendering + dropon.parentNode.insertBefore(element, dropon); + if (dropon.parentNode != oldParentNode) { + self.options(oldParentNode).onChange(element); + } + self.options(dropon.parentNode).onChange(element); + } + } else { + self.mark(dropon, 'after'); + var nextElement = dropon.nextSibling || null; + if (nextElement != element) { + var oldParentNode = element.parentNode; + element.style.visibility = 'hidden'; // fix gecko rendering + dropon.parentNode.insertBefore(element, nextElement); + if (dropon.parentNode != oldParentNode) { + self.options(oldParentNode).onChange(element); + } + self.options(dropon.parentNode).onChange(element); + } + } + }, + + _offsetSize: function (element, type) { + if (type == 'vertical' || type == 'height') { + return element.offsetHeight; + } else { + return element.offsetWidth; + } + }, + + /** @id MochiKit.Sortable.onEmptyHover */ + onEmptyHover: function (element, dropon, overlap) { + var oldParentNode = element.parentNode; + var self = MochiKit.Sortable; + var droponOptions = self.options(dropon); + + if (!MochiKit.DOM.isChildNode(dropon, element)) { + var index; + + var children = self.findElements(dropon, {tag: droponOptions.tag, + only: droponOptions.only}); + var child = null; + + if (children) { + var offset = self._offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); + + for (index = 0; index < children.length; index += 1) { + if (offset - self._offsetSize(children[index], droponOptions.overlap) >= 0) { + offset -= self._offsetSize(children[index], droponOptions.overlap); + } else if (offset - (self._offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { + child = index + 1 < children.length ? children[index + 1] : null; + break; + } else { + child = children[index]; + break; + } + } + } + + dropon.insertBefore(element, child); + + self.options(oldParentNode).onChange(element); + droponOptions.onChange(element); + } + }, + + /** @id MochiKit.Sortable.unmark */ + unmark: function () { + var m = MochiKit.Sortable._marker; + if (m) { + MochiKit.Style.hideElement(m); + } + }, + + /** @id MochiKit.Sortable.mark */ + mark: function (dropon, position) { + // mark on ghosting only + var d = MochiKit.DOM; + var self = MochiKit.Sortable; + var sortable = self.options(dropon.parentNode); + if (sortable && !sortable.ghosting) { + return; + } + + if (!self._marker) { + self._marker = d.getElement('dropmarker') || + document.createElement('DIV'); + MochiKit.Style.hideElement(self._marker); + d.addElementClass(self._marker, 'dropmarker'); + self._marker.style.position = 'absolute'; + document.getElementsByTagName('body').item(0).appendChild(self._marker); + } + var offsets = MochiKit.Position.cumulativeOffset(dropon); + self._marker.style.left = offsets.x + 'px'; + self._marker.style.top = offsets.y + 'px'; + + if (position == 'after') { + if (sortable.overlap == 'horizontal') { + self._marker.style.left = (offsets.x + dropon.clientWidth) + 'px'; + } else { + self._marker.style.top = (offsets.y + dropon.clientHeight) + 'px'; + } + } + MochiKit.Style.showElement(self._marker); + }, + + _tree: function (element, options, parent) { + var self = MochiKit.Sortable; + var children = self.findElements(element, options) || []; + + for (var i = 0; i < children.length; ++i) { + var match = children[i].id.match(options.format); + + if (!match) { + continue; + } + + var child = { + id: encodeURIComponent(match ? match[1] : null), + element: element, + parent: parent, + children: [], + position: parent.children.length, + container: self._findChildrenElement(children[i], options.treeTag.toUpperCase()) + }; + + /* Get the element containing the children and recurse over it */ + if (child.container) { + self._tree(child.container, options, child); + } + + parent.children.push (child); + } + + return parent; + }, + + /* Finds the first element of the given tag type within a parent element. + Used for finding the first LI[ST] within a L[IST]I[TEM].*/ + _findChildrenElement: function (element, containerTag) { + if (element && element.hasChildNodes) { + containerTag = containerTag.toUpperCase(); + for (var i = 0; i < element.childNodes.length; ++i) { + if (element.childNodes[i].tagName.toUpperCase() == containerTag) { + return element.childNodes[i]; + } + } + } + return null; + }, + + /** @id MochiKit.Sortable.tree */ + tree: function (element, options) { + element = MochiKit.DOM.getElement(element); + var sortableOptions = MochiKit.Sortable.options(element); + options = MochiKit.Base.update({ + tag: sortableOptions.tag, + treeTag: sortableOptions.treeTag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format + }, options || {}); + + var root = { + id: null, + parent: null, + children: new Array, + container: element, + position: 0 + }; + + return MochiKit.Sortable._tree(element, options, root); + }, + + /** + * Specifies the sequence for the Sortable. + * @param {Node} element Element to use as the Sortable. + * @param {Object} newSequence New sequence to use. + * @param {Object} options Options to use fro the Sortable. + */ + setSequence: function (element, newSequence, options) { + var self = MochiKit.Sortable; + var b = MochiKit.Base; + element = MochiKit.DOM.getElement(element); + options = b.update(self.options(element), options || {}); + + var nodeMap = {}; + b.map(function (n) { + var m = n.id.match(options.format); + if (m) { + nodeMap[m[1]] = [n, n.parentNode]; + } + n.parentNode.removeChild(n); + }, self.findElements(element, options)); + + b.map(function (ident) { + var n = nodeMap[ident]; + if (n) { + n[1].appendChild(n[0]); + delete nodeMap[ident]; + } + }, newSequence); + }, + + /* Construct a [i] index for a particular node */ + _constructIndex: function (node) { + var index = ''; + do { + if (node.id) { + index = '[' + node.position + ']' + index; + } + } while ((node = node.parent) != null); + return index; + }, + + /** @id MochiKit.Sortable.sequence */ + sequence: function (element, options) { + element = MochiKit.DOM.getElement(element); + var self = MochiKit.Sortable; + var options = MochiKit.Base.update(self.options(element), options || {}); + + return MochiKit.Base.map(function (item) { + return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; + }, MochiKit.DOM.getElement(self.findElements(element, options) || [])); + }, + + /** + * Serializes the content of a Sortable. Useful to send this content through a XMLHTTPRequest. + * These options override the Sortable options for the serialization only. + * @param {Node} element Element to serialize. + * @param {Object} options Serialization options. + */ + serialize: function (element, options) { + element = MochiKit.DOM.getElement(element); + var self = MochiKit.Sortable; + options = MochiKit.Base.update(self.options(element), options || {}); + var name = encodeURIComponent(options.name || element.id); + + if (options.tree) { + return MochiKit.Base.flattenArray(MochiKit.Base.map(function (item) { + return [name + self._constructIndex(item) + "[id]=" + + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); + }, self.tree(element, options).children)).join('&'); + } else { + return MochiKit.Base.map(function (item) { + return name + "[]=" + encodeURIComponent(item); + }, self.sequence(element, options)).join('&'); + } + } +}); + +// trunk compatibility +MochiKit.Sortable.Sortable = MochiKit.Sortable; + +MochiKit.Sortable.__new__ = function () { + MochiKit.Base.nameFunctions(this); +}; + +MochiKit.Sortable.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Sortable); diff --git a/frontend/delta/js/MochiKit/Style.js b/frontend/delta/js/MochiKit/Style.js new file mode 100644 index 0000000..fa5edbf --- a/dev/null +++ b/frontend/delta/js/MochiKit/Style.js @@ -0,0 +1,584 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Style 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved. + +The MochiKit.Style.getElementPosition function is adapted from +YAHOO.util.Dom.getXY v0.9.0. which is copyrighted by Yahoo! Inc. + +***/ + +MochiKit.Base.module(MochiKit, 'Style', '1.5', ['Base', 'DOM']); + + +/** @id MochiKit.Style.Dimensions */ +MochiKit.Style.Dimensions = function (w, h) { + if (!(this instanceof MochiKit.Style.Dimensions)) { + return new MochiKit.Style.Dimensions(w, h); + } + this.w = w; + this.h = h; +}; + +MochiKit.Style.Dimensions.prototype.__repr__ = function () { + var repr = MochiKit.Base.repr; + return '{w: ' + repr(this.w) + ', h: ' + repr(this.h) + '}'; +}; + +MochiKit.Style.Dimensions.prototype.toString = function () { + return this.__repr__(); +}; + + +/** @id MochiKit.Style.Coordinates */ +MochiKit.Style.Coordinates = function (x, y) { + if (!(this instanceof MochiKit.Style.Coordinates)) { + return new MochiKit.Style.Coordinates(x, y); + } + this.x = x; + this.y = y; +}; + +MochiKit.Style.Coordinates.prototype.__repr__ = function () { + var repr = MochiKit.Base.repr; + return '{x: ' + repr(this.x) + ', y: ' + repr(this.y) + '}'; +}; + +MochiKit.Style.Coordinates.prototype.toString = function () { + return this.__repr__(); +}; + + +MochiKit.Base.update(MochiKit.Style, { + + /** @id MochiKit.Style.getStyle */ + getStyle: function (elem, cssProperty) { + var dom = MochiKit.DOM; + var d = dom._document; + + elem = dom.getElement(elem); + cssProperty = MochiKit.Base.camelize(cssProperty); + + if (!elem || elem == d) { + return undefined; + } + if (cssProperty == 'opacity' && typeof(elem.filters) != 'undefined') { + var opacity = (MochiKit.Style.getStyle(elem, 'filter') || '').match(/alpha\(opacity=(.*)\)/); + if (opacity && opacity[1]) { + return parseFloat(opacity[1]) / 100; + } + return 1.0; + } + if (cssProperty == 'float' || cssProperty == 'cssFloat' || cssProperty == 'styleFloat') { + if (elem.style["float"]) { + return elem.style["float"]; + } else if (elem.style.cssFloat) { + return elem.style.cssFloat; + } else if (elem.style.styleFloat) { + return elem.style.styleFloat; + } else { + return "none"; + } + } + var value = elem.style ? elem.style[cssProperty] : null; + if (!value) { + if (d.defaultView && d.defaultView.getComputedStyle) { + var css = d.defaultView.getComputedStyle(elem, null); + cssProperty = cssProperty.replace(/([A-Z])/g, '-$1' + ).toLowerCase(); // from dojo.style.toSelectorCase + value = css ? css.getPropertyValue(cssProperty) : null; + } else if (elem.currentStyle) { + value = elem.currentStyle[cssProperty]; + if (/^\d/.test(value) && !/px$/.test(value) && cssProperty != 'fontWeight') { + /* Convert to px using an hack from Dean Edwards */ + var left = elem.style.left; + var rsLeft = elem.runtimeStyle.left; + elem.runtimeStyle.left = elem.currentStyle.left; + elem.style.left = value || 0; + value = elem.style.pixelLeft + "px"; + elem.style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + } + if (cssProperty == 'opacity') { + value = parseFloat(value); + } + + if (/Opera/.test(navigator.userAgent) && (MochiKit.Base.findValue(['left', 'top', 'right', 'bottom'], cssProperty) != -1)) { + if (MochiKit.Style.getStyle(elem, 'position') == 'static') { + value = 'auto'; + } + } + + return value == 'auto' ? null : value; + }, + + /** @id MochiKit.Style.setStyle */ + setStyle: function (elem, style) { + elem = MochiKit.DOM.getElement(elem); + for (var name in style) { + switch (name) { + case 'opacity': + MochiKit.Style.setOpacity(elem, style[name]); + break; + case 'float': + case 'cssFloat': + case 'styleFloat': + if (typeof(elem.style["float"]) != "undefined") { + elem.style["float"] = style[name]; + } else if (typeof(elem.style.cssFloat) != "undefined") { + elem.style.cssFloat = style[name]; + } else { + elem.style.styleFloat = style[name]; + } + break; + default: + elem.style[MochiKit.Base.camelize(name)] = style[name]; + } + } + }, + + /** @id MochiKit.Style.setOpacity */ + setOpacity: function (elem, o) { + elem = MochiKit.DOM.getElement(elem); + var self = MochiKit.Style; + if (o == 1) { + var toSet = /Gecko/.test(navigator.userAgent) && !(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)); + elem.style["opacity"] = toSet ? 0.999999 : 1.0; + if (/MSIE/.test(navigator.userAgent)) { + elem.style['filter'] = + self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, ''); + } + } else { + if (o < 0.00001) { + o = 0; + } + elem.style["opacity"] = o; + if (/MSIE/.test(navigator.userAgent)) { + elem.style['filter'] = + self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + o * 100 + ')'; + } + } + }, + + /* + + getElementPosition is adapted from YAHOO.util.Dom.getXY v0.9.0. + Copyright: Copyright (c) 2006, Yahoo! Inc. All rights reserved. + License: BSD, http://developer.yahoo.net/yui/license.txt + + */ + + /** @id MochiKit.Style.getElementPosition */ + getElementPosition: function (elem, /* optional */relativeTo) { + var self = MochiKit.Style; + var dom = MochiKit.DOM; + var isCoordinates = function (o) { + return o != null && + o.nodeType == null && + typeof(o.x) == "number" && + typeof(o.y) == "number"; + }; + + if (typeof(elem) == "string") { + elem = dom.getElement(elem); + } + if (elem == null || + (!isCoordinates(elem) && self.getStyle(elem, 'display') == 'none')) { + return undefined; + } + + var c = new self.Coordinates(0, 0); + var box = null; + var parent = null; + + var d = MochiKit.DOM._document; + var de = d.documentElement; + var b = d.body; + + if (isCoordinates(elem)) { + /* it's just a MochiKit.Style.Coordinates object */ + c.x += elem.x || 0; + c.y += elem.y || 0; + } else if (elem.getBoundingClientRect) { // IE shortcut + /* + + The IE shortcut can be off by two. We fix it. See: + http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp + + This is similar to the method used in + MochiKit.Signal.Event.mouse(). + + */ + box = elem.getBoundingClientRect(); + + c.x += box.left + + (de.scrollLeft || b.scrollLeft) - + (de.clientLeft || 0); + + c.y += box.top + + (de.scrollTop || b.scrollTop) - + (de.clientTop || 0); + + } else if (elem.offsetParent) { + c.x += elem.offsetLeft; + c.y += elem.offsetTop; + parent = elem.offsetParent; + + if (parent != elem) { + while (parent) { + c.x += parseInt(parent.style.borderLeftWidth, 10) || 0; + c.y += parseInt(parent.style.borderTopWidth, 10) || 0; + c.x += parent.offsetLeft; + c.y += parent.offsetTop; + parent = parent.offsetParent; + } + } + + /* + + Opera < 9 and old Safari (absolute) incorrectly account for + body offsetTop and offsetLeft. + + */ + var ua = navigator.userAgent.toLowerCase(); + if ((typeof(opera) != 'undefined' && + parseFloat(opera.version()) < 9) || + (ua.indexOf('AppleWebKit') != -1 && + self.getStyle(elem, 'position') == 'absolute')) { + + c.x -= b.offsetLeft; + c.y -= b.offsetTop; + + } + + // Adjust position for strange Opera scroll bug + if (elem.parentNode) { + parent = elem.parentNode; + } else { + parent = null; + } + while (parent) { + var tagName = parent.tagName.toUpperCase(); + if (tagName === 'BODY' || tagName === 'HTML') { + break; + } + var disp = self.getStyle(parent, 'display'); + // Handle strange Opera bug for some display + if (disp.search(/^inline|table-row.*$/i)) { + c.x -= parent.scrollLeft; + c.y -= parent.scrollTop; + } + if (parent.parentNode) { + parent = parent.parentNode; + } else { + parent = null; + } + } + } + + if (relativeTo) { + relativeTo = arguments.callee(relativeTo); + if (relativeTo) { + c.x -= (relativeTo.x || 0); + c.y -= (relativeTo.y || 0); + } + } + + return c; + }, + + /** @id MochiKit.Style.setElementPosition */ + setElementPosition: function (elem, newPos/* optional */, units) { + elem = MochiKit.DOM.getElement(elem); + if (typeof(units) == 'undefined') { + units = 'px'; + } + var newStyle = {}; + var isUndefNull = MochiKit.Base.isUndefinedOrNull; + if (!isUndefNull(newPos.x)) { + newStyle['left'] = newPos.x + units; + } + if (!isUndefNull(newPos.y)) { + newStyle['top'] = newPos.y + units; + } + MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle}); + }, + + /** @id MochiKit.Style.makePositioned */ + makePositioned: function (element) { + element = MochiKit.DOM.getElement(element); + var pos = MochiKit.Style.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, + // when an element is position relative but top and left have + // not been defined + if (/Opera/.test(navigator.userAgent)) { + element.style.top = 0; + element.style.left = 0; + } + } + }, + + /** @id MochiKit.Style.undoPositioned */ + undoPositioned: function (element) { + element = MochiKit.DOM.getElement(element); + if (element.style.position == 'relative') { + element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; + } + }, + + /** @id MochiKit.Style.makeClipping */ + makeClipping: function (element) { + element = MochiKit.DOM.getElement(element); + var s = element.style; + var oldOverflow = { 'overflow': s.overflow, + 'overflow-x': s.overflowX, + 'overflow-y': s.overflowY }; + if ((MochiKit.Style.getStyle(element, 'overflow') || 'visible') != 'hidden') { + element.style.overflow = 'hidden'; + element.style.overflowX = 'hidden'; + element.style.overflowY = 'hidden'; + } + return oldOverflow; + }, + + /** @id MochiKit.Style.undoClipping */ + undoClipping: function (element, overflow) { + element = MochiKit.DOM.getElement(element); + if (typeof(overflow) == 'string') { + element.style.overflow = overflow; + } else if (overflow != null) { + element.style.overflow = overflow['overflow']; + element.style.overflowX = overflow['overflow-x']; + element.style.overflowY = overflow['overflow-y']; + } + }, + + /** @id MochiKit.Style.getElementDimensions */ + getElementDimensions: function (elem, contentSize/*optional*/) { + var self = MochiKit.Style; + var dom = MochiKit.DOM; + if (typeof(elem.w) == 'number' || typeof(elem.h) == 'number') { + return new self.Dimensions(elem.w || 0, elem.h || 0); + } + elem = dom.getElement(elem); + if (!elem) { + return undefined; + } + var disp = self.getStyle(elem, 'display'); + // display can be empty/undefined on WebKit/KHTML + if (disp == 'none' || disp == '' || typeof(disp) == 'undefined') { + var s = elem.style; + var originalVisibility = s.visibility; + var originalPosition = s.position; + var originalDisplay = s.display; + s.visibility = 'hidden'; + s.position = 'absolute'; + s.display = self._getDefaultDisplay(elem); + var originalWidth = elem.offsetWidth; + var originalHeight = elem.offsetHeight; + s.display = originalDisplay; + s.position = originalPosition; + s.visibility = originalVisibility; + } else { + originalWidth = elem.offsetWidth || 0; + originalHeight = elem.offsetHeight || 0; + } + if (contentSize) { + var tableCell = 'colSpan' in elem && 'rowSpan' in elem; + var collapse = (tableCell && elem.parentNode && self.getStyle( + elem.parentNode, 'borderCollapse') == 'collapse'); + if (collapse) { + if (/MSIE/.test(navigator.userAgent)) { + var borderLeftQuota = elem.previousSibling? 0.5 : 1; + var borderRightQuota = elem.nextSibling? 0.5 : 1; + } + else { + var borderLeftQuota = 0.5; + var borderRightQuota = 0.5; + } + } else { + var borderLeftQuota = 1; + var borderRightQuota = 1; + } + originalWidth -= Math.round( + (parseFloat(self.getStyle(elem, 'paddingLeft')) || 0) + + (parseFloat(self.getStyle(elem, 'paddingRight')) || 0) + + borderLeftQuota * + (parseFloat(self.getStyle(elem, 'borderLeftWidth')) || 0) + + borderRightQuota * + (parseFloat(self.getStyle(elem, 'borderRightWidth')) || 0) + ); + if (tableCell) { + if (/Gecko|Opera/.test(navigator.userAgent) + && !/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)) { + var borderHeightQuota = 0; + } else if (/MSIE/.test(navigator.userAgent)) { + var borderHeightQuota = 1; + } else { + var borderHeightQuota = collapse? 0.5 : 1; + } + } else { + var borderHeightQuota = 1; + } + originalHeight -= Math.round( + (parseFloat(self.getStyle(elem, 'paddingTop')) || 0) + + (parseFloat(self.getStyle(elem, 'paddingBottom')) || 0) + + borderHeightQuota * ( + (parseFloat(self.getStyle(elem, 'borderTopWidth')) || 0) + + (parseFloat(self.getStyle(elem, 'borderBottomWidth')) || 0)) + ); + } + return new self.Dimensions(originalWidth, originalHeight); + }, + + /** @id MochiKit.Style.setElementDimensions */ + setElementDimensions: function (elem, newSize/* optional */, units) { + elem = MochiKit.DOM.getElement(elem); + if (typeof(units) == 'undefined') { + units = 'px'; + } + var newStyle = {}; + var isUndefNull = MochiKit.Base.isUndefinedOrNull; + if (!isUndefNull(newSize.w)) { + newStyle['width'] = newSize.w + units; + } + if (!isUndefNull(newSize.h)) { + newStyle['height'] = newSize.h + units; + } + MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle}); + }, + + _getDefaultDisplay: function (elem) { + var self = MochiKit.Style; + var dom = MochiKit.DOM; + elem = dom.getElement(elem); + if (!elem) { + return undefined; + } + var tagName = elem.tagName.toUpperCase(); + return self._defaultDisplay[tagName] || 'block'; + }, + + /** @id MochiKit.Style.setDisplayForElement */ + setDisplayForElement: function (display, element/*, ...*/) { + var elements = MochiKit.Base.extend(null, arguments, 1); + var getElement = MochiKit.DOM.getElement; + for (var i = 0; i < elements.length; i++) { + element = getElement(elements[i]); + if (element) { + element.style.display = display; + } + } + }, + + /** @id MochiKit.Style.getViewportDimensions */ + getViewportDimensions: function () { + var d = new MochiKit.Style.Dimensions(); + var w = MochiKit.DOM._window; + var b = MochiKit.DOM._document.body; + if (w.innerWidth) { + d.w = w.innerWidth; + d.h = w.innerHeight; + } else if (b && b.parentElement && b.parentElement.clientWidth) { + d.w = b.parentElement.clientWidth; + d.h = b.parentElement.clientHeight; + } else if (b && b.clientWidth) { + d.w = b.clientWidth; + d.h = b.clientHeight; + } + return d; + }, + + /** @id MochiKit.Style.getViewportPosition */ + getViewportPosition: function () { + var c = new MochiKit.Style.Coordinates(0, 0); + var d = MochiKit.DOM._document; + var de = d.documentElement; + var db = d.body; + if (de && (de.scrollTop || de.scrollLeft)) { + c.x = de.scrollLeft; + c.y = de.scrollTop; + } else if (db) { + c.x = db.scrollLeft; + c.y = db.scrollTop; + } + return c; + }, + + __new__: function () { + var m = MochiKit.Base; + + var inlines = ['A','ABBR','ACRONYM','B','BASEFONT','BDO','BIG','BR', + 'CITE','CODE','DFN','EM','FONT','I','IMG','KBD','LABEL', + 'Q','S','SAMP','SMALL','SPAN','STRIKE','STRONG','SUB', + 'SUP','TEXTAREA','TT','U','VAR']; + this._defaultDisplay = { 'TABLE': 'table', + 'THEAD': 'table-header-group', + 'TBODY': 'table-row-group', + 'TFOOT': 'table-footer-group', + 'COLGROUP': 'table-column-group', + 'COL': 'table-column', + 'TR': 'table-row', + 'TD': 'table-cell', + 'TH': 'table-cell', + 'CAPTION': 'table-caption', + 'LI': 'list-item', + 'INPUT': 'inline-block', + 'SELECT': 'inline-block' }; + // CSS 'display' support in IE6/7 is just broken... + if (/MSIE/.test(navigator.userAgent)) { + for (var k in this._defaultDisplay) { + var v = this._defaultDisplay[k]; + if (v.indexOf('table') == 0) { + this._defaultDisplay[k] = 'block'; + } + } + } + for (var i = 0; i < inlines.length; i++) { + this._defaultDisplay[inlines[i]] = 'inline'; + } + + // Backwards compatibility aliases + m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.3', true); + m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.3', true); + + this.hideElement = m.partial(this.setDisplayForElement, 'none'); + // TODO: showElement could be improved by using getDefaultDisplay. + this.showElement = m.partial(this.setDisplayForElement, 'block'); + + m.nameFunctions(this); + } +}); + +MochiKit.Style.__new__(); +MochiKit.Base._exportSymbols(this, MochiKit.Style); diff --git a/frontend/delta/js/MochiKit/Test.js b/frontend/delta/js/MochiKit/Test.js new file mode 100644 index 0000000..55d226c --- a/dev/null +++ b/frontend/delta/js/MochiKit/Test.js @@ -0,0 +1,167 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Test 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Test', '1.5', ['Base']); + +MochiKit.Test.runTests = function (obj) { + if (typeof(obj) == "string") { + // TODO: Remove this temporary API change advertisement + throw new TypeError("Automatic module import not supported, call runTests() with proper object: " + obj); + } + var suite = new MochiKit.Test.Suite(); + suite.run(obj); +}; + +MochiKit.Test.Suite = function () { + this.testIndex = 0; + MochiKit.Base.bindMethods(this); +}; + +MochiKit.Test.Suite.prototype = { + run: function (obj) { + try { + obj(this); + } catch (e) { + this.traceback(e); + } + }, + traceback: function (e) { + var items = MochiKit.Iter.sorted(MochiKit.Base.items(e)); + print("not ok " + this.testIndex + " - Error thrown"); + for (var i = 0; i < items.length; i++) { + var kv = items[i]; + if (kv[0] == "stack") { + kv[1] = kv[1].split(/\n/)[0]; + } + this.print("# " + kv.join(": ")); + } + }, + print: function (s) { + print(s); + }, + is: function (got, expected, /* optional */message) { + var res = 1; + var msg = null; + try { + res = MochiKit.Base.compare(got, expected); + } catch (e) { + msg = "Can not compare " + typeof(got) + ":" + typeof(expected); + } + if (res) { + msg = "Expected value did not compare equal"; + } + if (!res) { + return this.testResult(true, message); + } + return this.testResult(false, message, + [[msg], ["got:", got], ["expected:", expected]]); + }, + + testResult: function (pass, msg, failures) { + this.testIndex += 1; + if (pass) { + this.print("ok " + this.testIndex + " - " + msg); + return; + } + this.print("not ok " + this.testIndex + " - " + msg); + if (failures) { + for (var i = 0; i < failures.length; i++) { + this.print("# " + failures[i].join(" ")); + } + } + }, + + isDeeply: function (got, expected, /* optional */message) { + var m = MochiKit.Base; + var res = 1; + try { + res = m.compare(got, expected); + } catch (e) { + // pass + } + if (res === 0) { + return this.ok(true, message); + } + var gk = m.keys(got); + var ek = m.keys(expected); + gk.sort(); + ek.sort(); + if (m.compare(gk, ek)) { + // differing keys + var cmp = {}; + var i; + for (i = 0; i < gk.length; i++) { + cmp[gk[i]] = "got"; + } + for (i = 0; i < ek.length; i++) { + if (ek[i] in cmp) { + delete cmp[ek[i]]; + } else { + cmp[ek[i]] = "expected"; + } + } + var diffkeys = m.keys(cmp); + diffkeys.sort(); + var gotkeys = []; + var expkeys = []; + while (diffkeys.length) { + var k = diffkeys.shift(); + if (k in Object.prototype) { + continue; + } + (cmp[k] == "got" ? gotkeys : expkeys).push(k); + } + + + } + + return this.testResult((!res), msg, + (msg ? [["got:", got], ["expected:", expected]] : undefined) + ); + }, + + ok: function (res, message) { + return this.testResult(res, message); + } +}; + +MochiKit.Test.__new__ = function () { + var m = MochiKit.Base; + this.Suite.__export__ = false; + m.nameFunctions(this); + +}; + +MochiKit.Test.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Test); diff --git a/frontend/delta/js/MochiKit/Text.js b/frontend/delta/js/MochiKit/Text.js new file mode 100644 index 0000000..0c230fa --- a/dev/null +++ b/frontend/delta/js/MochiKit/Text.js @@ -0,0 +1,569 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Text 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2008 Per Cederberg. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Text', '1.5', ['Base', 'Format']); + +/** + * Checks if a text string starts with the specified substring. If + * either of the two strings is null, false will be returned. + * + * @param {String} substr the substring to search for + * @param {String} str the string to search in + * + * @return {Boolean} true if the string starts with the substring, or + * false otherwise + */ +MochiKit.Text.startsWith = function (substr, str) { + return str != null && substr != null && str.indexOf(substr) == 0; +}; + +/** + * Checks if a text string ends with the specified substring. If + * either of the two strings is null, false will be returned. + * + * @param {String} substr the substring to search for + * @param {String} str the string to search in + * + * @return {Boolean} true if the string ends with the substring, or + * false otherwise + */ +MochiKit.Text.endsWith = function (substr, str) { + return str != null && substr != null && + str.lastIndexOf(substr) == Math.max(str.length - substr.length, 0); +}; + +/** + * Checks if a text string contains the specified substring. If + * either of the two strings is null, false will be returned. + * + * @param {String} substr the substring to search for + * @param {String} str the string to search in + * + * @return {Boolean} true if the string contains the substring, or + * false otherwise + */ +MochiKit.Text.contains = function (substr, str) { + return str != null && substr != null && str.indexOf(substr) >= 0; +}; + +/** + * Adds a character to the left-hand side of a string until it + * reaches the specified minimum length. + * + * @param {String} str the string to process + * @param {Number} minLength the requested minimum length + * @param {String} fillChar the padding character to add, defaults + * to a space + * + * @return {String} the padded string + */ +MochiKit.Text.padLeft = function (str, minLength, fillChar) { + str = str || ""; + fillChar = fillChar || " "; + while (str.length < minLength) { + str = fillChar + str; + } + return str; +}; + +/** + * Adds a character to the right-hand side of a string until it + * reaches the specified minimum length. + * + * @param {String} str the string to process + * @param {Number} minLength the requested minimum length + * @param {String} fillChar the padding character to add, defaults + * to a space + * + * @return {String} the padded string + */ +MochiKit.Text.padRight = function (str, minLength, fillChar) { + str = str || ""; + fillChar = fillChar || " "; + while (str.length < minLength) { + str += fillChar; + } + return str; +}; + +/** + * Returns a truncated copy of a string. If the string is shorter + * than the specified maximum length, the object will be returned + * unmodified. If an optional tail string is specified, additional + * elements will be removed in order to accomodate the tail (that + * will be appended). This function also works on arrays. + * + * @param {String} str the string to truncate + * @param {Number} maxLength the maximum length + * @param {String} [tail] the tail to append on truncation + * + * @return {String} the truncated string + */ +MochiKit.Text.truncate = function (str, maxLength, tail) { + if (str == null || str.length <= maxLength || maxLength < 0) { + return str; + } else if (tail != null) { + str = str.slice(0, Math.max(0, maxLength - tail.length)); + if (typeof(str) == "string") { + return str + tail; + } else { + return MochiKit.Base.extend(str, tail); + } + } else { + return str.slice(0, maxLength); + } +}; + +/** + * Splits a text string using separator as the split point + * If max is given, at most max splits are done, giving at most + * max + 1 elements in the returned list. + * + * @param {String} str the string to split + * @param {String/RegExp} [separator] the separator char or regexp to use, + * defaults to newline + * @param {Number} [max] the maximum number of parts to return + * @return {Array} an array of parts of the string + */ +MochiKit.Text.split = function (str, separator, max) { + if (str == null) { + return str; + } + separator = separator || '\n'; + var bits = str.split(separator); + if ((typeof(max) == "undefined") || max >= bits.length - 1) { + return bits; + } + bits.splice(max, bits.length, bits.slice(max, bits.length).join(separator)); + return bits; +}; + +/** + * Splits a text string using separator as the split point + * If max is given, at most max splits are done, + * using splits from the right + * + * @param {String} str the string to split + * @param {String/RegExp} [separator] the separator char or regexp to use, + * defaults to newline + * @param {Number} [max] the maximum number of parts to return + * @return {Array} an array of parts of the string + */ +MochiKit.Text.rsplit = function (str, separator, max) { + if (str == null) { + return str; + } + separator = separator || '\n'; + var bits = str.split(separator); + if ((typeof(max) == "undefined") || max >= bits.length - 1){ + return bits; + } + bits.splice(0, bits.length-max, bits.slice(0, bits.length-max).join(separator)); + return bits; +}; + +/** + * Creates a formatter function for the specified formatter pattern + * and locale. The returned function takes as many arguments as the + * formatter pattern requires. See separate documentation for + * information about the formatter pattern syntax. + * + * @param {String} pattern the formatter pattern string + * @param {Object} [locale] the locale to use, defaults to + * LOCALE.en_US + * + * @return {Function} the formatter function created + * + * @throws FormatPatternError if the format pattern was invalid + */ +MochiKit.Text.formatter = function (pattern, locale) { + if (locale == null) { + locale = MochiKit.Format.formatLocale(); + } else if (typeof(locale) == "string") { + locale = MochiKit.Format.formatLocale(locale); + } + var parts = MochiKit.Text._parsePattern(pattern); + return function() { + var values = MochiKit.Base.extend([], arguments); + var res = []; + for (var i = 0; i < parts.length; i++) { + if (typeof(parts[i]) == "string") { + res.push(parts[i]); + } else { + res.push(MochiKit.Text.formatValue(parts[i], values, locale)); + } + } + return res.join(""); + }; +}; + +/** + * Formats the specified arguments according to a formatter pattern. + * See separate documentation for information about the formatter + * pattern syntax. + * + * @param {String} pattern the formatter pattern string + * @param {Object} [...] the optional values to format + * + * @return {String} the formatted output string + * + * @throws FormatPatternError if the format pattern was invalid + */ +MochiKit.Text.format = function (pattern/*, ...*/) { + var func = MochiKit.Text.formatter(pattern); + return func.apply(this, MochiKit.Base.extend([], arguments, 1)); +}; + +/** + * Format a value with the specified format specifier. + * + * @param {String/Object} spec the format specifier string or parsed + * format specifier object + * @param {Object} value the value to format + * @param {Object} [locale] the locale to use, defaults to + * LOCALE.en_US + * + * @return {String} the formatted output string + * + * @throws FormatPatternError if the format specifier was invalid + */ +MochiKit.Text.formatValue = function (spec, value, locale) { + var self = MochiKit.Text; + if (typeof(spec) === "string") { + spec = self._parseFormatFlags(spec, 0, spec.length); + } + for (var i = 0; spec.path != null && i < spec.path.length; i++) { + if (value != null) { + value = value[spec.path[i]]; + } + } + if (locale == null) { + locale = MochiKit.Format.formatLocale(); + } else if (typeof(locale) == "string") { + locale = MochiKit.Format.formatLocale(locale); + } + var str = ""; + if (spec.type == "number") { + if (value instanceof Number) { + value = value.valueOf(); + } + if (typeof(value) != "number" || isNaN(value)) { + str = ""; + } else if (value === Number.POSITIVE_INFINITY) { + str = "\u221e"; + } else if (value === Number.NEGATIVE_INFINITY) { + str = "-\u221e"; + } else { + var sign = (value < 0) ? "-" : spec.sign; + value = Math.abs(value); + if (spec.format === "%") { + str = self._truncToPercent(value, spec.precision); + } else if (spec.format === "d") { + str = MochiKit.Format.roundToFixed(value, 0); + } else if (spec.radix != 10) { + str = Math.floor(value).toString(spec.radix); + if (spec.format === "x") { + str = str.toLowerCase(); + } else if (spec.format === "X") { + str = str.toUpperCase(); + } + } else if (spec.precision >= 0) { + str = MochiKit.Format.roundToFixed(value, spec.precision); + } else { + str = value.toString(); + } + if (spec.padding === "0" && spec.format === "%") { + str = self.padLeft(str, spec.width - sign.length - 1, "0"); + } else if (spec.padding == "0") { + str = self.padLeft(str, spec.width - sign.length, "0"); + } + str = self._localizeNumber(str, locale, spec.group); + str = sign + str; + } + if (str !== "" && spec.format === "%") { + str = str + locale.percent; + } + } else { + if (spec.format == "r") { + str = MochiKit.Base.repr(value); + } else { + str = (value == null) ? "" : value.toString(); + } + str = self.truncate(str, spec.precision); + } + if (spec.align == "<") { + str = self.padRight(str, spec.width); + } else { + str = self.padLeft(str, spec.width); + } + return str; +}; + +/** + * Adjust an already formatted numeric string for locale-specific + * grouping and decimal separators. The grouping is optional and + * will attempt to keep the number string length intact by removing + * padded zeros (if possible). + * + * @param {String} num the formatted number string + * @param {Object} locale the formatting locale to use + * @param {Boolean} group the grouping flag + * + * @return {String} the localized number string + */ +MochiKit.Text._localizeNumber = function (num, locale, group) { + var parts = num.split(/\./); + var whole = parts[0]; + var frac = (parts.length == 1) ? "" : parts[1]; + var res = (frac.length > 0) ? locale.decimal : ""; + while (group && frac.length > 3) { + res = res + frac.substring(0, 3) + locale.separator; + frac = frac.substring(3); + if (whole.charAt(0) == "0") { + whole = whole.substring(1); + } + } + if (frac.length > 0) { + res = res + frac; + } + while (group && whole.length > 3) { + var pos = whole.length - 3; + res = locale.separator + whole.substring(pos) + res; + whole = whole.substring((whole.charAt(0) == "0") ? 1 : 0, pos); + } + return whole + res; +}; + +/** + * Parses a format pattern and returns an array of constant strings + * and format info objects. + * + * @param {String} pattern the format pattern to analyze + * + * @return {Array} an array of strings and format info objects + * + * @throws FormatPatternError if the format pattern was invalid + */ +MochiKit.Text._parsePattern = function (pattern) { + var self = MochiKit.Text; + var parts = []; + var re = /{[^{}]*}|{{?|}}?/g; + var lastPos = re.lastIndex = 0; + var m; + while ((m = re.exec(pattern)) != null) { + if (lastPos < m.index) { + parts.push(pattern.substring(lastPos, m.index)) + } + var str = m[0]; + lastPos = m.index + str.length; + if (self.startsWith("{", str) && self.endsWith("}", str)) { + parts.push(self._parseFormat(pattern, m.index + 1, lastPos - 1)); + } else if (self.startsWith("{{", str) || self.startsWith("}}", str)) { + parts.push(str.substring(1)); + } else if (self.startsWith("{", str)) { + var msg = "unescaped { char, should be escaped as {{"; + throw new self.FormatPatternError(pattern, m.index, msg); + } else if (self.startsWith("}", str)) { + var msg = "unescaped } char, should be escaped as }}"; + throw new self.FormatPatternError(pattern, m.index, msg); + } + } + if (lastPos < pattern.length) { + parts.push(pattern.substring(lastPos)); + } + return parts; +}; + +/** + * Parses a format instruction and returns a format info object. + * + * @param {String} pattern the format pattern string + * @param {Number} startPos the first index of the format instruction + * @param {Number} endPos the last index of the format instruction + * + * @return {Object} the format info object + * + * @throws FormatPatternError if the format pattern was invalid + */ +MochiKit.Text._parseFormat = function (pattern, startPos, endPos) { + var self = MochiKit.Text; + var text = pattern.substring(startPos, endPos); + var parts = self.split(text, ":", 1); + var path = parts[0]; + var flagsPos = startPos + path.length + ((parts.length == 1) ? 0 : 1); + var info = self._parseFormatFlags(pattern, flagsPos, endPos); + info.path = (path == "") ? [] : path.split("."); + for (var i = 0; i < info.path.length; i++) { + var v = info.path[i]; + // TODO: replace with MochiKit.Format.strip? + v = v.replace(/^\s+/, "").replace(/\s+$/, ""); + if (v == "" && info.path.length == 1) { + v = 0; + } else if (v == "") { + var msg = "format value path contains blanks"; + throw new self.FormatPatternError(pattern, startPos, msg); + } else if (/^\d+$/.test(v)) { + v = parseInt(v, 10); + } + info.path[i] = v; + } + if (info.path.length <= 0 || typeof(info.path[0]) != "number") { + info.path.unshift(0); + } + return info; +}; + +/** + * Parses a string with format flags and returns a format info object. + * + * @param {String} pattern the format pattern string + * @param {Number} startPos the first index of the format instruction + * @param {Number} endPos the last index of the format instruction + * + * @return {Object} the format info object + * + * @throws FormatPatternError if the format pattern was invalid + */ +MochiKit.Text._parseFormatFlags = function (pattern, startPos, endPos) { + var update = MochiKit.Base.update; + var info = { type: "string", format: "s", width: 0, precision: -1, + align: ">", sign: "", padding: " ", group: false }; + // TODO: replace with MochiKit.Format.rstrip? + var text = pattern.substring(startPos, endPos).replace(/\s+$/, ""); + var m = /^([<>+ 0,-]+)?(\d+)?(\.\d*)?([srbdoxXf%])?(.*)$/.exec(text); + var flags = m[1]; + var width = m[2]; + var precision = m[3]; + var type = m[4]; + var unmatched = m[5]; + for (var i = 0; flags && i < flags.length; i++) { + var chr = flags.charAt(i); + if (chr == "<" || chr == ">") { + info.align = chr; + } else if (chr == "+" || chr == "-" || chr == " ") { + info.sign = (chr == "-") ? "" : chr; + } else if (chr == "0") { + info.padding = chr; + } else if (chr == ",") { + info.group = true; + } + } + if (width) { + info.width = parseInt(width, 10); + } + if (precision && precision.length > 1) { + info.precision = parseInt(precision.substring(1), 10); + } + if (type == "s" || type == "r") { + info.format = type; + } else if (type == "b") { + update(info, { type: "number", format: type, radix: 2 }); + } else if (type == "o") { + update(info, { type: "number", format: type, radix: 8 }); + } else if (type == "x" || type == "X") { + update(info, { type: "number", format: type, radix: 16 }); + } else if (type == "d" || type == "f" || type == "%") { + update(info, { type: "number", format: type, radix: 10 }); + } + if (unmatched) { + var msg = "unsupported format flag: " + unmatched.charAt(0); + throw new MochiKit.Text.FormatPatternError(pattern, startPos, msg); + } + return info; +}; + +/** + * Formats a value as a percentage. This method avoids multiplication + * by 100 since it leads to weird numeric rounding errors. Instead it + * just move the decimal separator in the text string. It is ugly, + * but works... + * + * @param {Number} value the value to format + * @param {Number} precision the number of precision digits + */ +MochiKit.Text._truncToPercent = function (value, precision) { + // TODO: This can be simplified by using MochiKit.Format._shiftNumber + // as roundToFixed does. + var str; + if (precision >= 0) { + str = MochiKit.Format.roundToFixed(value, precision + 2); + } else { + str = (value == null) ? "0" : value.toString(); + } + var arr = MochiKit.Text.split(str, ".", 2); + var frac = MochiKit.Text.padRight(arr[1], 2, "0"); + var whole = arr[0] + frac.substring(0, 2); + frac = frac.substring(2); + while (/^0[0-9]/.test(whole)) { + whole = whole.substring(1); + } + return (frac.length <= 0) ? whole : whole + "." + frac; +}; + +/** + * Creates a new format pattern error. + * + * @param {String} pattern the format pattern string + * @param {Number} pos the position of the error + * @param {String} message the error message text + * + * @return {Error} the format pattern error + * + * @class The format pattern error class. This error is thrown when + * a syntax error is encountered inside a format string. + * @property {String} pattern The format pattern string. + * @property {Number} pos The position of the error. + * @property {String} message The error message text. + * @extends MochiKit.Base.NamedError + */ +MochiKit.Text.FormatPatternError = function (pattern, pos, message) { + this.pattern = pattern; + this.pos = pos; + this.message = message; +}; + +MochiKit.Text.FormatPatternError.prototype = new MochiKit.Base.NamedError("MochiKit.Text.FormatPatternError"); +MochiKit.Text.FormatPatternError.constructor = MochiKit.Text.FormatPatternError; + +// +//XXX: Internet Explorer export fix +// +if (MochiKit.__export__) { + formatter = MochiKit.Text.formatter; + format = MochiKit.Text.format; + formatValue = MochiKit.Text.formatValue; +} + + +MochiKit.Base.nameFunctions(MochiKit.Text); +MochiKit.Base._exportSymbols(this, MochiKit.Text); diff --git a/frontend/delta/js/MochiKit/Visual.js b/frontend/delta/js/MochiKit/Visual.js new file mode 100644 index 0000000..9bcd805 --- a/dev/null +++ b/frontend/delta/js/MochiKit/Visual.js @@ -0,0 +1,1999 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/*** + +MochiKit.Visual 1.5 + +See <http://mochikit.com/> for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +MochiKit.Base.module(MochiKit, 'Visual', '1.5', ['Base', 'DOM', 'Style', 'Color', 'Position']); + +MochiKit.Visual._RoundCorners = function (e, options) { + e = MochiKit.DOM.getElement(e); + this._setOptions(options); + if (this.options.__unstable__wrapElement) { + e = this._doWrap(e); + } + + var color = this.options.color; + var C = MochiKit.Color.Color; + if (this.options.color === "fromElement") { + color = C.fromBackground(e); + } else if (!(color instanceof C)) { + color = C.fromString(color); + } + this.isTransparent = (color.asRGB().a <= 0); + + var bgColor = this.options.bgColor; + if (this.options.bgColor === "fromParent") { + bgColor = C.fromBackground(e.offsetParent); + } else if (!(bgColor instanceof C)) { + bgColor = C.fromString(bgColor); + } + + this._roundCornersImpl(e, color, bgColor); +}; + +MochiKit.Visual._RoundCorners.prototype = { + _doWrap: function (e) { + var parent = e.parentNode; + var doc = MochiKit.DOM.currentDocument(); + if (typeof(doc.defaultView) === "undefined" + || doc.defaultView === null) { + return e; + } + var style = doc.defaultView.getComputedStyle(e, null); + if (typeof(style) === "undefined" || style === null) { + return e; + } + var wrapper = MochiKit.DOM.DIV({"style": { + display: "block", + // convert padding to margin + marginTop: style.getPropertyValue("padding-top"), + marginRight: style.getPropertyValue("padding-right"), + marginBottom: style.getPropertyValue("padding-bottom"), + marginLeft: style.getPropertyValue("padding-left"), + // remove padding so the rounding looks right + padding: "0px" + /* + paddingRight: "0px", + paddingLeft: "0px" + */ + }}); + wrapper.innerHTML = e.innerHTML; + e.innerHTML = ""; + e.appendChild(wrapper); + return e; + }, + + _roundCornersImpl: function (e, color, bgColor) { + if (this.options.border) { + this._renderBorder(e, bgColor); + } + if (this._isTopRounded()) { + this._roundTopCorners(e, color, bgColor); + } + if (this._isBottomRounded()) { + this._roundBottomCorners(e, color, bgColor); + } + }, + + _renderBorder: function (el, bgColor) { + var borderValue = "1px solid " + this._borderColor(bgColor); + var borderL = "border-left: " + borderValue; + var borderR = "border-right: " + borderValue; + var style = "style='" + borderL + ";" + borderR + "'"; + el.innerHTML = "<div " + style + ">" + el.innerHTML + "</div>"; + }, + + _roundTopCorners: function (el, color, bgColor) { + var corner = this._createCorner(bgColor); + for (var i = 0; i < this.options.numSlices; i++) { + corner.appendChild( + this._createCornerSlice(color, bgColor, i, "top") + ); + } + el.style.paddingTop = 0; + el.insertBefore(corner, el.firstChild); + }, + + _roundBottomCorners: function (el, color, bgColor) { + var corner = this._createCorner(bgColor); + for (var i = (this.options.numSlices - 1); i >= 0; i--) { + corner.appendChild( + this._createCornerSlice(color, bgColor, i, "bottom") + ); + } + el.style.paddingBottom = 0; + el.appendChild(corner); + }, + + _createCorner: function (bgColor) { + var dom = MochiKit.DOM; + return dom.DIV({style: {backgroundColor: bgColor.toString()}}); + }, + + _createCornerSlice: function (color, bgColor, n, position) { + var slice = MochiKit.DOM.SPAN(); + + var inStyle = slice.style; + inStyle.backgroundColor = color.toString(); + inStyle.display = "block"; + inStyle.height = "1px"; + inStyle.overflow = "hidden"; + inStyle.fontSize = "1px"; + + var borderColor = this._borderColor(color, bgColor); + if (this.options.border && n === 0) { + inStyle.borderTopStyle = "solid"; + inStyle.borderTopWidth = "1px"; + inStyle.borderLeftWidth = "0px"; + inStyle.borderRightWidth = "0px"; + inStyle.borderBottomWidth = "0px"; + // assumes css compliant box model + inStyle.height = "0px"; + inStyle.borderColor = borderColor.toString(); + } else if (borderColor) { + inStyle.borderColor = borderColor.toString(); + inStyle.borderStyle = "solid"; + inStyle.borderWidth = "0px 1px"; + } + + if (!this.options.compact && (n == (this.options.numSlices - 1))) { + inStyle.height = "2px"; + } + + this._setMargin(slice, n, position); + this._setBorder(slice, n, position); + + return slice; + }, + + _setOptions: function (options) { + this.options = { + corners: "all", + color: "fromElement", + bgColor: "fromParent", + blend: true, + border: false, + compact: false, + __unstable__wrapElement: false + }; + MochiKit.Base.update(this.options, options); + + this.options.numSlices = (this.options.compact ? 2 : 4); + }, + + _whichSideTop: function () { + var corners = this.options.corners; + if (this._hasString(corners, "all", "top")) { + return ""; + } + + var has_tl = (corners.indexOf("tl") != -1); + var has_tr = (corners.indexOf("tr") != -1); + if (has_tl && has_tr) { + return ""; + } + if (has_tl) { + return "left"; + } + if (has_tr) { + return "right"; + } + return ""; + }, + + _whichSideBottom: function () { + var corners = this.options.corners; + if (this._hasString(corners, "all", "bottom")) { + return ""; + } + + var has_bl = (corners.indexOf('bl') != -1); + var has_br = (corners.indexOf('br') != -1); + if (has_bl && has_br) { + return ""; + } + if (has_bl) { + return "left"; + } + if (has_br) { + return "right"; + } + return ""; + }, + + _borderColor: function (color, bgColor) { + if (color == "transparent") { + return bgColor; + } else if (this.options.border) { + return this.options.border; + } else if (this.options.blend) { + return bgColor.blendedColor(color); + } + return ""; + }, + + + _setMargin: function (el, n, corners) { + var marginSize = this._marginSize(n) + "px"; + var whichSide = ( + corners == "top" ? this._whichSideTop() : this._whichSideBottom() + ); + var style = el.style; + + if (whichSide == "left") { + style.marginLeft = marginSize; + style.marginRight = "0px"; + } else if (whichSide == "right") { + style.marginRight = marginSize; + style.marginLeft = "0px"; + } else { + style.marginLeft = marginSize; + style.marginRight = marginSize; + } + }, + + _setBorder: function (el, n, corners) { + var borderSize = this._borderSize(n) + "px"; + var whichSide = ( + corners == "top" ? this._whichSideTop() : this._whichSideBottom() + ); + + var style = el.style; + if (whichSide == "left") { + style.borderLeftWidth = borderSize; + style.borderRightWidth = "0px"; + } else if (whichSide == "right") { + style.borderRightWidth = borderSize; + style.borderLeftWidth = "0px"; + } else { + style.borderLeftWidth = borderSize; + style.borderRightWidth = borderSize; + } + }, + + _marginSize: function (n) { + if (this.isTransparent) { + return 0; + } + + var o = this.options; + if (o.compact && o.blend) { + var smBlendedMarginSizes = [1, 0]; + return smBlendedMarginSizes[n]; + } else if (o.compact) { + var compactMarginSizes = [2, 1]; + return compactMarginSizes[n]; + } else if (o.blend) { + var blendedMarginSizes = [3, 2, 1, 0]; + return blendedMarginSizes[n]; + } else { + var marginSizes = [5, 3, 2, 1]; + return marginSizes[n]; + } + }, + + _borderSize: function (n) { + var o = this.options; + var borderSizes; + if (o.compact && (o.blend || this.isTransparent)) { + return 1; + } else if (o.compact) { + borderSizes = [1, 0]; + } else if (o.blend) { + borderSizes = [2, 1, 1, 1]; + } else if (o.border) { + borderSizes = [0, 2, 0, 0]; + } else if (this.isTransparent) { + borderSizes = [5, 3, 2, 1]; + } else { + return 0; + } + return borderSizes[n]; + }, + + _hasString: function (str) { + for (var i = 1; i< arguments.length; i++) { + if (str.indexOf(arguments[i]) != -1) { + return true; + } + } + return false; + }, + + _isTopRounded: function () { + return this._hasString(this.options.corners, + "all", "top", "tl", "tr" + ); + }, + + _isBottomRounded: function () { + return this._hasString(this.options.corners, + "all", "bottom", "bl", "br" + ); + }, + + _hasSingleTextChild: function (el) { + return (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3); + } +}; + +/** @id MochiKit.Visual.roundElement */ +MochiKit.Visual.roundElement = function (e, options) { + new MochiKit.Visual._RoundCorners(e, options); +}; + +/** @id MochiKit.Visual.roundClass */ +MochiKit.Visual.roundClass = function (tagName, className, options) { + var elements = MochiKit.DOM.getElementsByTagAndClassName( + tagName, className + ); + for (var i = 0; i < elements.length; i++) { + MochiKit.Visual.roundElement(elements[i], options); + } +}; + +/** @id MochiKit.Visual.tagifyText */ +MochiKit.Visual.tagifyText = function (element, /* optional */tagifyStyle) { + /*** + + Change a node text to character in tags. + + @param tagifyStyle: the style to apply to character nodes, default to + 'position: relative'. + + ***/ + tagifyStyle = tagifyStyle || 'position:relative'; + if (/MSIE/.test(navigator.userAgent)) { + tagifyStyle += ';zoom:1'; + } + element = MochiKit.DOM.getElement(element); + var ma = MochiKit.Base.map; + ma(function (child) { + if (child.nodeType == 3) { + ma(function (character) { + element.insertBefore( + MochiKit.DOM.SPAN({style: tagifyStyle}, + character == ' ' ? String.fromCharCode(160) : character), child); + }, child.nodeValue.split('')); + MochiKit.DOM.removeElement(child); + } + }, element.childNodes); +}; + +MochiKit.Visual._forceRerendering = function (element) { + try { + element = MochiKit.DOM.getElement(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { + } +}; + +/** @id MochiKit.Visual.multiple */ +MochiKit.Visual.multiple = function (elements, effect, /* optional */options) { + /*** + + Launch the same effect subsequently on given elements. + + ***/ + options = MochiKit.Base.update({ + speed: 0.1, delay: 0.0 + }, options); + var masterDelay = options.delay; + var index = 0; + MochiKit.Base.map(function (innerelement) { + options.delay = index * options.speed + masterDelay; + new effect(innerelement, options); + index += 1; + }, elements); +}; + +MochiKit.Visual.PAIRS = { + 'slide': ['slideDown', 'slideUp'], + 'blind': ['blindDown', 'blindUp'], + 'appear': ['appear', 'fade'], + 'size': ['grow', 'shrink'] +}; + +/** @id MochiKit.Visual.toggle */ +MochiKit.Visual.toggle = function (element, /* optional */effect, /* optional */options) { + /*** + + Toggle an item between two state depending of its visibility, making + a effect between these states. Default effect is 'appear', can be + 'slide' or 'blind'. + + ***/ + element = MochiKit.DOM.getElement(element); + effect = (effect || 'appear').toLowerCase(); + options = MochiKit.Base.update({ + queue: {position: 'end', scope: (element.id || 'global'), limit: 1} + }, options); + var v = MochiKit.Visual; + v[MochiKit.Style.getStyle(element, 'display') != 'none' ? + v.PAIRS[effect][1] : v.PAIRS[effect][0]](element, options); +}; + +/*** + +Transitions: define functions calculating variations depending of a position. + +***/ + +MochiKit.Visual.Transitions = { __export__: false }; + +/** @id MochiKit.Visual.Transitions.linear */ +MochiKit.Visual.Transitions.linear = function (pos) { + return pos; +}; + +/** @id MochiKit.Visual.Transitions.sinoidal */ +MochiKit.Visual.Transitions.sinoidal = function (pos) { + return 0.5 - Math.cos(pos*Math.PI)/2; +}; + +/** @id MochiKit.Visual.Transitions.reverse */ +MochiKit.Visual.Transitions.reverse = function (pos) { + return 1 - pos; +}; + +/** @id MochiKit.Visual.Transitions.flicker */ +MochiKit.Visual.Transitions.flicker = function (pos) { + return 0.25 - Math.cos(pos*Math.PI)/4 + Math.random()/2; +}; + +/** @id MochiKit.Visual.Transitions.wobble */ +MochiKit.Visual.Transitions.wobble = function (pos) { + return 0.5 - Math.cos(9*pos*Math.PI)/2; +}; + +/** @id MochiKit.Visual.Transitions.pulse */ +MochiKit.Visual.Transitions.pulse = function (pos, pulses) { + if (pulses) { + pos *= 2 * pulses; + } else { + pos *= 10; + } + var decimals = pos - Math.floor(pos); + return (Math.floor(pos) % 2 == 0) ? decimals : 1 - decimals; +}; + +/** @id MochiKit.Visual.Transitions.parabolic */ +MochiKit.Visual.Transitions.parabolic = function (pos) { + return pos * pos; +}; + +/** @id MochiKit.Visual.Transitions.spring */ +MochiKit.Visual.Transitions.spring = function (pos) { + return 1 - (Math.cos(pos * 2.5 * Math.PI) * Math.exp(-pos * 6)); +}; + +/** @id MochiKit.Visual.Transitions.none */ +MochiKit.Visual.Transitions.none = function (pos) { + return 0; +}; + +/** @id MochiKit.Visual.Transitions.full */ +MochiKit.Visual.Transitions.full = function (pos) { + return 1; +}; + +/*** + +Core effects + +***/ + +MochiKit.Visual.ScopedQueue = function () { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(); + } + this.__init__(); +}; +MochiKit.Visual.ScopedQueue.__export__ = false; + +MochiKit.Base.update(MochiKit.Visual.ScopedQueue.prototype, { + __init__: function () { + this.effects = []; + this.interval = null; + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.add */ + add: function (effect) { + var timestamp = new Date().getTime(); + + var position = (typeof(effect.options.queue) == 'string') ? + effect.options.queue : effect.options.queue.position; + + var ma = MochiKit.Base.map; + switch (position) { + case 'front': + // move unstarted effects after this effect + ma(function (e) { + if (e.state == 'idle') { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + } + }, this.effects); + break; + case 'end': + var finish; + // start effect after last queued effect has finished + ma(function (e) { + var i = e.finishOn; + if (i >= (finish || i)) { + finish = i; + } + }, this.effects); + timestamp = finish || timestamp; + break; + case 'break': + ma(function (e) { + e.finalize(); + }, this.effects); + break; + case 'replace': + ma(function (e) { + e.cancel(); + }, this.effects); + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + if (!effect.options.queue.limit || + this.effects.length < effect.options.queue.limit) { + this.effects.push(effect); + } + + if (!this.interval) { + this.interval = this.startLoop(MochiKit.Base.bind(this.loop, this), + 40); + } + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.startLoop */ + startLoop: function (func, interval) { + return setInterval(func, interval); + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.remove */ + remove: function (effect) { + this.effects = MochiKit.Base.filter(function (e) { + return e != effect; + }, this.effects); + if (!this.effects.length) { + this.stopLoop(this.interval); + this.interval = null; + } + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.stopLoop */ + stopLoop: function (interval) { + clearInterval(interval); + }, + + /** @id MochiKit.Visual.ScopedQueue.prototype.loop */ + loop: function () { + var timePos = new Date().getTime(); + MochiKit.Base.map(function (effect) { + effect.loop(timePos); + }, this.effects); + } +}); + +MochiKit.Visual.Queues = { + __export__: false, + instances: {}, + get: function (queueName) { + if (typeof(queueName) != 'string') { + return queueName; + } + + if (!this.instances[queueName]) { + this.instances[queueName] = new MochiKit.Visual.ScopedQueue(); + } + return this.instances[queueName]; + } +}; + +MochiKit.Visual.Queue = MochiKit.Visual.Queues.get('global'); +MochiKit.Visual.Queue.__export__ = false; + +MochiKit.Visual.DefaultOptions = { + __export__: false, + transition: MochiKit.Visual.Transitions.sinoidal, + duration: 1.0, // seconds + fps: 25.0, // max. 25fps due to MochiKit.Visual.Queue implementation + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' +}; + +MochiKit.Visual.Base = function () {}; + +MochiKit.Visual.Base.prototype = { + /*** + + Basic class for all Effects. Define a looping mechanism called for each step + of an effect. Don't instantiate it, only subclass it. + + ***/ + + __class__ : MochiKit.Visual.Base, + + /** @id MochiKit.Visual.Base.prototype.start */ + start: function (options) { + var v = MochiKit.Visual; + this.options = MochiKit.Base.setdefault(options, + v.DefaultOptions); + this.currentFrame = 0; + this.state = 'idle'; + this.startOn = this.options.delay*1000; + this.finishOn = this.startOn + (this.options.duration*1000); + this.event('beforeStart'); + if (!this.options.sync) { + v.Queues.get(typeof(this.options.queue) == 'string' ? + 'global' : this.options.queue.scope).add(this); + } + }, + + /** @id MochiKit.Visual.Base.prototype.loop */ + loop: function (timePos) { + if (timePos >= this.startOn) { + if (timePos >= this.finishOn) { + return this.finalize(); + } + var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); + var frame = + Math.round(pos * this.options.fps * this.options.duration); + if (frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + + /** @id MochiKit.Visual.Base.prototype.render */ + render: function (pos) { + if (this.state == 'idle') { + this.state = 'running'; + this.event('beforeSetup'); + this.setup(); + this.event('afterSetup'); + } + if (this.state == 'running') { + var trans = this.options.transition; + if (typeof(trans) == "string") { + trans = MochiKit.Visual.Transitions[trans]; + } + if (typeof(trans) == "function") { + pos = trans(pos); + } + pos *= (this.options.to - this.options.from); + pos += this.options.from; + this.event('beforeUpdate'); + this.update(pos); + this.event('afterUpdate'); + } + }, + + /** @id MochiKit.Visual.Base.prototype.cancel */ + cancel: function () { + if (!this.options.sync) { + MochiKit.Visual.Queues.get(typeof(this.options.queue) == 'string' ? + 'global' : this.options.queue.scope).remove(this); + } + this.state = 'finished'; + }, + + /** @id MochiKit.Visual.Base.prototype.finalize */ + finalize: function () { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + this.finish(); + this.event('afterFinish'); + }, + + setup: function () { + }, + + finish: function () { + }, + + update: function (position) { + }, + + /** @id MochiKit.Visual.Base.prototype.event */ + event: function (eventName) { + if (this.options[eventName + 'Internal']) { + this.options[eventName + 'Internal'](this); + } + if (this.options[eventName]) { + this.options[eventName](this); + } + }, + + /** @id MochiKit.Visual.Base.prototype.repr */ + repr: function () { + return '[' + this.__class__.NAME + ', options:' + + MochiKit.Base.repr(this.options) + ']'; + } +}; + +/** @id MochiKit.Visual.Parallel */ +MochiKit.Visual.Parallel = function (effects, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(effects, options); + } + + this.__init__(effects, options); +}; + +MochiKit.Visual.Parallel.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Parallel.prototype, { + /*** + + Run multiple effects at the same time. + + ***/ + + __class__ : MochiKit.Visual.Parallel, + + __init__: function (effects, options) { + this.effects = effects || []; + this.start(options); + }, + + /** @id MochiKit.Visual.Parallel.prototype.update */ + update: function (position) { + MochiKit.Base.map(function (effect) { + effect.render(position); + }, this.effects); + }, + + /** @id MochiKit.Visual.Parallel.prototype.finish */ + finish: function () { + MochiKit.Base.map(function (effect) { + effect.finalize(); + }, this.effects); + } +}); + +/** @id MochiKit.Visual.Sequence */ +MochiKit.Visual.Sequence = function (effects, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(effects, options); + } + this.__init__(effects, options); +}; + +MochiKit.Visual.Sequence.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Sequence.prototype, { + + __class__ : MochiKit.Visual.Sequence, + + __init__: function (effects, options) { + var defs = { transition: MochiKit.Visual.Transitions.linear, + duration: 0 }; + this.effects = effects || []; + MochiKit.Base.map(function (effect) { + defs.duration += effect.options.duration; + }, this.effects); + MochiKit.Base.setdefault(options, defs); + this.start(options); + }, + + /** @id MochiKit.Visual.Sequence.prototype.update */ + update: function (position) { + var time = position * this.options.duration; + for (var i = 0; i < this.effects.length; i++) { + var effect = this.effects[i]; + if (time <= effect.options.duration) { + effect.render(time / effect.options.duration); + break; + } else { + time -= effect.options.duration; + } + } + }, + + /** @id MochiKit.Visual.Sequence.prototype.finish */ + finish: function () { + MochiKit.Base.map(function (effect) { + effect.finalize(); + }, this.effects); + } +}); + +/** @id MochiKit.Visual.Opacity */ +MochiKit.Visual.Opacity = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.Opacity.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Opacity.prototype, { + /*** + + Change the opacity of an element. + + @param options: 'from' and 'to' change the starting and ending opacities. + Must be between 0.0 and 1.0. Default to current opacity and 1.0. + + ***/ + + __class__ : MochiKit.Visual.Opacity, + + __init__: function (element, /* optional */options) { + var b = MochiKit.Base; + var s = MochiKit.Style; + this.element = MochiKit.DOM.getElement(element); + // make this work on IE on elements without 'layout' + if (this.element.currentStyle && + (!this.element.currentStyle.hasLayout)) { + s.setStyle(this.element, {zoom: 1}); + } + options = b.update({ + from: s.getStyle(this.element, 'opacity') || 0.0, + to: 1.0 + }, options); + this.start(options); + }, + + /** @id MochiKit.Visual.Opacity.prototype.update */ + update: function (position) { + MochiKit.Style.setStyle(this.element, {'opacity': position}); + } +}); + +/** @id MochiKit.Visual.Move.prototype */ +MochiKit.Visual.Move = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.Move.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Move.prototype, { + /*** + + Move an element between its current position to a defined position + + @param options: 'x' and 'y' for final positions, default to 0, 0. + + ***/ + + __class__ : MochiKit.Visual.Move, + + __init__: function (element, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + options = MochiKit.Base.update({ + x: 0, + y: 0, + mode: 'relative' + }, options); + this.start(options); + }, + + /** @id MochiKit.Visual.Move.prototype.setup */ + setup: function () { + // Bug in Opera: Opera returns the 'real' position of a static element + // or relative element that does not have top/left explicitly set. + // ==> Always set top and left for position relative elements in your + // stylesheets (to 0 if you do not need them) + MochiKit.Style.makePositioned(this.element); + + var s = this.element.style; + var originalVisibility = s.visibility; + var originalDisplay = s.display; + if (originalDisplay == 'none') { + s.visibility = 'hidden'; + s.display = ''; + } + + this.originalLeft = parseFloat(MochiKit.Style.getStyle(this.element, 'left') || '0'); + this.originalTop = parseFloat(MochiKit.Style.getStyle(this.element, 'top') || '0'); + + if (this.options.mode == 'absolute') { + // absolute movement, so we need to calc deltaX and deltaY + this.options.x -= this.originalLeft; + this.options.y -= this.originalTop; + } + if (originalDisplay == 'none') { + s.visibility = originalVisibility; + s.display = originalDisplay; + } + }, + + /** @id MochiKit.Visual.Move.prototype.update */ + update: function (position) { + MochiKit.Style.setStyle(this.element, { + left: Math.round(this.options.x * position + this.originalLeft) + 'px', + top: Math.round(this.options.y * position + this.originalTop) + 'px' + }); + } +}); + +/** @id MochiKit.Visual.Scale */ +MochiKit.Visual.Scale = function (element, percent, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, percent, options); + } + this.__init__(element, percent, options); +}; + +MochiKit.Visual.Scale.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Scale.prototype, { + /*** + + Change the size of an element. + + @param percent: final_size = percent*original_size + + @param options: several options changing scale behaviour + + ***/ + + __class__ : MochiKit.Visual.Scale, + + __init__: function (element, percent, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + options = MochiKit.Base.update({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or {} with provided values + scaleFrom: 100.0, + scaleTo: percent + }, options); + this.start(options); + }, + + /** @id MochiKit.Visual.Scale.prototype.setup */ + setup: function () { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = MochiKit.Style.getStyle(this.element, + 'position'); + + var ma = MochiKit.Base.map; + var b = MochiKit.Base.bind; + this.originalStyle = {}; + ma(b(function (k) { + this.originalStyle[k] = this.element.style[k]; + }, this), ['top', 'left', 'width', 'height', 'fontSize']); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = MochiKit.Style.getStyle(this.element, + 'font-size') || '100%'; + ma(b(function (fontSizeType) { + if (fontSize.indexOf(fontSizeType) > 0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }, this), ['em', 'px', '%']); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + if (/^content/.test(this.options.scaleMode)) { + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + } else if (this.options.scaleMode == 'box') { + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + } else { + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + } + }, + + /** @id MochiKit.Visual.Scale.prototype.update */ + update: function (position) { + var currentScale = (this.options.scaleFrom/100.0) + + (this.factor * position); + if (this.options.scaleContent && this.fontSize) { + MochiKit.Style.setStyle(this.element, { + fontSize: this.fontSize * currentScale + this.fontSizeType + }); + } + this.setDimensions(this.dims[0] * currentScale, + this.dims[1] * currentScale); + }, + + /** @id MochiKit.Visual.Scale.prototype.finish */ + finish: function () { + if (this.restoreAfterFinish) { + MochiKit.Style.setStyle(this.element, this.originalStyle); + } + }, + + /** @id MochiKit.Visual.Scale.prototype.setDimensions */ + setDimensions: function (height, width) { + var d = {}; + var r = Math.round; + if (/MSIE/.test(navigator.userAgent)) { + r = Math.ceil; + } + if (this.options.scaleX) { + d.width = r(width) + 'px'; + } + if (this.options.scaleY) { + d.height = r(height) + 'px'; + } + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) { + d.top = this.originalTop - topd + 'px'; + } + if (this.options.scaleX) { + d.left = this.originalLeft - leftd + 'px'; + } + } else { + if (this.options.scaleY) { + d.top = -topd + 'px'; + } + if (this.options.scaleX) { + d.left = -leftd + 'px'; + } + } + } + MochiKit.Style.setStyle(this.element, d); + } +}); + +/** @id MochiKit.Visual.Highlight */ +MochiKit.Visual.Highlight = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.Highlight.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Highlight.prototype, { + /*** + + Highlight an item of the page. + + @param options: 'startcolor' for choosing highlighting color, default + to '#ffff99'. + + ***/ + + __class__ : MochiKit.Visual.Highlight, + + __init__: function (element, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + options = MochiKit.Base.update({ + startcolor: '#ffff99' + }, options); + this.start(options); + }, + + /** @id MochiKit.Visual.Highlight.prototype.setup */ + setup: function () { + var b = MochiKit.Base; + var s = MochiKit.Style; + // Prevent executing on elements not in the layout flow + if (s.getStyle(this.element, 'display') == 'none') { + this.cancel(); + return; + } + // Disable background image during the effect + this.oldStyle = { + backgroundImage: s.getStyle(this.element, 'background-image') + }; + s.setStyle(this.element, { + backgroundImage: 'none' + }); + + if (!this.options.endcolor) { + this.options.endcolor = + MochiKit.Color.Color.fromBackground(this.element).toHexString(); + } + if (b.isUndefinedOrNull(this.options.restorecolor)) { + this.options.restorecolor = s.getStyle(this.element, + 'background-color'); + } + // init color calculations + this._base = b.map(b.bind(function (i) { + return parseInt( + this.options.startcolor.slice(i*2 + 1, i*2 + 3), 16); + }, this), [0, 1, 2]); + this._delta = b.map(b.bind(function (i) { + return parseInt(this.options.endcolor.slice(i*2 + 1, i*2 + 3), 16) + - this._base[i]; + }, this), [0, 1, 2]); + }, + + /** @id MochiKit.Visual.Highlight.prototype.update */ + update: function (position) { + var m = '#'; + MochiKit.Base.map(MochiKit.Base.bind(function (i) { + m += MochiKit.Color.toColorPart(Math.round(this._base[i] + + this._delta[i]*position)); + }, this), [0, 1, 2]); + MochiKit.Style.setStyle(this.element, { + backgroundColor: m + }); + }, + + /** @id MochiKit.Visual.Highlight.prototype.finish */ + finish: function () { + MochiKit.Style.setStyle(this.element, + MochiKit.Base.update(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +/** @id MochiKit.Visual.ScrollTo */ +MochiKit.Visual.ScrollTo = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.ScrollTo.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.ScrollTo.prototype, { + /*** + + Scroll to an element in the page. + + ***/ + + __class__ : MochiKit.Visual.ScrollTo, + + __init__: function (element, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + this.start(options); + }, + + /** @id MochiKit.Visual.ScrollTo.prototype.setup */ + setup: function () { + var p = MochiKit.Position; + p.prepare(); + var offsets = p.cumulativeOffset(this.element); + if (this.options.offset) { + offsets.y += this.options.offset; + } + var max; + if (window.innerHeight) { + max = window.innerHeight - window.height; + } else if (document.documentElement && + document.documentElement.clientHeight) { + max = document.documentElement.clientHeight - + document.body.scrollHeight; + } else if (document.body) { + max = document.body.clientHeight - document.body.scrollHeight; + } + this.scrollStart = p.windowOffset.y; + this.delta = (offsets.y > max ? max : offsets.y) - this.scrollStart; + }, + + /** @id MochiKit.Visual.ScrollTo.prototype.update */ + update: function (position) { + var p = MochiKit.Position; + p.prepare(); + window.scrollTo(p.windowOffset.x, this.scrollStart + (position * this.delta)); + } +}); + +MochiKit.Visual._CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +MochiKit.Visual.Morph = function (element, options) { + var cls = arguments.callee; + if (!(this instanceof cls)) { + return new cls(element, options); + } + this.__init__(element, options); +}; + +MochiKit.Visual.Morph.prototype = new MochiKit.Visual.Base(); + +MochiKit.Base.update(MochiKit.Visual.Morph.prototype, { + /*** + + Morph effect: make a transformation from current style to the given style, + automatically making a transition between the two. + + ***/ + + __class__ : MochiKit.Visual.Morph, + + __init__: function (element, /* optional */options) { + this.element = MochiKit.DOM.getElement(element); + this.start(options); + }, + + /** @id MochiKit.Visual.Morph.prototype.setup */ + setup: function () { + var b = MochiKit.Base; + var style = this.options.style; + this.styleStart = {}; + this.styleEnd = {}; + this.units = {}; + var value, unit; + for (var s in style) { + value = style[s]; + s = b.camelize(s); + if (MochiKit.Visual._CSS_LENGTH.test(value)) { + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + unit = (components.length == 3) ? components[2] : null; + this.styleEnd[s] = value; + this.units[s] = unit; + value = MochiKit.Style.getStyle(this.element, s); + components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + this.styleStart[s] = value; + } else if (/[Cc]olor$/.test(s)) { + var c = MochiKit.Color.Color; + value = c.fromString(value); + if (value) { + this.units[s] = "color"; + this.styleEnd[s] = value.toHexString(); + value = MochiKit.Style.getStyle(this.element, s); + this.styleStart[s] = c.fromString(value).toHexString(); + + this.styleStart[s] = b.map(b.bind(function (i) { + return parseInt( + this.styleStart[s].slice(i*2 + 1, i*2 + 3), 16); + }, this), [0, 1, 2]); + this.styleEnd[s] = b.map(b.bind(function (i) { + return parseInt( + this.styleEnd[s].slice(i*2 + 1, i*2 + 3), 16); + }, this), [0, 1, 2]); + } + } else { + // For non-length & non-color properties, we just set the value + this.element.style[s] = value; + } + } + }, + + /** @id MochiKit.Visual.Morph.prototype.update */ + update: function (position) { + var value; + for (var s in this.styleStart) { + if (this.units[s] == "color") { + var m = '#'; + var start = this.styleStart[s]; + var end = this.styleEnd[s]; + MochiKit.Base.map(MochiKit.Base.bind(function (i) { + m += MochiKit.Color.toColorPart(Math.round(start[i] + + (end[i] - start[i])*position)); + }, this), [0, 1, 2]); + this.element.style[s] = m; + } else { + value = this.styleStart[s] + Math.round((this.styleEnd[s] - this.styleStart[s]) * position * 1000) / 1000 + this.units[s]; + this.element.style[s] = value; + } + } + } +}); + +/*** + +Combination effects. + +***/ + +/** @id MochiKit.Visual.fade */ +MochiKit.Visual.fade = function (element, /* optional */ options) { + /*** + + Fade a given element: change its opacity and hide it in the end. + + @param options: 'to' and 'from' to change opacity. + + ***/ + var s = MochiKit.Style; + var oldOpacity = s.getStyle(element, 'opacity'); + options = MochiKit.Base.update({ + from: s.getStyle(element, 'opacity') || 1.0, + to: 0.0, + afterFinishInternal: function (effect) { + if (effect.options.to !== 0) { + return; + } + s.hideElement(effect.element); + s.setStyle(effect.element, {'opacity': oldOpacity}); + } + }, options); + return new MochiKit.Visual.Opacity(element, options); +}; + +/** @id MochiKit.Visual.appear */ +MochiKit.Visual.appear = function (element, /* optional */ options) { + /*** + + Make an element appear. + + @param options: 'to' and 'from' to change opacity. + + ***/ + var s = MochiKit.Style; + var v = MochiKit.Visual; + options = MochiKit.Base.update({ + from: (s.getStyle(element, 'display') == 'none' ? 0.0 : + s.getStyle(element, 'opacity') || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function (effect) { + v._forceRerendering(effect.element); + }, + beforeSetupInternal: function (effect) { + s.setStyle(effect.element, {'opacity': effect.options.from}); + s.showElement(effect.element); + } + }, options); + return new v.Opacity(element, options); +}; + +/** @id MochiKit.Visual.puff */ +MochiKit.Visual.puff = function (element, /* optional */ options) { + /*** + + 'Puff' an element: grow it to double size, fading it and make it hidden. + + ***/ + var s = MochiKit.Style; + var v = MochiKit.Visual; + element = MochiKit.DOM.getElement(element); + var elementDimensions = MochiKit.Style.getElementDimensions(element, true); + var oldStyle = { + position: s.getStyle(element, 'position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height, + opacity: s.getStyle(element, 'opacity') + }; + options = MochiKit.Base.update({ + beforeSetupInternal: function (effect) { + MochiKit.Position.absolutize(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + }, + scaleContent: true, + scaleFromCenter: true + }, options); + return new v.Parallel( + [new v.Scale(element, 200, + {sync: true, scaleFromCenter: options.scaleFromCenter, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + scaleContent: options.scaleContent, restoreAfterFinish: true}), + new v.Opacity(element, {sync: true, to: 0.0 })], + options); +}; + +/** @id MochiKit.Visual.blindUp */ +MochiKit.Visual.blindUp = function (element, /* optional */ options) { + /*** + + Blind an element up: change its vertical size to 0. + + ***/ + var d = MochiKit.DOM; + var s = MochiKit.Style; + element = d.getElement(element); + var elementDimensions = s.getElementDimensions(element, true); + var elemClip = s.makeClipping(element); + options = MochiKit.Base.update({ + scaleContent: false, + scaleX: false, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + restoreAfterFinish: true, + afterFinishInternal: function (effect) { + s.hideElement(effect.element); + s.undoClipping(effect.element, elemClip); + } + }, options); + return new MochiKit.Visual.Scale(element, 0, options); +}; + +/** @id MochiKit.Visual.blindDown */ +MochiKit.Visual.blindDown = function (element, /* optional */ options) { + /*** + + Blind an element down: restore its vertical size. + + ***/ + var d = MochiKit.DOM; + var s = MochiKit.Style; + element = d.getElement(element); + var elementDimensions = s.getElementDimensions(element, true); + var elemClip; + options = MochiKit.Base.update({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + restoreAfterFinish: true, + afterSetupInternal: function (effect) { + elemClip = s.makeClipping(effect.element); + s.setStyle(effect.element, {height: '0px'}); + s.showElement(effect.element); + }, + afterFinishInternal: function (effect) { + s.undoClipping(effect.element, elemClip); + } + }, options); + return new MochiKit.Visual.Scale(element, 100, options); +}; + +/** @id MochiKit.Visual.switchOff */ +MochiKit.Visual.switchOff = function (element, /* optional */ options) { + /*** + + Apply a switch-off-like effect. + + ***/ + var d = MochiKit.DOM; + var s = MochiKit.Style; + element = d.getElement(element); + var elementDimensions = s.getElementDimensions(element, true); + var oldOpacity = s.getStyle(element, 'opacity'); + var elemClip; + options = MochiKit.Base.update({ + duration: 0.7, + restoreAfterFinish: true, + beforeSetupInternal: function (effect) { + s.makePositioned(element); + elemClip = s.makeClipping(element); + }, + afterFinishInternal: function (effect) { + s.hideElement(element); + s.undoClipping(element, elemClip); + s.undoPositioned(element); + s.setStyle(element, {'opacity': oldOpacity}); + } + }, options); + var v = MochiKit.Visual; + return new v.Sequence( + [new v.appear(element, + { sync: true, duration: 0.57 * options.duration, + from: 0, transition: v.Transitions.flicker }), + new v.Scale(element, 1, + { sync: true, duration: 0.43 * options.duration, + scaleFromCenter: true, scaleX: false, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + scaleContent: false, restoreAfterFinish: true })], + options); +}; + +/** @id MochiKit.Visual.dropOut */ +MochiKit.Visual.dropOut = function (element, /* optional */ options) { + /*** + + Make an element fall and disappear. + + ***/ + var d = MochiKit.DOM; + var s = MochiKit.Style; + element = d.getElement(element); + var oldStyle = { + top: s.getStyle(element, 'top'), + left: s.getStyle(element, 'left'), + opacity: s.getStyle(element, 'opacity') + }; + + options = MochiKit.Base.update({ + duration: 0.5, + distance: 100, + beforeSetupInternal: function (effect) { + s.makePositioned(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + s.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options); + var v = MochiKit.Visual; + return new v.Parallel( + [new v.Move(element, {x: 0, y: options.distance, sync: true}), + new v.Opacity(element, {sync: true, to: 0.0})], + options); +}; + +/** @id MochiKit.Visual.shake */ +MochiKit.Visual.shake = function (element, /* optional */ options) { + /*** + + Move an element from left to right several times. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + element = d.getElement(element); + var oldStyle = { + top: s.getStyle(element, 'top'), + left: s.getStyle(element, 'left') + }; + options = MochiKit.Base.update({ + duration: 0.5, + afterFinishInternal: function (effect) { + s.undoPositioned(element); + s.setStyle(element, oldStyle); + } + }, options); + return new v.Sequence( + [new v.Move(element, { sync: true, duration: 0.1 * options.duration, + x: 20, y: 0 }), + new v.Move(element, { sync: true, duration: 0.2 * options.duration, + x: -40, y: 0 }), + new v.Move(element, { sync: true, duration: 0.2 * options.duration, + x: 40, y: 0 }), + new v.Move(element, { sync: true, duration: 0.2 * options.duration, + x: -40, y: 0 }), + new v.Move(element, { sync: true, duration: 0.2 * options.duration, + x: 40, y: 0 }), + new v.Move(element, { sync: true, duration: 0.1 * options.duration, + x: -20, y: 0 })], + options); +}; + +/** @id MochiKit.Visual.slideDown */ +MochiKit.Visual.slideDown = function (element, /* optional */ options) { + /*** + + Slide an element down. + It needs to have the content of the element wrapped in a container + element with fixed height. + + ***/ + var d = MochiKit.DOM; + var b = MochiKit.Base; + var s = MochiKit.Style; + element = d.getElement(element); + if (!element.firstChild) { + throw new Error("MochiKit.Visual.slideDown must be used on a element with a child"); + } + d.removeEmptyTextNodes(element); + var oldInnerBottom = s.getStyle(element.firstChild, 'bottom') || 0; + var elementDimensions = s.getElementDimensions(element, true); + var elemClip; + options = b.update({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + restoreAfterFinish: true, + afterSetupInternal: function (effect) { + s.makePositioned(effect.element); + s.makePositioned(effect.element.firstChild); + if (/Opera/.test(navigator.userAgent)) { + s.setStyle(effect.element, {top: ''}); + } + elemClip = s.makeClipping(effect.element); + s.setStyle(effect.element, {height: '0px'}); + s.showElement(effect.element); + }, + afterUpdateInternal: function (effect) { + var elementDimensions = s.getElementDimensions(effect.element, true); + s.setStyle(effect.element.firstChild, + {bottom: (effect.dims[0] - elementDimensions.h) + 'px'}); + }, + afterFinishInternal: function (effect) { + s.undoClipping(effect.element, elemClip); + // IE will crash if child is undoPositioned first + if (/MSIE/.test(navigator.userAgent)) { + s.undoPositioned(effect.element); + s.undoPositioned(effect.element.firstChild); + } else { + s.undoPositioned(effect.element.firstChild); + s.undoPositioned(effect.element); + } + s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); + } + }, options); + + return new MochiKit.Visual.Scale(element, 100, options); +}; + +/** @id MochiKit.Visual.slideUp */ +MochiKit.Visual.slideUp = function (element, /* optional */ options) { + /*** + + Slide an element up. + It needs to have the content of the element wrapped in a container + element with fixed height. + + ***/ + var d = MochiKit.DOM; + var b = MochiKit.Base; + var s = MochiKit.Style; + element = d.getElement(element); + if (!element.firstChild) { + throw new Error("MochiKit.Visual.slideUp must be used on a element with a child"); + } + d.removeEmptyTextNodes(element); + var oldInnerBottom = s.getStyle(element.firstChild, 'bottom'); + var elementDimensions = s.getElementDimensions(element, true); + var elemClip; + options = b.update({ + scaleContent: false, + scaleX: false, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + scaleFrom: 100, + restoreAfterFinish: true, + beforeStartInternal: function (effect) { + s.makePositioned(effect.element); + s.makePositioned(effect.element.firstChild); + if (/Opera/.test(navigator.userAgent)) { + s.setStyle(effect.element, {top: ''}); + } + elemClip = s.makeClipping(effect.element); + s.showElement(effect.element); + }, + afterUpdateInternal: function (effect) { + var elementDimensions = s.getElementDimensions(effect.element, true); + s.setStyle(effect.element.firstChild, + {bottom: (effect.dims[0] - elementDimensions.h) + 'px'}); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.element); + s.undoClipping(effect.element, elemClip); + s.undoPositioned(effect.element.firstChild); + s.undoPositioned(effect.element); + s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); + } + }, options); + return new MochiKit.Visual.Scale(element, 0, options); +}; + +// Bug in opera makes the TD containing this element expand for a instance +// after finish +/** @id MochiKit.Visual.squish */ +MochiKit.Visual.squish = function (element, /* optional */ options) { + /*** + + Reduce an element and make it disappear. + + ***/ + var d = MochiKit.DOM; + var b = MochiKit.Base; + var s = MochiKit.Style; + var elementDimensions = s.getElementDimensions(element, true); + var elemClip; + options = b.update({ + restoreAfterFinish: true, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + beforeSetupInternal: function (effect) { + elemClip = s.makeClipping(effect.element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.element); + s.undoClipping(effect.element, elemClip); + } + }, options); + + return new MochiKit.Visual.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, options); +}; + +/** @id MochiKit.Visual.grow */ +MochiKit.Visual.grow = function (element, /* optional */ options) { + /*** + + Grow an element to its original size. Make it zero-sized before + if necessary. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + element = d.getElement(element); + options = MochiKit.Base.update({ + direction: 'center', + moveTransition: v.Transitions.sinoidal, + scaleTransition: v.Transitions.sinoidal, + opacityTransition: v.Transitions.full, + scaleContent: true, + scaleFromCenter: false + }, options); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: s.getStyle(element, 'opacity') + }; + var dims = s.getElementDimensions(element, true); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.w; + initialMoveY = moveY = 0; + moveX = -dims.w; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.h; + moveY = -dims.h; + break; + case 'bottom-right': + initialMoveX = dims.w; + initialMoveY = dims.h; + moveX = -dims.w; + moveY = -dims.h; + break; + case 'center': + initialMoveX = dims.w / 2; + initialMoveY = dims.h / 2; + moveX = -dims.w / 2; + moveY = -dims.h / 2; + break; + } + + var optionsParallel = MochiKit.Base.update({ + beforeSetupInternal: function (effect) { + s.setStyle(effect.effects[0].element, {height: '0px'}); + s.showElement(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.undoClipping(effect.effects[0].element); + s.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options); + + return new v.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetupInternal: function (effect) { + s.hideElement(effect.element); + s.makeClipping(effect.element); + s.makePositioned(effect.element); + }, + afterFinishInternal: function (effect) { + new v.Parallel( + [new v.Opacity(effect.element, { + sync: true, to: 1.0, from: 0.0, + transition: options.opacityTransition + }), + new v.Move(effect.element, { + x: moveX, y: moveY, sync: true, + transition: options.moveTransition + }), + new v.Scale(effect.element, 100, { + scaleMode: {originalHeight: dims.h, + originalWidth: dims.w}, + sync: true, + scaleFrom: /Opera/.test(navigator.userAgent) ? 1 : 0, + transition: options.scaleTransition, + scaleContent: options.scaleContent, + scaleFromCenter: options.scaleFromCenter, + restoreAfterFinish: true + }) + ], optionsParallel + ); + } + }); +}; + +/** @id MochiKit.Visual.shrink */ +MochiKit.Visual.shrink = function (element, /* optional */ options) { + /*** + + Shrink an element and make it disappear. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + element = d.getElement(element); + options = MochiKit.Base.update({ + direction: 'center', + moveTransition: v.Transitions.sinoidal, + scaleTransition: v.Transitions.sinoidal, + opacityTransition: v.Transitions.none, + scaleContent: true, + scaleFromCenter: false + }, options); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: s.getStyle(element, 'opacity') + }; + + var dims = s.getElementDimensions(element, true); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.w; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.h; + break; + case 'bottom-right': + moveX = dims.w; + moveY = dims.h; + break; + case 'center': + moveX = dims.w / 2; + moveY = dims.h / 2; + break; + } + var elemClip; + + var optionsParallel = MochiKit.Base.update({ + beforeStartInternal: function (effect) { + s.makePositioned(effect.effects[0].element); + elemClip = s.makeClipping(effect.effects[0].element); + }, + afterFinishInternal: function (effect) { + s.hideElement(effect.effects[0].element); + s.undoClipping(effect.effects[0].element, elemClip); + s.undoPositioned(effect.effects[0].element); + s.setStyle(effect.effects[0].element, oldStyle); + } + }, options); + + return new v.Parallel( + [new v.Opacity(element, { + sync: true, to: 0.0, from: 1.0, + transition: options.opacityTransition + }), + new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, { + scaleMode: {originalHeight: dims.h, originalWidth: dims.w}, + sync: true, transition: options.scaleTransition, + scaleContent: options.scaleContent, + scaleFromCenter: options.scaleFromCenter, + restoreAfterFinish: true + }), + new v.Move(element, { + x: moveX, y: moveY, sync: true, transition: options.moveTransition + }) + ], optionsParallel + ); +}; + +/** @id MochiKit.Visual.pulsate */ +MochiKit.Visual.pulsate = function (element, /* optional */ options) { + /*** + + Pulse an element between appear/fade. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var b = MochiKit.Base; + var oldOpacity = MochiKit.Style.getStyle(element, 'opacity'); + options = b.update({ + duration: 3.0, + from: 0, + afterFinishInternal: function (effect) { + MochiKit.Style.setStyle(effect.element, {'opacity': oldOpacity}); + } + }, options); + var transition = options.transition || v.Transitions.sinoidal; + options.transition = function (pos) { + return transition(1 - v.Transitions.pulse(pos, options.pulses)); + }; + return new v.Opacity(element, options); +}; + +/** @id MochiKit.Visual.fold */ +MochiKit.Visual.fold = function (element, /* optional */ options) { + /*** + + Fold an element, first vertically, then horizontally. + + ***/ + var d = MochiKit.DOM; + var v = MochiKit.Visual; + var s = MochiKit.Style; + element = d.getElement(element); + var elementDimensions = s.getElementDimensions(element, true); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + var elemClip = s.makeClipping(element); + options = MochiKit.Base.update({ + scaleContent: false, + scaleX: false, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + afterFinishInternal: function (effect) { + new v.Scale(element, 1, { + scaleContent: false, + scaleY: false, + scaleMode: {originalHeight: elementDimensions.h, + originalWidth: elementDimensions.w}, + afterFinishInternal: function (effect) { + s.hideElement(effect.element); + s.undoClipping(effect.element, elemClip); + s.setStyle(effect.element, oldStyle); + } + }); + } + }, options); + return new v.Scale(element, 5, options); +}; + + +MochiKit.Base.nameFunctions(MochiKit.Visual); +MochiKit.Base._exportSymbols(this, MochiKit.Visual); diff --git a/frontend/delta/js/React/react-0.4.1.js b/frontend/delta/js/React/react-0.4.1.js new file mode 100644 index 0000000..d029de2 --- a/dev/null +++ b/frontend/delta/js/React/react-0.4.1.js @@ -0,0 +1,11491 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +/** + * React v0.4.1 + */ +(function(e){if("function"==typeof bootstrap)bootstrap("react",e);else if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeReact=e}else"undefined"!=typeof window?window.React=e():global.React=e()})(function(){var define,ses,bootstrap,module,exports; +return (function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule $ + * @typechecks + */ + +var ge = require("./ge"); +var ex = require("./ex"); + +/** + * @param {string|DOMDocument|DOMElement|DOMTextNode} id + * @return {DOMDocument|DOMElement|DOMTextNode} + * + * Find a node by ID. + * + * If your application code depends on the existence of the element, use $, + * which will throw if the element doesn't exist. + * + * If you're not sure whether or not the element exists, use ge instead, and + * manually check for the element's existence in your application code. + */ +function $(id) { + var element = ge(id); + if (!element) { + throw new Error(ex( + 'Tried to get element with id of "%s" but it is not present on the page.', + id + )); + } + return element; +} + +module.exports = $; + +},{"./ex":68,"./ge":71}],2:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule CSSProperty + */ + +"use strict"; + +/** + * CSS properties which accept numbers but are not in units of "px". + */ +var isUnitlessNumber = { + fillOpacity: true, + fontWeight: true, + opacity: true, + orphans: true, + zIndex: true, + zoom: true +}; + +/** + * Most style properties can be unset by doing .style[prop] = '' but IE8 + * doesn't like doing that with shorthand properties so for the properties that + * IE8 breaks on, which are listed here, we instead unset each of the + * individual properties. See http://bugs.jquery.com/ticket/12385. + * The 4-value 'clock' properties like margin, padding, border-width seem to + * behave without any problems. Curiously, list-style works too without any + * special prodding. + */ +var shorthandPropertyExpansions = { + background: { + backgroundImage: true, + backgroundPosition: true, + backgroundRepeat: true, + backgroundColor: true + }, + border: { + borderWidth: true, + borderStyle: true, + borderColor: true + }, + borderBottom: { + borderBottomWidth: true, + borderBottomStyle: true, + borderBottomColor: true + }, + borderLeft: { + borderLeftWidth: true, + borderLeftStyle: true, + borderLeftColor: true + }, + borderRight: { + borderRightWidth: true, + borderRightStyle: true, + borderRightColor: true + }, + borderTop: { + borderTopWidth: true, + borderTopStyle: true, + borderTopColor: true + }, + font: { + fontStyle: true, + fontVariant: true, + fontWeight: true, + fontSize: true, + lineHeight: true, + fontFamily: true + } +}; + +var CSSProperty = { + isUnitlessNumber: isUnitlessNumber, + shorthandPropertyExpansions: shorthandPropertyExpansions +}; + +module.exports = CSSProperty; + +},{}],3:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule CSSPropertyOperations + * @typechecks static-only + */ + +"use strict"; + +var CSSProperty = require("./CSSProperty"); + +var dangerousStyleValue = require("./dangerousStyleValue"); +var escapeTextForBrowser = require("./escapeTextForBrowser"); +var hyphenate = require("./hyphenate"); +var memoizeStringOnly = require("./memoizeStringOnly"); + +var processStyleName = memoizeStringOnly(function(styleName) { + return escapeTextForBrowser(hyphenate(styleName)); +}); + +/** + * Operations for dealing with CSS properties. + */ +var CSSPropertyOperations = { + + /** + * Serializes a mapping of style properties for use as inline styles: + * + * > createMarkupForStyles({width: '200px', height: 0}) + * "width:200px;height:0;" + * + * Undefined values are ignored so that declarative programming is easier. + * + * @param {object} styles + * @return {?string} + */ + createMarkupForStyles: function(styles) { + var serialized = ''; + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + var styleValue = styles[styleName]; + if (styleValue != null) { + serialized += processStyleName(styleName) + ':'; + serialized += dangerousStyleValue(styleName, styleValue) + ';'; + } + } + return serialized || null; + }, + + /** + * Sets the value for multiple styles on a node. If a value is specified as + * '' (empty string), the corresponding style property will be unset. + * + * @param {DOMElement} node + * @param {object} styles + */ + setValueForStyles: function(node, styles) { + var style = node.style; + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + var styleValue = dangerousStyleValue(styleName, styles[styleName]); + if (styleValue) { + style[styleName] = styleValue; + } else { + var expansion = CSSProperty.shorthandPropertyExpansions[styleName]; + if (expansion) { + // Shorthand property that IE8 won't like unsetting, so unset each + // component to placate it + for (var individualStyleName in expansion) { + style[individualStyleName] = ''; + } + } else { + style[styleName] = ''; + } + } + } + } + +}; + +module.exports = CSSPropertyOperations; + +},{"./CSSProperty":2,"./dangerousStyleValue":65,"./escapeTextForBrowser":67,"./hyphenate":76,"./memoizeStringOnly":83}],4:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule CallbackRegistry + * @typechecks static-only + */ + +"use strict"; + +var listenerBank = {}; + +/** + * Stores "listeners" by `registrationName`/`id`. There should be at most one + * "listener" per `registrationName`/`id` in the `listenerBank`. + * + * Access listeners via `listenerBank[registrationName][id]`. + * + * @class CallbackRegistry + * @internal + */ +var CallbackRegistry = { + + /** + * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent. + * + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @param {?function} listener The callback to store. + */ + putListener: function(id, registrationName, listener) { + var bankForRegistrationName = + listenerBank[registrationName] || (listenerBank[registrationName] = {}); + bankForRegistrationName[id] = listener; + }, + + /** + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @return {?function} The stored callback. + */ + getListener: function(id, registrationName) { + var bankForRegistrationName = listenerBank[registrationName]; + return bankForRegistrationName && bankForRegistrationName[id]; + }, + + /** + * Deletes a listener from the registration bank. + * + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + */ + deleteListener: function(id, registrationName) { + var bankForRegistrationName = listenerBank[registrationName]; + if (bankForRegistrationName) { + delete bankForRegistrationName[id]; + } + }, + + /** + * Deletes all listeners for the DOM element with the supplied ID. + * + * @param {string} id ID of the DOM element. + */ + deleteAllListeners: function(id) { + for (var registrationName in listenerBank) { + delete listenerBank[registrationName][id]; + } + }, + + /** + * This is needed for tests only. Do not use! + */ + __purge: function() { + listenerBank = {}; + } + +}; + +module.exports = CallbackRegistry; + +},{}],5:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ChangeEventPlugin + */ + +"use strict"; + +var EventConstants = require("./EventConstants"); +var EventPluginHub = require("./EventPluginHub"); +var EventPropagators = require("./EventPropagators"); +var ExecutionEnvironment = require("./ExecutionEnvironment"); +var SyntheticEvent = require("./SyntheticEvent"); + +var isEventSupported = require("./isEventSupported"); +var keyOf = require("./keyOf"); + +var topLevelTypes = EventConstants.topLevelTypes; + +var eventTypes = { + change: { + phasedRegistrationNames: { + bubbled: keyOf({onChange: null}), + captured: keyOf({onChangeCapture: null}) + } + } +}; + +/** + * For IE shims + */ +var activeElement = null; +var activeElementID = null; +var activeElementValue = null; +var activeElementValueProp = null; + + +/** + * SECTION: handle `change` event + */ +function shouldUseChangeEvent(elem) { + return ( + elem.nodeName === 'SELECT' || + (elem.nodeName === 'INPUT' && elem.type === 'file') + ); +} + +var doesChangeEventBubble = false; +if (ExecutionEnvironment.canUseDOM) { + // See `handleChange` comment below + doesChangeEventBubble = isEventSupported('change') && ( + !('documentMode' in document) || document.documentMode > 8 + ); +} + +function manualDispatchChangeEvent(nativeEvent) { + var event = SyntheticEvent.getPooled( + eventTypes.change, + activeElementID, + nativeEvent + ); + EventPropagators.accumulateTwoPhaseDispatches(event); + + // If change bubbled, we'd just bind to it like all the other events + // and have it go through ReactEventTopLevelCallback. Since it doesn't, we + // manually listen for the change event and so we have to enqueue and + // process the abstract event manually. + EventPluginHub.enqueueEvents(event); + EventPluginHub.processEventQueue(); +} + +function startWatchingForChangeEventIE8(target, targetID) { + activeElement = target; + activeElementID = targetID; + activeElement.attachEvent('onchange', manualDispatchChangeEvent); +} + +function stopWatchingForChangeEventIE8() { + if (!activeElement) { + return; + } + activeElement.detachEvent('onchange', manualDispatchChangeEvent); + activeElement = null; + activeElementID = null; +} + +function getTargetIDForChangeEvent( + topLevelType, + topLevelTarget, + topLevelTargetID) { + if (topLevelType === topLevelTypes.topChange) { + return topLevelTargetID; + } +} +function handleEventsForChangeEventIE8( + topLevelType, + topLevelTarget, + topLevelTargetID) { + if (topLevelType === topLevelTypes.topFocus) { + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForChangeEventIE8(); + startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID); + } else if (topLevelType === topLevelTypes.topBlur) { + stopWatchingForChangeEventIE8(); + } +} + + +/** + * SECTION: handle `input` event + */ +var isInputEventSupported = false; +if (ExecutionEnvironment.canUseDOM) { + // IE9 claims to support the input event but fails to trigger it when + // deleting text, so we ignore its input events + isInputEventSupported = isEventSupported('input') && ( + !('documentMode' in document) || document.documentMode > 9 + ); +} + + +/** + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + */ +var supportedInputTypes = { + 'color': true, + 'date': true, + 'datetime': true, + 'datetime-local': true, + 'email': true, + 'month': true, + 'number': true, + 'password': true, + 'range': true, + 'search': true, + 'tel': true, + 'text': true, + 'time': true, + 'url': true, + 'week': true +}; + +function shouldUseInputEvent(elem) { + return ( + (elem.nodeName === 'INPUT' && supportedInputTypes[elem.type]) || + elem.nodeName === 'TEXTAREA' + ); +} + +/** + * (For old IE.) Replacement getter/setter for the `value` property that gets + * set on the active element. + */ +var newValueProp = { + get: function() { + return activeElementValueProp.get.call(this); + }, + set: function(val) { + // Cast to a string so we can do equality checks. + activeElementValue = '' + val; + activeElementValueProp.set.call(this, val); + } +}; + +/** + * (For old IE.) Starts tracking propertychange events on the passed-in element + * and override the value property so that we can distinguish user events from + * value changes in JS. + */ +function startWatchingForValueChange(target, targetID) { + activeElement = target; + activeElementID = targetID; + activeElementValue = target.value; + activeElementValueProp = Object.getOwnPropertyDescriptor( + target.constructor.prototype, + 'value' + ); + + Object.defineProperty(activeElement, 'value', newValueProp); + activeElement.attachEvent('onpropertychange', handlePropertyChange); +} + +/** + * (For old IE.) Removes the event listeners from the currently-tracked element, + * if any exists. + */ +function stopWatchingForValueChange() { + if (!activeElement) { + return; + } + + // delete restores the original property definition + delete activeElement.value; + activeElement.detachEvent('onpropertychange', handlePropertyChange); + + activeElement = null; + activeElementID = null; + activeElementValue = null; + activeElementValueProp = null; +} + +/** + * (For old IE.) Handles a propertychange event, sending a `change` event if + * the value of the active element has changed. + */ +function handlePropertyChange(nativeEvent) { + if (nativeEvent.propertyName !== 'value') { + return; + } + var value = nativeEvent.srcElement.value; + if (value === activeElementValue) { + return; + } + activeElementValue = value; + + manualDispatchChangeEvent(nativeEvent); +} + +/** + * If a `change` event should be fired, returns the target's ID. + */ +function getTargetIDForInputEvent( + topLevelType, + topLevelTarget, + topLevelTargetID) { + if (topLevelType === topLevelTypes.topInput) { + // In modern browsers (i.e., not IE8 or IE9), the input event is exactly + // what we want so fall through here and trigger an abstract event + return topLevelTargetID; + } +} + +// For IE8 and IE9. +function handleEventsForInputEventIE( + topLevelType, + topLevelTarget, + topLevelTargetID) { + if (topLevelType === topLevelTypes.topFocus) { + // In IE8, we can capture almost all .value changes by adding a + // propertychange handler and looking for events with propertyName + // equal to 'value' + // In IE9, propertychange fires for most input events but is buggy and + // doesn't fire when text is deleted, but conveniently, selectionchange + // appears to fire in all of the remaining cases so we catch those and + // forward the event if the value has changed + // In either case, we don't want to call the event handler if the value + // is changed from JS so we redefine a setter for `.value` that updates + // our activeElementValue variable, allowing us to ignore those changes + // + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForValueChange(); + startWatchingForValueChange(topLevelTarget, topLevelTargetID); + } else if (topLevelType === topLevelTypes.topBlur) { + stopWatchingForValueChange(); + } +} + +// For IE8 and IE9. +function getTargetIDForInputEventIE( + topLevelType, + topLevelTarget, + topLevelTargetID) { + if (topLevelType === topLevelTypes.topSelectionChange || + topLevelType === topLevelTypes.topKeyUp || + topLevelType === topLevelTypes.topKeyDown) { + // On the selectionchange event, the target is just document which isn't + // helpful for us so just check activeElement instead. + // + // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire + // propertychange on the first input event after setting `value` from a + // script and fires only keydown, keypress, keyup. Catching keyup usually + // gets it and catching keydown lets us fire an event for the first + // keystroke if user does a key repeat (it'll be a little delayed: right + // before the second keystroke). Other input methods (e.g., paste) seem to + // fire selectionchange normally. + if (activeElement && activeElement.value !== activeElementValue) { + activeElementValue = activeElement.value; + return activeElementID; + } + } +} + + +/** + * SECTION: handle `click` event + */ +function shouldUseClickEvent(elem) { + // Use the `click` event to detect changes to checkbox and radio inputs. + // This approach works across all browsers, whereas `change` does not fire + // until `blur` in IE8. + return ( + elem.nodeName === 'INPUT' && + (elem.type === 'checkbox' || elem.type === 'radio') + ); +} + +function getTargetIDForClickEvent( + topLevelType, + topLevelTarget, + topLevelTargetID) { + if (topLevelType === topLevelTypes.topClick) { + return topLevelTargetID; + } +} + +/** + * This plugin creates an `onChange` event that normalizes change events + * across form elements. This event fires at a time when it's possible to + * change the element's value without seeing a flicker. + * + * Supported elements are: + * - input (see `supportedInputTypes`) + * - textarea + * - select + */ +var ChangeEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent) { + + var getTargetIDFunc, handleEventFunc; + if (shouldUseChangeEvent(topLevelTarget)) { + if (doesChangeEventBubble) { + getTargetIDFunc = getTargetIDForChangeEvent; + } else { + handleEventFunc = handleEventsForChangeEventIE8; + } + } else if (shouldUseInputEvent(topLevelTarget)) { + if (isInputEventSupported) { + getTargetIDFunc = getTargetIDForInputEvent; + } else { + getTargetIDFunc = getTargetIDForInputEventIE; + handleEventFunc = handleEventsForInputEventIE; + } + } else if (shouldUseClickEvent(topLevelTarget)) { + getTargetIDFunc = getTargetIDForClickEvent; + } + + if (getTargetIDFunc) { + var targetID = getTargetIDFunc( + topLevelType, + topLevelTarget, + topLevelTargetID + ); + if (targetID) { + var event = SyntheticEvent.getPooled( + eventTypes.change, + targetID, + nativeEvent + ); + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + } + + if (handleEventFunc) { + handleEventFunc( + topLevelType, + topLevelTarget, + topLevelTargetID + ); + } + } + +}; + +module.exports = ChangeEventPlugin; + +})() +},{"./EventConstants":13,"./EventPluginHub":15,"./EventPropagators":18,"./ExecutionEnvironment":19,"./SyntheticEvent":51,"./isEventSupported":79,"./keyOf":82}],6:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule DOMChildrenOperations + */ + +// Empty blocks improve readability so disable that warning +// jshint -W035 + +"use strict"; + +var Danger = require("./Danger"); + +var insertNodeAt = require("./insertNodeAt"); +var keyOf = require("./keyOf"); +var throwIf = require("./throwIf"); + +var NON_INCREASING_OPERATIONS; +if (true) { + NON_INCREASING_OPERATIONS = + 'DOM child management operations must be provided in order ' + + 'of increasing destination index. This is likely an issue with ' + + 'the core framework.'; +} + +var MOVE_NODE_AT_ORIG_INDEX = keyOf({moveFrom: null}); +var INSERT_MARKUP = keyOf({insertMarkup: null}); +var REMOVE_AT = keyOf({removeAt: null}); + +/** + * In order to carry out movement of DOM nodes without knowing their IDs, we + * have to first store knowledge about nodes' original indices before beginning + * to carry out the sequence of operations. Once we begin the sequence, the DOM + * indices in future instructions are no longer valid. + * + * @param {Element} parent Parent DOM node. + * @param {Object} childOperations Description of child operations. + * @return {Array?} Sparse array containing elements by their current index in + * the DOM. + */ +var _getNodesByOriginalIndex = function(parent, childOperations) { + var nodesByOriginalIndex; // Sparse array. + var childOperation; + var origIndex; + for (var i = 0; i < childOperations.length; i++) { + childOperation = childOperations[i]; + if (MOVE_NODE_AT_ORIG_INDEX in childOperation) { + nodesByOriginalIndex = nodesByOriginalIndex || []; + origIndex = childOperation.moveFrom; + nodesByOriginalIndex[origIndex] = parent.childNodes[origIndex]; + } else if (REMOVE_AT in childOperation) { + nodesByOriginalIndex = nodesByOriginalIndex || []; + origIndex = childOperation.removeAt; + nodesByOriginalIndex[origIndex] = parent.childNodes[origIndex]; + } + } + return nodesByOriginalIndex; +}; + +/** + * Removes DOM elements from their parent, or moved. + * @param {Element} parent Parent DOM node. + * @param {Array} nodesByOriginalIndex Child nodes by their original index + * (potentially sparse.) + */ +var _removeChildrenByOriginalIndex = function(parent, nodesByOriginalIndex) { + for (var j = 0; j < nodesByOriginalIndex.length; j++) { + var nodeToRemove = nodesByOriginalIndex[j]; + if (nodeToRemove) { // We used a sparse array. + parent.removeChild(nodesByOriginalIndex[j]); + } + } +}; + +/** + * Once all nodes that will be removed or moved - are removed from the parent + * node, we can begin the process of placing nodes into their final locations. + * We must perform all operations in the order of the final DOM index - + * otherwise, we couldn't count on the fact that an insertion at index X, will + * remain at index X. This will iterate through the child operations, adding + * content where needed, skip over removals (they've already been removed) and + * insert "moved" Elements that were previously removed. The "moved" elements + * are only temporarily removed from the parent, so that index calculations can + * be manageable and perform well in the cases that matter. + */ +var _placeNodesAtDestination = + function(parent, childOperations, nodesByOriginalIndex) { + var origNode; + var finalIndex; + var lastFinalIndex = -1; + var childOperation; + for (var k = 0; k < childOperations.length; k++) { + childOperation = childOperations[k]; + if (MOVE_NODE_AT_ORIG_INDEX in childOperation) { + origNode = nodesByOriginalIndex[childOperation.moveFrom]; + finalIndex = childOperation.finalIndex; + insertNodeAt(parent, origNode, finalIndex); + if (true) { + throwIf(finalIndex <= lastFinalIndex, NON_INCREASING_OPERATIONS); + lastFinalIndex = finalIndex; + } + } else if (REMOVE_AT in childOperation) { + } else if (INSERT_MARKUP in childOperation) { + finalIndex = childOperation.finalIndex; + var markup = childOperation.insertMarkup; + Danger.dangerouslyInsertMarkupAt(parent, markup, finalIndex); + if (true) { + throwIf(finalIndex <= lastFinalIndex, NON_INCREASING_OPERATIONS); + lastFinalIndex = finalIndex; + } + } + } + }; + +var manageChildren = function(parent, childOperations) { + var nodesByOriginalIndex = _getNodesByOriginalIndex(parent, childOperations); + if (nodesByOriginalIndex) { + _removeChildrenByOriginalIndex(parent, nodesByOriginalIndex); + } + _placeNodesAtDestination(parent, childOperations, nodesByOriginalIndex); +}; + +/** + * Also reexport all of the dangerous functions. It helps to have all dangerous + * functions located in a single module `Danger`. + */ +var DOMChildrenOperations = { + dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup, + manageChildren: manageChildren +}; + +module.exports = DOMChildrenOperations; + +})() +},{"./Danger":9,"./insertNodeAt":77,"./keyOf":82,"./throwIf":89}],7:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule DOMProperty + * @typechecks static-only + */ + +/*jslint bitwise: true */ + +"use strict"; + +var invariant = require("./invariant"); + +var DOMPropertyInjection = { + /** + * Mapping from normalized, camelcased property names to a configuration that + * specifies how the associated DOM property should be accessed or rendered. + */ + MUST_USE_ATTRIBUTE: 0x1, + MUST_USE_PROPERTY: 0x2, + HAS_BOOLEAN_VALUE: 0x4, + HAS_SIDE_EFFECTS: 0x8, + + /** + * Inject some specialized knowledge about the DOM. This takes a config object + * with the following properties: + * + * isCustomAttribute: function that given an attribute name will return true + * if it can be inserted into the DOM verbatim. Useful for data-* or aria-* + * attributes where it's impossible to enumerate all of the possible + * attribute names, + * + * Properties: object mapping DOM property name to one of the + * DOMPropertyInjection constants or null. If your attribute isn't in here, + * it won't get written to the DOM. + * + * DOMAttributeNames: object mapping React attribute name to the DOM + * attribute name. Attribute names not specified use the **lowercase** + * normalized name. + * + * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties. + * Property names not specified use the normalized name. + * + * DOMMutationMethods: Properties that require special mutation methods. If + * `value` is undefined, the mutation method should unset the property. + * + * @param {object} domPropertyConfig the config as described above. + */ + injectDOMPropertyConfig: function(domPropertyConfig) { + var Properties = domPropertyConfig.Properties || {}; + var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {}; + var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {}; + var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {}; + + if (domPropertyConfig.isCustomAttribute) { + DOMProperty._isCustomAttributeFunctions.push( + domPropertyConfig.isCustomAttribute + ); + } + + for (var propName in Properties) { + invariant( + !DOMProperty.isStandardName[propName], + 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property ' + + '\'%s\' which has already been injected. You may be accidentally ' + + 'injecting the same DOM property config twice, or you may be ' + + 'injecting two configs that have conflicting property names.', + propName + ); + + DOMProperty.isStandardName[propName] = true; + + DOMProperty.getAttributeName[propName] = + DOMAttributeNames[propName] || propName.toLowerCase(); + + DOMProperty.getPropertyName[propName] = + DOMPropertyNames[propName] || propName; + + var mutationMethod = DOMMutationMethods[propName]; + if (mutationMethod) { + DOMProperty.getMutationMethod[propName] = mutationMethod; + } + + var propConfig = Properties[propName]; + DOMProperty.mustUseAttribute[propName] = + propConfig & DOMPropertyInjection.MUST_USE_ATTRIBUTE; + DOMProperty.mustUseProperty[propName] = + propConfig & DOMPropertyInjection.MUST_USE_PROPERTY; + DOMProperty.hasBooleanValue[propName] = + propConfig & DOMPropertyInjection.HAS_BOOLEAN_VALUE; + DOMProperty.hasSideEffects[propName] = + propConfig & DOMPropertyInjection.HAS_SIDE_EFFECTS; + + invariant( + !DOMProperty.mustUseAttribute[propName] || + !DOMProperty.mustUseProperty[propName], + 'DOMProperty: Cannot use require using both attribute and property: %s', + propName + ); + invariant( + DOMProperty.mustUseProperty[propName] || + !DOMProperty.hasSideEffects[propName], + 'DOMProperty: Properties that have side effects must use property: %s', + propName + ); + } + } +}; +var defaultValueCache = {}; + +/** + * DOMProperty exports lookup objects that can be used like functions: + * + * > DOMProperty.isValid['id'] + * true + * > DOMProperty.isValid['foobar'] + * undefined + * + * Although this may be confusing, it performs better in general. + * + * @see http://jsperf.com/key-exists + * @see http://jsperf.com/key-missing + */ +var DOMProperty = { + + /** + * Checks whether a property name is a standard property. + * @type {Object} + */ + isStandardName: {}, + + /** + * Mapping from normalized names to attribute names that differ. Attribute + * names are used when rendering markup or with `*Attribute()`. + * @type {Object} + */ + getAttributeName: {}, + + /** + * Mapping from normalized names to properties on DOM node instances. + * (This includes properties that mutate due to external factors.) + * @type {Object} + */ + getPropertyName: {}, + + /** + * Mapping from normalized names to mutation methods. This will only exist if + * mutation cannot be set simply by the property or `setAttribute()`. + * @type {Object} + */ + getMutationMethod: {}, + + /** + * Whether the property must be accessed and mutated as an object property. + * @type {Object} + */ + mustUseAttribute: {}, + + /** + * Whether the property must be accessed and mutated using `*Attribute()`. + * (This includes anything that fails `<propName> in <element>`.) + * @type {Object} + */ + mustUseProperty: {}, + + /** + * Whether the property should be removed when set to a falsey value. + * @type {Object} + */ + hasBooleanValue: {}, + + /** + * Whether or not setting a value causes side effects such as triggering + * resources to be loaded or text selection changes. We must ensure that + * the value is only set if it has changed. + * @type {Object} + */ + hasSideEffects: {}, + + /** + * All of the isCustomAttribute() functions that have been injected. + */ + _isCustomAttributeFunctions: [], + + /** + * Checks whether a property name is a custom attribute. + * @method + */ + isCustomAttribute: function(attributeName) { + return DOMProperty._isCustomAttributeFunctions.some( + function(isCustomAttributeFn) { + return isCustomAttributeFn.call(null, attributeName); + } + ); + }, + + /** + * Returns the default property value for a DOM property (i.e., not an + * attribute). Most default values are '' or false, but not all. Worse yet, + * some (in particular, `type`) vary depending on the type of element. + * + * TODO: Is it better to grab all the possible properties when creating an + * element to avoid having to create the same element twice? + */ + getDefaultValueForProperty: function(nodeName, prop) { + var nodeDefaults = defaultValueCache[nodeName]; + var testElement; + if (!nodeDefaults) { + defaultValueCache[nodeName] = nodeDefaults = {}; + } + if (!(prop in nodeDefaults)) { + testElement = document.createElement(nodeName); + nodeDefaults[prop] = testElement[prop]; + } + return nodeDefaults[prop]; + }, + + injection: DOMPropertyInjection +}; + +module.exports = DOMProperty; + +},{"./invariant":78}],8:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule DOMPropertyOperations + * @typechecks static-only + */ + +"use strict"; + +var DOMProperty = require("./DOMProperty"); + +var escapeTextForBrowser = require("./escapeTextForBrowser"); +var memoizeStringOnly = require("./memoizeStringOnly"); + +var processAttributeNameAndPrefix = memoizeStringOnly(function(name) { + return escapeTextForBrowser(name) + '="'; +}); + +/** + * Operations for dealing with DOM properties. + */ +var DOMPropertyOperations = { + + /** + * Creates markup for a property. + * + * @param {string} name + * @param {*} value + * @return {?string} Markup string, or null if the property was invalid. + */ + createMarkupForProperty: function(name, value) { + if (DOMProperty.isStandardName[name]) { + if (value == null || DOMProperty.hasBooleanValue[name] && !value) { + return ''; + } + var attributeName = DOMProperty.getAttributeName[name]; + return processAttributeNameAndPrefix(attributeName) + + escapeTextForBrowser(value) + '"'; + } else if (DOMProperty.isCustomAttribute(name)) { + if (value == null) { + return ''; + } + return processAttributeNameAndPrefix(name) + + escapeTextForBrowser(value) + '"'; + } else { + return null; + } + }, + + /** + * Sets the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + * @param {*} value + */ + setValueForProperty: function(node, name, value) { + if (DOMProperty.isStandardName[name]) { + var mutationMethod = DOMProperty.getMutationMethod[name]; + if (mutationMethod) { + mutationMethod(node, value); + } else if (DOMProperty.mustUseAttribute[name]) { + if (DOMProperty.hasBooleanValue[name] && !value) { + node.removeAttribute(DOMProperty.getAttributeName[name]); + } else { + node.setAttribute(DOMProperty.getAttributeName[name], value); + } + } else { + var propName = DOMProperty.getPropertyName[name]; + if (!DOMProperty.hasSideEffects[name] || node[propName] !== value) { + node[propName] = value; + } + } + } else if (DOMProperty.isCustomAttribute(name)) { + node.setAttribute(name, value); + } + }, + + /** + * Deletes the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + */ + deleteValueForProperty: function(node, name) { + if (DOMProperty.isStandardName[name]) { + var mutationMethod = DOMProperty.getMutationMethod[name]; + if (mutationMethod) { + mutationMethod(node, undefined); + } else if (DOMProperty.mustUseAttribute[name]) { + node.removeAttribute(DOMProperty.getAttributeName[name]); + } else { + var propName = DOMProperty.getPropertyName[name]; + node[propName] = DOMProperty.getDefaultValueForProperty( + node.nodeName, + name + ); + } + } else if (DOMProperty.isCustomAttribute(name)) { + node.removeAttribute(name); + } + } + +}; + +module.exports = DOMPropertyOperations; + +},{"./DOMProperty":7,"./escapeTextForBrowser":67,"./memoizeStringOnly":83}],9:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule Danger + */ + +/*jslint evil: true, sub: true */ + +"use strict"; + +var ExecutionEnvironment = require("./ExecutionEnvironment"); + +var throwIf = require("./throwIf"); + +var DOM_UNSUPPORTED; +var NO_MARKUP_PARENT; +var NO_MULTI_MARKUP; +if (true) { + DOM_UNSUPPORTED = + 'You may not insert markup into the document while you are in a worker ' + + 'thread. It\'s not you, it\'s me. This is likely the fault of the ' + + 'framework. Please report this immediately.'; + NO_MARKUP_PARENT = + 'You have attempted to inject markup without a suitable parent. This is ' + + 'likely the fault of the framework - please report immediately.'; + NO_MULTI_MARKUP = + 'The framework has attempted to either insert zero or multiple markup ' + + 'roots into a single location when it should not. This is a serious ' + + 'error - a fault of the framework - please report immediately.'; +} + +var validateMarkupParams; +if (true) { + validateMarkupParams = function(parentNode, markup) { + throwIf(!ExecutionEnvironment.canUseDOM, DOM_UNSUPPORTED); + throwIf(!parentNode || !parentNode.tagName, NO_MARKUP_PARENT); + throwIf(!markup, NO_MULTI_MARKUP); + }; +} + +/** + * Dummy container used to render all markup. + */ +var dummyNode = ExecutionEnvironment.canUseDOM ? + document.createElement('div') : + null; + +/** + * Some browsers cannot use `innerHTML` to render certain elements standalone, + * so we wrap them, render the wrapped nodes, then extract the desired node. + */ +var markupWrap = { + 'option': [1, '<select multiple="true">', '</select>'], + 'legend': [1, '<fieldset>', '</fieldset>'], + 'area': [1, '<map>', '</map>'], + 'param': [1, '<object>', '</object>'], + 'thead': [1, '<table>', '</table>'], + 'tr': [2, '<table><tbody>', '</tbody></table>'], + 'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'], + 'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'] +}; +markupWrap['optgroup'] = markupWrap['option']; +markupWrap['tbody'] = markupWrap['thead']; +markupWrap['tfoot'] = markupWrap['thead']; +markupWrap['colgroup'] = markupWrap['thead']; +markupWrap['caption'] = markupWrap['thead']; +markupWrap['th'] = markupWrap['td']; + +/** + * In IE8, certain elements cannot render alone, so wrap all elements. + */ +var defaultWrap = [1, '?<div>', '</div>']; + +/** + * Feature detection, remove wraps that are unnecessary for the current browser. + */ +if (dummyNode) { + for (var nodeName in markupWrap) { + if (!markupWrap.hasOwnProperty(nodeName)) { + continue; + } + dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>'; + if (dummyNode.firstChild) { + markupWrap[nodeName] = null; + } + } + dummyNode.innerHTML = '<link />'; + if (dummyNode.firstChild) { + defaultWrap = null; + } +} + +/** + * Renders markup into nodes. The returned HTMLCollection is live and should be + * used immediately (or at least before the next invocation to `renderMarkup`). + * + * NOTE: Extracting the `nodeName` does not require a regular expression match + * because we make assumptions about React-generated markup (i.e. there are no + * spaces surrounding the opening tag and there is at least one attribute). + * @see http://jsperf.com/extract-nodename + * + * @param {string} markup + * @return {*} An HTMLCollection. + */ +function renderMarkup(markup) { + var node = dummyNode; + var nodeName = markup.substring(1, markup.indexOf(' ')); + + var wrap = markupWrap[nodeName.toLowerCase()] || defaultWrap; + if (wrap) { + node.innerHTML = wrap[1] + markup + wrap[2]; + + var wrapDepth = wrap[0]; + while (wrapDepth--) { + node = node.lastChild; + } + } else { + node.innerHTML = markup; + } + return node.childNodes; +} + +/** + * Inserts node after 'after'. If 'after' is null, inserts it after nothing, + * which is inserting it at the beginning. + * + * @param {Element} elem Parent element. + * @param {Element} insert Element to insert. + * @param {Element} after Element to insert after. + * @return {Element} Element that was inserted. + */ +function insertNodeAfterNode(elem, insert, after) { + if (true) { + throwIf(!ExecutionEnvironment.canUseDOM, DOM_UNSUPPORTED); + } + if (after) { + if (after.nextSibling) { + return elem.insertBefore(insert, after.nextSibling); + } else { + return elem.appendChild(insert); + } + } else { + return elem.insertBefore(insert, elem.firstChild); + } +} + +/** + * Slow: Should only be used when it is known there are a few (or one) element + * in the node list. + * @param {Element} parentRootDomNode Parent element. + * @param {HTMLCollection} htmlCollection HTMLCollection to insert. + * @param {Element} after Element to insert the node list after. + */ +function inefficientlyInsertHTMLCollectionAfter( + parentRootDomNode, + htmlCollection, + after) { + + if (true) { + throwIf(!ExecutionEnvironment.canUseDOM, DOM_UNSUPPORTED); + } + var ret; + var originalLength = htmlCollection.length; + // Access htmlCollection[0] because htmlCollection shrinks as we remove items. + // `insertNodeAfterNode` will remove items from the htmlCollection. + for (var i = 0; i < originalLength; i++) { + ret = + insertNodeAfterNode(parentRootDomNode, htmlCollection[0], ret || after); + } +} + +/** + * Super-dangerously inserts markup into existing DOM structure. Seriously, you + * don't want to use this module unless you are building a framework. This + * requires that the markup that you are inserting represents the root of a + * tree. We do not support the case where there `markup` represents several + * roots. + * + * @param {Element} parentNode Parent DOM element. + * @param {string} markup Markup to dangerously insert. + * @param {number} index Position to insert markup at. + */ +function dangerouslyInsertMarkupAt(parentNode, markup, index) { + if (true) { + validateMarkupParams(parentNode, markup); + } + var htmlCollection = renderMarkup(markup); + var afterNode = index ? parentNode.childNodes[index - 1] : null; + inefficientlyInsertHTMLCollectionAfter(parentNode, htmlCollection, afterNode); +} + +/** + * Replaces a node with a string of markup at its current position within its + * parent. `childNode` must be in the document (or at least within a parent + * node). The string of markup must represent a tree of markup with a single + * root. + * + * @param {Element} childNode Child node to replace. + * @param {string} markup Markup to dangerously replace child with. + */ +function dangerouslyReplaceNodeWithMarkup(childNode, markup) { + var parentNode = childNode.parentNode; + if (true) { + validateMarkupParams(parentNode, markup); + } + var htmlCollection = renderMarkup(markup); + if (true) { + throwIf(htmlCollection.length !== 1, NO_MULTI_MARKUP); + } + parentNode.replaceChild(htmlCollection[0], childNode); +} + +var Danger = { + dangerouslyInsertMarkupAt: dangerouslyInsertMarkupAt, + dangerouslyReplaceNodeWithMarkup: dangerouslyReplaceNodeWithMarkup +}; + +module.exports = Danger; + +},{"./ExecutionEnvironment":19,"./throwIf":89}],10:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule DefaultDOMPropertyConfig + */ + +"use strict"; + +var DOMProperty = require("./DOMProperty"); + +var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; +var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY; +var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE; +var HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS; + +var DefaultDOMPropertyConfig = { + isCustomAttribute: RegExp.prototype.test.bind( + /^(data|aria)-[a-z_][a-z\d_.\-]*$/ + ), + Properties: { + /** + * Standard Properties + */ + accessKey: null, + accept: null, + action: null, + ajaxify: MUST_USE_ATTRIBUTE, + allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + allowTransparency: MUST_USE_ATTRIBUTE, + alt: null, + autoComplete: null, + autoFocus: HAS_BOOLEAN_VALUE, + autoPlay: HAS_BOOLEAN_VALUE, + cellPadding: null, + cellSpacing: null, + checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + className: MUST_USE_PROPERTY, + colSpan: null, + contentEditable: null, + contextMenu: MUST_USE_ATTRIBUTE, + controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + data: null, // For `<object />` acts as `src`. + dateTime: MUST_USE_ATTRIBUTE, + dir: null, + disabled: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + draggable: null, + encType: null, + frameBorder: MUST_USE_ATTRIBUTE, + height: MUST_USE_ATTRIBUTE, + hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + href: null, + htmlFor: null, + icon: null, + id: MUST_USE_PROPERTY, + label: null, + lang: null, + list: null, + max: null, + maxLength: MUST_USE_ATTRIBUTE, + method: null, + min: null, + multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + name: null, + pattern: null, + poster: null, + preload: null, + placeholder: null, + radioGroup: null, + rel: null, + readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + required: HAS_BOOLEAN_VALUE, + role: MUST_USE_ATTRIBUTE, + scrollLeft: MUST_USE_PROPERTY, + scrollTop: MUST_USE_PROPERTY, + selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + size: null, + spellCheck: null, + src: null, + step: null, + style: null, + tabIndex: null, + target: null, + title: null, + type: null, + value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS, + width: MUST_USE_ATTRIBUTE, + wmode: MUST_USE_ATTRIBUTE, + /** + * SVG Properties + */ + cx: MUST_USE_PROPERTY, + cy: MUST_USE_PROPERTY, + d: MUST_USE_PROPERTY, + fill: MUST_USE_PROPERTY, + fx: MUST_USE_PROPERTY, + fy: MUST_USE_PROPERTY, + points: MUST_USE_PROPERTY, + r: MUST_USE_PROPERTY, + stroke: MUST_USE_PROPERTY, + strokeLinecap: MUST_USE_PROPERTY, + strokeWidth: MUST_USE_PROPERTY, + transform: MUST_USE_PROPERTY, + x: MUST_USE_PROPERTY, + x1: MUST_USE_PROPERTY, + x2: MUST_USE_PROPERTY, + version: MUST_USE_PROPERTY, + viewBox: MUST_USE_PROPERTY, + y: MUST_USE_PROPERTY, + y1: MUST_USE_PROPERTY, + y2: MUST_USE_PROPERTY, + spreadMethod: MUST_USE_PROPERTY, + offset: MUST_USE_PROPERTY, + stopColor: MUST_USE_PROPERTY, + stopOpacity: MUST_USE_PROPERTY, + gradientUnits: MUST_USE_PROPERTY, + gradientTransform: MUST_USE_PROPERTY + }, + DOMAttributeNames: { + className: 'class', + htmlFor: 'for', + strokeLinecap: 'stroke-linecap', + strokeWidth: 'stroke-width', + stopColor: 'stop-color', + stopOpacity: 'stop-opacity' + }, + DOMPropertyNames: { + autoComplete: 'autocomplete', + autoFocus: 'autofocus', + autoPlay: 'autoplay', + encType: 'enctype', + radioGroup: 'radiogroup', + spellCheck: 'spellcheck' + }, + DOMMutationMethods: { + /** + * Setting `className` to null may cause it to be set to the string "null". + * + * @param {DOMElement} node + * @param {*} value + */ + className: function(node, value) { + node.className = value || ''; + } + } +}; + +module.exports = DefaultDOMPropertyConfig; + +},{"./DOMProperty":7}],11:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule DefaultEventPluginOrder + */ + +"use strict"; + + var keyOf = require("./keyOf"); + +/** + * Module that is injectable into `EventPluginHub`, that specifies a + * deterministic ordering of `EventPlugin`s. A convenient way to reason about + * plugins, without having to package every one of them. This is better than + * having plugins be ordered in the same order that they are injected because + * that ordering would be influenced by the packaging order. + * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that + * preventing default on events is convenient in `SimpleEventPlugin` handlers. + */ +var DefaultEventPluginOrder = [ + keyOf({ResponderEventPlugin: null}), + keyOf({SimpleEventPlugin: null}), + keyOf({TapEventPlugin: null}), + keyOf({EnterLeaveEventPlugin: null}), + keyOf({ChangeEventPlugin: null}), + keyOf({AnalyticsEventPlugin: null}), + keyOf({MobileSafariClickEventPlugin: null}) +]; + +module.exports = DefaultEventPluginOrder; + +},{"./keyOf":82}],12:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EnterLeaveEventPlugin + * @typechecks static-only + */ + +"use strict"; + +var EventConstants = require("./EventConstants"); +var EventPropagators = require("./EventPropagators"); +var ExecutionEnvironment = require("./ExecutionEnvironment"); +var SyntheticMouseEvent = require("./SyntheticMouseEvent"); + +var ReactMount = require("./ReactMount"); +var keyOf = require("./keyOf"); + +var topLevelTypes = EventConstants.topLevelTypes; +var getFirstReactDOM = ReactMount.getFirstReactDOM; + +var eventTypes = { + mouseEnter: {registrationName: keyOf({onMouseEnter: null})}, + mouseLeave: {registrationName: keyOf({onMouseLeave: null})} +}; + +var EnterLeaveEventPlugin = { + + eventTypes: eventTypes, + + /** + * For almost every interaction we care about, there will be both a top-level + * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that + * we do not extract duplicate events. However, moving the mouse into the + * browser from outside will not fire a `mouseout` event. In this case, we use + * the `mouseover` top-level event. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent) { + if (topLevelType === topLevelTypes.topMouseOver && + (nativeEvent.relatedTarget || nativeEvent.fromElement)) { + return null; + } + if (topLevelType !== topLevelTypes.topMouseOut && + topLevelType !== topLevelTypes.topMouseOver) { + // Must not be a mouse in or mouse out - ignoring. + return null; + } + + var from, to; + if (topLevelType === topLevelTypes.topMouseOut) { + from = topLevelTarget; + to = + getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) || + ExecutionEnvironment.global; + } else { + from = ExecutionEnvironment.global; + to = topLevelTarget; + } + + if (from === to) { + // Nothing pertains to our managed components. + return null; + } + + var fromID = from ? ReactMount.getID(from) : ''; + var toID = to ? ReactMount.getID(to) : ''; + + var leave = SyntheticMouseEvent.getPooled( + eventTypes.mouseLeave, + fromID, + nativeEvent + ); + var enter = SyntheticMouseEvent.getPooled( + eventTypes.mouseEnter, + toID, + nativeEvent + ); + + EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID); + return [leave, enter]; + } + +}; + +module.exports = EnterLeaveEventPlugin; + +})() +},{"./EventConstants":13,"./EventPropagators":18,"./ExecutionEnvironment":19,"./ReactMount":39,"./SyntheticMouseEvent":54,"./keyOf":82}],13:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EventConstants + */ + +"use strict"; + +var keyMirror = require("./keyMirror"); + +var PropagationPhases = keyMirror({bubbled: null, captured: null}); + +/** + * Types of raw signals from the browser caught at the top level. + */ +var topLevelTypes = keyMirror({ + topBlur: null, + topChange: null, + topClick: null, + topDOMCharacterDataModified: null, + topDoubleClick: null, + topDrag: null, + topDragEnd: null, + topDragEnter: null, + topDragExit: null, + topDragLeave: null, + topDragOver: null, + topDragStart: null, + topDrop: null, + topFocus: null, + topInput: null, + topKeyDown: null, + topKeyPress: null, + topKeyUp: null, + topMouseDown: null, + topMouseMove: null, + topMouseOut: null, + topMouseOver: null, + topMouseUp: null, + topScroll: null, + topSelectionChange: null, + topSubmit: null, + topTouchCancel: null, + topTouchEnd: null, + topTouchMove: null, + topTouchStart: null, + topWheel: null +}); + +var EventConstants = { + topLevelTypes: topLevelTypes, + PropagationPhases: PropagationPhases +}; + +module.exports = EventConstants; + +},{"./keyMirror":81}],14:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EventListener + */ + +/** + * Upstream version of event listener. Does not take into account specific + * nature of platform. + */ +var EventListener = { + /** + * Listens to bubbled events on a DOM node. + * + * @param {Element} el DOM element to register listener on. + * @param {string} handlerBaseName 'click'/'mouseover' + * @param {Function!} cb Callback function + */ + listen: function(el, handlerBaseName, cb) { + if (el.addEventListener) { + el.addEventListener(handlerBaseName, cb, false); + } else if (el.attachEvent) { + el.attachEvent('on' + handlerBaseName, cb); + } + }, + + /** + * Listens to captured events on a DOM node. + * + * @see `EventListener.listen` for params. + * @throws Exception if addEventListener is not supported. + */ + capture: function(el, handlerBaseName, cb) { + if (!el.addEventListener) { + if (true) { + console.error( + 'You are attempting to use addEventlistener ' + + 'in a browser that does not support it support it.' + + 'This likely means that you will not receive events that ' + + 'your application relies on (such as scroll).'); + } + return; + } else { + el.addEventListener(handlerBaseName, cb, true); + } + } +}; + +module.exports = EventListener; + +},{}],15:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EventPluginHub + */ + +"use strict"; + +var CallbackRegistry = require("./CallbackRegistry"); +var EventPluginRegistry = require("./EventPluginRegistry"); +var EventPluginUtils = require("./EventPluginUtils"); +var EventPropagators = require("./EventPropagators"); +var ExecutionEnvironment = require("./ExecutionEnvironment"); + +var accumulate = require("./accumulate"); +var forEachAccumulated = require("./forEachAccumulated"); +var invariant = require("./invariant"); + +/** + * Internal queue of events that have accumulated their dispatches and are + * waiting to have their dispatches executed. + */ +var eventQueue = null; + +/** + * Dispatches an event and releases it back into the pool, unless persistent. + * + * @param {?object} event Synthetic event to be dispatched. + * @private + */ +var executeDispatchesAndRelease = function(event) { + if (event) { + var executeDispatch = EventPluginUtils.executeDispatch; + // Plugins can provide custom behavior when dispatching events. + var PluginModule = EventPluginRegistry.getPluginModuleForEvent(event); + if (PluginModule && PluginModule.executeDispatch) { + executeDispatch = PluginModule.executeDispatch; + } + EventPluginUtils.executeDispatchesInOrder(event, executeDispatch); + + if (!event.isPersistent()) { + event.constructor.release(event); + } + } +}; + +/** + * This is a unified interface for event plugins to be installed and configured. + * + * Event plugins can implement the following properties: + * + * `extractEvents` {function(string, DOMEventTarget, string, object): *} + * Required. When a top-level event is fired, this method is expected to + * extract synthetic events that will in turn be queued and dispatched. + * + * `eventTypes` {object} + * Optional, plugins that fire events must publish a mapping of registration + * names that are used to register listeners. Values of this mapping must + * be objects that contain `registrationName` or `phasedRegistrationNames`. + * + * `executeDispatch` {function(object, function, string)} + * Optional, allows plugins to override how an event gets dispatched. By + * default, the listener is simply invoked. + * + * Each plugin that is injected into `EventsPluginHub` is immediately operable. + * + * @public + */ +var EventPluginHub = { + + /** + * Methods for injecting dependencies. + */ + injection: { + + /** + * @param {object} InjectedInstanceHandle + * @public + */ + injectInstanceHandle: EventPropagators.injection.injectInstanceHandle, + + /** + * @param {array} InjectedEventPluginOrder + * @public + */ + injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder, + + /** + * @param {object} injectedNamesToPlugins Map from names to plugin modules. + */ + injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName + + }, + + registrationNames: EventPluginRegistry.registrationNames, + + putListener: CallbackRegistry.putListener, + + getListener: CallbackRegistry.getListener, + + deleteListener: CallbackRegistry.deleteListener, + + deleteAllListeners: CallbackRegistry.deleteAllListeners, + + /** + * Allows registered plugins an opportunity to extract events from top-level + * native browser events. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @internal + */ + extractEvents: function( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent) { + var events; + var plugins = EventPluginRegistry.plugins; + for (var i = 0, l = plugins.length; i < l; i++) { + // Not every plugin in the ordering may be loaded at runtime. + var possiblePlugin = plugins[i]; + if (possiblePlugin) { + var extractedEvents = possiblePlugin.extractEvents( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent + ); + if (extractedEvents) { + events = accumulate(events, extractedEvents); + } + } + } + return events; + }, + + /** + * Enqueues a synthetic event that should be dispatched when + * `processEventQueue` is invoked. + * + * @param {*} events An accumulation of synthetic events. + * @internal + */ + enqueueEvents: function(events) { + if (events) { + eventQueue = accumulate(eventQueue, events); + } + }, + + /** + * Dispatches all synthetic events on the event queue. + * + * @internal + */ + processEventQueue: function() { + // Set `eventQueue` to null before processing it so that we can tell if more + // events get enqueued while processing. + var processingEventQueue = eventQueue; + eventQueue = null; + forEachAccumulated(processingEventQueue, executeDispatchesAndRelease); + invariant( + !eventQueue, + 'processEventQueue(): Additional events were enqueued while processing ' + + 'an event queue. Support for this has not yet been implemented.' + ); + } + +}; + +if (ExecutionEnvironment.canUseDOM) { + window.EventPluginHub = EventPluginHub; +} + +module.exports = EventPluginHub; + +},{"./CallbackRegistry":4,"./EventPluginRegistry":16,"./EventPluginUtils":17,"./EventPropagators":18,"./ExecutionEnvironment":19,"./accumulate":61,"./forEachAccumulated":70,"./invariant":78}],16:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EventPluginRegistry + * @typechecks static-only + */ + +"use strict"; + +var invariant = require("./invariant"); + +/** + * Injectable ordering of event plugins. + */ +var EventPluginOrder = null; + +/** + * Injectable mapping from names to event plugin modules. + */ +var namesToPlugins = {}; + +/** + * Recomputes the plugin list using the injected plugins and plugin ordering. + * + * @private + */ +function recomputePluginOrdering() { + if (!EventPluginOrder) { + // Wait until an `EventPluginOrder` is injected. + return; + } + for (var pluginName in namesToPlugins) { + var PluginModule = namesToPlugins[pluginName]; + var pluginIndex = EventPluginOrder.indexOf(pluginName); + invariant( + pluginIndex > -1, + 'EventPluginRegistry: Cannot inject event plugins that do not exist in ' + + 'the plugin ordering, `%s`.', + pluginName + ); + if (EventPluginRegistry.plugins[pluginIndex]) { + continue; + } + invariant( + PluginModule.extractEvents, + 'EventPluginRegistry: Event plugins must implement an `extractEvents` ' + + 'method, but `%s` does not.', + pluginName + ); + EventPluginRegistry.plugins[pluginIndex] = PluginModule; + var publishedEvents = PluginModule.eventTypes; + for (var eventName in publishedEvents) { + invariant( + publishEventForPlugin(publishedEvents[eventName], PluginModule), + 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', + eventName, + pluginName + ); + } + } +} + +/** + * Publishes an event so that it can be dispatched by the supplied plugin. + * + * @param {object} dispatchConfig Dispatch configuration for the event. + * @param {object} PluginModule Plugin publishing the event. + * @return {boolean} True if the event was successfully published. + * @private + */ +function publishEventForPlugin(dispatchConfig, PluginModule) { + var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; + if (phasedRegistrationNames) { + for (var phaseName in phasedRegistrationNames) { + if (phasedRegistrationNames.hasOwnProperty(phaseName)) { + var phasedRegistrationName = phasedRegistrationNames[phaseName]; + publishRegistrationName(phasedRegistrationName, PluginModule); + } + } + return true; + } else if (dispatchConfig.registrationName) { + publishRegistrationName(dispatchConfig.registrationName, PluginModule); + return true; + } + return false; +} + +/** + * Publishes a registration name that is used to identify dispatched events and + * can be used with `EventPluginHub.putListener` to register listeners. + * + * @param {string} registrationName Registration name to add. + * @param {object} PluginModule Plugin publishing the event. + * @private + */ +function publishRegistrationName(registrationName, PluginModule) { + invariant( + !EventPluginRegistry.registrationNames[registrationName], + 'EventPluginHub: More than one plugin attempted to publish the same ' + + 'registration name, `%s`.', + registrationName + ); + EventPluginRegistry.registrationNames[registrationName] = PluginModule; + EventPluginRegistry.registrationNamesKeys.push(registrationName); +} + +/** + * Registers plugins so that they can extract and dispatch events. + * + * @see {EventPluginHub} + */ +var EventPluginRegistry = { + + /** + * Ordered list of injected plugins. + */ + plugins: [], + + /** + * Mapping from registration names to plugin modules. + */ + registrationNames: {}, + + /** + * The keys of `registrationNames`. + */ + registrationNamesKeys: [], + + /** + * Injects an ordering of plugins (by plugin name). This allows the ordering + * to be decoupled from injection of the actual plugins so that ordering is + * always deterministic regardless of packaging, on-the-fly injection, etc. + * + * @param {array} InjectedEventPluginOrder + * @internal + * @see {EventPluginHub.injection.injectEventPluginOrder} + */ + injectEventPluginOrder: function(InjectedEventPluginOrder) { + invariant( + !EventPluginOrder, + 'EventPluginRegistry: Cannot inject event plugin ordering more than once.' + ); + // Clone the ordering so it cannot be dynamically mutated. + EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder); + recomputePluginOrdering(); + }, + + /** + * Injects plugins to be used by `EventPluginHub`. The plugin names must be + * in the ordering injected by `injectEventPluginOrder`. + * + * Plugins can be injected as part of page initialization or on-the-fly. + * + * @param {object} injectedNamesToPlugins Map from names to plugin modules. + * @internal + * @see {EventPluginHub.injection.injectEventPluginsByName} + */ + injectEventPluginsByName: function(injectedNamesToPlugins) { + var isOrderingDirty = false; + for (var pluginName in injectedNamesToPlugins) { + if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) { + continue; + } + var PluginModule = injectedNamesToPlugins[pluginName]; + if (namesToPlugins[pluginName] !== PluginModule) { + invariant( + !namesToPlugins[pluginName], + 'EventPluginRegistry: Cannot inject two different event plugins ' + + 'using the same name, `%s`.', + pluginName + ); + namesToPlugins[pluginName] = PluginModule; + isOrderingDirty = true; + } + } + if (isOrderingDirty) { + recomputePluginOrdering(); + } + }, + + /** + * Looks up the plugin for the supplied event. + * + * @param {object} event A synthetic event. + * @return {?object} The plugin that created the supplied event. + * @internal + */ + getPluginModuleForEvent: function(event) { + var dispatchConfig = event.dispatchConfig; + if (dispatchConfig.registrationName) { + return EventPluginRegistry.registrationNames[ + dispatchConfig.registrationName + ] || null; + } + for (var phase in dispatchConfig.phasedRegistrationNames) { + if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) { + continue; + } + var PluginModule = EventPluginRegistry.registrationNames[ + dispatchConfig.phasedRegistrationNames[phase] + ]; + if (PluginModule) { + return PluginModule; + } + } + return null; + }, + + /** + * Exposed for unit testing. + * @private + */ + _resetEventPlugins: function() { + EventPluginOrder = null; + for (var pluginName in namesToPlugins) { + if (namesToPlugins.hasOwnProperty(pluginName)) { + delete namesToPlugins[pluginName]; + } + } + EventPluginRegistry.plugins.length = 0; + var registrationNames = EventPluginRegistry.registrationNames; + for (var registrationName in registrationNames) { + if (registrationNames.hasOwnProperty(registrationName)) { + delete registrationNames[registrationName]; + } + } + EventPluginRegistry.registrationNamesKeys.length = 0; + } + +}; + +module.exports = EventPluginRegistry; + +},{"./invariant":78}],17:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EventPluginUtils + */ + +"use strict"; + +var EventConstants = require("./EventConstants"); + +var invariant = require("./invariant"); + +var topLevelTypes = EventConstants.topLevelTypes; + +function isEndish(topLevelType) { + return topLevelType === topLevelTypes.topMouseUp || + topLevelType === topLevelTypes.topTouchEnd || + topLevelType === topLevelTypes.topTouchCancel; +} + +function isMoveish(topLevelType) { + return topLevelType === topLevelTypes.topMouseMove || + topLevelType === topLevelTypes.topTouchMove; +} +function isStartish(topLevelType) { + return topLevelType === topLevelTypes.topMouseDown || + topLevelType === topLevelTypes.topTouchStart; +} + +var validateEventDispatches; +if (true) { + validateEventDispatches = function(event) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + + var listenersIsArr = Array.isArray(dispatchListeners); + var idsIsArr = Array.isArray(dispatchIDs); + var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0; + var listenersLen = listenersIsArr ? + dispatchListeners.length : + dispatchListeners ? 1 : 0; + + invariant( + idsIsArr === listenersIsArr && IDsLen === listenersLen, + 'EventPluginUtils: Invalid `event`.' + ); + }; +} + +/** + * Invokes `cb(event, listener, id)`. Avoids using call if no scope is + * provided. The `(listener,id)` pair effectively forms the "dispatch" but are + * kept separate to conserve memory. + */ +function forEachEventDispatch(event, cb) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + if (true) { + validateEventDispatches(event); + } + if (Array.isArray(dispatchListeners)) { + for (var i = 0; i < dispatchListeners.length; i++) { + if (event.isPropagationStopped()) { + break; + } + // Listeners and IDs are two parallel arrays that are always in sync. + cb(event, dispatchListeners[i], dispatchIDs[i]); + } + } else if (dispatchListeners) { + cb(event, dispatchListeners, dispatchIDs); + } +} + +/** + * Default implementation of PluginModule.executeDispatch(). + * @param {SyntheticEvent} SyntheticEvent to handle + * @param {function} Application-level callback + * @param {string} domID DOM id to pass to the callback. + */ +function executeDispatch(event, listener, domID) { + listener(event, domID); +} + +/** + * Standard/simple iteration through an event's collected dispatches. + */ +function executeDispatchesInOrder(event, executeDispatch) { + forEachEventDispatch(event, executeDispatch); + event._dispatchListeners = null; + event._dispatchIDs = null; +} + +/** + * Standard/simple iteration through an event's collected dispatches, but stops + * at the first dispatch execution returning true, and returns that id. + * + * @return id of the first dispatch execution who's listener returns true, or + * null if no listener returned true. + */ +function executeDispatchesInOrderStopAtTrue(event) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + if (true) { + validateEventDispatches(event); + } + if (Array.isArray(dispatchListeners)) { + for (var i = 0; i < dispatchListeners.length; i++) { + if (event.isPropagationStopped()) { + break; + } + // Listeners and IDs are two parallel arrays that are always in sync. + if (dispatchListeners[i](event, dispatchIDs[i])) { + return dispatchIDs[i]; + } + } + } else if (dispatchListeners) { + if (dispatchListeners(event, dispatchIDs)) { + return dispatchIDs; + } + } + return null; +} + +/** + * Execution of a "direct" dispatch - there must be at most one dispatch + * accumulated on the event or it is considered an error. It doesn't really make + * sense for an event with multiple dispatches (bubbled) to keep track of the + * return values at each dispatch execution, but it does tend to make sense when + * dealing with "direct" dispatches. + * + * @return The return value of executing the single dispatch. + */ +function executeDirectDispatch(event) { + if (true) { + validateEventDispatches(event); + } + var dispatchListener = event._dispatchListeners; + var dispatchID = event._dispatchIDs; + invariant( + !Array.isArray(dispatchListener), + 'executeDirectDispatch(...): Invalid `event`.' + ); + var res = dispatchListener ? + dispatchListener(event, dispatchID) : + null; + event._dispatchListeners = null; + event._dispatchIDs = null; + return res; +} + +/** + * @param {SyntheticEvent} event + * @return {bool} True iff number of dispatches accumulated is greater than 0. + */ +function hasDispatches(event) { + return !!event._dispatchListeners; +} + +/** + * General utilities that are useful in creating custom Event Plugins. + */ +var EventPluginUtils = { + isEndish: isEndish, + isMoveish: isMoveish, + isStartish: isStartish, + executeDispatchesInOrder: executeDispatchesInOrder, + executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue, + executeDirectDispatch: executeDirectDispatch, + hasDispatches: hasDispatches, + executeDispatch: executeDispatch +}; + +module.exports = EventPluginUtils; + +},{"./EventConstants":13,"./invariant":78}],18:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EventPropagators + */ + +"use strict"; + +var CallbackRegistry = require("./CallbackRegistry"); +var EventConstants = require("./EventConstants"); + +var accumulate = require("./accumulate"); +var forEachAccumulated = require("./forEachAccumulated"); +var getListener = CallbackRegistry.getListener; +var PropagationPhases = EventConstants.PropagationPhases; + +/** + * Injected dependencies: + */ + +/** + * - `InstanceHandle`: [required] Module that performs logical traversals of DOM + * hierarchy given ids of the logical DOM elements involved. + */ +var injection = { + InstanceHandle: null, + injectInstanceHandle: function(InjectedInstanceHandle) { + injection.InstanceHandle = InjectedInstanceHandle; + if (true) { + injection.validate(); + } + }, + validate: function() { + var invalid = !injection.InstanceHandle|| + !injection.InstanceHandle.traverseTwoPhase || + !injection.InstanceHandle.traverseEnterLeave; + if (invalid) { + throw new Error('InstanceHandle not injected before use!'); + } + } +}; + +/** + * Some event types have a notion of different registration names for different + * "phases" of propagation. This finds listeners by a given phase. + */ +function listenerAtPhase(id, event, propagationPhase) { + var registrationName = + event.dispatchConfig.phasedRegistrationNames[propagationPhase]; + return getListener(id, registrationName); +} + +/** + * Tags a `SyntheticEvent` with dispatched listeners. Creating this function + * here, allows us to not have to bind or create functions for each event. + * Mutating the event's members allows us to not have to create a wrapping + * "dispatch" object that pairs the event with the listener. + */ +function accumulateDirectionalDispatches(domID, upwards, event) { + if (true) { + if (!domID) { + throw new Error('Dispatching id must not be null'); + } + injection.validate(); + } + var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured; + var listener = listenerAtPhase(domID, event, phase); + if (listener) { + event._dispatchListeners = accumulate(event._dispatchListeners, listener); + event._dispatchIDs = accumulate(event._dispatchIDs, domID); + } +} + +/** + * Collect dispatches (must be entirely collected before dispatching - see unit + * tests). Lazily allocate the array to conserve memory. We must loop through + * each event and perform the traversal for each one. We can not perform a + * single traversal for the entire collection of events because each event may + * have a different target. + */ +function accumulateTwoPhaseDispatchesSingle(event) { + if (event && event.dispatchConfig.phasedRegistrationNames) { + injection.InstanceHandle.traverseTwoPhase( + event.dispatchMarker, + accumulateDirectionalDispatches, + event + ); + } +} + + +/** + * Accumulates without regard to direction, does not look for phased + * registration names. Same as `accumulateDirectDispatchesSingle` but without + * requiring that the `dispatchMarker` be the same as the dispatched ID. + */ +function accumulateDispatches(id, ignoredDirection, event) { + if (event && event.dispatchConfig.registrationName) { + var registrationName = event.dispatchConfig.registrationName; + var listener = getListener(id, registrationName); + if (listener) { + event._dispatchListeners = accumulate(event._dispatchListeners, listener); + event._dispatchIDs = accumulate(event._dispatchIDs, id); + } + } +} + +/** + * Accumulates dispatches on an `SyntheticEvent`, but only for the + * `dispatchMarker`. + * @param {SyntheticEvent} event + */ +function accumulateDirectDispatchesSingle(event) { + if (event && event.dispatchConfig.registrationName) { + accumulateDispatches(event.dispatchMarker, null, event); + } +} + +function accumulateTwoPhaseDispatches(events) { + if (true) { + injection.validate(); + } + forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle); +} + +function accumulateEnterLeaveDispatches(leave, enter, fromID, toID) { + if (true) { + injection.validate(); + } + injection.InstanceHandle.traverseEnterLeave( + fromID, + toID, + accumulateDispatches, + leave, + enter + ); +} + + +function accumulateDirectDispatches(events) { + if (true) { + injection.validate(); + } + forEachAccumulated(events, accumulateDirectDispatchesSingle); +} + + + +/** + * A small set of propagation patterns, each of which will accept a small amount + * of information, and generate a set of "dispatch ready event objects" - which + * are sets of events that have already been annotated with a set of dispatched + * listener functions/ids. The API is designed this way to discourage these + * propagation strategies from actually executing the dispatches, since we + * always want to collect the entire set of dispatches before executing event a + * single one. + * + * @constructor EventPropagators + */ +var EventPropagators = { + accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches, + accumulateDirectDispatches: accumulateDirectDispatches, + accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches, + injection: injection +}; + +module.exports = EventPropagators; + +},{"./CallbackRegistry":4,"./EventConstants":13,"./accumulate":61,"./forEachAccumulated":70}],19:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ExecutionEnvironment + */ + +/*jslint evil: true */ + +"use strict"; + +var canUseDOM = typeof window !== 'undefined'; + +/** + * Simple, lightweight module assisting with the detection and context of + * Worker. Helps avoid circular dependencies and allows code to reason about + * whether or not they are in a Worker, even if they never include the main + * `ReactWorker` dependency. + */ +var ExecutionEnvironment = { + + canUseDOM: canUseDOM, + + canUseWorkers: typeof Worker !== 'undefined', + + isInWorker: !canUseDOM, // For now, this is true - might change in the future. + + global: new Function('return this;')() + +}; + +module.exports = ExecutionEnvironment; + +})() +},{}],20:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule MobileSafariClickEventPlugin + * @typechecks static-only + */ + +"use strict"; + +var EventConstants = require("./EventConstants"); + +var emptyFunction = require("./emptyFunction"); + +var topLevelTypes = EventConstants.topLevelTypes; + +/** + * Mobile Safari does not fire properly bubble click events on non-interactive + * elements, which means delegated click listeners do not fire. The workaround + * for this bug involves attaching an empty click listener on the target node. + * + * This particular plugin works around the bug by attaching an empty click + * listener on `touchstart` (which does fire on every element). + */ +var MobileSafariClickEventPlugin = { + + eventTypes: null, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent) { + if (topLevelType === topLevelTypes.topTouchStart) { + var target = nativeEvent.target; + if (target && !target.onclick) { + target.onclick = emptyFunction; + } + } + } + +}; + +module.exports = MobileSafariClickEventPlugin; + +},{"./EventConstants":13,"./emptyFunction":66}],21:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule PooledClass + */ + +"use strict"; + +/** + * Static poolers. Several custom versions for each potential number of + * arguments. A completely generic pooler is easy to implement, but would + * require accessing the `arguments` object. In each of these, `this` refers to + * the Class itself, not an instance. If any others are needed, simply add them + * here, or in their own files. + */ +var oneArgumentPooler = function(copyFieldsFrom) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, copyFieldsFrom); + return instance; + } else { + return new Klass(copyFieldsFrom); + } +}; + +var twoArgumentPooler = function(a1, a2) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2); + return instance; + } else { + return new Klass(a1, a2); + } +}; + +var threeArgumentPooler = function(a1, a2, a3) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2, a3); + return instance; + } else { + return new Klass(a1, a2, a3); + } +}; + +var fiveArgumentPooler = function(a1, a2, a3, a4, a5) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2, a3, a4, a5); + return instance; + } else { + return new Klass(a1, a2, a3, a4, a5); + } +}; + +var standardReleaser = function(instance) { + var Klass = this; + if (instance.destructor) { + instance.destructor(); + } + if (Klass.instancePool.length < Klass.poolSize) { + Klass.instancePool.push(instance); + } +}; + +var DEFAULT_POOL_SIZE = 10; +var DEFAULT_POOLER = oneArgumentPooler; + +/** + * Augments `CopyConstructor` to be a poolable class, augmenting only the class + * itself (statically) not adding any prototypical fields. Any CopyConstructor + * you give this may have a `poolSize` property, and will look for a + * prototypical `destructor` on instances (optional). + * + * @param {Function} CopyConstructor Constructor that can be used to reset. + * @param {Function} pooler Customizable pooler. + */ +var addPoolingTo = function(CopyConstructor, pooler) { + var NewKlass = CopyConstructor; + NewKlass.instancePool = []; + NewKlass.getPooled = pooler || DEFAULT_POOLER; + if (!NewKlass.poolSize) { + NewKlass.poolSize = DEFAULT_POOL_SIZE; + } + NewKlass.release = standardReleaser; + return NewKlass; +}; + +var PooledClass = { + addPoolingTo: addPoolingTo, + oneArgumentPooler: oneArgumentPooler, + twoArgumentPooler: twoArgumentPooler, + threeArgumentPooler: threeArgumentPooler, + fiveArgumentPooler: fiveArgumentPooler +}; + +module.exports = PooledClass; + +},{}],22:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule React + */ + +"use strict"; + +var ReactCompositeComponent = require("./ReactCompositeComponent"); +var ReactComponent = require("./ReactComponent"); +var ReactDOM = require("./ReactDOM"); +var ReactMount = require("./ReactMount"); +var ReactPropTypes = require("./ReactPropTypes"); +var ReactServerRendering = require("./ReactServerRendering"); + +var ReactDefaultInjection = require("./ReactDefaultInjection"); + +ReactDefaultInjection.inject(); + +var React = { + DOM: ReactDOM, + PropTypes: ReactPropTypes, + initializeTouchEvents: function(shouldUseTouch) { + ReactMount.useTouchEvents = shouldUseTouch; + }, + autoBind: ReactCompositeComponent.autoBind, + createClass: ReactCompositeComponent.createClass, + constructAndRenderComponent: ReactMount.constructAndRenderComponent, + constructAndRenderComponentByID: ReactMount.constructAndRenderComponentByID, + renderComponent: ReactMount.renderComponent, + renderComponentToString: ReactServerRendering.renderComponentToString, + unmountAndReleaseReactRootNode: ReactMount.unmountAndReleaseReactRootNode, + isValidComponent: ReactComponent.isValidComponent +}; + +module.exports = React; + +},{"./ReactComponent":23,"./ReactCompositeComponent":24,"./ReactDOM":26,"./ReactDefaultInjection":33,"./ReactMount":39,"./ReactPropTypes":45,"./ReactServerRendering":47}],23:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactComponent + */ + +/*jslint evil: true */ + +"use strict"; + +var getReactRootElementInContainer = require("./getReactRootElementInContainer"); +var ReactCurrentOwner = require("./ReactCurrentOwner"); +var ReactDOMIDOperations = require("./ReactDOMIDOperations"); +var ReactMarkupChecksum = require("./ReactMarkupChecksum"); +var ReactMount = require("./ReactMount"); +var ReactOwner = require("./ReactOwner"); +var ReactReconcileTransaction = require("./ReactReconcileTransaction"); +var ReactUpdates = require("./ReactUpdates"); + +var invariant = require("./invariant"); +var keyMirror = require("./keyMirror"); +var merge = require("./merge"); + +/** + * Prop key that references a component's owner. + * @private + */ +var OWNER = '{owner}'; + +/** + * Props key that determines if a component's key was already validated. + * @private + */ +var IS_KEY_VALIDATED = '{is.key.validated}'; + +/** + * Every React component is in one of these life cycles. + */ +var ComponentLifeCycle = keyMirror({ + /** + * Mounted components have a DOM node representation and are capable of + * receiving new props. + */ + MOUNTED: null, + /** + * Unmounted components are inactive and cannot receive new props. + */ + UNMOUNTED: null +}); + +/** + * Warn if there's no key explicitly set on dynamic arrays of children. + * This allows us to keep track of children between updates. + */ + +var ownerHasWarned = {}; + +/** + * Warn if the component doesn't have an explicit key assigned to it. + * This component is in an array. The array could grow and shrink or be + * reordered. All children, that hasn't already been validated, are required to + * have a "key" property assigned to it. + * + * @internal + * @param {ReactComponent} component Component that requires a key. + */ +function validateExplicitKey(component) { + if (component[IS_KEY_VALIDATED] || component.props.key != null) { + return; + } + component[IS_KEY_VALIDATED] = true; + + // We can't provide friendly warnings for top level components. + if (!ReactCurrentOwner.current) { + return; + } + + // Name of the component whose render method tried to pass children. + var currentName = ReactCurrentOwner.current.constructor.displayName; + if (ownerHasWarned.hasOwnProperty(currentName)) { + return; + } + ownerHasWarned[currentName] = true; + + var message = 'Each child in an array should have a unique "key" prop. ' + + 'Check the render method of ' + currentName + '.'; + if (!component.isOwnedBy(ReactCurrentOwner.current)) { + // Name of the component that originally created this child. + var childOwnerName = + component.props[OWNER] && component.props[OWNER].constructor.displayName; + + // Usually the current owner is the offender, but if it accepts + // children as a property, it may be the creator of the child that's + // responsible for assigning it a key. + message += ' It was passed a child from ' + childOwnerName + '.'; + } + + console.warn(message); +} + +/** + * Ensure that every component either is passed in a static location or, if + * if it's passed in an array, has an explicit key property defined. + * + * @internal + * @param {*} component Statically passed child of any type. + * @return {boolean} + */ +function validateChildKeys(component) { + if (Array.isArray(component)) { + for (var i = 0; i < component.length; i++) { + var child = component[i]; + if (ReactComponent.isValidComponent(child)) { + validateExplicitKey(child); + } + } + } else if (ReactComponent.isValidComponent(component)) { + // This component was passed in a valid location. + component[IS_KEY_VALIDATED] = true; + } +} + +/** + * Components are the basic units of composition in React. + * + * Every component accepts a set of keyed input parameters known as "props" that + * are initialized by the constructor. Once a component is mounted, the props + * can be mutated using `setProps` or `replaceProps`. + * + * Every component is capable of the following operations: + * + * `mountComponent` + * Initializes the component, renders markup, and registers event listeners. + * + * `receiveProps` + * Updates the rendered DOM nodes given a new set of props. + * + * `unmountComponent` + * Releases any resources allocated by this component. + * + * Components can also be "owned" by other components. Being owned by another + * component means being constructed by that component. This is different from + * being the child of a component, which means having a DOM representation that + * is a child of the DOM representation of that component. + * + * @class ReactComponent + */ +var ReactComponent = { + + /** + * @param {?object} object + * @return {boolean} True if `object` is a valid component. + * @final + */ + isValidComponent: function(object) { + return !!( + object && + typeof object.mountComponentIntoNode === 'function' && + typeof object.receiveProps === 'function' + ); + }, + + /** + * Generate a key string that identifies a component within a set. + * + * @param {*} component A component that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + * @internal + */ + getKey: function(component, index) { + if (component && component.props && component.props.key != null) { + // Explicit key + return '' + component.props.key; + } + // Implicit key determined by the index in the set + return '' + index; + }, + + /** + * @internal + */ + LifeCycle: ComponentLifeCycle, + + /** + * React references `ReactDOMIDOperations` using this property in order to + * allow dependency injection. + * + * @internal + */ + DOMIDOperations: ReactDOMIDOperations, + + /** + * React references `ReactReconcileTransaction` using this property in order + * to allow dependency injection. + * + * @internal + */ + ReactReconcileTransaction: ReactReconcileTransaction, + + /** + * @param {object} DOMIDOperations + * @final + */ + setDOMOperations: function(DOMIDOperations) { + ReactComponent.DOMIDOperations = DOMIDOperations; + }, + + /** + * @param {Transaction} ReactReconcileTransaction + * @final + */ + setReactReconcileTransaction: function(ReactReconcileTransaction) { + ReactComponent.ReactReconcileTransaction = ReactReconcileTransaction; + }, + + /** + * Base functionality for every ReactComponent constructor. + * + * @lends {ReactComponent.prototype} + */ + Mixin: { + + /** + * Checks whether or not this component is mounted. + * + * @return {boolean} True if mounted, false otherwise. + * @final + * @protected + */ + isMounted: function() { + return this._lifeCycleState === ComponentLifeCycle.MOUNTED; + }, + + /** + * Returns the DOM node rendered by this component. + * + * @return {DOMElement} The root node of this component. + * @final + * @protected + */ + getDOMNode: function() { + invariant( + this.isMounted(), + 'getDOMNode(): A component must be mounted to have a DOM node.' + ); + return ReactMount.getNode(this._rootNodeID); + }, + + /** + * Sets a subset of the props. + * + * @param {object} partialProps Subset of the next props. + * @param {?function} callback Called after props are updated. + * @final + * @public + */ + setProps: function(partialProps, callback) { + // Merge with `_pendingProps` if it exists, otherwise with existing props. + this.replaceProps( + merge(this._pendingProps || this.props, partialProps), + callback + ); + }, + + /** + * Replaces all of the props. + * + * @param {object} props New props. + * @param {?function} callback Called after props are updated. + * @final + * @public + */ + replaceProps: function(props, callback) { + invariant( + !this.props[OWNER], + 'replaceProps(...): You called `setProps` or `replaceProps` on a ' + + 'component with an owner. This is an anti-pattern since props will ' + + 'get reactively updated when rendered. Instead, change the owner\'s ' + + '`render` method to pass the correct value as props to the component ' + + 'where it is created.' + ); + this._pendingProps = props; + ReactUpdates.enqueueUpdate(this, callback); + }, + + /** + * Base constructor for all React component. + * + * Subclasses that override this method should make sure to invoke + * `ReactComponent.Mixin.construct.call(this, ...)`. + * + * @param {?object} initialProps + * @param {*} children + * @internal + */ + construct: function(initialProps, children) { + this.props = initialProps || {}; + // Record the component responsible for creating this component. + this.props[OWNER] = ReactCurrentOwner.current; + // All components start unmounted. + this._lifeCycleState = ComponentLifeCycle.UNMOUNTED; + + this._pendingProps = null; + this._pendingCallbacks = null; + + // Children can be more than one argument + var childrenLength = arguments.length - 1; + if (childrenLength === 1) { + if (true) { + validateChildKeys(children); + } + this.props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + if (true) { + validateChildKeys(arguments[i + 1]); + } + childArray[i] = arguments[i + 1]; + } + this.props.children = childArray; + } + }, + + /** + * Initializes the component, renders markup, and registers event listeners. + * + * NOTE: This does not insert any nodes into the DOM. + * + * Subclasses that override this method should make sure to invoke + * `ReactComponent.Mixin.mountComponent.call(this, ...)`. + * + * @param {string} rootID DOM ID of the root node. + * @param {ReactReconcileTransaction} transaction + * @return {?string} Rendered markup to be inserted into the DOM. + * @internal + */ + mountComponent: function(rootID, transaction) { + invariant( + !this.isMounted(), + 'mountComponent(%s, ...): Can only mount an unmounted component.', + rootID + ); + var props = this.props; + if (props.ref != null) { + ReactOwner.addComponentAsRefTo(this, props.ref, props[OWNER]); + } + this._rootNodeID = rootID; + this._lifeCycleState = ComponentLifeCycle.MOUNTED; + // Effectively: return ''; + }, + + /** + * Releases any resources allocated by `mountComponent`. + * + * NOTE: This does not remove any nodes from the DOM. + * + * Subclasses that override this method should make sure to invoke + * `ReactComponent.Mixin.unmountComponent.call(this)`. + * + * @internal + */ + unmountComponent: function() { + invariant( + this.isMounted(), + 'unmountComponent(): Can only unmount a mounted component.' + ); + var props = this.props; + if (props.ref != null) { + ReactOwner.removeComponentAsRefFrom(this, props.ref, props[OWNER]); + } + ReactMount.purgeID(this._rootNodeID); + this._rootNodeID = null; + this._lifeCycleState = ComponentLifeCycle.UNMOUNTED; + }, + + /** + * Updates the rendered DOM nodes given a new set of props. + * + * Subclasses that override this method should make sure to invoke + * `ReactComponent.Mixin.receiveProps.call(this, ...)`. + * + * @param {object} nextProps Next set of properties. + * @param {ReactReconcileTransaction} transaction + * @internal + */ + receiveProps: function(nextProps, transaction) { + invariant( + this.isMounted(), + 'receiveProps(...): Can only update a mounted component.' + ); + this._pendingProps = nextProps; + this._performUpdateIfNecessary(transaction); + }, + + /** + * Call `_performUpdateIfNecessary` within a new transaction. + * + * @param {ReactReconcileTransaction} transaction + * @internal + */ + performUpdateIfNecessary: function() { + var transaction = ReactComponent.ReactReconcileTransaction.getPooled(); + transaction.perform(this._performUpdateIfNecessary, this, transaction); + ReactComponent.ReactReconcileTransaction.release(transaction); + }, + + /** + * If `_pendingProps` is set, update the component. + * + * @param {ReactReconcileTransaction} transaction + * @internal + */ + _performUpdateIfNecessary: function(transaction) { + if (this._pendingProps == null) { + return; + } + var prevProps = this.props; + this.props = this._pendingProps; + this._pendingProps = null; + this.updateComponent(transaction, prevProps); + }, + + /** + * Updates the component's currently mounted representation. + * + * @param {ReactReconcileTransaction} transaction + * @param {object} prevProps + * @internal + */ + updateComponent: function(transaction, prevProps) { + var props = this.props; + // If either the owner or a `ref` has changed, make sure the newest owner + // has stored a reference to `this`, and the previous owner (if different) + // has forgotten the reference to `this`. + if (props[OWNER] !== prevProps[OWNER] || props.ref !== prevProps.ref) { + if (prevProps.ref != null) { + ReactOwner.removeComponentAsRefFrom( + this, prevProps.ref, prevProps[OWNER] + ); + } + // Correct, even if the owner is the same, and only the ref has changed. + if (props.ref != null) { + ReactOwner.addComponentAsRefTo(this, props.ref, props[OWNER]); + } + } + }, + + /** + * Mounts this component and inserts it into the DOM. + * + * @param {string} rootID DOM ID of the root node. + * @param {DOMElement} container DOM element to mount into. + * @param {boolean} shouldReuseMarkup If true, do not insert markup + * @final + * @internal + * @see {ReactMount.renderComponent} + */ + mountComponentIntoNode: function(rootID, container, shouldReuseMarkup) { + var transaction = ReactComponent.ReactReconcileTransaction.getPooled(); + transaction.perform( + this._mountComponentIntoNode, + this, + rootID, + container, + transaction, + shouldReuseMarkup + ); + ReactComponent.ReactReconcileTransaction.release(transaction); + }, + + /** + * @param {string} rootID DOM ID of the root node. + * @param {DOMElement} container DOM element to mount into. + * @param {ReactReconcileTransaction} transaction + * @param {boolean} shouldReuseMarkup If true, do not insert markup + * @final + * @private + */ + _mountComponentIntoNode: function( + rootID, + container, + transaction, + shouldReuseMarkup) { + invariant( + container && container.nodeType === 1, + 'mountComponentIntoNode(...): Target container is not a DOM element.' + ); + var markup = this.mountComponent(rootID, transaction); + + if (shouldReuseMarkup) { + if (ReactMarkupChecksum.canReuseMarkup( + markup, + getReactRootElementInContainer(container))) { + return; + } else { + if (true) { + console.warn( + 'React attempted to use reuse markup in a container but the ' + + 'checksum was invalid. This generally means that you are using ' + + 'server rendering and the markup generated on the server was ' + + 'not what the client was expecting. React injected new markup ' + + 'to compensate which works but you have lost many of the ' + + 'benefits of server rendering. Instead, figure out why the ' + + 'markup being generated is different on the client or server.' + ); + } + } + } + + // Asynchronously inject markup by ensuring that the container is not in + // the document when settings its `innerHTML`. + var parent = container.parentNode; + if (parent) { + var next = container.nextSibling; + parent.removeChild(container); + container.innerHTML = markup; + if (next) { + parent.insertBefore(container, next); + } else { + parent.appendChild(container); + } + } else { + container.innerHTML = markup; + } + }, + + /** + * Unmounts this component and removes it from the DOM. + * + * @param {DOMElement} container DOM element to unmount from. + * @final + * @internal + * @see {ReactMount.unmountAndReleaseReactRootNode} + */ + unmountComponentFromNode: function(container) { + this.unmountComponent(); + // http://jsperf.com/emptying-a-node + while (container.lastChild) { + container.removeChild(container.lastChild); + } + }, + + /** + * Checks if this component is owned by the supplied `owner` component. + * + * @param {ReactComponent} owner Component to check. + * @return {boolean} True if `owners` owns this component. + * @final + * @internal + */ + isOwnedBy: function(owner) { + return this.props[OWNER] === owner; + }, + + /** + * Gets another component, that shares the same owner as this one, by ref. + * + * @param {string} ref of a sibling Component. + * @return {?ReactComponent} the actual sibling Component. + * @final + * @internal + */ + getSiblingByRef: function(ref) { + var owner = this.props[OWNER]; + if (!owner || !owner.refs) { + return null; + } + return owner.refs[ref]; + } + + } + +}; + +module.exports = ReactComponent; + +},{"./ReactCurrentOwner":25,"./ReactDOMIDOperations":28,"./ReactMarkupChecksum":38,"./ReactMount":39,"./ReactOwner":43,"./ReactReconcileTransaction":46,"./ReactUpdates":49,"./getReactRootElementInContainer":73,"./invariant":78,"./keyMirror":81,"./merge":84}],24:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactCompositeComponent + */ + +"use strict"; + +var ReactComponent = require("./ReactComponent"); +var ReactCurrentOwner = require("./ReactCurrentOwner"); +var ReactOwner = require("./ReactOwner"); +var ReactPropTransferer = require("./ReactPropTransferer"); +var ReactUpdates = require("./ReactUpdates"); + +var invariant = require("./invariant"); +var keyMirror = require("./keyMirror"); +var merge = require("./merge"); +var mixInto = require("./mixInto"); + +/** + * Policies that describe methods in `ReactCompositeComponentInterface`. + */ +var SpecPolicy = keyMirror({ + /** + * These methods may be defined only once by the class specification or mixin. + */ + DEFINE_ONCE: null, + /** + * These methods may be defined by both the class specification and mixins. + * Subsequent definitions will be chained. These methods must return void. + */ + DEFINE_MANY: null, + /** + * These methods are overriding the base ReactCompositeComponent class. + */ + OVERRIDE_BASE: null +}); + +/** + * Composite components are higher-level components that compose other composite + * or native components. + * + * To create a new type of `ReactCompositeComponent`, pass a specification of + * your new class to `React.createClass`. The only requirement of your class + * specification is that you implement a `render` method. + * + * var MyComponent = React.createClass({ + * render: function() { + * return <div>Hello World</div>; + * } + * }); + * + * The class specification supports a specific protocol of methods that have + * special meaning (e.g. `render`). See `ReactCompositeComponentInterface` for + * more the comprehensive protocol. Any other properties and methods in the + * class specification will available on the prototype. + * + * @interface ReactCompositeComponentInterface + * @internal + */ +var ReactCompositeComponentInterface = { + + /** + * An array of Mixin objects to include when defining your component. + * + * @type {array} + * @optional + */ + mixins: SpecPolicy.DEFINE_MANY, + + /** + * Definition of prop types for this component. + * + * @type {object} + * @optional + */ + propTypes: SpecPolicy.DEFINE_ONCE, + + + + // ==== Definition methods ==== + + /** + * Invoked when the component is mounted. Values in the mapping will be set on + * `this.props` if that prop is not specified (i.e. using an `in` check). + * + * This method is invoked before `getInitialState` and therefore cannot rely + * on `this.state` or use `this.setState`. + * + * @return {object} + * @optional + */ + getDefaultProps: SpecPolicy.DEFINE_ONCE, + + /** + * Invoked once before the component is mounted. The return value will be used + * as the initial value of `this.state`. + * + * getInitialState: function() { + * return { + * isOn: false, + * fooBaz: new BazFoo() + * } + * } + * + * @return {object} + * @optional + */ + getInitialState: SpecPolicy.DEFINE_ONCE, + + /** + * Uses props from `this.props` and state from `this.state` to render the + * structure of the component. + * + * No guarantees are made about when or how often this method is invoked, so + * it must not have side effects. + * + * render: function() { + * var name = this.props.name; + * return <div>Hello, {name}!</div>; + * } + * + * @return {ReactComponent} + * @nosideeffects + * @required + */ + render: SpecPolicy.DEFINE_ONCE, + + + + // ==== Delegate methods ==== + + /** + * Invoked when the component is initially created and about to be mounted. + * This may have side effects, but any external subscriptions or data created + * by this method must be cleaned up in `componentWillUnmount`. + * + * @optional + */ + componentWillMount: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component has been mounted and has a DOM representation. + * However, there is no guarantee that the DOM node is in the document. + * + * Use this as an opportunity to operate on the DOM when the component has + * been mounted (initialized and rendered) for the first time. + * + * @param {DOMElement} rootNode DOM element representing the component. + * @optional + */ + componentDidMount: SpecPolicy.DEFINE_MANY, + + /** + * Invoked before the component receives new props. + * + * Use this as an opportunity to react to a prop transition by updating the + * state using `this.setState`. Current props are accessed via `this.props`. + * + * componentWillReceiveProps: function(nextProps) { + * this.setState({ + * likesIncreasing: nextProps.likeCount > this.props.likeCount + * }); + * } + * + * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop + * transition may cause a state change, but the opposite is not true. If you + * need it, you are probably looking for `componentWillUpdate`. + * + * @param {object} nextProps + * @optional + */ + componentWillReceiveProps: SpecPolicy.DEFINE_MANY, + + /** + * Invoked while deciding if the component should be updated as a result of + * receiving new props and state. + * + * Use this as an opportunity to `return false` when you're certain that the + * transition to the new props and state will not require a component update. + * + * shouldComponentUpdate: function(nextProps, nextState) { + * return !equal(nextProps, this.props) || !equal(nextState, this.state); + * } + * + * @param {object} nextProps + * @param {?object} nextState + * @return {boolean} True if the component should update. + * @optional + */ + shouldComponentUpdate: SpecPolicy.DEFINE_ONCE, + + /** + * Invoked when the component is about to update due to a transition from + * `this.props` and `this.state` to `nextProps` and `nextState`. + * + * Use this as an opportunity to perform preparation before an update occurs. + * + * NOTE: You **cannot** use `this.setState()` in this method. + * + * @param {object} nextProps + * @param {?object} nextState + * @param {ReactReconcileTransaction} transaction + * @optional + */ + componentWillUpdate: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component's DOM representation has been updated. + * + * Use this as an opportunity to operate on the DOM when the component has + * been updated. + * + * @param {object} prevProps + * @param {?object} prevState + * @param {DOMElement} rootNode DOM element representing the component. + * @optional + */ + componentDidUpdate: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component is about to be removed from its parent and have + * its DOM representation destroyed. + * + * Use this as an opportunity to deallocate any external resources. + * + * NOTE: There is no `componentDidUnmount` since your component will have been + * destroyed by that point. + * + * @optional + */ + componentWillUnmount: SpecPolicy.DEFINE_MANY, + + + + // ==== Advanced methods ==== + + /** + * Updates the component's currently mounted DOM representation. + * + * By default, this implements React's rendering and reconciliation algorithm. + * Sophisticated clients may wish to override this. + * + * @param {ReactReconcileTransaction} transaction + * @internal + * @overridable + */ + updateComponent: SpecPolicy.OVERRIDE_BASE + +}; + +/** + * Mapping from class specification keys to special processing functions. + * + * Although these are declared in the specification when defining classes + * using `React.createClass`, they will not be on the component's prototype. + */ +var RESERVED_SPEC_KEYS = { + displayName: function(Constructor, displayName) { + Constructor.displayName = displayName; + }, + mixins: function(Constructor, mixins) { + if (mixins) { + for (var i = 0; i < mixins.length; i++) { + mixSpecIntoComponent(Constructor, mixins[i]); + } + } + }, + propTypes: function(Constructor, propTypes) { + Constructor.propTypes = propTypes; + } +}; + +function validateMethodOverride(proto, name) { + var specPolicy = ReactCompositeComponentInterface[name]; + + // Disallow overriding of base class methods unless explicitly allowed. + if (ReactCompositeComponentMixin.hasOwnProperty(name)) { + invariant( + specPolicy === SpecPolicy.OVERRIDE_BASE, + 'ReactCompositeComponentInterface: You are attempting to override ' + + '`%s` from your class specification. Ensure that your method names ' + + 'do not overlap with React methods.', + name + ); + } + + // Disallow defining methods more than once unless explicitly allowed. + if (proto.hasOwnProperty(name)) { + invariant( + specPolicy === SpecPolicy.DEFINE_MANY, + 'ReactCompositeComponentInterface: You are attempting to define ' + + '`%s` on your component more than once. This conflict may be due ' + + 'to a mixin.', + name + ); + } +} + + +function validateLifeCycleOnReplaceState(instance) { + var compositeLifeCycleState = instance._compositeLifeCycleState; + invariant( + instance.isMounted() || + compositeLifeCycleState === CompositeLifeCycle.MOUNTING, + 'replaceState(...): Can only update a mounted or mounting component.' + ); + invariant( + compositeLifeCycleState !== CompositeLifeCycle.RECEIVING_STATE && + compositeLifeCycleState !== CompositeLifeCycle.UNMOUNTING, + 'replaceState(...): Cannot update while unmounting component or during ' + + 'an existing state transition (such as within `render`).' + ); +} + +/** + * Custom version of `mixInto` which handles policy validation and reserved + * specification keys when building `ReactCompositeComponent` classses. + */ +function mixSpecIntoComponent(Constructor, spec) { + var proto = Constructor.prototype; + for (var name in spec) { + var property = spec[name]; + if (!spec.hasOwnProperty(name) || !property) { + continue; + } + validateMethodOverride(proto, name); + + if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) { + RESERVED_SPEC_KEYS[name](Constructor, property); + } else { + // Setup methods on prototype: + // The following member methods should not be automatically bound: + // 1. Expected ReactCompositeComponent methods (in the "interface"). + // 2. Overridden methods (that were mixed in). + var isCompositeComponentMethod = name in ReactCompositeComponentInterface; + var isInherited = name in proto; + var markedDontBind = property.__reactDontBind; + var isFunction = typeof property === 'function'; + var shouldAutoBind = + isFunction && + !isCompositeComponentMethod && + !isInherited && + !markedDontBind; + + if (shouldAutoBind) { + if (!proto.__reactAutoBindMap) { + proto.__reactAutoBindMap = {}; + } + proto.__reactAutoBindMap[name] = property; + proto[name] = property; + } else { + if (isInherited) { + // For methods which are defined more than once, call the existing + // methods before calling the new property. + proto[name] = createChainedFunction(proto[name], property); + } else { + proto[name] = property; + } + } + } + } +} + +/** + * Creates a function that invokes two functions and ignores their return vales. + * + * @param {function} one Function to invoke first. + * @param {function} two Function to invoke second. + * @return {function} Function that invokes the two argument functions. + * @private + */ +function createChainedFunction(one, two) { + return function chainedFunction() { + one.apply(this, arguments); + two.apply(this, arguments); + }; +} + +/** + * `ReactCompositeComponent` maintains an auxiliary life cycle state in + * `this._compositeLifeCycleState` (which can be null). + * + * This is different from the life cycle state maintained by `ReactComponent` in + * `this._lifeCycleState`. The following diagram shows how the states overlap in + * time. There are times when the CompositeLifeCycle is null - at those times it + * is only meaningful to look at ComponentLifeCycle alone. + * + * Top Row: ReactComponent.ComponentLifeCycle + * Low Row: ReactComponent.CompositeLifeCycle + * + * +-------+------------------------------------------------------+--------+ + * | UN | MOUNTED | UN | + * |MOUNTED| | MOUNTED| + * +-------+------------------------------------------------------+--------+ + * | ^--------+ +------+ +------+ +------+ +--------^ | + * | | | | | | | | | | | | + * | 0--|MOUNTING|-0-|RECEIV|-0-|RECEIV|-0-|RECEIV|-0-| UN |--->0 | + * | | | |PROPS | | PROPS| | STATE| |MOUNTING| | + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * | +--------+ +------+ +------+ +------+ +--------+ | + * | | | | + * +-------+------------------------------------------------------+--------+ + */ +var CompositeLifeCycle = keyMirror({ + /** + * Components in the process of being mounted respond to state changes + * differently. + */ + MOUNTING: null, + /** + * Components in the process of being unmounted are guarded against state + * changes. + */ + UNMOUNTING: null, + /** + * Components that are mounted and receiving new props respond to state + * changes differently. + */ + RECEIVING_PROPS: null, + /** + * Components that are mounted and receiving new state are guarded against + * additional state changes. + */ + RECEIVING_STATE: null +}); + +/** + * @lends {ReactCompositeComponent.prototype} + */ +var ReactCompositeComponentMixin = { + + /** + * Base constructor for all composite component. + * + * @param {?object} initialProps + * @param {*} children + * @final + * @internal + */ + construct: function(initialProps, children) { + // Children can be either an array or more than one argument + ReactComponent.Mixin.construct.apply(this, arguments); + this.state = null; + this._pendingState = null; + this._compositeLifeCycleState = null; + }, + + /** + * Checks whether or not this composite component is mounted. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function() { + return ReactComponent.Mixin.isMounted.call(this) && + this._compositeLifeCycleState !== CompositeLifeCycle.MOUNTING; + }, + + /** + * Initializes the component, renders markup, and registers event listeners. + * + * @param {string} rootID DOM ID of the root node. + * @param {ReactReconcileTransaction} transaction + * @return {?string} Rendered markup to be inserted into the DOM. + * @final + * @internal + */ + mountComponent: function(rootID, transaction) { + ReactComponent.Mixin.mountComponent.call(this, rootID, transaction); + this._compositeLifeCycleState = CompositeLifeCycle.MOUNTING; + + this._defaultProps = this.getDefaultProps ? this.getDefaultProps() : null; + this._processProps(this.props); + + if (this.__reactAutoBindMap) { + this._bindAutoBindMethods(); + } + + this.state = this.getInitialState ? this.getInitialState() : null; + this._pendingState = null; + this._pendingForceUpdate = false; + + if (this.componentWillMount) { + this.componentWillMount(); + // When mounting, calls to `setState` by `componentWillMount` will set + // `this._pendingState` without triggering a re-render. + if (this._pendingState) { + this.state = this._pendingState; + this._pendingState = null; + } + } + + this._renderedComponent = this._renderValidatedComponent(); + + // Done with mounting, `setState` will now trigger UI changes. + this._compositeLifeCycleState = null; + var markup = this._renderedComponent.mountComponent(rootID, transaction); + if (this.componentDidMount) { + transaction.getReactOnDOMReady().enqueue(this, this.componentDidMount); + } + return markup; + }, + + /** + * Releases any resources allocated by `mountComponent`. + * + * @final + * @internal + */ + unmountComponent: function() { + this._compositeLifeCycleState = CompositeLifeCycle.UNMOUNTING; + if (this.componentWillUnmount) { + this.componentWillUnmount(); + } + this._compositeLifeCycleState = null; + + this._defaultProps = null; + + ReactComponent.Mixin.unmountComponent.call(this); + this._renderedComponent.unmountComponent(); + this._renderedComponent = null; + + if (this.refs) { + this.refs = null; + } + + // Some existing components rely on this.props even after they've been + // destroyed (in event handlers). + // TODO: this.props = null; + // TODO: this.state = null; + }, + + /** + * Sets a subset of the state. Always use this or `replaceState` to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + setState: function(partialState, callback) { + // Merge with `_pendingState` if it exists, otherwise with existing state. + this.replaceState( + merge(this._pendingState || this.state, partialState), + callback + ); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {object} completeState Next state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + replaceState: function(completeState, callback) { + validateLifeCycleOnReplaceState(this); + this._pendingState = completeState; + ReactUpdates.enqueueUpdate(this, callback); + }, + + /** + * Processes props by setting default values for unspecified props and + * asserting that the props are valid. + * + * @param {object} props + * @private + */ + _processProps: function(props) { + var propName; + var defaultProps = this._defaultProps; + for (propName in defaultProps) { + if (!(propName in props)) { + props[propName] = defaultProps[propName]; + } + } + var propTypes = this.constructor.propTypes; + if (propTypes) { + var componentName = this.constructor.displayName; + for (propName in propTypes) { + var checkProp = propTypes[propName]; + if (checkProp) { + checkProp(props, propName, componentName); + } + } + } + }, + + performUpdateIfNecessary: function() { + var compositeLifeCycleState = this._compositeLifeCycleState; + // Do not trigger a state transition if we are in the middle of mounting or + // receiving props because both of those will already be doing this. + if (compositeLifeCycleState === CompositeLifeCycle.MOUNTING || + compositeLifeCycleState === CompositeLifeCycle.RECEIVING_PROPS) { + return; + } + ReactComponent.Mixin.performUpdateIfNecessary.call(this); + }, + + /** + * If any of `_pendingProps`, `_pendingState`, or `_pendingForceUpdate` is + * set, update the component. + * + * @param {ReactReconcileTransaction} transaction + * @internal + */ + _performUpdateIfNecessary: function(transaction) { + if (this._pendingProps == null && + this._pendingState == null && + !this._pendingForceUpdate) { + return; + } + + var nextProps = this.props; + if (this._pendingProps != null) { + nextProps = this._pendingProps; + this._processProps(nextProps); + this._pendingProps = null; + + this._compositeLifeCycleState = CompositeLifeCycle.RECEIVING_PROPS; + if (this.componentWillReceiveProps) { + this.componentWillReceiveProps(nextProps, transaction); + } + } + + this._compositeLifeCycleState = CompositeLifeCycle.RECEIVING_STATE; + + var nextState = this._pendingState || this.state; + this._pendingState = null; + + if (this._pendingForceUpdate || + !this.shouldComponentUpdate || + this.shouldComponentUpdate(nextProps, nextState)) { + this._pendingForceUpdate = false; + // Will set `this.props` and `this.state`. + this._performComponentUpdate(nextProps, nextState, transaction); + } else { + // If it's determined that a component should not update, we still want + // to set props and state. + this.props = nextProps; + this.state = nextState; + } + + this._compositeLifeCycleState = null; + }, + + /** + * Merges new props and state, notifies delegate methods of update and + * performs update. + * + * @param {object} nextProps Next object to set as properties. + * @param {?object} nextState Next object to set as state. + * @param {ReactReconcileTransaction} transaction + * @private + */ + _performComponentUpdate: function(nextProps, nextState, transaction) { + var prevProps = this.props; + var prevState = this.state; + + if (this.componentWillUpdate) { + this.componentWillUpdate(nextProps, nextState, transaction); + } + + this.props = nextProps; + this.state = nextState; + + this.updateComponent(transaction, prevProps, prevState); + + if (this.componentDidUpdate) { + transaction.getReactOnDOMReady().enqueue( + this, + this.componentDidUpdate.bind(this, prevProps, prevState) + ); + } + }, + + /** + * Updates the component's currently mounted DOM representation. + * + * By default, this implements React's rendering and reconciliation algorithm. + * Sophisticated clients may wish to override this. + * + * @param {ReactReconcileTransaction} transaction + * @param {object} prevProps + * @param {?object} prevState + * @internal + * @overridable + */ + updateComponent: function(transaction, prevProps, prevState) { + ReactComponent.Mixin.updateComponent.call(this, transaction, prevProps); + var currentComponent = this._renderedComponent; + var nextComponent = this._renderValidatedComponent(); + if (currentComponent.constructor === nextComponent.constructor) { + currentComponent.receiveProps(nextComponent.props, transaction); + } else { + // These two IDs are actually the same! But nothing should rely on that. + var thisID = this._rootNodeID; + var currentComponentID = currentComponent._rootNodeID; + currentComponent.unmountComponent(); + var nextMarkup = nextComponent.mountComponent(thisID, transaction); + ReactComponent.DOMIDOperations.dangerouslyReplaceNodeWithMarkupByID( + currentComponentID, + nextMarkup + ); + this._renderedComponent = nextComponent; + } + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldUpdateComponent`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + forceUpdate: function(callback) { + var compositeLifeCycleState = this._compositeLifeCycleState; + invariant( + this.isMounted() || + compositeLifeCycleState === CompositeLifeCycle.MOUNTING, + 'forceUpdate(...): Can only force an update on mounted or mounting ' + + 'components.' + ); + invariant( + compositeLifeCycleState !== CompositeLifeCycle.RECEIVING_STATE && + compositeLifeCycleState !== CompositeLifeCycle.UNMOUNTING, + 'forceUpdate(...): Cannot force an update while unmounting component ' + + 'or during an existing state transition (such as within `render`).' + ); + this._pendingForceUpdate = true; + ReactUpdates.enqueueUpdate(this, callback); + }, + + /** + * @private + */ + _renderValidatedComponent: function() { + var renderedComponent; + ReactCurrentOwner.current = this; + try { + renderedComponent = this.render(); + } catch (error) { + // IE8 requires `catch` in order to use `finally`. + throw error; + } finally { + ReactCurrentOwner.current = null; + } + invariant( + ReactComponent.isValidComponent(renderedComponent), + '%s.render(): A valid ReactComponent must be returned.', + this.constructor.displayName || 'ReactCompositeComponent' + ); + return renderedComponent; + }, + + /** + * @private + */ + _bindAutoBindMethods: function() { + for (var autoBindKey in this.__reactAutoBindMap) { + if (!this.__reactAutoBindMap.hasOwnProperty(autoBindKey)) { + continue; + } + var method = this.__reactAutoBindMap[autoBindKey]; + this[autoBindKey] = this._bindAutoBindMethod(method); + } + }, + + /** + * Binds a method to the component. + * + * @param {function} method Method to be bound. + * @private + */ + _bindAutoBindMethod: function(method) { + var component = this; + var boundMethod = function() { + return method.apply(component, arguments); + }; + if (true) { + var componentName = component.constructor.displayName; + var _bind = boundMethod.bind; + boundMethod.bind = function(newThis) { + // User is trying to bind() an autobound method; we effectively will + // ignore the value of "this" that the user is trying to use, so + // let's warn. + if (newThis !== component) { + console.warn( + 'bind(): React component methods may only be bound to the ' + + 'component instance. See ' + componentName + ); + } else if (arguments.length === 1) { + console.warn( + 'bind(): You are binding a component method to the component. ' + + 'React does this for you automatically in a high-performance ' + + 'way, so you can safely remove this call. See ' + componentName + ); + return boundMethod; + } + return _bind.apply(boundMethod, arguments); + }; + } + return boundMethod; + } +}; + +var ReactCompositeComponentBase = function() {}; +mixInto(ReactCompositeComponentBase, ReactComponent.Mixin); +mixInto(ReactCompositeComponentBase, ReactOwner.Mixin); +mixInto(ReactCompositeComponentBase, ReactPropTransferer.Mixin); +mixInto(ReactCompositeComponentBase, ReactCompositeComponentMixin); + +/** + * Module for creating composite components. + * + * @class ReactCompositeComponent + * @extends ReactComponent + * @extends ReactOwner + * @extends ReactPropTransferer + */ +var ReactCompositeComponent = { + + LifeCycle: CompositeLifeCycle, + + Base: ReactCompositeComponentBase, + + /** + * Creates a composite component class given a class specification. + * + * @param {object} spec Class specification (which must define `render`). + * @return {function} Component constructor function. + * @public + */ + createClass: function(spec) { + var Constructor = function() {}; + Constructor.prototype = new ReactCompositeComponentBase(); + Constructor.prototype.constructor = Constructor; + mixSpecIntoComponent(Constructor, spec); + invariant( + Constructor.prototype.render, + 'createClass(...): Class specification must implement a `render` method.' + ); + // Reduce time spent doing lookups by setting these on the prototype. + for (var methodName in ReactCompositeComponentInterface) { + if (!Constructor.prototype[methodName]) { + Constructor.prototype[methodName] = null; + } + } + + var ConvenienceConstructor = function(props, children) { + var instance = new Constructor(); + instance.construct.apply(instance, arguments); + return instance; + }; + ConvenienceConstructor.componentConstructor = Constructor; + ConvenienceConstructor.originalSpec = spec; + return ConvenienceConstructor; + }, + + /** + * TODO: Delete this when all callers have been updated to rely on this + * behavior being the default. + * + * Backwards compatible stub for what is now the default behavior. + * @param {function} method Method to be bound. + * @public + */ + autoBind: function(method) { + if (true) { + console.warn( + 'React.autoBind() is now deprecated. All React component methods ' + + 'are auto bound by default, so React.autoBind() is a no-op. It ' + + 'will be removed in the next version of React' + ); + } + return method; + } +}; + +module.exports = ReactCompositeComponent; + +})() +},{"./ReactComponent":23,"./ReactCurrentOwner":25,"./ReactOwner":43,"./ReactPropTransferer":44,"./ReactUpdates":49,"./invariant":78,"./keyMirror":81,"./merge":84,"./mixInto":87}],25:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactCurrentOwner + */ + +"use strict"; + +/** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + * + * The depth indicate how many composite components are above this render level. + */ +var ReactCurrentOwner = { + + /** + * @internal + * @type {ReactComponent} + */ + current: null + +}; + +module.exports = ReactCurrentOwner; + +},{}],26:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactDOM + * @typechecks static-only + */ + +"use strict"; + +var ReactNativeComponent = require("./ReactNativeComponent"); + +var mergeInto = require("./mergeInto"); +var objMapKeyVal = require("./objMapKeyVal"); + +/** + * Creates a new React class that is idempotent and capable of containing other + * React components. It accepts event listeners and DOM properties that are + * valid according to `DOMProperty`. + * + * - Event listeners: `onClick`, `onMouseDown`, etc. + * - DOM properties: `className`, `name`, `title`, etc. + * + * The `style` property functions differently from the DOM API. It accepts an + * object mapping of style properties to values. + * + * @param {string} tag Tag name (e.g. `div`). + * @param {boolean} omitClose True if the close tag should be omitted. + * @private + */ +function createDOMComponentClass(tag, omitClose) { + var Constructor = function() {}; + Constructor.prototype = new ReactNativeComponent(tag, omitClose); + Constructor.prototype.constructor = Constructor; + + var ConvenienceConstructor = function(props, children) { + var instance = new Constructor(); + instance.construct.apply(instance, arguments); + return instance; + }; + ConvenienceConstructor.componentConstructor = Constructor; + return ConvenienceConstructor; +} + +/** + * Creates a mapping from supported HTML tags to `ReactNativeComponent` classes. + * This is also accessible via `React.DOM`. + * + * @public + */ +var ReactDOM = objMapKeyVal({ + a: false, + abbr: false, + address: false, + area: false, + article: false, + aside: false, + audio: false, + b: false, + base: false, + bdi: false, + bdo: false, + big: false, + blockquote: false, + body: false, + br: true, + button: false, + canvas: false, + caption: false, + cite: false, + code: false, + col: true, + colgroup: false, + data: false, + datalist: false, + dd: false, + del: false, + details: false, + dfn: false, + div: false, + dl: false, + dt: false, + em: false, + embed: true, + fieldset: false, + figcaption: false, + figure: false, + footer: false, + form: false, // NOTE: Injected, see `ReactDOMForm`. + h1: false, + h2: false, + h3: false, + h4: false, + h5: false, + h6: false, + head: false, + header: false, + hr: true, + html: false, + i: false, + iframe: false, + img: true, + input: true, + ins: false, + kbd: false, + keygen: true, + label: false, + legend: false, + li: false, + link: false, + main: false, + map: false, + mark: false, + menu: false, + menuitem: false, // NOTE: Close tag should be omitted, but causes problems. + meta: true, + meter: false, + nav: false, + noscript: false, + object: false, + ol: false, + optgroup: false, + option: false, + output: false, + p: false, + param: true, + pre: false, + progress: false, + q: false, + rp: false, + rt: false, + ruby: false, + s: false, + samp: false, + script: false, + section: false, + select: false, + small: false, + source: false, + span: false, + strong: false, + style: false, + sub: false, + summary: false, + sup: false, + table: false, + tbody: false, + td: false, + textarea: false, // NOTE: Injected, see `ReactDOMTextarea`. + tfoot: false, + th: false, + thead: false, + time: false, + title: false, + tr: false, + track: true, + u: false, + ul: false, + 'var': false, + video: false, + wbr: false, + + // SVG + circle: false, + g: false, + line: false, + path: false, + polyline: false, + rect: false, + svg: false, + text: false +}, createDOMComponentClass); + +var injection = { + injectComponentClasses: function(componentClasses) { + mergeInto(ReactDOM, componentClasses); + } +}; + +ReactDOM.injection = injection; + +module.exports = ReactDOM; + +},{"./ReactNativeComponent":41,"./mergeInto":86,"./objMapKeyVal":88}],27:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactDOMForm + */ + +"use strict"; + +var ReactCompositeComponent = require("./ReactCompositeComponent"); +var ReactDOM = require("./ReactDOM"); +var ReactEventEmitter = require("./ReactEventEmitter"); +var EventConstants = require("./EventConstants"); + +// Store a reference to the <form> `ReactNativeComponent`. +var form = ReactDOM.form; + +/** + * Since onSubmit doesn't bubble OR capture on the top level in IE8, we need + * to capture it on the <form> element itself. There are lots of hacks we could + * do to accomplish this, but the most reliable is to make <form> a + * composite component and use `componentDidMount` to attach the event handlers. + */ +var ReactDOMForm = ReactCompositeComponent.createClass({ + render: function() { + // TODO: Instead of using `ReactDOM` directly, we should use JSX. However, + // `jshint` fails to parse JSX so in order for linting to work in the open + // source repo, we need to just use `ReactDOM.form`. + return this.transferPropsTo(form(null, this.props.children)); + }, + + componentDidMount: function(node) { + ReactEventEmitter.trapBubbledEvent( + EventConstants.topLevelTypes.topSubmit, + 'submit', + node + ); + } +}); + +module.exports = ReactDOMForm; + +},{"./EventConstants":13,"./ReactCompositeComponent":24,"./ReactDOM":26,"./ReactEventEmitter":34}],28:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactDOMIDOperations + * @typechecks static-only + */ + +/*jslint evil: true */ + +"use strict"; + +var CSSPropertyOperations = require("./CSSPropertyOperations"); +var DOMChildrenOperations = require("./DOMChildrenOperations"); +var DOMPropertyOperations = require("./DOMPropertyOperations"); +var ReactMount = require("./ReactMount"); + +var getTextContentAccessor = require("./getTextContentAccessor"); +var invariant = require("./invariant"); + +/** + * Errors for properties that should not be updated with `updatePropertyById()`. + * + * @type {object} + * @private + */ +var INVALID_PROPERTY_ERRORS = { + dangerouslySetInnerHTML: + '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.', + style: '`style` must be set using `updateStylesByID()`.' +}; + +/** + * The DOM property to use when setting text content. + * + * @type {string} + * @private + */ +var textContentAccessor = getTextContentAccessor() || 'NA'; + +/** + * Operations used to process updates to DOM nodes. This is made injectable via + * `ReactComponent.DOMIDOperations`. + */ +var ReactDOMIDOperations = { + + /** + * Updates a DOM node with new property values. This should only be used to + * update DOM properties in `DOMProperty`. + * + * @param {string} id ID of the node to update. + * @param {string} name A valid property name, see `DOMProperty`. + * @param {*} value New value of the property. + * @internal + */ + updatePropertyByID: function(id, name, value) { + var node = ReactMount.getNode(id); + invariant( + !INVALID_PROPERTY_ERRORS.hasOwnProperty(name), + 'updatePropertyByID(...): %s', + INVALID_PROPERTY_ERRORS[name] + ); + + // If we're updating to null or undefined, we should remove the property + // from the DOM node instead of inadvertantly setting to a string. This + // brings us in line with the same behavior we have on initial render. + if (value != null) { + DOMPropertyOperations.setValueForProperty(node, name, value); + } else { + DOMPropertyOperations.deleteValueForProperty(node, name); + } + }, + + /** + * Updates a DOM node to remove a property. This should only be used to remove + * DOM properties in `DOMProperty`. + * + * @param {string} id ID of the node to update. + * @param {string} name A property name to remove, see `DOMProperty`. + * @internal + */ + deletePropertyByID: function(id, name, value) { + var node = ReactMount.getNode(id); + invariant( + !INVALID_PROPERTY_ERRORS.hasOwnProperty(name), + 'updatePropertyByID(...): %s', + INVALID_PROPERTY_ERRORS[name] + ); + DOMPropertyOperations.deleteValueForProperty(node, name, value); + }, + + /** + * This should almost never be used instead of `updatePropertyByID()` due to + * the extra object allocation required by the API. That said, this is useful + * for batching up several operations across worker thread boundaries. + * + * @param {string} id ID of the node to update. + * @param {object} properties A mapping of valid property names. + * @internal + * @see {ReactDOMIDOperations.updatePropertyByID} + */ + updatePropertiesByID: function(id, properties) { + for (var name in properties) { + if (!properties.hasOwnProperty(name)) { + continue; + } + ReactDOMIDOperations.updatePropertiesByID(id, name, properties[name]); + } + }, + + /** + * Updates a DOM node with new style values. If a value is specified as '', + * the corresponding style property will be unset. + * + * @param {string} id ID of the node to update. + * @param {object} styles Mapping from styles to values. + * @internal + */ + updateStylesByID: function(id, styles) { + var node = ReactMount.getNode(id); + CSSPropertyOperations.setValueForStyles(node, styles); + }, + + /** + * Updates a DOM node's innerHTML set by `props.dangerouslySetInnerHTML`. + * + * @param {string} id ID of the node to update. + * @param {object} html An HTML object with the `__html` property. + * @internal + */ + updateInnerHTMLByID: function(id, html) { + var node = ReactMount.getNode(id); + // HACK: IE8- normalize whitespace in innerHTML, removing leading spaces. + // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html + node.innerHTML = (html && html.__html || '').replace(/^ /g, ' '); + }, + + /** + * Updates a DOM node's text content set by `props.content`. + * + * @param {string} id ID of the node to update. + * @param {string} content Text content. + * @internal + */ + updateTextContentByID: function(id, content) { + var node = ReactMount.getNode(id); + node[textContentAccessor] = content; + }, + + /** + * Replaces a DOM node that exists in the document with markup. + * + * @param {string} id ID of child to be replaced. + * @param {string} markup Dangerous markup to inject in place of child. + * @internal + * @see {Danger.dangerouslyReplaceNodeWithMarkup} + */ + dangerouslyReplaceNodeWithMarkupByID: function(id, markup) { + var node = ReactMount.getNode(id); + DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup); + }, + + /** + * TODO: We only actually *need* to purge the cache when we remove elements. + * Detect if any elements were removed instead of blindly purging. + */ + manageChildrenByParentID: function(parentID, domOperations) { + var parent = ReactMount.getNode(parentID); + DOMChildrenOperations.manageChildren(parent, domOperations); + } + +}; + +module.exports = ReactDOMIDOperations; + +})() +},{"./CSSPropertyOperations":3,"./DOMChildrenOperations":6,"./DOMPropertyOperations":8,"./ReactMount":39,"./getTextContentAccessor":74,"./invariant":78}],29:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactDOMInput + */ + +"use strict"; + +var DOMPropertyOperations = require("./DOMPropertyOperations"); +var ReactCompositeComponent = require("./ReactCompositeComponent"); +var ReactDOM = require("./ReactDOM"); + +var merge = require("./merge"); + +// Store a reference to the <input> `ReactNativeComponent`. +var input = ReactDOM.input; + +/** + * Implements an <input> native component that allows setting these optional + * props: `checked`, `value`, `defaultChecked`, and `defaultValue`. + * + * If `checked` or `value` are not supplied (or null/undefined), user actions + * that affect the checked state or value will trigger updates to the element. + * + * If they are supplied (and not null/undefined), the rendered element will not + * trigger updates to the element. Instead, the props must change in order for + * the rendered element to be updated. + * + * The rendered element will be initialized as unchecked (or `defaultChecked`) + * with an empty value (or `defaultValue`). + * + * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html + */ +var ReactDOMInput = ReactCompositeComponent.createClass({ + + getInitialState: function() { + return { + checked: this.props.defaultChecked || false, + value: this.props.defaultValue || '' + }; + }, + + shouldComponentUpdate: function() { + // Defer any updates to this component during the `onChange` handler. + return !this._isChanging; + }, + + getChecked: function() { + return this.props.checked != null ? this.props.checked : this.state.checked; + }, + + getValue: function() { + // Cast `this.props.value` to a string so equality checks pass. + return this.props.value != null ? '' + this.props.value : this.state.value; + }, + + render: function() { + // Clone `this.props` so we don't mutate the input. + var props = merge(this.props); + + props.checked = this.getChecked(); + props.value = this.getValue(); + props.onChange = this.handleChange; + + return input(props, this.props.children); + }, + + componentDidUpdate: function(prevProps, prevState, rootNode) { + if (this.props.checked != null) { + DOMPropertyOperations.setValueForProperty( + rootNode, + 'checked', + this.props.checked || false + ); + } + if (this.props.value != null) { + // Cast `this.props.value` to a string so falsey values that cast to + // truthy strings are not ignored. + DOMPropertyOperations.setValueForProperty( + rootNode, + 'value', + '' + this.props.value || '' + ); + } + }, + + handleChange: function(event) { + var returnValue; + if (this.props.onChange) { + this._isChanging = true; + returnValue = this.props.onChange(event); + this._isChanging = false; + } + this.setState({ + checked: event.target.checked, + value: event.target.value + }); + return returnValue; + } + +}); + +module.exports = ReactDOMInput; + +},{"./DOMPropertyOperations":8,"./ReactCompositeComponent":24,"./ReactDOM":26,"./merge":84}],30:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactDOMOption + */ + +"use strict"; + +var ReactCompositeComponent = require("./ReactCompositeComponent"); +var ReactDOM = require("./ReactDOM"); + +// Store a reference to the <option> `ReactNativeComponent`. +var option = ReactDOM.option; + +/** + * Implements an <option> native component that warns when `selected` is set. + */ +var ReactDOMOption = ReactCompositeComponent.createClass({ + + componentWillMount: function() { + // TODO (yungsters): Remove support for `selected` in <option>. + if (this.props.selected != null) { + if (true) { + console.warn( + 'Use the `defaultValue` or `value` props on <select> instead of ' + + 'setting `selected` on <option>.' + ); + } + } + }, + + render: function() { + return option(this.props, this.props.children); + } + +}); + +module.exports = ReactDOMOption; + +},{"./ReactCompositeComponent":24,"./ReactDOM":26}],31:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactDOMSelect + */ + +"use strict"; + +var ReactCompositeComponent = require("./ReactCompositeComponent"); +var ReactDOM = require("./ReactDOM"); + +var invariant = require("./invariant"); +var merge = require("./merge"); + +// Store a reference to the <select> `ReactNativeComponent`. +var select = ReactDOM.select; + +/** + * Validation function for `value` and `defaultValue`. + * @private + */ +function selectValueType(props, propName, componentName) { + if (props[propName] == null) { + return; + } + if (props.multiple) { + invariant( + Array.isArray(props[propName]), + 'The `%s` prop supplied to <select> must be an array if `multiple` is ' + + 'true.', + propName + ); + } else { + invariant( + !Array.isArray(props[propName]), + 'The `%s` prop supplied to <select> must be a scalar value if ' + + '`multiple` is false.', + propName + ); + } +} + +/** + * If `value` is supplied, updates <option> elements on mount and update. + * @private + */ +function updateOptions() { + /*jshint validthis:true */ + if (this.props.value == null) { + return; + } + var options = this.getDOMNode().options; + var selectedValue = '' + this.props.value; + + for (var i = 0, l = options.length; i < l; i++) { + var selected = this.props.multiple ? + selectedValue.indexOf(options[i].value) >= 0 : + selected = options[i].value === selectedValue; + + if (selected !== options[i].selected) { + options[i].selected = selected; + } + } +} + +/** + * Implements a <select> native component that allows optionally setting the + * props `value` and `defaultValue`. If `multiple` is false, the prop must be a + * string. If `multiple` is true, the prop must be an array of strings. + * + * If `value` is not supplied (or null/undefined), user actions that change the + * selected option will trigger updates to the rendered options. + * + * If it is supplied (and not null/undefined), the rendered options will not + * update in response to user actions. Instead, the `value` prop must change in + * order for the rendered options to update. + * + * If `defaultValue` is provided, any options with the supplied values will be + * selected. + */ +var ReactDOMSelect = ReactCompositeComponent.createClass({ + + propTypes: { + defaultValue: selectValueType, + value: selectValueType + }, + + getInitialState: function() { + return {value: this.props.defaultValue || (this.props.multiple ? [] : '')}; + }, + + componentWillReceiveProps: function(nextProps) { + if (!this.props.multiple && nextProps.multiple) { + this.setState({value: [this.state.value]}); + } else if (this.props.multiple && !nextProps.multiple) { + this.setState({value: this.state.value[0]}); + } + }, + + shouldComponentUpdate: function() { + // Defer any updates to this component during the `onChange` handler. + return !this._isChanging; + }, + + render: function() { + // Clone `this.props` so we don't mutate the input. + var props = merge(this.props); + + props.onChange = this.handleChange; + props.value = null; + + return select(props, this.props.children); + }, + + componentDidMount: updateOptions, + + componentDidUpdate: updateOptions, + + handleChange: function(event) { + var returnValue; + if (this.props.onChange) { + this._isChanging = true; + returnValue = this.props.onChange(event); + this._isChanging = false; + } + + var selectedValue; + if (this.props.multiple) { + selectedValue = []; + var options = event.target.options; + for (var i = 0, l = options.length; i < l; i++) { + if (options[i].selected) { + selectedValue.push(options[i].value); + } + } + } else { + selectedValue = event.target.value; + } + + this.setState({value: selectedValue}); + return returnValue; + } + +}); + +module.exports = ReactDOMSelect; + +},{"./ReactCompositeComponent":24,"./ReactDOM":26,"./invariant":78,"./merge":84}],32:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactDOMTextarea + */ + +"use strict"; + +var DOMPropertyOperations = require("./DOMPropertyOperations"); +var ReactCompositeComponent = require("./ReactCompositeComponent"); +var ReactDOM = require("./ReactDOM"); + +var invariant = require("./invariant"); +var merge = require("./merge"); + +// Store a reference to the <textarea> `ReactNativeComponent`. +var textarea = ReactDOM.textarea; + +// For quickly matching children type, to test if can be treated as content. +var CONTENT_TYPES = {'string': true, 'number': true}; + +/** + * Implements a <textarea> native component that allows setting `value`, and + * `defaultValue`. This differs from the traditional DOM API because value is + * usually set as PCDATA children. + * + * If `value` is not supplied (or null/undefined), user actions that affect the + * value will trigger updates to the element. + * + * If `value` is supplied (and not null/undefined), the rendered element will + * not trigger updates to the element. Instead, the `value` prop must change in + * order for the rendered element to be updated. + * + * The rendered element will be initialized with an empty value, the prop + * `defaultValue` if specified, or the children content (deprecated). + */ +var ReactDOMTextarea = ReactCompositeComponent.createClass({ + + getInitialState: function() { + var defaultValue = this.props.defaultValue; + // TODO (yungsters): Remove support for children content in <textarea>. + var children = this.props.children; + if (children != null) { + if (true) { + console.warn( + 'Use the `defaultValue` or `value` props instead of setting ' + + 'children on <textarea>.' + ); + } + invariant( + defaultValue == null, + 'If you supply `defaultValue` on a <textarea>, do not pass children.' + ); + if (Array.isArray(children)) { + invariant( + children.length <= 1, + '<textarea> can only have at most one child.' + ); + children = children[0]; + } + invariant( + CONTENT_TYPES[typeof children], + 'If you specify children to <textarea>, it must be a single string ' + + 'or number., not an array or object.' + ); + defaultValue = '' + children; + } + defaultValue = defaultValue || ''; + return { + // We save the initial value so that `ReactNativeComponent` doesn't update + // `textContent` (unnecessary since we update value). + initialValue: this.props.value != null ? this.props.value : defaultValue, + value: defaultValue + }; + }, + + shouldComponentUpdate: function() { + // Defer any updates to this component during the `onChange` handler. + return !this._isChanging; + }, + + getValue: function() { + return this.props.value != null ? this.props.value : this.state.value; + }, + + render: function() { + // Clone `this.props` so we don't mutate the input. + var props = merge(this.props); + + invariant( + props.dangerouslySetInnerHTML == null, + '`dangerouslySetInnerHTML` does not make sense on <textarea>.' + ); + + props.value = this.getValue(); + props.onChange = this.handleChange; + + // Always set children to the same thing. In IE9, the selection range will + // get reset if `textContent` is mutated. + return textarea(props, this.state.initialValue); + }, + + componentDidUpdate: function(prevProps, prevState, rootNode) { + if (this.props.value != null) { + DOMPropertyOperations.setValueForProperty( + rootNode, + 'value', + this.props.value || '' + ); + } + }, + + handleChange: function(event) { + var returnValue; + if (this.props.onChange) { + this._isChanging = true; + returnValue = this.props.onChange(event); + this._isChanging = false; + } + this.setState({value: event.target.value}); + return returnValue; + } + +}); + +module.exports = ReactDOMTextarea; + +},{"./DOMPropertyOperations":8,"./ReactCompositeComponent":24,"./ReactDOM":26,"./invariant":78,"./merge":84}],33:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactDefaultInjection + */ + +"use strict"; + +var ReactDOM = require("./ReactDOM"); +var ReactDOMForm = require("./ReactDOMForm"); +var ReactDOMInput = require("./ReactDOMInput"); +var ReactDOMOption = require("./ReactDOMOption"); +var ReactDOMSelect = require("./ReactDOMSelect"); +var ReactDOMTextarea = require("./ReactDOMTextarea"); +var ReactEventEmitter = require("./ReactEventEmitter"); +var ReactEventTopLevelCallback = require("./ReactEventTopLevelCallback"); + +var DefaultDOMPropertyConfig = require("./DefaultDOMPropertyConfig"); +var DOMProperty = require("./DOMProperty"); + +var DefaultEventPluginOrder = require("./DefaultEventPluginOrder"); +var EnterLeaveEventPlugin = require("./EnterLeaveEventPlugin"); +var ChangeEventPlugin = require("./ChangeEventPlugin"); +var EventPluginHub = require("./EventPluginHub"); +var ReactInstanceHandles = require("./ReactInstanceHandles"); +var SimpleEventPlugin = require("./SimpleEventPlugin"); +var MobileSafariClickEventPlugin = require("./MobileSafariClickEventPlugin"); + +function inject() { + ReactEventEmitter.TopLevelCallbackCreator = ReactEventTopLevelCallback; + /** + * Inject module for resolving DOM hierarchy and plugin ordering. + */ + EventPluginHub.injection.injectEventPluginOrder(DefaultEventPluginOrder); + EventPluginHub.injection.injectInstanceHandle(ReactInstanceHandles); + + /** + * Some important event plugins included by default (without having to require + * them). + */ + EventPluginHub.injection.injectEventPluginsByName({ + 'SimpleEventPlugin': SimpleEventPlugin, + 'EnterLeaveEventPlugin': EnterLeaveEventPlugin, + 'ChangeEventPlugin': ChangeEventPlugin, + 'MobileSafariClickEventPlugin': MobileSafariClickEventPlugin + }); + + ReactDOM.injection.injectComponentClasses({ + form: ReactDOMForm, + input: ReactDOMInput, + option: ReactDOMOption, + select: ReactDOMSelect, + textarea: ReactDOMTextarea + }); + + DOMProperty.injection.injectDOMPropertyConfig(DefaultDOMPropertyConfig); +} + +module.exports = { + inject: inject +}; + +},{"./ChangeEventPlugin":5,"./DOMProperty":7,"./DefaultDOMPropertyConfig":10,"./DefaultEventPluginOrder":11,"./EnterLeaveEventPlugin":12,"./EventPluginHub":15,"./MobileSafariClickEventPlugin":20,"./ReactDOM":26,"./ReactDOMForm":27,"./ReactDOMInput":29,"./ReactDOMOption":30,"./ReactDOMSelect":31,"./ReactDOMTextarea":32,"./ReactEventEmitter":34,"./ReactEventTopLevelCallback":35,"./ReactInstanceHandles":37,"./SimpleEventPlugin":50}],34:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactEventEmitter + * @typechecks static-only + */ + +"use strict"; + +var EventConstants = require("./EventConstants"); +var EventListener = require("./EventListener"); +var EventPluginHub = require("./EventPluginHub"); +var ExecutionEnvironment = require("./ExecutionEnvironment"); +var ReactUpdates = require("./ReactUpdates"); +var ViewportMetrics = require("./ViewportMetrics"); + +var invariant = require("./invariant"); +var isEventSupported = require("./isEventSupported"); + +/** + * Summary of `ReactEventEmitter` event handling: + * + * - Top-level delegation is used to trap native browser events. We normalize + * and de-duplicate events to account for browser quirks. + * + * - Forward these native events (with the associated top-level type used to + * trap it) to `EventPluginHub`, which in turn will ask plugins if they want + * to extract any synthetic events. + * + * - The `EventPluginHub` will then process each event by annotating them with + * "dispatches", a sequence of listeners and IDs that care about that event. + * + * - The `EventPluginHub` then dispatches the events. + * + * Overview of React and the event system: + * + * . + * +------------+ . + * | DOM | . + * +------------+ . +-----------+ + * + . +--------+|SimpleEvent| + * | . | |Plugin | + * +-----|------+ . v +-----------+ + * | | | . +--------------+ +------------+ + * | +-----------.--->|EventPluginHub| | Event | + * | | . | | +-----------+ | Propagators| + * | ReactEvent | . | | |TapEvent | |------------| + * | Emitter | . | |<---+|Plugin | |other plugin| + * | | . | | +-----------+ | utilities | + * | +-----------.---------+ | +------------+ + * | | | . +----|---------+ + * +-----|------+ . | ^ +-----------+ + * | . | | |Enter/Leave| + * + . | +-------+|Plugin | + * +-------------+ . v +-----------+ + * | application | . +----------+ + * |-------------| . | callback | + * | | . | registry | + * | | . +----------+ + * +-------------+ . + * . + * React Core . General Purpose Event Plugin System + */ + +/** + * Whether or not `ensureListening` has been invoked. + * @type {boolean} + * @private + */ +var _isListening = false; + +/** + * Traps top-level events by using event bubbling. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {string} handlerBaseName Event name (e.g. "click"). + * @param {DOMEventTarget} element Element on which to attach listener. + * @internal + */ +function trapBubbledEvent(topLevelType, handlerBaseName, element) { + EventListener.listen( + element, + handlerBaseName, + ReactEventEmitter.TopLevelCallbackCreator.createTopLevelCallback( + topLevelType + ) + ); +} + +/** + * Traps a top-level event by using event capturing. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {string} handlerBaseName Event name (e.g. "click"). + * @param {DOMEventTarget} element Element on which to attach listener. + * @internal + */ +function trapCapturedEvent(topLevelType, handlerBaseName, element) { + EventListener.capture( + element, + handlerBaseName, + ReactEventEmitter.TopLevelCallbackCreator.createTopLevelCallback( + topLevelType + ) + ); +} + +/** + * Listens to window scroll and resize events. We cache scroll values so that + * application code can access them without triggering reflows. + * + * NOTE: Scroll events do not bubble. + * + * @private + * @see http://www.quirksmode.org/dom/events/scroll.html + */ +function registerScrollValueMonitoring() { + var refresh = ViewportMetrics.refreshScrollValues; + EventListener.listen(window, 'scroll', refresh); + EventListener.listen(window, 'resize', refresh); +} + +/** + * We listen for bubbled touch events on the document object. + * + * Firefox v8.01 (and possibly others) exhibited strange behavior when mounting + * `onmousemove` events at some node that was not the document element. The + * symptoms were that if your mouse is not moving over something contained + * within that mount point (for example on the background) the top-level + * listeners for `onmousemove` won't be called. However, if you register the + * `mousemove` on the document object, then it will of course catch all + * `mousemove`s. This along with iOS quirks, justifies restricting top-level + * listeners to the document object only, at least for these movement types of + * events and possibly all events. + * + * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html + * + * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but + * they bubble to document. + * + * @param {boolean} touchNotMouse Listen to touch events instead of mouse. + * @private + * @see http://www.quirksmode.org/dom/events/keys.html. + */ +function listenAtTopLevel(touchNotMouse) { + invariant( + !_isListening, + 'listenAtTopLevel(...): Cannot setup top-level listener more than once.' + ); + var topLevelTypes = EventConstants.topLevelTypes; + var mountAt = document; + + registerScrollValueMonitoring(); + trapBubbledEvent(topLevelTypes.topMouseOver, 'mouseover', mountAt); + trapBubbledEvent(topLevelTypes.topMouseDown, 'mousedown', mountAt); + trapBubbledEvent(topLevelTypes.topMouseUp, 'mouseup', mountAt); + trapBubbledEvent(topLevelTypes.topMouseMove, 'mousemove', mountAt); + trapBubbledEvent(topLevelTypes.topMouseOut, 'mouseout', mountAt); + trapBubbledEvent(topLevelTypes.topClick, 'click', mountAt); + trapBubbledEvent(topLevelTypes.topDoubleClick, 'dblclick', mountAt); + if (touchNotMouse) { + trapBubbledEvent(topLevelTypes.topTouchStart, 'touchstart', mountAt); + trapBubbledEvent(topLevelTypes.topTouchEnd, 'touchend', mountAt); + trapBubbledEvent(topLevelTypes.topTouchMove, 'touchmove', mountAt); + trapBubbledEvent(topLevelTypes.topTouchCancel, 'touchcancel', mountAt); + } + trapBubbledEvent(topLevelTypes.topKeyUp, 'keyup', mountAt); + trapBubbledEvent(topLevelTypes.topKeyPress, 'keypress', mountAt); + trapBubbledEvent(topLevelTypes.topKeyDown, 'keydown', mountAt); + trapBubbledEvent(topLevelTypes.topInput, 'input', mountAt); + trapBubbledEvent(topLevelTypes.topChange, 'change', mountAt); + trapBubbledEvent( + topLevelTypes.topSelectionChange, + 'selectionchange', + mountAt + ); + trapBubbledEvent( + topLevelTypes.topDOMCharacterDataModified, + 'DOMCharacterDataModified', + mountAt + ); + + if (isEventSupported('drag')) { + trapBubbledEvent(topLevelTypes.topDrag, 'drag', mountAt); + trapBubbledEvent(topLevelTypes.topDragEnd, 'dragend', mountAt); + trapBubbledEvent(topLevelTypes.topDragEnter, 'dragenter', mountAt); + trapBubbledEvent(topLevelTypes.topDragExit, 'dragexit', mountAt); + trapBubbledEvent(topLevelTypes.topDragLeave, 'dragleave', mountAt); + trapBubbledEvent(topLevelTypes.topDragOver, 'dragover', mountAt); + trapBubbledEvent(topLevelTypes.topDragStart, 'dragstart', mountAt); + trapBubbledEvent(topLevelTypes.topDrop, 'drop', mountAt); + } + + if (isEventSupported('wheel')) { + trapBubbledEvent(topLevelTypes.topWheel, 'wheel', mountAt); + } else if (isEventSupported('mousewheel')) { + trapBubbledEvent(topLevelTypes.topWheel, 'mousewheel', mountAt); + } else { + // Firefox needs to capture a different mouse scroll event. + // @see http://www.quirksmode.org/dom/events/tests/scroll.html + trapBubbledEvent(topLevelTypes.topWheel, 'DOMMouseScroll', mountAt); + } + + // IE<9 does not support capturing so just trap the bubbled event there. + if (isEventSupported('scroll', true)) { + trapCapturedEvent(topLevelTypes.topScroll, 'scroll', mountAt); + } else { + trapBubbledEvent(topLevelTypes.topScroll, 'scroll', window); + } + + if (isEventSupported('focus', true)) { + trapCapturedEvent(topLevelTypes.topFocus, 'focus', mountAt); + trapCapturedEvent(topLevelTypes.topBlur, 'blur', mountAt); + } else if (isEventSupported('focusin')) { + // IE has `focusin` and `focusout` events which bubble. + // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html + trapBubbledEvent(topLevelTypes.topFocus, 'focusin', mountAt); + trapBubbledEvent(topLevelTypes.topBlur, 'focusout', mountAt); + } +} + +/** + * `ReactEventEmitter` is used to attach top-level event listeners. For example: + * + * ReactEventEmitter.putListener('myID', 'onClick', myFunction); + * + * This would allocate a "registration" of `('onClick', myFunction)` on 'myID'. + * + * @internal + */ +var ReactEventEmitter = { + + /** + * React references `ReactEventTopLevelCallback` using this property in order + * to allow dependency injection. + */ + TopLevelCallbackCreator: null, + + /** + * Ensures that top-level event delegation listeners are installed. + * + * There are issues with listening to both touch events and mouse events on + * the top-level, so we make the caller choose which one to listen to. (If + * there's a touch top-level listeners, anchors don't receive clicks for some + * reason, and only in some cases). + * + * @param {boolean} touchNotMouse Listen to touch events instead of mouse. + */ + ensureListening: function(touchNotMouse) { + invariant( + ExecutionEnvironment.canUseDOM, + 'ensureListening(...): Cannot toggle event listening in a Worker ' + + 'thread. This is likely a bug in the framework. Please report ' + + 'immediately.' + ); + invariant( + ReactEventEmitter.TopLevelCallbackCreator, + 'ensureListening(...): Cannot be called without a top level callback ' + + 'creator being injected.' + ); + if (!_isListening) { + listenAtTopLevel(touchNotMouse); + _isListening = true; + } + }, + + /** + * Sets whether or not any created callbacks should be enabled. + * + * @param {boolean} enabled True if callbacks should be enabled. + */ + setEnabled: function(enabled) { + invariant( + ExecutionEnvironment.canUseDOM, + 'setEnabled(...): Cannot toggle event listening in a Worker thread. ' + + 'This is likely a bug in the framework. Please report immediately.' + ); + if (ReactEventEmitter.TopLevelCallbackCreator) { + ReactEventEmitter.TopLevelCallbackCreator.setEnabled(enabled); + } + }, + + /** + * @return {boolean} True if callbacks are enabled. + */ + isEnabled: function() { + return !!( + ReactEventEmitter.TopLevelCallbackCreator && + ReactEventEmitter.TopLevelCallbackCreator.isEnabled() + ); + }, + + /** + * Streams a fired top-level event to `EventPluginHub` where plugins have the + * opportunity to create `ReactEvent`s to be dispatched. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + */ + handleTopLevel: function( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent) { + var events = EventPluginHub.extractEvents( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent + ); + + // Event queue being processed in the same cycle allows `preventDefault`. + ReactUpdates.batchedUpdates(function() { + EventPluginHub.enqueueEvents(events); + EventPluginHub.processEventQueue(); + }); + }, + + registrationNames: EventPluginHub.registrationNames, + + putListener: EventPluginHub.putListener, + + getListener: EventPluginHub.getListener, + + deleteListener: EventPluginHub.deleteListener, + + deleteAllListeners: EventPluginHub.deleteAllListeners, + + trapBubbledEvent: trapBubbledEvent, + + trapCapturedEvent: trapCapturedEvent + +}; + +module.exports = ReactEventEmitter; + +})() +},{"./EventConstants":13,"./EventListener":14,"./EventPluginHub":15,"./ExecutionEnvironment":19,"./ReactUpdates":49,"./ViewportMetrics":60,"./invariant":78,"./isEventSupported":79}],35:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactEventTopLevelCallback + * @typechecks static-only + */ + +"use strict"; + +var ExecutionEnvironment = require("./ExecutionEnvironment"); +var ReactEventEmitter = require("./ReactEventEmitter"); +var ReactMount = require("./ReactMount"); + +var getEventTarget = require("./getEventTarget"); + +/** + * @type {boolean} + * @private + */ +var _topLevelListenersEnabled = true; + +/** + * Top-level callback creator used to implement event handling using delegation. + * This is used via dependency injection. + */ +var ReactEventTopLevelCallback = { + + /** + * Sets whether or not any created callbacks should be enabled. + * + * @param {boolean} enabled True if callbacks should be enabled. + */ + setEnabled: function(enabled) { + _topLevelListenersEnabled = !!enabled; + }, + + /** + * @return {boolean} True if callbacks are enabled. + */ + isEnabled: function() { + return _topLevelListenersEnabled; + }, + + /** + * Creates a callback for the supplied `topLevelType` that could be added as + * a listener to the document. The callback computes a `topLevelTarget` which + * should be the root node of a mounted React component where the listener + * is attached. + * + * @param {string} topLevelType Record from `EventConstants`. + * @return {function} Callback for handling top-level events. + */ + createTopLevelCallback: function(topLevelType) { + return function(nativeEvent) { + if (!_topLevelListenersEnabled) { + return; + } + // TODO: Remove when synthetic events are ready, this is for IE<9. + if (nativeEvent.srcElement && + nativeEvent.srcElement !== nativeEvent.target) { + nativeEvent.target = nativeEvent.srcElement; + } + var topLevelTarget = ReactMount.getFirstReactDOM( + getEventTarget(nativeEvent) + ) || ExecutionEnvironment.global; + var topLevelTargetID = ReactMount.getID(topLevelTarget) || ''; + ReactEventEmitter.handleTopLevel( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent + ); + }; + } + +}; + +module.exports = ReactEventTopLevelCallback; + +})() +},{"./ExecutionEnvironment":19,"./ReactEventEmitter":34,"./ReactMount":39,"./getEventTarget":72}],36:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactInputSelection + */ + +"use strict"; + +// It is not safe to read the document.activeElement property in IE if there's +// nothing focused. +function getActiveElement() { + try { + return document.activeElement; + } catch (e) { + } +} + +function isInDocument(node) { + return document.documentElement.contains(node); +} + +/** + * @ReactInputSelection: React input selection module. Based on Selection.js, + * but modified to be suitable for react and has a couple of bug fixes (doesn't + * assume buttons have range selections allowed). + * Input selection module for React. + */ +var ReactInputSelection = { + + hasSelectionCapabilities: function(elem) { + return elem && ( + (elem.nodeName === 'INPUT' && elem.type === 'text') || + elem.nodeName === 'TEXTAREA' || + elem.contentEditable === 'true' + ); + }, + + getSelectionInformation: function() { + var focusedElem = getActiveElement(); + return { + focusedElem: focusedElem, + selectionRange: + ReactInputSelection.hasSelectionCapabilities(focusedElem) ? + ReactInputSelection.getSelection(focusedElem) : + null + }; + }, + + /** + * @restoreSelection: If any selection information was potentially lost, + * restore it. This is useful when performing operations that could remove dom + * nodes and place them back in, resulting in focus being lost. + */ + restoreSelection: function(priorSelectionInformation) { + var curFocusedElem = getActiveElement(); + var priorFocusedElem = priorSelectionInformation.focusedElem; + var priorSelectionRange = priorSelectionInformation.selectionRange; + if (curFocusedElem !== priorFocusedElem && + isInDocument(priorFocusedElem)) { + if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) { + ReactInputSelection.setSelection( + priorFocusedElem, + priorSelectionRange + ); + } + priorFocusedElem.focus(); + } + }, + + /** + * @getSelection: Gets the selection bounds of a textarea or input. + * -@input: Look up selection bounds of this input or textarea + * -@return {start: selectionStart, end: selectionEnd} + */ + getSelection: function(input) { + var range; + if (input.contentEditable === 'true' && window.getSelection) { + range = window.getSelection().getRangeAt(0); + var commonAncestor = range.commonAncestorContainer; + if (commonAncestor && commonAncestor.nodeType === 3) { + commonAncestor = commonAncestor.parentNode; + } + if (commonAncestor !== input) { + return {start: 0, end: 0}; + } else { + return {start: range.startOffset, end: range.endOffset}; + } + } + + if (!document.selection) { + // Mozilla, Safari, etc. + return {start: input.selectionStart, end: input.selectionEnd}; + } + + range = document.selection.createRange(); + if (range.parentElement() !== input) { + // There can only be one selection per document in IE, so if the + // containing element of the document's selection isn't our text field, + // our text field must have no selection. + return {start: 0, end: 0}; + } + + var length = input.value.length; + + if (input.nodeName === 'INPUT') { + return { + start: -range.moveStart('character', -length), + end: -range.moveEnd('character', -length) + }; + } else { + var range2 = range.duplicate(); + range2.moveToElementText(input); + range2.setEndPoint('StartToEnd', range); + var end = length - range2.text.length; + range2.setEndPoint('StartToStart', range); + return { + start: length - range2.text.length, + end: end + }; + } + }, + + /** + * @setSelection: Sets the selection bounds of a textarea or input and focuses + * the input. + * -@input Set selection bounds of this input or textarea + * -@rangeObj Object of same form that is returned from get* + */ + setSelection: function(input, rangeObj) { + var range; + var start = rangeObj.start; + var end = rangeObj.end; + if (typeof end === 'undefined') { + end = start; + } + if (document.selection) { + // IE is inconsistent about character offsets when it comes to carriage + // returns, so we need to manually take them into account + if (input.tagName === 'TEXTAREA') { + var cr_before = + (input.value.slice(0, start).match(/\r/g) || []).length; + var cr_inside = + (input.value.slice(start, end).match(/\r/g) || []).length; + start -= cr_before; + end -= cr_before + cr_inside; + } + range = input.createTextRange(); + range.collapse(true); + range.moveStart('character', start); + range.moveEnd('character', end - start); + range.select(); + } else { + if (input.contentEditable === 'true') { + if (input.childNodes.length === 1) { + range = document.createRange(); + range.setStart(input.childNodes[0], start); + range.setEnd(input.childNodes[0], end); + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + } + } else { + input.selectionStart = start; + input.selectionEnd = Math.min(end, input.value.length); + input.focus(); + } + } + } + +}; + +module.exports = ReactInputSelection; + +},{}],37:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactInstanceHandles + * @typechecks static-only + */ + +"use strict"; + +var invariant = require("./invariant"); + +var SEPARATOR = '.'; +var SEPARATOR_LENGTH = SEPARATOR.length; + +/** + * Maximum depth of traversals before we consider the possibility of a bad ID. + */ +var MAX_TREE_DEPTH = 100; + +/** + * Size of the reactRoot ID space. We generate random numbers for React root + * IDs and if there's a collision the events and DOM update system will + * get confused. If we assume 100 React components per page, and a user + * loads 1 page per minute 24/7 for 50 years, with a mount point space of + * 9,999,999 the likelihood of never having a collision is 99.997%. + */ +var GLOBAL_MOUNT_POINT_MAX = 9999999; + +/** + * Creates a DOM ID prefix to use when mounting React components. + * + * @param {number} index A unique integer + * @return {string} React root ID. + * @internal + */ +function getReactRootIDString(index) { + return SEPARATOR + 'r[' + index.toString(36) + ']'; +} + +/** + * Checks if a character in the supplied ID is a separator or the end. + * + * @param {string} id A React DOM ID. + * @param {number} index Index of the character to check. + * @return {boolean} True if the character is a separator or end of the ID. + * @private + */ +function isBoundary(id, index) { + return id.charAt(index) === SEPARATOR || index === id.length; +} + +/** + * Checks if the supplied string is a valid React DOM ID. + * + * @param {string} id A React DOM ID, maybe. + * @return {boolean} True if the string is a valid React DOM ID. + * @private + */ +function isValidID(id) { + return id === '' || ( + id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR + ); +} + +/** + * Checks if the first ID is an ancestor of or equal to the second ID. + * + * @param {string} ancestorID + * @param {string} descendantID + * @return {boolean} True if `ancestorID` is an ancestor of `descendantID`. + * @internal + */ +function isAncestorIDOf(ancestorID, descendantID) { + return ( + descendantID.indexOf(ancestorID) === 0 && + isBoundary(descendantID, ancestorID.length) + ); +} + +/** + * Gets the parent ID of the supplied React DOM ID, `id`. + * + * @param {string} id ID of a component. + * @return {string} ID of the parent, or an empty string. + * @private + */ +function getParentID(id) { + return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : ''; +} + +/** + * Gets the next DOM ID on the tree path from the supplied `ancestorID` to the + * supplied `destinationID`. If they are equal, the ID is returned. + * + * @param {string} ancestorID ID of an ancestor node of `destinationID`. + * @param {string} destinationID ID of the destination node. + * @return {string} Next ID on the path from `ancestorID` to `destinationID`. + * @private + */ +function getNextDescendantID(ancestorID, destinationID) { + invariant( + isValidID(ancestorID) && isValidID(destinationID), + 'getNextDescendantID(%s, %s): Received an invalid React DOM ID.', + ancestorID, + destinationID + ); + invariant( + isAncestorIDOf(ancestorID, destinationID), + 'getNextDescendantID(...): React has made an invalid assumption about ' + + 'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.', + ancestorID, + destinationID + ); + if (ancestorID === destinationID) { + return ancestorID; + } + // Skip over the ancestor and the immediate separator. Traverse until we hit + // another separator or we reach the end of `destinationID`. + var start = ancestorID.length + SEPARATOR_LENGTH; + for (var i = start; i < destinationID.length; i++) { + if (isBoundary(destinationID, i)) { + break; + } + } + return destinationID.substr(0, i); +} + +/** + * Gets the nearest common ancestor ID of two IDs. + * + * Using this ID scheme, the nearest common ancestor ID is the longest common + * prefix of the two IDs that immediately preceded a "marker" in both strings. + * + * @param {string} oneID + * @param {string} twoID + * @return {string} Nearest common ancestor ID, or the empty string if none. + * @private + */ +function getFirstCommonAncestorID(oneID, twoID) { + var minLength = Math.min(oneID.length, twoID.length); + if (minLength === 0) { + return ''; + } + var lastCommonMarkerIndex = 0; + // Use `<=` to traverse until the "EOL" of the shorter string. + for (var i = 0; i <= minLength; i++) { + if (isBoundary(oneID, i) && isBoundary(twoID, i)) { + lastCommonMarkerIndex = i; + } else if (oneID.charAt(i) !== twoID.charAt(i)) { + break; + } + } + var longestCommonID = oneID.substr(0, lastCommonMarkerIndex); + invariant( + isValidID(longestCommonID), + 'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s', + oneID, + twoID, + longestCommonID + ); + return longestCommonID; +} + +/** + * Traverses the parent path between two IDs (either up or down). The IDs must + * not be the same, and there must exist a parent path between them. + * + * @param {?string} start ID at which to start traversal. + * @param {?string} stop ID at which to end traversal. + * @param {function} cb Callback to invoke each ID with. + * @param {?boolean} skipFirst Whether or not to skip the first node. + * @param {?boolean} skipLast Whether or not to skip the last node. + * @private + */ +function traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) { + start = start || ''; + stop = stop || ''; + invariant( + start !== stop, + 'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.', + start + ); + var traverseUp = isAncestorIDOf(stop, start); + invariant( + traverseUp || isAncestorIDOf(start, stop), + 'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' + + 'not have a parent path.', + start, + stop + ); + // Traverse from `start` to `stop` one depth at a time. + var depth = 0; + var traverse = traverseUp ? getParentID : getNextDescendantID; + for (var id = start; /* until break */; id = traverse(id, stop)) { + if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) { + cb(id, traverseUp, arg); + } + if (id === stop) { + // Only break //after// visiting `stop`. + break; + } + invariant( + depth++ < MAX_TREE_DEPTH, + 'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' + + 'traversing the React DOM ID tree. This may be due to malformed IDs: %s', + start, stop + ); + } +} + +/** + * Manages the IDs assigned to DOM representations of React components. This + * uses a specific scheme in order to traverse the DOM efficiently (e.g. in + * order to simulate events). + * + * @internal + */ +var ReactInstanceHandles = { + + separator: SEPARATOR, + + createReactRootID: function() { + return getReactRootIDString( + Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX) + ); + }, + + /** + * Gets the DOM ID of the React component that is the root of the tree that + * contains the React component with the supplied DOM ID. + * + * @param {string} id DOM ID of a React component. + * @return {?string} DOM ID of the React component that is the root. + * @internal + */ + getReactRootIDFromNodeID: function(id) { + var regexResult = /\.r\[[^\]]+\]/.exec(id); + return regexResult && regexResult[0]; + }, + + /** + * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that + * should would receive a `mouseEnter` or `mouseLeave` event. + * + * NOTE: Does not invoke the callback on the nearest common ancestor because + * nothing "entered" or "left" that element. + * + * @param {string} leaveID ID being left. + * @param {string} enterID ID being entered. + * @param {function} cb Callback to invoke on each entered/left ID. + * @param {*} upArg Argument to invoke the callback with on left IDs. + * @param {*} downArg Argument to invoke the callback with on entered IDs. + * @internal + */ + traverseEnterLeave: function(leaveID, enterID, cb, upArg, downArg) { + var ancestorID = getFirstCommonAncestorID(leaveID, enterID); + if (ancestorID !== leaveID) { + traverseParentPath(leaveID, ancestorID, cb, upArg, false, true); + } + if (ancestorID !== enterID) { + traverseParentPath(ancestorID, enterID, cb, downArg, true, false); + } + }, + + /** + * Simulates the traversal of a two-phase, capture/bubble event dispatch. + * + * NOTE: This traversal happens on IDs without touching the DOM. + * + * @param {string} targetID ID of the target node. + * @param {function} cb Callback to invoke. + * @param {*} arg Argument to invoke the callback with. + * @internal + */ + traverseTwoPhase: function(targetID, cb, arg) { + if (targetID) { + traverseParentPath('', targetID, cb, arg, true, false); + traverseParentPath(targetID, '', cb, arg, false, true); + } + }, + + /** + * Exposed for unit testing. + * @private + */ + _getFirstCommonAncestorID: getFirstCommonAncestorID, + + /** + * Exposed for unit testing. + * @private + */ + _getNextDescendantID: getNextDescendantID, + + isAncestorIDOf: isAncestorIDOf, + + SEPARATOR: SEPARATOR + +}; + +module.exports = ReactInstanceHandles; + +},{"./invariant":78}],38:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactMarkupChecksum + */ + +"use strict"; + +var adler32 = require("./adler32"); + +var ReactMarkupChecksum = { + CHECKSUM_ATTR_NAME: 'data-react-checksum', + + /** + * @param {string} markup Markup string + * @return {string} Markup string with checksum attribute attached + */ + addChecksumToMarkup: function(markup) { + var checksum = adler32(markup); + return markup.replace( + '>', + ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '">' + ); + }, + + /** + * @param {string} markup to use + * @param {DOMElement} element root React element + * @returns {boolean} whether or not the markup is the same + */ + canReuseMarkup: function(markup, element) { + var existingChecksum = element.getAttribute( + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + ); + existingChecksum = existingChecksum && parseInt(existingChecksum, 10); + var markupChecksum = adler32(markup); + return markupChecksum === existingChecksum; + } +}; + +module.exports = ReactMarkupChecksum; + +},{"./adler32":62}],39:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactMount + */ + +"use strict"; + +var invariant = require("./invariant"); +var getReactRootElementInContainer = require("./getReactRootElementInContainer"); +var ReactEventEmitter = require("./ReactEventEmitter"); +var ReactInstanceHandles = require("./ReactInstanceHandles"); + +var SEPARATOR = ReactInstanceHandles.SEPARATOR; + +var ATTR_NAME = 'data-reactid'; +var nodeCache = {}; + +var $ = require("./$"); + +/** Mapping from reactRootID to React component instance. */ +var instanceByReactRootID = {}; + +/** Mapping from reactRootID to `container` nodes. */ +var containersByReactRootID = {}; + +if (true) { + /** __DEV__-only mapping from reactRootID to root elements. */ + var rootElementsByReactRootID = {}; +} + +/** + * @param {DOMElement} container DOM element that may contain a React component. + * @return {?string} A "reactRoot" ID, if a React component is rendered. + */ +function getReactRootID(container) { + var rootElement = getReactRootElementInContainer(container); + return rootElement && ReactMount.getID(rootElement); +} + +/** + * Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form + * element can return its control whose name or ID equals ATTR_NAME. All + * DOM nodes support `getAttributeNode` but this can also get called on + * other objects so just return '' if we're given something other than a + * DOM node (such as window). + * + * @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node. + * @return {string} ID of the supplied `domNode`. + */ +function getID(node) { + var id = internalGetID(node); + if (id) { + if (nodeCache.hasOwnProperty(id)) { + var cached = nodeCache[id]; + if (cached !== node) { + invariant( + !isValid(cached, id), + 'ReactMount: Two valid but unequal nodes with the same `%s`: %s', + ATTR_NAME, id + ); + + nodeCache[id] = node; + } + } else { + nodeCache[id] = node; + } + } + + return id; +} + +function internalGetID(node) { + // If node is something like a window, document, or text node, none of + // which support attributes or a .getAttribute method, gracefully return + // the empty string, as if the attribute were missing. + return node && node.getAttribute && node.getAttribute(ATTR_NAME) || ''; +} + +/** + * Sets the React-specific ID of the given node. + * + * @param {DOMElement} node The DOM node whose ID will be set. + * @param {string} id The value of the ID attribute. + */ +function setID(node, id) { + var oldID = internalGetID(node); + if (oldID !== id) { + delete nodeCache[oldID]; + } + node.setAttribute(ATTR_NAME, id); + nodeCache[id] = node; +} + +/** + * Finds the node with the supplied React-generated DOM ID. + * + * @param {string} id A React-generated DOM ID. + * @return {DOMElement} DOM node with the suppled `id`. + * @internal + */ +function getNode(id) { + if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) { + nodeCache[id] = ReactMount.findReactNodeByID(id); + } + return nodeCache[id]; +} + +/** + * A node is "valid" if it is contained by a currently mounted container. + * + * This means that the node does not have to be contained by a document in + * order to be considered valid. + * + * @param {?DOMElement} node The candidate DOM node. + * @param {string} id The expected ID of the node. + * @return {boolean} Whether the node is contained by a mounted container. + */ +function isValid(node, id) { + if (node) { + invariant( + internalGetID(node) === id, + 'ReactMount: Unexpected modification of `%s`', + ATTR_NAME + ); + + var container = ReactMount.findReactContainerForID(id); + if (container && contains(container, node)) { + return true; + } + } + + return false; +} + +function contains(ancestor, descendant) { + if (ancestor.contains) { + // Supported natively in virtually all browsers, but not in jsdom. + return ancestor.contains(descendant); + } + + if (descendant === ancestor) { + return true; + } + + if (descendant.nodeType === 3) { + // If descendant is a text node, start from descendant.parentNode + // instead, so that we can assume all ancestors worth considering are + // element nodes with nodeType === 1. + descendant = descendant.parentNode; + } + + while (descendant && descendant.nodeType === 1) { + if (descendant === ancestor) { + return true; + } + descendant = descendant.parentNode; + } + + return false; +} + +/** + * Causes the cache to forget about one React-specific ID. + * + * @param {string} id The ID to forget. + */ +function purgeID(id) { + delete nodeCache[id]; +} + +/** + * Mounting is the process of initializing a React component by creatings its + * representative DOM elements and inserting them into a supplied `container`. + * Any prior content inside `container` is destroyed in the process. + * + * ReactMount.renderComponent(component, $('container')); + * + * <div id="container"> <-- Supplied `container`. + * <div data-reactid=".r[3]"> <-- Rendered reactRoot of React + * // ... component. + * </div> + * </div> + * + * Inside of `container`, the first element rendered is the "reactRoot". + */ +var ReactMount = { + + /** Time spent generating markup. */ + totalInstantiationTime: 0, + + /** Time spent inserting markup into the DOM. */ + totalInjectionTime: 0, + + /** Whether support for touch events should be initialized. */ + useTouchEvents: false, + + /** + * This is a hook provided to support rendering React components while + * ensuring that the apparent scroll position of its `container` does not + * change. + * + * @param {DOMElement} container The `container` being rendered into. + * @param {function} renderCallback This must be called once to do the render. + */ + scrollMonitor: function(container, renderCallback) { + renderCallback(); + }, + + /** + * Ensures that the top-level event delegation listener is set up. This will + * be invoked some time before the first time any React component is rendered. + * + * @private + */ + prepareTopLevelEvents: function() { + ReactEventEmitter.ensureListening(ReactMount.useTouchEvents); + }, + + /** + * Take a component that's already mounted into the DOM and replace its props + * @param {ReactComponent} prevComponent component instance already in the DOM + * @param {ReactComponent} nextComponent component instance to render + * @param {DOMElement} container container to render into + * @param {?function} callback function triggered on completion + */ + _updateRootComponent: function( + prevComponent, + nextComponent, + container, + callback) { + var nextProps = nextComponent.props; + ReactMount.scrollMonitor(container, function() { + prevComponent.replaceProps(nextProps, callback); + }); + + if (true) { + // Record the root element in case it later gets transplanted. + rootElementsByReactRootID[getReactRootID(container)] = + getReactRootElementInContainer(container); + } + + return prevComponent; + }, + + /** + * Register a component into the instance map and start the events system. + * @param {ReactComponent} nextComponent component instance to render + * @param {DOMElement} container container to render into + * @return {string} reactRoot ID prefix + */ + _registerComponent: function(nextComponent, container) { + ReactMount.prepareTopLevelEvents(); + + var reactRootID = ReactMount.registerContainer(container); + instanceByReactRootID[reactRootID] = nextComponent; + return reactRootID; + }, + + /** + * Render a new component into the DOM. + * @param {ReactComponent} nextComponent component instance to render + * @param {DOMElement} container container to render into + * @param {boolean} shouldReuseMarkup if we should skip the markup insertion + * @return {ReactComponent} nextComponent + */ + _renderNewRootComponent: function( + nextComponent, + container, + shouldReuseMarkup) { + var reactRootID = ReactMount._registerComponent(nextComponent, container); + nextComponent.mountComponentIntoNode( + reactRootID, + container, + shouldReuseMarkup + ); + + if (true) { + // Record the root element in case it later gets transplanted. + rootElementsByReactRootID[reactRootID] = + getReactRootElementInContainer(container); + } + + return nextComponent; + }, + + /** + * Renders a React component into the DOM in the supplied `container`. + * + * If the React component was previously rendered into `container`, this will + * perform an update on it and only mutate the DOM as necessary to reflect the + * latest React component. + * + * @param {ReactComponent} nextComponent Component instance to render. + * @param {DOMElement} container DOM element to render into. + * @param {?function} callback function triggered on completion + * @return {ReactComponent} Component instance rendered in `container`. + */ + renderComponent: function(nextComponent, container, callback) { + var registeredComponent = instanceByReactRootID[getReactRootID(container)]; + + if (registeredComponent) { + if (registeredComponent.constructor === nextComponent.constructor) { + return ReactMount._updateRootComponent( + registeredComponent, + nextComponent, + container, + callback + ); + } else { + ReactMount.unmountAndReleaseReactRootNode(container); + } + } + + var reactRootElement = getReactRootElementInContainer(container); + var containerHasReactMarkup = + reactRootElement && ReactMount.isRenderedByReact(reactRootElement); + + var shouldReuseMarkup = containerHasReactMarkup && !registeredComponent; + + var component = ReactMount._renderNewRootComponent( + nextComponent, + container, + shouldReuseMarkup + ); + callback && callback(); + return component; + }, + + /** + * Constructs a component instance of `constructor` with `initialProps` and + * renders it into the supplied `container`. + * + * @param {function} constructor React component constructor. + * @param {?object} props Initial props of the component instance. + * @param {DOMElement} container DOM element to render into. + * @return {ReactComponent} Component instance rendered in `container`. + */ + constructAndRenderComponent: function(constructor, props, container) { + return ReactMount.renderComponent(constructor(props), container); + }, + + /** + * Constructs a component instance of `constructor` with `initialProps` and + * renders it into a container node identified by supplied `id`. + * + * @param {function} componentConstructor React component constructor + * @param {?object} props Initial props of the component instance. + * @param {string} id ID of the DOM element to render into. + * @return {ReactComponent} Component instance rendered in the container node. + */ + constructAndRenderComponentByID: function(constructor, props, id) { + return ReactMount.constructAndRenderComponent(constructor, props, $(id)); + }, + + /** + * Registers a container node into which React components will be rendered. + * This also creates the "reatRoot" ID that will be assigned to the element + * rendered within. + * + * @param {DOMElement} container DOM element to register as a container. + * @return {string} The "reactRoot" ID of elements rendered within. + */ + registerContainer: function(container) { + var reactRootID = getReactRootID(container); + if (reactRootID) { + // If one exists, make sure it is a valid "reactRoot" ID. + reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID); + } + if (!reactRootID) { + // No valid "reactRoot" ID found, create one. + reactRootID = ReactInstanceHandles.createReactRootID(); + } + containersByReactRootID[reactRootID] = container; + return reactRootID; + }, + + /** + * Unmounts and destroys the React component rendered in the `container`. + * + * @param {DOMElement} container DOM element containing a React component. + * @return {boolean} True if a component was found in and unmounted from + * `container` + */ + unmountAndReleaseReactRootNode: function(container) { + var reactRootID = getReactRootID(container); + var component = instanceByReactRootID[reactRootID]; + if (!component) { + return false; + } + component.unmountComponentFromNode(container); + delete instanceByReactRootID[reactRootID]; + delete containersByReactRootID[reactRootID]; + if (true) { + delete rootElementsByReactRootID[reactRootID]; + } + return true; + }, + + /** + * Finds the container DOM element that contains React component to which the + * supplied DOM `id` belongs. + * + * @param {string} id The ID of an element rendered by a React component. + * @return {?DOMElement} DOM element that contains the `id`. + */ + findReactContainerForID: function(id) { + var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id); + var container = containersByReactRootID[reactRootID]; + + if (true) { + var rootElement = rootElementsByReactRootID[reactRootID]; + if (rootElement && rootElement.parentNode !== container) { + invariant( + // Call internalGetID here because getID calls isValid which calls + // findReactContainerForID (this function). + internalGetID(rootElement) === reactRootID, + 'ReactMount: Root element ID differed from reactRootID.' + ); + + var containerChild = container.firstChild; + if (containerChild && + reactRootID === internalGetID(containerChild)) { + // If the container has a new child with the same ID as the old + // root element, then rootElementsByReactRootID[reactRootID] is + // just stale and needs to be updated. The case that deserves a + // warning is when the container is empty. + rootElementsByReactRootID[reactRootID] = containerChild; + } else { + console.warn( + 'ReactMount: Root element has been removed from its original ' + + 'container. New container:', rootElement.parentNode + ); + } + } + } + + return container; + }, + + /** + * Finds an element rendered by React with the supplied ID. + * + * @param {string} id ID of a DOM node in the React component. + * @return {DOMElement} Root DOM node of the React component. + */ + findReactNodeByID: function(id) { + var reactRoot = ReactMount.findReactContainerForID(id); + return ReactMount.findComponentRoot(reactRoot, id); + }, + + /** + * True if the supplied `node` is rendered by React. + * + * @param {*} node DOM Element to check. + * @return {boolean} True if the DOM Element appears to be rendered by React. + * @internal + */ + isRenderedByReact: function(node) { + if (node.nodeType !== 1) { + // Not a DOMElement, therefore not a React component + return false; + } + var id = ReactMount.getID(node); + return id ? id.charAt(0) === SEPARATOR : false; + }, + + /** + * Traverses up the ancestors of the supplied node to find a node that is a + * DOM representation of a React component. + * + * @param {*} node + * @return {?DOMEventTarget} + * @internal + */ + getFirstReactDOM: function(node) { + var current = node; + while (current && current.parentNode !== current) { + if (ReactMount.isRenderedByReact(current)) { + return current; + } + current = current.parentNode; + } + return null; + }, + + /** + * Finds a node with the supplied `id` inside of the supplied `ancestorNode`. + * Exploits the ID naming scheme to perform the search quickly. + * + * @param {DOMEventTarget} ancestorNode Search from this root. + * @pararm {string} id ID of the DOM representation of the component. + * @return {DOMEventTarget} DOM node with the supplied `id`. + * @internal + */ + findComponentRoot: function(ancestorNode, id) { + var firstChildren = [ancestorNode.firstChild]; + var childIndex = 0; + + while (childIndex < firstChildren.length) { + var child = firstChildren[childIndex++]; + while (child) { + var childID = ReactMount.getID(child); + if (childID) { + if (id === childID) { + return child; + } else if (ReactInstanceHandles.isAncestorIDOf(childID, id)) { + // If we find a child whose ID is an ancestor of the given ID, + // then we can be sure that we only want to search the subtree + // rooted at this child, so we can throw out the rest of the + // search state. + firstChildren.length = childIndex = 0; + firstChildren.push(child.firstChild); + break; + } else { + // TODO This should not be necessary if the ID hierarchy is + // correct, but is occasionally necessary if the DOM has been + // modified in unexpected ways. + firstChildren.push(child.firstChild); + } + } else { + // If this child had no ID, then there's a chance that it was + // injected automatically by the browser, as when a `<table>` + // element sprouts an extra `<tbody>` child as a side effect of + // `.innerHTML` parsing. Optimistically continue down this + // branch, but not before examining the other siblings. + firstChildren.push(child.firstChild); + } + child = child.nextSibling; + } + } + + if (true) { + console.error( + 'Error while invoking `findComponentRoot` with the following ' + + 'ancestor node:', + ancestorNode + ); + } + invariant( + false, + 'findComponentRoot(..., %s): Unable to find element. This probably ' + + 'means the DOM was unexpectedly mutated (e.g. by the browser).', + id, + ReactMount.getID(ancestorNode) + ); + }, + + + /** + * React ID utilities. + */ + + ATTR_NAME: ATTR_NAME, + + getID: getID, + + setID: setID, + + getNode: getNode, + + purgeID: purgeID, + + injection: {} +}; + +module.exports = ReactMount; + +})() +},{"./$":1,"./ReactEventEmitter":34,"./ReactInstanceHandles":37,"./getReactRootElementInContainer":73,"./invariant":78}],40:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactMultiChild + */ + +"use strict"; + +var ReactComponent = require("./ReactComponent"); + +/** + * Given a `curChild` and `newChild`, determines if `curChild` should be managed + * as it exists, as opposed to being destroyed and/or replaced. + * @param {?ReactComponent} curChild + * @param {?ReactComponent} newChild + * @return {!boolean} Whether or not `curChild` should be updated with + * `newChild`'s props + */ +function shouldManageExisting(curChild, newChild) { + return curChild && newChild && curChild.constructor === newChild.constructor; +} + +/** + * `ReactMultiChild` provides common functionality for components that have + * multiple children. Standard `ReactCompositeComponent`s do not currently have + * multiple children. `ReactNativeComponent`s do, however. Other specially + * reconciled components will also have multiple children. Contains three + * internally used properties that are used to keep track of state throughout + * the `updateMultiChild` process. + * + * @class ReactMultiChild + */ + +/** + * @lends `ReactMultiChildMixin`. + */ +var ReactMultiChildMixin = { + + enqueueMarkupAt: function(markup, insertAt) { + this.domOperations = this.domOperations || []; + this.domOperations.push({insertMarkup: markup, finalIndex: insertAt}); + }, + + enqueueMove: function(originalIndex, finalIndex) { + this.domOperations = this.domOperations || []; + this.domOperations.push({moveFrom: originalIndex, finalIndex: finalIndex}); + }, + + enqueueUnmountChildByName: function(name, removeChild) { + if (ReactComponent.isValidComponent(removeChild)) { + this.domOperations = this.domOperations || []; + this.domOperations.push({removeAt: removeChild._domIndex}); + removeChild.unmountComponent && removeChild.unmountComponent(); + delete this._renderedChildren[name]; + } + }, + + /** + * Process any pending DOM operations that have been accumulated when updating + * the UI. By default, we execute the injected `DOMIDOperations` module's + * `manageChildrenByParentID` which does executes the DOM operations without + * any animation. It can be used as a reference implementation for special + * animation based implementations. + * + * @abstract + */ + processChildDOMOperationsQueue: function() { + if (this.domOperations) { + ReactComponent.DOMIDOperations + .manageChildrenByParentID(this._rootNodeID, this.domOperations); + this.domOperations = null; + } + }, + + unmountMultiChild: function() { + var renderedChildren = this._renderedChildren; + for (var name in renderedChildren) { + if (renderedChildren.hasOwnProperty(name) && renderedChildren[name]) { + var renderedChild = renderedChildren[name]; + renderedChild.unmountComponent && renderedChild.unmountComponent(); + } + } + this._renderedChildren = null; + }, + + /** + * Generates markup for a component that holds multiple children. #todo: Allow + * all `ReactMultiChildMixin`s to support having arrays of children without a + * container node. This current implementation may assume that children exist + * at domIndices [0, parentNode.length]. + * + * Has side effects of (likely) causing events to be registered. Also, every + * component instance may only be rendered once. + * + * @param {?Object} children Flattened children object. + * @return {!String} The rendered markup. + */ + mountMultiChild: function(children, transaction) { + var accum = ''; + var index = 0; + for (var name in children) { + var child = children[name]; + if (children.hasOwnProperty(name) && child) { + accum += child.mountComponent( + this._rootNodeID + '.' + name, + transaction + ); + child._domIndex = index; + index++; + } + } + this._renderedChildren = children; // children are in just the right form! + this.domOperations = null; + return accum; + }, + + /** + * Reconciles new children with old children in three phases. + * + * - Adds new content while updating existing children that should remain. + * - Remove children that are no longer present in the next children. + * - As a very last step, moves existing dom structures around. + * - (Comment 1) `curChildrenDOMIndex` is the largest index of the current + * rendered children that appears in the next children and did not need to + * be "moved". + * - (Comment 2) This is the key insight. If any non-removed child's previous + * index is less than `curChildrenDOMIndex` it must be moved. + * + * @param {?Object} children Flattened children object. + */ + updateMultiChild: function(nextChildren, transaction) { + if (!nextChildren && !this._renderedChildren) { + return; + } else if (nextChildren && !this._renderedChildren) { + this._renderedChildren = {}; // lazily allocate backing store with nothing + } else if (!nextChildren && this._renderedChildren) { + nextChildren = {}; + } + var rootDomIdDot = this._rootNodeID + '.'; + var markupBuffer = null; // Accumulate adjacent new children markup. + var numPendingInsert = 0; // How many root nodes are waiting in markupBuffer + var loopDomIndex = 0; // Index of loop through new children. + var curChildrenDOMIndex = 0; // See (Comment 1) + for (var name in nextChildren) { + if (!nextChildren.hasOwnProperty(name)) {continue;} + var curChild = this._renderedChildren[name]; + var nextChild = nextChildren[name]; + if (shouldManageExisting(curChild, nextChild)) { + if (markupBuffer) { + this.enqueueMarkupAt(markupBuffer, loopDomIndex - numPendingInsert); + markupBuffer = null; + } + numPendingInsert = 0; + if (curChild._domIndex < curChildrenDOMIndex) { // (Comment 2) + this.enqueueMove(curChild._domIndex, loopDomIndex); + } + curChildrenDOMIndex = Math.max(curChild._domIndex, curChildrenDOMIndex); + curChild.receiveProps(nextChild.props, transaction); + curChild._domIndex = loopDomIndex; + } else { + if (curChild) { // !shouldUpdate && curChild => delete + this.enqueueUnmountChildByName(name, curChild); + curChildrenDOMIndex = + Math.max(curChild._domIndex, curChildrenDOMIndex); + } + if (nextChild) { // !shouldUpdate && nextChild => insert + this._renderedChildren[name] = nextChild; + var nextMarkup = + nextChild.mountComponent(rootDomIdDot + name, transaction); + markupBuffer = markupBuffer ? markupBuffer + nextMarkup : nextMarkup; + numPendingInsert++; + nextChild._domIndex = loopDomIndex; + } + } + loopDomIndex = nextChild ? loopDomIndex + 1 : loopDomIndex; + } + if (markupBuffer) { + this.enqueueMarkupAt(markupBuffer, loopDomIndex - numPendingInsert); + } + for (var childName in this._renderedChildren) { // from other direction + if (!this._renderedChildren.hasOwnProperty(childName)) { continue; } + var child = this._renderedChildren[childName]; + if (child && !nextChildren[childName]) { + this.enqueueUnmountChildByName(childName, child); + } + } + this.processChildDOMOperationsQueue(); + } +}; + +var ReactMultiChild = { + Mixin: ReactMultiChildMixin +}; + +module.exports = ReactMultiChild; + +})() +},{"./ReactComponent":23}],41:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactNativeComponent + * @typechecks static-only + */ + +"use strict"; + +var CSSPropertyOperations = require("./CSSPropertyOperations"); +var DOMProperty = require("./DOMProperty"); +var DOMPropertyOperations = require("./DOMPropertyOperations"); +var ReactComponent = require("./ReactComponent"); +var ReactEventEmitter = require("./ReactEventEmitter"); +var ReactMultiChild = require("./ReactMultiChild"); +var ReactMount = require("./ReactMount"); + +var escapeTextForBrowser = require("./escapeTextForBrowser"); +var flattenChildren = require("./flattenChildren"); +var invariant = require("./invariant"); +var keyOf = require("./keyOf"); +var merge = require("./merge"); +var mixInto = require("./mixInto"); + +var putListener = ReactEventEmitter.putListener; +var deleteListener = ReactEventEmitter.deleteListener; +var registrationNames = ReactEventEmitter.registrationNames; + +// For quickly matching children type, to test if can be treated as content. +var CONTENT_TYPES = {'string': true, 'number': true}; + +var DANGEROUSLY_SET_INNER_HTML = keyOf({dangerouslySetInnerHTML: null}); +var STYLE = keyOf({style: null}); + +/** + * @param {?object} props + */ +function assertValidProps(props) { + if (!props) { + return; + } + // Note the use of `==` which checks for null or undefined. + invariant( + props.children == null || props.dangerouslySetInnerHTML == null, + 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.' + ); + invariant( + props.style == null || typeof props.style === 'object', + 'The `style` prop expects a mapping from style properties to values, ' + + 'not a string.' + ); +} + +/** + * @constructor ReactNativeComponent + * @extends ReactComponent + * @extends ReactMultiChild + */ +function ReactNativeComponent(tag, omitClose) { + this._tagOpen = '<' + tag; + this._tagClose = omitClose ? '' : '</' + tag + '>'; + this.tagName = tag.toUpperCase(); +} + +ReactNativeComponent.Mixin = { + + /** + * Generates root tag markup then recurses. This method has side effects and + * is not idempotent. + * + * @internal + * @param {string} rootID The root DOM ID for this node. + * @param {ReactReconcileTransaction} transaction + * @return {string} The computed markup. + */ + mountComponent: function(rootID, transaction) { + ReactComponent.Mixin.mountComponent.call(this, rootID, transaction); + assertValidProps(this.props); + return ( + this._createOpenTagMarkup() + + this._createContentMarkup(transaction) + + this._tagClose + ); + }, + + /** + * Creates markup for the open tag and all attributes. + * + * This method has side effects because events get registered. + * + * Iterating over object properties is faster than iterating over arrays. + * @see http://jsperf.com/obj-vs-arr-iteration + * + * @private + * @return {string} Markup of opening tag. + */ + _createOpenTagMarkup: function() { + var props = this.props; + var ret = this._tagOpen; + + for (var propKey in props) { + if (!props.hasOwnProperty(propKey)) { + continue; + } + var propValue = props[propKey]; + if (propValue == null) { + continue; + } + if (registrationNames[propKey]) { + putListener(this._rootNodeID, propKey, propValue); + } else { + if (propKey === STYLE) { + if (propValue) { + propValue = props.style = merge(props.style); + } + propValue = CSSPropertyOperations.createMarkupForStyles(propValue); + } + var markup = + DOMPropertyOperations.createMarkupForProperty(propKey, propValue); + if (markup) { + ret += ' ' + markup; + } + } + } + + var escapedID = escapeTextForBrowser(this._rootNodeID); + return ret + ' ' + ReactMount.ATTR_NAME + '="' + escapedID + '">'; + }, + + /** + * Creates markup for the content between the tags. + * + * @private + * @param {ReactReconcileTransaction} transaction + * @return {string} Content markup. + */ + _createContentMarkup: function(transaction) { + // Intentional use of != to avoid catching zero/false. + var innerHTML = this.props.dangerouslySetInnerHTML; + if (innerHTML != null) { + if (innerHTML.__html != null) { + return innerHTML.__html; + } + } else { + var contentToUse = + CONTENT_TYPES[typeof this.props.children] ? this.props.children : null; + var childrenToUse = contentToUse != null ? null : this.props.children; + if (contentToUse != null) { + return escapeTextForBrowser(contentToUse); + } else if (childrenToUse != null) { + return this.mountMultiChild( + flattenChildren(childrenToUse), + transaction + ); + } + } + return ''; + }, + + receiveProps: function(nextProps, transaction) { + assertValidProps(nextProps); + ReactComponent.Mixin.receiveProps.call(this, nextProps, transaction); + }, + + /** + * Updates a native DOM component after it has already been allocated and + * attached to the DOM. Reconciles the root DOM node, then recurses. + * + * @param {ReactReconcileTransaction} transaction + * @param {object} prevProps + * @internal + * @overridable + */ + updateComponent: function(transaction, prevProps) { + ReactComponent.Mixin.updateComponent.call(this, transaction, prevProps); + this._updateDOMProperties(prevProps); + this._updateDOMChildren(prevProps, transaction); + }, + + /** + * Reconciles the properties by detecting differences in property values and + * updating the DOM as necessary. This function is probably the single most + * critical path for performance optimization. + * + * TODO: Benchmark whether checking for changed values in memory actually + * improves performance (especially statically positioned elements). + * TODO: Benchmark the effects of putting this at the top since 99% of props + * do not change for a given reconciliation. + * TODO: Benchmark areas that can be improved with caching. + * + * @private + * @param {object} lastProps + */ + _updateDOMProperties: function(lastProps) { + var nextProps = this.props; + var propKey; + var styleName; + var styleUpdates; + for (propKey in lastProps) { + if (nextProps.hasOwnProperty(propKey) || + !lastProps.hasOwnProperty(propKey)) { + continue; + } + if (propKey === STYLE) { + var lastStyle = lastProps[propKey]; + for (styleName in lastStyle) { + if (lastStyle.hasOwnProperty(styleName)) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = ''; + } + } + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + // http://jsperf.com/emptying-speed + ReactComponent.DOMIDOperations.updateTextContentByID( + this._rootNodeID, + '' + ); + } else if (registrationNames[propKey]) { + deleteListener(this._rootNodeID, propKey); + } else { + ReactComponent.DOMIDOperations.deletePropertyByID( + this._rootNodeID, + propKey + ); + } + } + for (propKey in nextProps) { + var nextProp = nextProps[propKey]; + var lastProp = lastProps[propKey]; + if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) { + continue; + } + if (propKey === STYLE) { + if (nextProp) { + nextProp = nextProps.style = merge(nextProp); + } + if (lastProp) { + // Unset styles on `lastProp` but not on `nextProp`. + for (styleName in lastProp) { + if (lastProp.hasOwnProperty(styleName) && + !nextProp.hasOwnProperty(styleName)) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = ''; + } + } + // Update styles that changed since `lastProp`. + for (styleName in nextProp) { + if (nextProp.hasOwnProperty(styleName) && + lastProp[styleName] !== nextProp[styleName]) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = nextProp[styleName]; + } + } + } else { + // Relies on `updateStylesByID` not mutating `styleUpdates`. + styleUpdates = nextProp; + } + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var lastHtml = lastProp && lastProp.__html; + var nextHtml = nextProp && nextProp.__html; + if (lastHtml !== nextHtml) { + ReactComponent.DOMIDOperations.updateInnerHTMLByID( + this._rootNodeID, + nextProp + ); + } + } else if (registrationNames[propKey]) { + putListener(this._rootNodeID, propKey, nextProp); + } else if ( + DOMProperty.isStandardName[propKey] || + DOMProperty.isCustomAttribute(propKey)) { + ReactComponent.DOMIDOperations.updatePropertyByID( + this._rootNodeID, + propKey, + nextProp + ); + } + } + if (styleUpdates) { + ReactComponent.DOMIDOperations.updateStylesByID( + this._rootNodeID, + styleUpdates + ); + } + }, + + /** + * Reconciles the children with the various properties that affect the + * children content. + * + * @param {object} lastProps + * @param {ReactReconcileTransaction} transaction + */ + _updateDOMChildren: function(lastProps, transaction) { + var nextProps = this.props; + + var lastUsedContent = + CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null; + var contentToUse = + CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null; + + // Note the use of `!=` which checks for null or undefined. + + var lastUsedChildren = + lastUsedContent != null ? null : lastProps.children; + var childrenToUse = contentToUse != null ? null : nextProps.children; + + if (contentToUse != null) { + var childrenRemoved = lastUsedChildren != null && childrenToUse == null; + if (childrenRemoved) { + this.updateMultiChild(null, transaction); + } + if (lastUsedContent !== contentToUse) { + ReactComponent.DOMIDOperations.updateTextContentByID( + this._rootNodeID, + '' + contentToUse + ); + } + } else { + var contentRemoved = lastUsedContent != null && contentToUse == null; + if (contentRemoved) { + ReactComponent.DOMIDOperations.updateTextContentByID( + this._rootNodeID, + '' + ); + } + this.updateMultiChild(flattenChildren(nextProps.children), transaction); + } + }, + + /** + * Destroys all event registrations for this instance. Does not remove from + * the DOM. That must be done by the parent. + * + * @internal + */ + unmountComponent: function() { + ReactEventEmitter.deleteAllListeners(this._rootNodeID); + ReactComponent.Mixin.unmountComponent.call(this); + this.unmountMultiChild(); + } + +}; + +mixInto(ReactNativeComponent, ReactComponent.Mixin); +mixInto(ReactNativeComponent, ReactNativeComponent.Mixin); +mixInto(ReactNativeComponent, ReactMultiChild.Mixin); + +module.exports = ReactNativeComponent; + +},{"./CSSPropertyOperations":3,"./DOMProperty":7,"./DOMPropertyOperations":8,"./ReactComponent":23,"./ReactEventEmitter":34,"./ReactMount":39,"./ReactMultiChild":40,"./escapeTextForBrowser":67,"./flattenChildren":69,"./invariant":78,"./keyOf":82,"./merge":84,"./mixInto":87}],42:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactOnDOMReady + */ + +"use strict"; + +var PooledClass = require("./PooledClass"); + +var mixInto = require("./mixInto"); + +/** + * A specialized pseudo-event module to help keep track of components waiting to + * be notified when their DOM representations are available for use. + * + * This implements `PooledClass`, so you should never need to instantiate this. + * Instead, use `ReactOnDOMReady.getPooled()`. + * + * @param {?array<function>} initialCollection + * @class ReactOnDOMReady + * @implements PooledClass + * @internal + */ +function ReactOnDOMReady(initialCollection) { + this._queue = initialCollection || null; +} + +mixInto(ReactOnDOMReady, { + + /** + * Enqueues a callback to be invoked when `notifyAll` is invoked. This is used + * to enqueue calls to `componentDidMount` and `componentDidUpdate`. + * + * @param {ReactComponent} component Component being rendered. + * @param {function(DOMElement)} callback Invoked when `notifyAll` is invoked. + * @internal + */ + enqueue: function(component, callback) { + this._queue = this._queue || []; + this._queue.push({component: component, callback: callback}); + }, + + /** + * Invokes all enqueued callbacks and clears the queue. This is invoked after + * the DOM representation of a component has been created or updated. + * + * @internal + */ + notifyAll: function() { + var queue = this._queue; + if (queue) { + this._queue = null; + for (var i = 0, l = queue.length; i < l; i++) { + var component = queue[i].component; + var callback = queue[i].callback; + callback.call(component, component.getDOMNode()); + } + queue.length = 0; + } + }, + + /** + * Resets the internal queue. + * + * @internal + */ + reset: function() { + this._queue = null; + }, + + /** + * `PooledClass` looks for this. + */ + destructor: function() { + this.reset(); + } + +}); + +PooledClass.addPoolingTo(ReactOnDOMReady); + +module.exports = ReactOnDOMReady; + +},{"./PooledClass":21,"./mixInto":87}],43:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactOwner + */ + +"use strict"; + +var invariant = require("./invariant"); + +/** + * ReactOwners are capable of storing references to owned components. + * + * All components are capable of //being// referenced by owner components, but + * only ReactOwner components are capable of //referencing// owned components. + * The named reference is known as a "ref". + * + * Refs are available when mounted and updated during reconciliation. + * + * var MyComponent = React.createClass({ + * render: function() { + * return ( + * <div onClick={this.handleClick}> + * <CustomComponent ref="custom" /> + * </div> + * ); + * }, + * handleClick: function() { + * this.refs.custom.handleClick(); + * }, + * componentDidMount: function() { + * this.refs.custom.initialize(); + * } + * }); + * + * Refs should rarely be used. When refs are used, they should only be done to + * control data that is not handled by React's data flow. + * + * @class ReactOwner + */ +var ReactOwner = { + + /** + * @param {?object} object + * @return {boolean} True if `object` is a valid owner. + * @final + */ + isValidOwner: function(object) { + return !!( + object && + typeof object.attachRef === 'function' && + typeof object.detachRef === 'function' + ); + }, + + /** + * Adds a component by ref to an owner component. + * + * @param {ReactComponent} component Component to reference. + * @param {string} ref Name by which to refer to the component. + * @param {ReactOwner} owner Component on which to record the ref. + * @final + * @internal + */ + addComponentAsRefTo: function(component, ref, owner) { + invariant( + ReactOwner.isValidOwner(owner), + 'addComponentAsRefTo(...): Only a ReactOwner can have refs.' + ); + owner.attachRef(ref, component); + }, + + /** + * Removes a component by ref from an owner component. + * + * @param {ReactComponent} component Component to dereference. + * @param {string} ref Name of the ref to remove. + * @param {ReactOwner} owner Component on which the ref is recorded. + * @final + * @internal + */ + removeComponentAsRefFrom: function(component, ref, owner) { + invariant( + ReactOwner.isValidOwner(owner), + 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs.' + ); + // Check that `component` is still the current ref because we do not want to + // detach the ref if another component stole it. + if (owner.refs[ref] === component) { + owner.detachRef(ref); + } + }, + + /** + * A ReactComponent must mix this in to have refs. + * + * @lends {ReactOwner.prototype} + */ + Mixin: { + + /** + * Lazily allocates the refs object and stores `component` as `ref`. + * + * @param {string} ref Reference name. + * @param {component} component Component to store as `ref`. + * @final + * @private + */ + attachRef: function(ref, component) { + invariant( + component.isOwnedBy(this), + 'attachRef(%s, ...): Only a component\'s owner can store a ref to it.', + ref + ); + var refs = this.refs || (this.refs = {}); + refs[ref] = component; + }, + + /** + * Detaches a reference name. + * + * @param {string} ref Name to dereference. + * @final + * @private + */ + detachRef: function(ref) { + delete this.refs[ref]; + } + + } + +}; + +module.exports = ReactOwner; + +},{"./invariant":78}],44:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactPropTransferer + */ + +"use strict"; + +var emptyFunction = require("./emptyFunction"); +var joinClasses = require("./joinClasses"); +var merge = require("./merge"); + +/** + * Creates a transfer strategy that will merge prop values using the supplied + * `mergeStrategy`. If a prop was previously unset, this just sets it. + * + * @param {function} mergeStrategy + * @return {function} + */ +function createTransferStrategy(mergeStrategy) { + return function(props, key, value) { + if (!props.hasOwnProperty(key)) { + props[key] = value; + } else { + props[key] = mergeStrategy(props[key], value); + } + }; +} + +/** + * Transfer strategies dictate how props are transferred by `transferPropsTo`. + */ +var TransferStrategies = { + /** + * Never transfer `children`. + */ + children: emptyFunction, + /** + * Transfer the `className` prop by merging them. + */ + className: createTransferStrategy(joinClasses), + /** + * Never transfer the `ref` prop. + */ + ref: emptyFunction, + /** + * Transfer the `style` prop (which is an object) by merging them. + */ + style: createTransferStrategy(merge) +}; + +/** + * ReactPropTransferer are capable of transferring props to another component + * using a `transferPropsTo` method. + * + * @class ReactPropTransferer + */ +var ReactPropTransferer = { + + TransferStrategies: TransferStrategies, + + /** + * @lends {ReactPropTransferer.prototype} + */ + Mixin: { + + /** + * Transfer props from this component to a target component. + * + * Props that do not have an explicit transfer strategy will be transferred + * only if the target component does not already have the prop set. + * + * This is usually used to pass down props to a returned root component. + * + * @param {ReactComponent} component Component receiving the properties. + * @return {ReactComponent} The supplied `component`. + * @final + * @protected + */ + transferPropsTo: function(component) { + var props = {}; + for (var thatKey in component.props) { + if (component.props.hasOwnProperty(thatKey)) { + props[thatKey] = component.props[thatKey]; + } + } + for (var thisKey in this.props) { + if (!this.props.hasOwnProperty(thisKey)) { + continue; + } + var transferStrategy = TransferStrategies[thisKey]; + if (transferStrategy) { + transferStrategy(props, thisKey, this.props[thisKey]); + } else if (!props.hasOwnProperty(thisKey)) { + props[thisKey] = this.props[thisKey]; + } + } + component.props = props; + return component; + } + + } + +}; + +module.exports = ReactPropTransferer; + +},{"./emptyFunction":66,"./joinClasses":80,"./merge":84}],45:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactPropTypes + */ + +"use strict"; + +var createObjectFrom = require("./createObjectFrom"); +var invariant = require("./invariant"); + +/** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var Props = require('ReactPropTypes'); + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * invariant( + * propValue == null || + * typeof propValue === string || + * propValue instanceof URI, + * 'Invalid `%s` supplied to `%s`, expected string or URI.', + * propName, + * componentName + * ); + * } + * }, + * render: function() { ... } + * }); + * + * @internal + */ +var Props = { + + array: createPrimitiveTypeChecker('array'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + + oneOf: createEnumTypeChecker, + + instanceOf: createInstanceTypeChecker + +}; + +var ANONYMOUS = '<<anonymous>>'; + +function createPrimitiveTypeChecker(expectedType) { + function validatePrimitiveType(propValue, propName, componentName) { + var propType = typeof propValue; + if (propType === 'object' && Array.isArray(propValue)) { + propType = 'array'; + } + invariant( + propType === expectedType, + 'Invalid prop `%s` of type `%s` supplied to `%s`, expected `%s`.', + propName, + propType, + componentName, + expectedType + ); + } + return createChainableTypeChecker(validatePrimitiveType); +} + +function createEnumTypeChecker(expectedValues) { + var expectedEnum = createObjectFrom(expectedValues); + function validateEnumType(propValue, propName, componentName) { + invariant( + expectedEnum[propValue], + 'Invalid prop `%s` supplied to `%s`, expected one of %s.', + propName, + componentName, + JSON.stringify(Object.keys(expectedEnum)) + ); + } + return createChainableTypeChecker(validateEnumType); +} + +function createInstanceTypeChecker(expectedClass) { + function validateInstanceType(propValue, propName, componentName) { + invariant( + propValue instanceof expectedClass, + 'Invalid prop `%s` supplied to `%s`, expected instance of `%s`.', + propName, + componentName, + expectedClass.name || ANONYMOUS + ); + } + return createChainableTypeChecker(validateInstanceType); +} + +function createChainableTypeChecker(validate) { + function createTypeChecker(isRequired) { + function checkType(props, propName, componentName) { + var propValue = props[propName]; + if (propValue != null) { + // Only validate if there is a value to check. + validate(propValue, propName, componentName || ANONYMOUS); + } else { + invariant( + !isRequired, + 'Required prop `%s` was not specified in `%s`.', + propName, + componentName || ANONYMOUS + ); + } + } + if (!isRequired) { + checkType.isRequired = createTypeChecker(true); + } + return checkType; + } + return createTypeChecker(false); +} + +module.exports = Props; + +},{"./createObjectFrom":64,"./invariant":78}],46:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactReconcileTransaction + * @typechecks static-only + */ + +"use strict"; + +var ExecutionEnvironment = require("./ExecutionEnvironment"); +var PooledClass = require("./PooledClass"); +var ReactEventEmitter = require("./ReactEventEmitter"); +var ReactInputSelection = require("./ReactInputSelection"); +var ReactOnDOMReady = require("./ReactOnDOMReady"); +var Transaction = require("./Transaction"); + +var mixInto = require("./mixInto"); + +/** + * Ensures that, when possible, the selection range (currently selected text + * input) is not disturbed by performing the transaction. + */ +var SELECTION_RESTORATION = { + /** + * @return {Selection} Selection information. + */ + initialize: ReactInputSelection.getSelectionInformation, + /** + * @param {Selection} sel Selection information returned from `initialize`. + */ + close: ReactInputSelection.restoreSelection +}; + +/** + * Suppresses events (blur/focus) that could be inadvertently dispatched due to + * high level DOM manipulations (like temporarily removing a text input from the + * DOM). + */ +var EVENT_SUPPRESSION = { + /** + * @return {boolean} The enabled status of `ReactEventEmitter` before the + * reconciliation. + */ + initialize: function() { + var currentlyEnabled = ReactEventEmitter.isEnabled(); + ReactEventEmitter.setEnabled(false); + return currentlyEnabled; + }, + + /** + * @param {boolean} previouslyEnabled Enabled status of `ReactEventEmitter` + * before the reconciliation occured. `close` restores the previous value. + */ + close: function(previouslyEnabled) { + ReactEventEmitter.setEnabled(previouslyEnabled); + } +}; + +/** + * Provides a `ReactOnDOMReady` queue for collecting `onDOMReady` callbacks + * during the performing of the transaction. + */ +var ON_DOM_READY_QUEUEING = { + /** + * Initializes the internal `onDOMReady` queue. + */ + initialize: function() { + this.reactOnDOMReady.reset(); + }, + + /** + * After DOM is flushed, invoke all registered `onDOMReady` callbacks. + */ + close: function() { + this.reactOnDOMReady.notifyAll(); + } +}; + +/** + * Executed within the scope of the `Transaction` instance. Consider these as + * being member methods, but with an implied ordering while being isolated from + * each other. + */ +var TRANSACTION_WRAPPERS = [ + SELECTION_RESTORATION, + EVENT_SUPPRESSION, + ON_DOM_READY_QUEUEING +]; + +/** + * Currently: + * - The order that these are listed in the transaction is critical: + * - Suppresses events. + * - Restores selection range. + * + * Future: + * - Restore document/overflow scroll positions that were unintentionally + * modified via DOM insertions above the top viewport boundary. + * - Implement/integrate with customized constraint based layout system and keep + * track of which dimensions must be remeasured. + * + * @class ReactReconcileTransaction + */ +function ReactReconcileTransaction() { + this.reinitializeTransaction(); + this.reactOnDOMReady = ReactOnDOMReady.getPooled(null); +} + +var Mixin = { + /** + * @see Transaction + * @abstract + * @final + * @return {array<object>} List of operation wrap proceedures. + * TODO: convert to array<TransactionWrapper> + */ + getTransactionWrappers: function() { + if (ExecutionEnvironment.canUseDOM) { + return TRANSACTION_WRAPPERS; + } else { + return []; + } + }, + + /** + * @return {object} The queue to collect `onDOMReady` callbacks with. + * TODO: convert to ReactOnDOMReady + */ + getReactOnDOMReady: function() { + return this.reactOnDOMReady; + }, + + /** + * `PooledClass` looks for this, and will invoke this before allowing this + * instance to be resused. + */ + destructor: function() { + ReactOnDOMReady.release(this.reactOnDOMReady); + this.reactOnDOMReady = null; + } +}; + + +mixInto(ReactReconcileTransaction, Transaction.Mixin); +mixInto(ReactReconcileTransaction, Mixin); + +PooledClass.addPoolingTo(ReactReconcileTransaction); + +module.exports = ReactReconcileTransaction; + +},{"./ExecutionEnvironment":19,"./PooledClass":21,"./ReactEventEmitter":34,"./ReactInputSelection":36,"./ReactOnDOMReady":42,"./Transaction":59,"./mixInto":87}],47:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @typechecks static-only + * @providesModule ReactServerRendering + */ +"use strict"; + +var ReactMarkupChecksum = require("./ReactMarkupChecksum"); +var ReactReconcileTransaction = require("./ReactReconcileTransaction"); +var ReactInstanceHandles = require("./ReactInstanceHandles"); + +/** + * @param {object} component + * @param {function} callback + */ +function renderComponentToString(component, callback) { + // We use a callback API to keep the API async in case in the future we ever + // need it, but in reality this is a synchronous operation. + var id = ReactInstanceHandles.createReactRootID(); + var transaction = ReactReconcileTransaction.getPooled(); + transaction.reinitializeTransaction(); + try { + transaction.perform(function() { + var markup = component.mountComponent(id, transaction); + markup = ReactMarkupChecksum.addChecksumToMarkup(markup); + callback(markup); + }, null); + } finally { + ReactReconcileTransaction.release(transaction); + } +} + +module.exports = { + renderComponentToString: renderComponentToString +}; + +},{"./ReactInstanceHandles":37,"./ReactMarkupChecksum":38,"./ReactReconcileTransaction":46}],48:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactTextComponent + * @typechecks static-only + */ + +"use strict"; + +var ReactComponent = require("./ReactComponent"); +var ReactMount = require("./ReactMount"); + +var escapeTextForBrowser = require("./escapeTextForBrowser"); +var mixInto = require("./mixInto"); + +/** + * Text nodes violate a couple assumptions that React makes about components: + * + * - When mounting text into the DOM, adjacent text nodes are merged. + * - Text nodes cannot be assigned a React root ID. + * + * This component is used to wrap strings in elements so that they can undergo + * the same reconciliation that is applied to elements. + * + * TODO: Investigate representing React components in the DOM with text nodes. + * + * @class ReactTextComponent + * @extends ReactComponent + * @internal + */ +var ReactTextComponent = function(initialText) { + this.construct({text: initialText}); +}; + +mixInto(ReactTextComponent, ReactComponent.Mixin); +mixInto(ReactTextComponent, { + + /** + * Creates the markup for this text node. This node is not intended to have + * any features besides containing text content. + * + * @param {string} rootID DOM ID of the root node. + * @return {string} Markup for this text node. + * @internal + */ + mountComponent: function(rootID) { + ReactComponent.Mixin.mountComponent.call(this, rootID); + return ( + '<span ' + ReactMount.ATTR_NAME + '="' + rootID + '">' + + escapeTextForBrowser(this.props.text) + + '</span>' + ); + }, + + /** + * Updates this component by updating the text content. + * + * @param {object} nextProps Contains the next text content. + * @param {ReactReconcileTransaction} transaction + * @internal + */ + receiveProps: function(nextProps, transaction) { + if (nextProps.text !== this.props.text) { + this.props.text = nextProps.text; + ReactComponent.DOMIDOperations.updateTextContentByID( + this._rootNodeID, + nextProps.text + ); + } + } + +}); + +module.exports = ReactTextComponent; + +},{"./ReactComponent":23,"./ReactMount":39,"./escapeTextForBrowser":67,"./mixInto":87}],49:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ReactUpdates + */ + +"use strict"; + +var invariant = require("./invariant"); + +var isBatchingUpdates = false; + +var dirtyComponents = []; + +/** + * Call the provided function in a context within which calls to `setState` and + * friends are batched such that components aren't updated unnecessarily. + */ +function batchedUpdates(callback) { + if (isBatchingUpdates) { + // We're already executing in an environment where updates will be batched, + // so this is a no-op. + callback(); + return; + } + + isBatchingUpdates = true; + + try { + callback(); + // TODO: Sort components by depth such that parent components update first + for (var i = 0; i < dirtyComponents.length; i++) { + // If a component is unmounted before pending changes apply, ignore them + // TODO: Queue unmounts in the same list to avoid this happening at all + var component = dirtyComponents[i]; + if (component.isMounted()) { + // If performUpdateIfNecessary happens to enqueue any new updates, we + // shouldn't execute the callbacks until the next render happens, so + // stash the callbacks first + var callbacks = component._pendingCallbacks; + component._pendingCallbacks = null; + component.performUpdateIfNecessary(); + if (callbacks) { + for (var j = 0; j < callbacks.length; j++) { + callbacks[j].call(component); + } + } + } + } + } catch (error) { + // IE8 requires `catch` in order to use `finally`. + throw error; + } finally { + dirtyComponents.length = 0; + isBatchingUpdates = false; + } +} + +/** + * Mark a component as needing a rerender, adding an optional callback to a + * list of functions which will be executed once the rerender occurs. + */ +function enqueueUpdate(component, callback) { + invariant( + !callback || typeof callback === "function", + 'enqueueUpdate(...): You called `setProps`, `replaceProps`, ' + + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + + 'isn\'t callable.' + ); + + if (!isBatchingUpdates) { + component.performUpdateIfNecessary(); + callback && callback(); + return; + } + + dirtyComponents.push(component); + + if (callback) { + if (component._pendingCallbacks) { + component._pendingCallbacks.push(callback); + } else { + component._pendingCallbacks = [callback]; + } + } +} + +var ReactUpdates = { + batchedUpdates: batchedUpdates, + enqueueUpdate: enqueueUpdate +}; + +module.exports = ReactUpdates; + +},{"./invariant":78}],50:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SimpleEventPlugin + */ + +"use strict"; + +var EventConstants = require("./EventConstants"); +var EventPropagators = require("./EventPropagators"); +var SyntheticEvent = require("./SyntheticEvent"); +var SyntheticFocusEvent = require("./SyntheticFocusEvent"); +var SyntheticKeyboardEvent = require("./SyntheticKeyboardEvent"); +var SyntheticMouseEvent = require("./SyntheticMouseEvent"); +var SyntheticMutationEvent = require("./SyntheticMutationEvent"); +var SyntheticTouchEvent = require("./SyntheticTouchEvent"); +var SyntheticUIEvent = require("./SyntheticUIEvent"); +var SyntheticWheelEvent = require("./SyntheticWheelEvent"); + +var invariant = require("./invariant"); +var keyOf = require("./keyOf"); + +var topLevelTypes = EventConstants.topLevelTypes; + +var eventTypes = { + blur: { + phasedRegistrationNames: { + bubbled: keyOf({onBlur: true}), + captured: keyOf({onBlurCapture: true}) + } + }, + click: { + phasedRegistrationNames: { + bubbled: keyOf({onClick: true}), + captured: keyOf({onClickCapture: true}) + } + }, + doubleClick: { + phasedRegistrationNames: { + bubbled: keyOf({onDoubleClick: true}), + captured: keyOf({onDoubleClickCapture: true}) + } + }, + drag: { + phasedRegistrationNames: { + bubbled: keyOf({onDrag: true}), + captured: keyOf({onDragCapture: true}) + } + }, + dragEnd: { + phasedRegistrationNames: { + bubbled: keyOf({onDragEnd: true}), + captured: keyOf({onDragEndCapture: true}) + } + }, + dragEnter: { + phasedRegistrationNames: { + bubbled: keyOf({onDragEnter: true}), + captured: keyOf({onDragEnterCapture: true}) + } + }, + dragExit: { + phasedRegistrationNames: { + bubbled: keyOf({onDragExit: true}), + captured: keyOf({onDragExitCapture: true}) + } + }, + dragLeave: { + phasedRegistrationNames: { + bubbled: keyOf({onDragLeave: true}), + captured: keyOf({onDragLeaveCapture: true}) + } + }, + dragOver: { + phasedRegistrationNames: { + bubbled: keyOf({onDragOver: true}), + captured: keyOf({onDragOverCapture: true}) + } + }, + dragStart: { + phasedRegistrationNames: { + bubbled: keyOf({onDragStart: true}), + captured: keyOf({onDragStartCapture: true}) + } + }, + drop: { + phasedRegistrationNames: { + bubbled: keyOf({onDrop: true}), + captured: keyOf({onDropCapture: true}) + } + }, + DOMCharacterDataModified: { + phasedRegistrationNames: { + bubbled: keyOf({onDOMCharacterDataModified: true}), + captured: keyOf({onDOMCharacterDataModifiedCapture: true}) + } + }, + focus: { + phasedRegistrationNames: { + bubbled: keyOf({onFocus: true}), + captured: keyOf({onFocusCapture: true}) + } + }, + input: { + phasedRegistrationNames: { + bubbled: keyOf({onInput: true}), + captured: keyOf({onInputCapture: true}) + } + }, + keyDown: { + phasedRegistrationNames: { + bubbled: keyOf({onKeyDown: true}), + captured: keyOf({onKeyDownCapture: true}) + } + }, + keyPress: { + phasedRegistrationNames: { + bubbled: keyOf({onKeyPress: true}), + captured: keyOf({onKeyPressCapture: true}) + } + }, + keyUp: { + phasedRegistrationNames: { + bubbled: keyOf({onKeyUp: true}), + captured: keyOf({onKeyUpCapture: true}) + } + }, + // Note: We do not allow listening to mouseOver events. Instead, use the + // onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`. + mouseDown: { + phasedRegistrationNames: { + bubbled: keyOf({onMouseDown: true}), + captured: keyOf({onMouseDownCapture: true}) + } + }, + mouseMove: { + phasedRegistrationNames: { + bubbled: keyOf({onMouseMove: true}), + captured: keyOf({onMouseMoveCapture: true}) + } + }, + mouseUp: { + phasedRegistrationNames: { + bubbled: keyOf({onMouseUp: true}), + captured: keyOf({onMouseUpCapture: true}) + } + }, + scroll: { + phasedRegistrationNames: { + bubbled: keyOf({onScroll: true}), + captured: keyOf({onScrollCapture: true}) + } + }, + submit: { + phasedRegistrationNames: { + bubbled: keyOf({onSubmit: true}), + captured: keyOf({onSubmitCapture: true}) + } + }, + touchCancel: { + phasedRegistrationNames: { + bubbled: keyOf({onTouchCancel: true}), + captured: keyOf({onTouchCancelCapture: true}) + } + }, + touchEnd: { + phasedRegistrationNames: { + bubbled: keyOf({onTouchEnd: true}), + captured: keyOf({onTouchEndCapture: true}) + } + }, + touchMove: { + phasedRegistrationNames: { + bubbled: keyOf({onTouchMove: true}), + captured: keyOf({onTouchMoveCapture: true}) + } + }, + touchStart: { + phasedRegistrationNames: { + bubbled: keyOf({onTouchStart: true}), + captured: keyOf({onTouchStartCapture: true}) + } + }, + wheel: { + phasedRegistrationNames: { + bubbled: keyOf({onWheel: true}), + captured: keyOf({onWheelCapture: true}) + } + } +}; + +var topLevelEventsToDispatchConfig = { + topBlur: eventTypes.blur, + topClick: eventTypes.click, + topDoubleClick: eventTypes.doubleClick, + topDOMCharacterDataModified: eventTypes.DOMCharacterDataModified, + topDrag: eventTypes.drag, + topDragEnd: eventTypes.dragEnd, + topDragEnter: eventTypes.dragEnter, + topDragExit: eventTypes.dragExit, + topDragLeave: eventTypes.dragLeave, + topDragOver: eventTypes.dragOver, + topDragStart: eventTypes.dragStart, + topDrop: eventTypes.drop, + topFocus: eventTypes.focus, + topInput: eventTypes.input, + topKeyDown: eventTypes.keyDown, + topKeyPress: eventTypes.keyPress, + topKeyUp: eventTypes.keyUp, + topMouseDown: eventTypes.mouseDown, + topMouseMove: eventTypes.mouseMove, + topMouseUp: eventTypes.mouseUp, + topScroll: eventTypes.scroll, + topSubmit: eventTypes.submit, + topTouchCancel: eventTypes.touchCancel, + topTouchEnd: eventTypes.touchEnd, + topTouchMove: eventTypes.touchMove, + topTouchStart: eventTypes.touchStart, + topWheel: eventTypes.wheel +}; + +var SimpleEventPlugin = { + + eventTypes: eventTypes, + + /** + * Same as the default implementation, except cancels the event when return + * value is false. + * + * @param {object} Event to be dispatched. + * @param {function} Application-level callback. + * @param {string} domID DOM ID to pass to the callback. + */ + executeDispatch: function(event, listener, domID) { + var returnValue = listener(event, domID); + if (returnValue === false) { + event.stopPropagation(); + event.preventDefault(); + } + }, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function( + topLevelType, + topLevelTarget, + topLevelTargetID, + nativeEvent) { + var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType]; + if (!dispatchConfig) { + return null; + } + var EventConstructor; + switch(topLevelType) { + case topLevelTypes.topInput: + case topLevelTypes.topSubmit: + // HTML Events + // @see http://www.w3.org/TR/html5/index.html#events-0 + EventConstructor = SyntheticEvent; + break; + case topLevelTypes.topKeyDown: + case topLevelTypes.topKeyPress: + case topLevelTypes.topKeyUp: + EventConstructor = SyntheticKeyboardEvent; + break; + case topLevelTypes.topBlur: + case topLevelTypes.topFocus: + EventConstructor = SyntheticFocusEvent; + break; + case topLevelTypes.topClick: + case topLevelTypes.topDoubleClick: + case topLevelTypes.topDrag: + case topLevelTypes.topDragEnd: + case topLevelTypes.topDragEnter: + case topLevelTypes.topDragExit: + case topLevelTypes.topDragLeave: + case topLevelTypes.topDragOver: + case topLevelTypes.topDragStart: + case topLevelTypes.topDrop: + case topLevelTypes.topMouseDown: + case topLevelTypes.topMouseMove: + case topLevelTypes.topMouseUp: + EventConstructor = SyntheticMouseEvent; + break; + case topLevelTypes.topDOMCharacterDataModified: + EventConstructor = SyntheticMutationEvent; + break; + case topLevelTypes.topTouchCancel: + case topLevelTypes.topTouchEnd: + case topLevelTypes.topTouchMove: + case topLevelTypes.topTouchStart: + EventConstructor = SyntheticTouchEvent; + break; + case topLevelTypes.topScroll: + EventConstructor = SyntheticUIEvent; + break; + case topLevelTypes.topWheel: + EventConstructor = SyntheticWheelEvent; + break; + } + invariant( + EventConstructor, + 'SimpleEventPlugin: Unhandled event type, `%s`.', + topLevelType + ); + var event = EventConstructor.getPooled( + dispatchConfig, + topLevelTargetID, + nativeEvent + ); + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + +}; + +module.exports = SimpleEventPlugin; + +},{"./EventConstants":13,"./EventPropagators":18,"./SyntheticEvent":51,"./SyntheticFocusEvent":52,"./SyntheticKeyboardEvent":53,"./SyntheticMouseEvent":54,"./SyntheticMutationEvent":55,"./SyntheticTouchEvent":56,"./SyntheticUIEvent":57,"./SyntheticWheelEvent":58,"./invariant":78,"./keyOf":82}],51:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticEvent + * @typechecks static-only + */ + +"use strict"; + +var PooledClass = require("./PooledClass"); + +var emptyFunction = require("./emptyFunction"); +var getEventTarget = require("./getEventTarget"); +var merge = require("./merge"); +var mergeInto = require("./mergeInto"); + +/** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var EventInterface = { + type: null, + target: getEventTarget, + currentTarget: null, + eventPhase: null, + bubbles: null, + cancelable: null, + timeStamp: function(event) { + return event.timeStamp || Date.now(); + }, + defaultPrevented: null, + isTrusted: null +}; + +/** + * Synthetic events are dispatched by event plugins, typically in response to a + * top-level event delegation handler. + * + * These systems should generally use pooling to reduce the frequency of garbage + * collection. The system should check `isPersistent` to determine whether the + * event should be released into the pool after being dispatched. Users that + * need a persisted event should invoke `persist`. + * + * Synthetic events (and subclasses) implement the DOM Level 3 Events API by + * normalizing browser quirks. Subclasses do not necessarily have to implement a + * DOM interface; custom application-specific events can also subclass this. + * + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + */ +function SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent) { + this.dispatchConfig = dispatchConfig; + this.dispatchMarker = dispatchMarker; + this.nativeEvent = nativeEvent; + + var Interface = this.constructor.Interface; + for (var propName in Interface) { + if (!Interface.hasOwnProperty(propName)) { + continue; + } + var normalize = Interface[propName]; + if (normalize) { + this[propName] = normalize(nativeEvent); + } else { + this[propName] = nativeEvent[propName]; + } + } + + if (nativeEvent.defaultPrevented || nativeEvent.returnValue === false) { + this.isDefaultPrevented = emptyFunction.thatReturnsTrue; + } else { + this.isDefaultPrevented = emptyFunction.thatReturnsFalse; + } + this.isPropagationStopped = emptyFunction.thatReturnsFalse; +} + +mergeInto(SyntheticEvent.prototype, { + + preventDefault: function() { + this.defaultPrevented = true; + var event = this.nativeEvent; + event.preventDefault ? event.preventDefault() : event.returnValue = false; + this.isDefaultPrevented = emptyFunction.thatReturnsTrue; + }, + + stopPropagation: function() { + var event = this.nativeEvent; + event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true; + this.isPropagationStopped = emptyFunction.thatReturnsTrue; + }, + + /** + * We release all dispatched `SyntheticEvent`s after each event loop, adding + * them back into the pool. This allows a way to hold onto a reference that + * won't be added back into the pool. + */ + persist: function() { + this.isPersistent = emptyFunction.thatReturnsTrue; + }, + + /** + * Checks if this event should be released back into the pool. + * + * @return {boolean} True if this should not be released, false otherwise. + */ + isPersistent: emptyFunction.thatReturnsFalse, + + /** + * `PooledClass` looks for `destructor` on each instance it releases. + */ + destructor: function() { + var Interface = this.constructor.Interface; + for (var propName in Interface) { + this[propName] = null; + } + this.dispatchConfig = null; + this.dispatchMarker = null; + this.nativeEvent = null; + } + +}); + +SyntheticEvent.Interface = EventInterface; + +/** + * Helper to reduce boilerplate when creating subclasses. + * + * @param {function} Class + * @param {?object} Interface + */ +SyntheticEvent.augmentClass = function(Class, Interface) { + var Super = this; + + var prototype = Object.create(Super.prototype); + mergeInto(prototype, Class.prototype); + Class.prototype = prototype; + Class.prototype.constructor = Class; + + Class.Interface = merge(Super.Interface, Interface); + Class.augmentClass = Super.augmentClass; + + PooledClass.addPoolingTo(Class, PooledClass.threeArgumentPooler); +}; + +PooledClass.addPoolingTo(SyntheticEvent, PooledClass.threeArgumentPooler); + +module.exports = SyntheticEvent; + +},{"./PooledClass":21,"./emptyFunction":66,"./getEventTarget":72,"./merge":84,"./mergeInto":86}],52:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticFocusEvent + * @typechecks static-only + */ + +"use strict"; + +var SyntheticUIEvent = require("./SyntheticUIEvent"); + +/** + * @interface FocusEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var FocusEventInterface = { + relatedTarget: null +}; + +/** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ +function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); +} + +SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); + +module.exports = SyntheticFocusEvent; + +},{"./SyntheticUIEvent":57}],53:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticKeyboardEvent + * @typechecks static-only + */ + +"use strict"; + +var SyntheticUIEvent = require("./SyntheticUIEvent"); + +/** + * @interface KeyboardEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var KeyboardEventInterface = { + 'char': null, + key: null, + location: null, + ctrlKey: null, + shiftKey: null, + altKey: null, + metaKey: null, + repeat: null, + locale: null, + // Legacy Interface + charCode: null, + keyCode: null, + which: null +}; + +/** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ +function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); +} + +SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); + +module.exports = SyntheticKeyboardEvent; + +},{"./SyntheticUIEvent":57}],54:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticMouseEvent + * @typechecks static-only + */ + +"use strict"; + +var SyntheticUIEvent = require("./SyntheticUIEvent"); +var ViewportMetrics = require("./ViewportMetrics"); + +/** + * @interface MouseEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var MouseEventInterface = { + screenX: null, + screenY: null, + clientX: null, + clientY: null, + ctrlKey: null, + shiftKey: null, + altKey: null, + metaKey: null, + button: function(event) { + // Webkit, Firefox, IE9+ + // which: 1 2 3 + // button: 0 1 2 (standard) + var button = event.button; + if ('which' in event) { + return button; + } + // IE<9 + // which: undefined + // button: 0 0 0 + // button: 1 4 2 (onmouseup) + return button === 2 ? 2 : button === 4 ? 1 : 0; + }, + buttons: null, + relatedTarget: function(event) { + return event.relatedTarget || ( + event.fromElement === event.srcElement ? + event.toElement : + event.fromElement + ); + }, + // "Proprietary" Interface. + pageX: function(event) { + return 'pageX' in event ? + event.pageX : + event.clientX + ViewportMetrics.currentScrollLeft; + }, + pageY: function(event) { + return 'pageY' in event ? + event.pageY : + event.clientY + ViewportMetrics.currentScrollTop; + } +}; + +/** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ +function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); +} + +SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); + +module.exports = SyntheticMouseEvent; + +},{"./SyntheticUIEvent":57,"./ViewportMetrics":60}],55:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticMutationEvent + * @typechecks static-only + */ + +"use strict"; + +var SyntheticEvent = require("./SyntheticEvent"); + +/** + * @interface MutationEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var MutationEventInterface = { + relatedNode: null, + prevValue: null, + newValue: null, + attrName: null, + attrChange: null +}; + +/** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticEvent} + */ +function SyntheticMutationEvent(dispatchConfig, dispatchMarker, nativeEvent) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); +} + +SyntheticEvent.augmentClass(SyntheticMutationEvent, MutationEventInterface); + +module.exports = SyntheticMutationEvent; + +},{"./SyntheticEvent":51}],56:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticTouchEvent + * @typechecks static-only + */ + +"use strict"; + +var SyntheticUIEvent = require("./SyntheticUIEvent"); + +/** + * @interface TouchEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var TouchEventInterface = { + touches: null, + targetTouches: null, + changedTouches: null, + altKey: null, + metaKey: null, + ctrlKey: null, + shiftKey: null +}; + +/** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ +function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); +} + +SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); + +module.exports = SyntheticTouchEvent; + +},{"./SyntheticUIEvent":57}],57:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticUIEvent + * @typechecks static-only + */ + +"use strict"; + +var SyntheticEvent = require("./SyntheticEvent"); + +/** + * @interface UIEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var UIEventInterface = { + view: null, + detail: null +}; + +/** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticEvent} + */ +function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); +} + +SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); + +module.exports = SyntheticUIEvent; + +},{"./SyntheticEvent":51}],58:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticWheelEvent + * @typechecks static-only + */ + +"use strict"; + +var SyntheticMouseEvent = require("./SyntheticMouseEvent"); + +/** + * @interface WheelEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var WheelEventInterface = { + deltaX: function(event) { + // NOTE: IE<9 does not support x-axis delta. + return ( + 'deltaX' in event ? event.deltaX : + // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). + 'wheelDeltaX' in event ? -event.wheelDeltaX : 0 + ); + }, + deltaY: function(event) { + return ( + // Normalize (up is positive). + 'deltaY' in event ? -event.deltaY : + // Fallback to `wheelDeltaY` for Webkit. + 'wheelDeltaY' in event ? event.wheelDeltaY : + // Fallback to `wheelDelta` for IE<9. + 'wheelDelta' in event ? event.wheelData : 0 + ); + }, + deltaZ: null, + deltaMode: null +}; + +/** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticMouseEvent} + */ +function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent) { + SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); +} + +SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); + +module.exports = SyntheticWheelEvent; + +},{"./SyntheticMouseEvent":54}],59:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule Transaction + */ + +"use strict"; + +var invariant = require("./invariant"); + +/** + * `Transaction` creates a black box that is able to wrap any method such that + * certain invariants are maintained before and after the method is invoked + * (Even if an exception is thrown while invoking the wrapped method). Whoever + * instantiates a transaction can provide enforcers of the invariants at + * creation time. The `Transaction` class itself will supply one additional + * automatic invariant for you - the invariant that any transaction instance + * should not be ran while it is already being ran. You would typically create a + * single instance of a `Transaction` for reuse multiple times, that potentially + * is used to wrap several different methods. Wrappers are extremely simple - + * they only require implementing two methods. + * + * <pre> + * wrappers (injected at creation time) + * + + + * | | + * +-----------------|--------|--------------+ + * | v | | + * | +---------------+ | | + * | +--| wrapper1 |---|----+ | + * | | +---------------+ v | | + * | | +-------------+ | | + * | | +----| wrapper2 |--------+ | + * | | | +-------------+ | | | + * | | | | | | + * | v v v v | wrapper + * | +---+ +---+ +---------+ +---+ +---+ | invariants + * perform(anyMethod) | | | | | | | | | | | | maintained + * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|--------> + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * | +---+ +---+ +---------+ +---+ +---+ | + * | initialize close | + * +-----------------------------------------+ + * </pre> + * + * Bonus: + * - Reports timing metrics by method name and wrapper index. + * + * Use cases: + * - Preserving the input selection ranges before/after reconciliation. + * Restoring selection even in the event of an unexpected error. + * - Deactivating events while rearranging the DOM, preventing blurs/focuses, + * while guaranteeing that afterwards, the event system is reactivated. + * - Flushing a queue of collected DOM mutations to the main UI thread after a + * reconciliation takes place in a worker thread. + * - Invoking any collected `componentDidRender` callbacks after rendering new + * content. + * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue + * to preserve the `scrollTop` (an automatic scroll aware DOM). + * - (Future use case): Layout calculations before and after DOM upates. + * + * Transactional plugin API: + * - A module that has an `initialize` method that returns any precomputation. + * - and a `close` method that accepts the precomputation. `close` is invoked + * when the wrapped process is completed, or has failed. + * + * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules + * that implement `initialize` and `close`. + * @return {Transaction} Single transaction for reuse in thread. + * + * @class Transaction + */ +var Mixin = { + /** + * Sets up this instance so that it is prepared for collecting metrics. Does + * so such that this setup method may be used on an instance that is already + * initialized, in a way that does not consume additional memory upon reuse. + * That can be useful if you decide to make your subclass of this mixin a + * "PooledClass". + */ + reinitializeTransaction: function() { + this.transactionWrappers = this.getTransactionWrappers(); + if (!this.wrapperInitData) { + this.wrapperInitData = []; + } else { + this.wrapperInitData.length = 0; + } + if (!this.timingMetrics) { + this.timingMetrics = {}; + } + this.timingMetrics.methodInvocationTime = 0; + if (!this.timingMetrics.wrapperInitTimes) { + this.timingMetrics.wrapperInitTimes = []; + } else { + this.timingMetrics.wrapperInitTimes.length = 0; + } + if (!this.timingMetrics.wrapperCloseTimes) { + this.timingMetrics.wrapperCloseTimes = []; + } else { + this.timingMetrics.wrapperCloseTimes.length = 0; + } + this._isInTransaction = false; + }, + + _isInTransaction: false, + + /** + * @abstract + * @return {Array<TransactionWrapper>} Array of transaction wrappers. + */ + getTransactionWrappers: null, + + isInTransaction: function() { + return !!this._isInTransaction; + }, + + /** + * Executes the function within a safety window. Use this for the top level + * methods that result in large amounts of computation/mutations that would + * need to be safety checked. + * + * @param {function} method Member of scope to call. + * @param {Object} scope Scope to invoke from. + * @param {Object?=} args... Arguments to pass to the method (optional). + * Helps prevent need to bind in many cases. + * @return Return value from `method`. + */ + perform: function(method, scope, a, b, c, d, e, f) { + invariant( + !this.isInTransaction(), + 'Transaction.perform(...): Cannot initialize a transaction when there ' + + 'is already an outstanding transaction.' + ); + var memberStart = Date.now(); + var errorToThrow = null; + var ret; + try { + this.initializeAll(); + ret = method.call(scope, a, b, c, d, e, f); + } catch (error) { + // IE8 requires `catch` in order to use `finally`. + errorToThrow = error; + } finally { + var memberEnd = Date.now(); + this.methodInvocationTime += (memberEnd - memberStart); + try { + this.closeAll(); + } catch (closeError) { + // If `method` throws, prefer to show that stack trace over any thrown + // by invoking `closeAll`. + errorToThrow = errorToThrow || closeError; + } + } + if (errorToThrow) { + throw errorToThrow; + } + return ret; + }, + + initializeAll: function() { + this._isInTransaction = true; + var transactionWrappers = this.transactionWrappers; + var wrapperInitTimes = this.timingMetrics.wrapperInitTimes; + var errorToThrow = null; + for (var i = 0; i < transactionWrappers.length; i++) { + var initStart = Date.now(); + var wrapper = transactionWrappers[i]; + try { + this.wrapperInitData[i] = wrapper.initialize ? + wrapper.initialize.call(this) : + null; + } catch (initError) { + // Prefer to show the stack trace of the first error. + errorToThrow = errorToThrow || initError; + this.wrapperInitData[i] = Transaction.OBSERVED_ERROR; + } finally { + var curInitTime = wrapperInitTimes[i]; + var initEnd = Date.now(); + wrapperInitTimes[i] = (curInitTime || 0) + (initEnd - initStart); + } + } + if (errorToThrow) { + throw errorToThrow; + } + }, + + /** + * Invokes each of `this.transactionWrappers.close[i]` functions, passing into + * them the respective return values of `this.transactionWrappers.init[i]` + * (`close`rs that correspond to initializers that failed will not be + * invoked). + */ + closeAll: function() { + invariant( + this.isInTransaction(), + 'Transaction.closeAll(): Cannot close transaction when none are open.' + ); + var transactionWrappers = this.transactionWrappers; + var wrapperCloseTimes = this.timingMetrics.wrapperCloseTimes; + var errorToThrow = null; + for (var i = 0; i < transactionWrappers.length; i++) { + var wrapper = transactionWrappers[i]; + var closeStart = Date.now(); + var initData = this.wrapperInitData[i]; + try { + if (initData !== Transaction.OBSERVED_ERROR) { + wrapper.close && wrapper.close.call(this, initData); + } + } catch (closeError) { + // Prefer to show the stack trace of the first error. + errorToThrow = errorToThrow || closeError; + } finally { + var closeEnd = Date.now(); + var curCloseTime = wrapperCloseTimes[i]; + wrapperCloseTimes[i] = (curCloseTime || 0) + (closeEnd - closeStart); + } + } + this.wrapperInitData.length = 0; + this._isInTransaction = false; + if (errorToThrow) { + throw errorToThrow; + } + } +}; + +var Transaction = { + + Mixin: Mixin, + + /** + * Token to look for to determine if an error occured. + */ + OBSERVED_ERROR: {} + +}; + +module.exports = Transaction; + +})() +},{"./invariant":78}],60:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ViewportMetrics + */ + +"use strict"; + +var ViewportMetrics = { + + currentScrollLeft: 0, + + currentScrollTop: 0, + + refreshScrollValues: function() { + ViewportMetrics.currentScrollLeft = + document.body.scrollLeft + document.documentElement.scrollLeft; + ViewportMetrics.currentScrollTop = + document.body.scrollTop + document.documentElement.scrollTop; + } + +}; + +module.exports = ViewportMetrics; + +},{}],61:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule accumulate + */ + +"use strict"; + +var invariant = require("./invariant"); + +/** + * Accumulates items that must not be null or undefined. + * + * This is used to conserve memory by avoiding array allocations. + * + * @return {*|array<*>} An accumulation of items. + */ +function accumulate(current, next) { + invariant( + next != null, + 'accumulate(...): Accumulated items must be not be null or undefined.' + ); + if (current == null) { + return next; + } else { + // Both are not empty. Warning: Never call x.concat(y) when you are not + // certain that x is an Array (x could be a string with concat method). + var currentIsArray = Array.isArray(current); + var nextIsArray = Array.isArray(next); + if (currentIsArray) { + return current.concat(next); + } else { + if (nextIsArray) { + return [current].concat(next); + } else { + return [current, next]; + } + } + } +} + +module.exports = accumulate; + +},{"./invariant":78}],62:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule adler32 + */ + +"use strict"; + +var MOD = 65521; + +// This is a clean-room implementation of adler32 designed for detecting +// if markup is not what we expect it to be. It does not need to be +// cryptographically strong, only reasonable good at detecting if markup +// generated on the server is different than that on the client. +function adler32(data) { + var a = 1; + var b = 0; + for (var i = 0; i < data.length; i++) { + a = (a + data.charCodeAt(i)) % MOD; + b = (b + a) % MOD; + } + return a | (b << 16); +} + +module.exports = adler32; + +},{}],63:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule copyProperties + */ + +/** + * Copy properties from one or more objects (up to 5) into the first object. + * This is a shallow copy. It mutates the first object and also returns it. + * + * NOTE: `arguments` has a very significant performance penalty, which is why + * we don't support unlimited arguments. + */ +function copyProperties(obj, a, b, c, d, e, f) { + obj = obj || {}; + + if (true) { + if (f) { + throw new Error('Too many arguments passed to copyProperties'); + } + } + + var args = [a, b, c, d, e]; + var ii = 0, v; + while (args[ii]) { + v = args[ii++]; + for (var k in v) { + obj[k] = v[k]; + } + + // IE ignores toString in object iteration.. See: + // webreflection.blogspot.com/2007/07/quick-fix-internet-explorer-and.html + if (v.hasOwnProperty && v.hasOwnProperty('toString') && + (typeof v.toString != 'undefined') && (obj.toString !== v.toString)) { + obj.toString = v.toString; + } + } + + return obj; +} + +module.exports = copyProperties; + +},{}],64:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule createObjectFrom + */ + +var hasArrayNature = require("./hasArrayNature"); + +/** + * Construct an object from an array of keys + * and optionally specified value or list of values. + * + * >>> createObjectFrom(['a','b','c']); + * {a: true, b: true, c: true} + * + * >>> createObjectFrom(['a','b','c'], false); + * {a: false, b: false, c: false} + * + * >>> createObjectFrom(['a','b','c'], 'monkey'); + * {c:'monkey', b:'monkey' c:'monkey'} + * + * >>> createObjectFrom(['a','b','c'], [1,2,3]); + * {a: 1, b: 2, c: 3} + * + * >>> createObjectFrom(['women', 'men'], [true, false]); + * {women: true, men: false} + * + * @param Array list of keys + * @param mixed optional value or value array. defaults true. + * @returns object + */ +function createObjectFrom(keys, values /* = true */) { + if (true) { + if (!hasArrayNature(keys)) { + throw new TypeError('Must pass an array of keys.'); + } + } + + var object = {}; + var is_array = hasArrayNature(values); + if (typeof values == 'undefined') { + values = true; + } + + for (var ii = keys.length; ii--;) { + object[keys[ii]] = is_array ? values[ii] : values; + } + return object; +} + +module.exports = createObjectFrom; + +},{"./hasArrayNature":75}],65:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule dangerousStyleValue + * @typechecks static-only + */ + +"use strict"; + +var CSSProperty = require("./CSSProperty"); + +/** + * Convert a value into the proper css writable value. The `styleName` name + * name should be logical (no hyphens), as specified + * in `CSSProperty.isUnitlessNumber`. + * + * @param {string} styleName CSS property name such as `topMargin`. + * @param {*} value CSS property value such as `10px`. + * @return {string} Normalized style value with dimensions applied. + */ +function dangerousStyleValue(styleName, value) { + // Note that we've removed escapeTextForBrowser() calls here since the + // whole string will be escaped when the attribute is injected into + // the markup. If you provide unsafe user data here they can inject + // arbitrary CSS which may be problematic (I couldn't repro this): + // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet + // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ + // This is not an XSS hole but instead a potential CSS injection issue + // which has lead to a greater discussion about how we're going to + // trust URLs moving forward. See #2115901 + + var isEmpty = value == null || typeof value === 'boolean' || value === ''; + if (isEmpty) { + return ''; + } + + var isNonNumeric = isNaN(value); + if (isNonNumeric || value === 0 || CSSProperty.isUnitlessNumber[styleName]) { + return '' + value; // cast to string + } + + return value + 'px'; +} + +module.exports = dangerousStyleValue; + +},{"./CSSProperty":2}],66:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule emptyFunction + */ + +var copyProperties = require("./copyProperties"); + +function makeEmptyFunction(arg) { + return function() { + return arg; + }; +} + +/** + * This function accepts and discards inputs; it has no side effects. This is + * primarily useful idiomatically for overridable function endpoints which + * always need to be callable, since JS lacks a null-call idiom ala Cocoa. + */ +function emptyFunction() {} + +copyProperties(emptyFunction, { + thatReturns: makeEmptyFunction, + thatReturnsFalse: makeEmptyFunction(false), + thatReturnsTrue: makeEmptyFunction(true), + thatReturnsNull: makeEmptyFunction(null), + thatReturnsThis: function() { return this; }, + thatReturnsArgument: function(arg) { return arg; } +}); + +module.exports = emptyFunction; + +},{"./copyProperties":63}],67:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule escapeTextForBrowser + * @typechecks static-only + */ + +"use strict"; + +var invariant = require("./invariant"); + +var ESCAPE_LOOKUP = { + "&": "&", + ">": ">", + "<": "<", + "\"": """, + "'": "'", + "/": "/" +}; + +function escaper(match) { + return ESCAPE_LOOKUP[match]; +} + +/** + * Escapes text to prevent scripting attacks. + * + * @param {number|string} text Text value to escape. + * @return {string} An escaped string. + */ +function escapeTextForBrowser(text) { + var type = typeof text; + invariant( + type !== 'object', + 'escapeTextForBrowser(...): Attempted to escape an object.' + ); + if (text === '') { + return ''; + } else { + if (type === 'string') { + return text.replace(/[&><"'\/]/g, escaper); + } else { + return (''+text).replace(/[&><"'\/]/g, escaper); + } + } +} + +module.exports = escapeTextForBrowser; + +},{"./invariant":78}],68:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ex + * @typechecks + * @nostacktrace + */ + +/** + * This function transforms error message with arguments into plain text error + * message, so that it can be passed to window.onerror without losing anything. + * It can then be transformed back by `erx()` function. + * + * Usage: + * throw new Error(ex('Error %s from %s', errorCode, userID)); + * + * @param {string} errorMessage + */ + +var ex = function(errorMessage/*, arg1, arg2, ...*/) { + var args = Array.prototype.slice.call(arguments).map(function(arg) { + return String(arg); + }); + var expectedLength = errorMessage.split('%s').length - 1; + + if (expectedLength !== args.length - 1) { + // something wrong with the formatting string + return ex('ex args number mismatch: %s', JSON.stringify(args)); + } + + return ex._prefix + JSON.stringify(args) + ex._suffix; +}; + +ex._prefix = '<![EX['; +ex._suffix = ']]>'; + +module.exports = ex; + +},{}],69:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule flattenChildren + */ + +"use strict"; + +var invariant = require("./invariant"); +var traverseAllChildren = require("./traverseAllChildren"); + +/** + * @param {function} traverseContext Context passed through traversal. + * @param {?ReactComponent} child React child component. + * @param {!string} name String name of key path to child. + */ +function flattenSingleChildIntoContext(traverseContext, child, name) { + // We found a component instance. + var result = traverseContext; + invariant( + !result.hasOwnProperty(name), + 'flattenChildren(...): Encountered two children with the same key, `%s`. ' + + 'Children keys must be unique.', + name + ); + result[name] = child; +} + +/** + * Flattens children that are typically specified as `props.children`. + * @return {!object} flattened children keyed by name. + */ +function flattenChildren(children) { + if (children == null) { + return children; + } + var result = {}; + traverseAllChildren(children, flattenSingleChildIntoContext, result); + return result; +} + +module.exports = flattenChildren; + +},{"./invariant":78,"./traverseAllChildren":90}],70:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule forEachAccumulated + */ + +"use strict"; + +/** + * @param {array} an "accumulation" of items which is either an Array or + * a single item. Useful when paired with the `accumulate` module. This is a + * simple utility that allows us to reason about a collection of items, but + * handling the case when there is exactly one item (and we do not need to + * allocate an array). + */ +var forEachAccumulated = function(arr, cb, scope) { + if (Array.isArray(arr)) { + arr.forEach(cb, scope); + } else if (arr) { + cb.call(scope, arr); + } +}; + +module.exports = forEachAccumulated; + +},{}],71:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule ge + */ + +/** + * Find a node by ID. Optionally search a sub-tree outside of the document + * + * Use ge if you're not sure whether or not the element exists. You can test + * for existence yourself in your application code. + * + * If your application code depends on the existence of the element, use $ + * instead, which will throw in DEV if the element doesn't exist. + */ +function ge(arg, root, tag) { + return typeof arg != 'string' ? arg : + !root ? document.getElementById(arg) : + _geFromSubtree(arg, root, tag); +} + +function _geFromSubtree(id, root, tag) { + var elem, children, ii; + + if (_getNodeID(root) == id) { + return root; + } else if (root.getElementsByTagName) { + // All Elements implement this, which does an iterative DFS, which is + // faster than recursion and doesn't run into stack depth issues. + children = root.getElementsByTagName(tag || '*'); + for (ii = 0; ii < children.length; ii++) { + if (_getNodeID(children[ii]) == id) { + return children[ii]; + } + } + } else { + // DocumentFragment does not implement getElementsByTagName, so + // recurse over its children. Its children must be Elements, so + // each child will use the getElementsByTagName case instead. + children = root.childNodes; + for (ii = 0; ii < children.length; ii++) { + elem = _geFromSubtree(id, children[ii]); + if (elem) { + return elem; + } + } + } + + return null; +} + +/** + * Return the ID value for a given node. This allows us to avoid issues + * with forms that contain inputs with name="id". + * + * @return string (null if attribute not set) + */ +function _getNodeID(node) { + // #document and #document-fragment do not have getAttributeNode. + var id = node.getAttributeNode && node.getAttributeNode('id'); + return id ? id.value : null; +} + +module.exports = ge; + +},{}],72:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule getEventTarget + * @typechecks static-only + */ + +"use strict"; + +var ExecutionEnvironment = require("./ExecutionEnvironment"); + +/** + * Gets the target node from a native browser event by accounting for + * inconsistencies in browser DOM APIs. + * + * @param {object} nativeEvent Native browser event. + * @return {DOMEventTarget} Target node. + */ +function getEventTarget(nativeEvent) { + var target = + nativeEvent.target || + nativeEvent.srcElement || + ExecutionEnvironment.global; + // Safari may fire events on text nodes (Node.TEXT_NODE is 3). + // @see http://www.quirksmode.org/js/events_properties.html + return target.nodeType === 3 ? target.parentNode : target; +} + +module.exports = getEventTarget; + +})() +},{"./ExecutionEnvironment":19}],73:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule getReactRootElementInContainer + */ + +"use strict"; + +/** + * @param {DOMElement} container DOM element that may contain a React component + * @return {?*} DOM element that may have the reactRoot ID, or null. + */ +function getReactRootElementInContainer(container) { + return container && container.firstChild; +} + +module.exports = getReactRootElementInContainer; + +},{}],74:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule getTextContentAccessor + */ + +"use strict"; + +var ExecutionEnvironment = require("./ExecutionEnvironment"); + +var contentKey = null; + +/** + * Gets the key used to access text content on a DOM node. + * + * @return {?string} Key used to access text content. + * @internal + */ +function getTextContentAccessor() { + if (!contentKey && ExecutionEnvironment.canUseDOM) { + contentKey = 'innerText' in document.createElement('div') ? + 'innerText' : + 'textContent'; + } + return contentKey; +} + +module.exports = getTextContentAccessor; + +},{"./ExecutionEnvironment":19}],75:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule hasArrayNature + */ + +/** + * Perform a heuristic test to determine if an object is "array-like". + * + * A monk asked Joshu, a Zen master, "Has a dog Buddha nature?" + * Joshu replied: "Mu." + * + * This function determines if its argument has "array nature": it returns + * true if the argument is an actual array, an `arguments' object, or an + * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()). + * + * @param obj An object to test. + * @return bool True if the object is array-like. + */ +function hasArrayNature(obj) { + return ( + // not null/false + !!obj && + // arrays are objects, NodeLists are functions in Safari + (typeof obj == 'object' || typeof obj == 'function') && + // quacks like an array + ('length' in obj) && + // not window + !('setInterval' in obj) && + // no DOM node should be considered an array-like + // a 'select' element has 'length' and 'item' properties + (typeof obj.nodeType != 'number') && + ( + // a real array + (Array.isArray(obj) || + // arguments + ('callee' in obj) || // HTMLCollection/NodeList + 'item' in obj) + ) + ); +} + +module.exports = hasArrayNature; + +},{}],76:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule hyphenate + * @typechecks + */ + +var _uppercasePattern = /([A-Z])/g; + +/** + * Hyphenates a camelcased string, for example: + * + * > hyphenate('backgroundColor') + * < "background-color" + * + * @param {string} string + * @return {string} + */ +function hyphenate(string) { + return string.replace(_uppercasePattern, '-$1').toLowerCase(); +} + +module.exports = hyphenate; + +},{}],77:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule insertNodeAt + */ + +"use strict"; + +/** + * Inserts `node` at a particular child index. Other nodes move to make room. + * @param {!Element} root The parent root node to insert into. + * @param {!node} node The node to insert. + * @param {!number} atIndex The index in `root` that `node` should exist at. + */ +function insertNodeAt(root, node, atIndex) { + var childNodes = root.childNodes; + // Remove from parent so that if node is already child of root, + // `childNodes[atIndex]` already takes into account the removal. + var curAtIndex = root.childNodes[atIndex]; + if (curAtIndex === node) { + return node; + } + if (node.parentNode) { + node.parentNode.removeChild(node); + } + if (atIndex >= childNodes.length) { + root.appendChild(node); + } else { + root.insertBefore(node, childNodes[atIndex]); + } + return node; +} + +module.exports = insertNodeAt; + +},{}],78:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule invariant + */ + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf style format and arguments to provide information about + * what broke and what you were expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +function invariant(condition) { + if (!condition) { + throw new Error('Invariant Violation'); + } +} + +module.exports = invariant; + +if (true) { + var invariantDev = function(condition, format, a, b, c, d, e, f) { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + + if (!condition) { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + throw new Error( + 'Invariant Violation: ' + + format.replace(/%s/g, function() { return args[argIndex++]; }) + ); + } + }; + + module.exports = invariantDev; +} + +},{}],79:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule isEventSupported + */ + +"use strict"; + +var ExecutionEnvironment = require("./ExecutionEnvironment"); + +var testNode, useHasFeature; +if (ExecutionEnvironment.canUseDOM) { + testNode = document.createElement('div'); + useHasFeature = + document.implementation && + document.implementation.hasFeature && + // `hasFeature` always returns true in Firefox 19+. + document.implementation.hasFeature('', '') !== true; +} + +/** + * Checks if an event is supported in the current execution environment. + * + * NOTE: This will not work correctly for non-generic events such as `change`, + * `reset`, `load`, `error`, and `select`. + * + * Borrows from Modernizr. + * + * @param {string} eventNameSuffix Event name, e.g. "click". + * @param {?boolean} capture Check if the capture phase is supported. + * @return {boolean} True if the event is supported. + * @internal + * @license Modernizr 3.0.0pre (Custom Build) | MIT + */ +function isEventSupported(eventNameSuffix, capture) { + if (!testNode || (capture && !testNode.addEventListener)) { + return false; + } + var element = document.createElement('div'); + + var eventName = 'on' + eventNameSuffix; + var isSupported = eventName in element; + + if (!isSupported) { + element.setAttribute(eventName, ''); + isSupported = typeof element[eventName] === 'function'; + if (typeof element[eventName] !== 'undefined') { + element[eventName] = undefined; + } + element.removeAttribute(eventName); + } + + if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') { + // This is the only way to test support for the `wheel` event in IE9+. + isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); + } + + element = null; + return isSupported; +} + +module.exports = isEventSupported; + +},{"./ExecutionEnvironment":19}],80:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule joinClasses + * @typechecks static-only + */ + +"use strict"; + +/** + * Combines multiple className strings into one. + * http://jsperf.com/joinclasses-args-vs-array + * + * @param {...?string} classes + * @return {string} + */ +function joinClasses(className/*, ... */) { + if (!className) { + className = ''; + } + var nextClass; + var argLength = arguments.length; + if (argLength > 1) { + for (var ii = 1; ii < argLength; ii++) { + nextClass = arguments[ii]; + nextClass && (className += ' ' + nextClass); + } + } + return className; +} + +module.exports = joinClasses; + +},{}],81:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule keyMirror + * @typechecks static-only + */ + +"use strict"; + +var invariant = require("./invariant"); + +/** + * Constructs an enumeration with keys equal to their value. + * + * For example: + * + * var COLORS = keyMirror({blue: null, red: null}); + * var myColor = COLORS.blue; + * var isColorValid = !!COLORS[myColor]; + * + * The last line could not be performed if the values of the generated enum were + * not equal to their keys. + * + * Input: {key1: val1, key2: val2} + * Output: {key1: key1, key2: key2} + * + * @param {object} obj + * @return {object} + */ +var keyMirror = function(obj) { + var ret = {}; + var key; + invariant( + obj instanceof Object && !Array.isArray(obj), + 'keyMirror(...): Argument must be an object.' + ); + for (key in obj) { + if (!obj.hasOwnProperty(key)) { + continue; + } + ret[key] = key; + } + return ret; +}; + +module.exports = keyMirror; + +},{"./invariant":78}],82:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule keyOf + */ + +/** + * Allows extraction of a minified key. Let's the build system minify keys + * without loosing the ability to dynamically use key strings as values + * themselves. Pass in an object with a single key/val pair and it will return + * you the string key of that single record. Suppose you want to grab the + * value for a key 'className' inside of an object. Key/val minification may + * have aliased that key to be 'xa12'. keyOf({className: null}) will return + * 'xa12' in that case. Resolve keys you want to use once at startup time, then + * reuse those resolutions. + */ +var keyOf = function(oneKeyObj) { + var key; + for (key in oneKeyObj) { + if (!oneKeyObj.hasOwnProperty(key)) { + continue; + } + return key; + } + return null; +}; + + +module.exports = keyOf; + +},{}],83:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule memoizeStringOnly + * @typechecks static-only + */ + +"use strict"; + +/** + * Memoizes the return value of a function that accepts one string argument. + * + * @param {function} callback + * @return {function} + */ +function memoizeStringOnly(callback) { + var cache = {}; + return function(string) { + if (cache.hasOwnProperty(string)) { + return cache[string]; + } else { + return cache[string] = callback.call(this, string); + } + }; +} + +module.exports = memoizeStringOnly; + +},{}],84:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule merge + */ + +"use strict"; + +var mergeInto = require("./mergeInto"); + +/** + * Shallow merges two structures into a return value, without mutating either. + * + * @param {?object} one Optional object with properties to merge from. + * @param {?object} two Optional object with properties to merge from. + * @return {object} The shallow extension of one by two. + */ +var merge = function(one, two) { + var result = {}; + mergeInto(result, one); + mergeInto(result, two); + return result; +}; + +module.exports = merge; + +},{"./mergeInto":86}],85:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule mergeHelpers + * + * requiresPolyfills: Array.isArray + */ + +"use strict"; + +var invariant = require("./invariant"); +var keyMirror = require("./keyMirror"); + +/** + * Maximum number of levels to traverse. Will catch circular structures. + * @const + */ +var MAX_MERGE_DEPTH = 36; + +/** + * We won't worry about edge cases like new String('x') or new Boolean(true). + * Functions are considered terminals, and arrays are not. + * @param {*} o The item/object/value to test. + * @return {boolean} true iff the argument is a terminal. + */ +var isTerminal = function(o) { + return typeof o !== 'object' || o === null; +}; + +var mergeHelpers = { + + MAX_MERGE_DEPTH: MAX_MERGE_DEPTH, + + isTerminal: isTerminal, + + /** + * Converts null/undefined values into empty object. + * + * @param {?Object=} arg Argument to be normalized (nullable optional) + * @return {!Object} + */ + normalizeMergeArg: function(arg) { + return arg === undefined || arg === null ? {} : arg; + }, + + /** + * If merging Arrays, a merge strategy *must* be supplied. If not, it is + * likely the caller's fault. If this function is ever called with anything + * but `one` and `two` being `Array`s, it is the fault of the merge utilities. + * + * @param {*} one Array to merge into. + * @param {*} two Array to merge from. + */ + checkMergeArrayArgs: function(one, two) { + invariant( + Array.isArray(one) && Array.isArray(two), + 'Critical assumptions about the merge functions have been violated. ' + + 'This is the fault of the merge functions themselves, not necessarily ' + + 'the callers.' + ); + }, + + /** + * @param {*} one Object to merge into. + * @param {*} two Object to merge from. + */ + checkMergeObjectArgs: function(one, two) { + mergeHelpers.checkMergeObjectArg(one); + mergeHelpers.checkMergeObjectArg(two); + }, + + /** + * @param {*} arg + */ + checkMergeObjectArg: function(arg) { + invariant( + !isTerminal(arg) && !Array.isArray(arg), + 'Critical assumptions about the merge functions have been violated. ' + + 'This is the fault of the merge functions themselves, not necessarily ' + + 'the callers.' + ); + }, + + /** + * Checks that a merge was not given a circular object or an object that had + * too great of depth. + * + * @param {number} Level of recursion to validate against maximum. + */ + checkMergeLevel: function(level) { + invariant( + level < MAX_MERGE_DEPTH, + 'Maximum deep merge depth exceeded. You may be attempting to merge ' + + 'circular structures in an unsupported way.' + ); + }, + + /** + * Checks that the supplied merge strategy is valid. + * + * @param {string} Array merge strategy. + */ + checkArrayStrategy: function(strategy) { + invariant( + strategy === undefined || strategy in mergeHelpers.ArrayStrategies, + 'You must provide an array strategy to deep merge functions to ' + + 'instruct the deep merge how to resolve merging two arrays.' + ); + }, + + /** + * Set of possible behaviors of merge algorithms when encountering two Arrays + * that must be merged together. + * - `clobber`: The left `Array` is ignored. + * - `indexByIndex`: The result is achieved by recursively deep merging at + * each index. (not yet supported.) + */ + ArrayStrategies: keyMirror({ + Clobber: true, + IndexByIndex: true + }) + +}; + +module.exports = mergeHelpers; + +},{"./invariant":78,"./keyMirror":81}],86:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule mergeInto + * @typechecks static-only + */ + +"use strict"; + +var mergeHelpers = require("./mergeHelpers"); + +var checkMergeObjectArg = mergeHelpers.checkMergeObjectArg; + +/** + * Shallow merges two structures by mutating the first parameter. + * + * @param {object} one Object to be merged into. + * @param {?object} two Optional object with properties to merge from. + */ +function mergeInto(one, two) { + checkMergeObjectArg(one); + if (two != null) { + checkMergeObjectArg(two); + for (var key in two) { + if (!two.hasOwnProperty(key)) { + continue; + } + one[key] = two[key]; + } + } +} + +module.exports = mergeInto; + +},{"./mergeHelpers":85}],87:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule mixInto + */ + +"use strict"; + +/** + * Simply copies properties to the prototype. + */ +var mixInto = function(constructor, methodBag) { + var methodName; + for (methodName in methodBag) { + if (!methodBag.hasOwnProperty(methodName)) { + continue; + } + constructor.prototype[methodName] = methodBag[methodName]; + } +}; + +module.exports = mixInto; + +},{}],88:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule objMapKeyVal + */ + +"use strict"; + +/** + * Behaves the same as `objMap` but invokes func with the key first, and value + * second. Use `objMap` unless you need this special case. + * Invokes func as: + * + * func(key, value, iteration) + * + * @param {?object} obj Object to map keys over + * @param {!function} func Invoked for each key/val pair. + * @param {?*} context + * @return {?object} Result of mapping or null if obj is falsey + */ +function objMapKeyVal(obj, func, context) { + if (!obj) { + return null; + } + var i = 0; + var ret = {}; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + ret[key] = func.call(context, key, obj[key], i++); + } + } + return ret; +} + +module.exports = objMapKeyVal; + +},{}],89:[function(require,module,exports){ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule throwIf + */ + +"use strict"; + +var throwIf = function(condition, err) { + if (condition) { + throw new Error(err); + } +}; + +module.exports = throwIf; + +},{}],90:[function(require,module,exports){ +(function(){/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule traverseAllChildren + */ + +"use strict"; + +var ReactComponent = require("./ReactComponent"); +var ReactTextComponent = require("./ReactTextComponent"); + +var invariant = require("./invariant"); + +/** + * TODO: Test that: + * 1. `mapChildren` transforms strings and numbers into `ReactTextComponent`. + * 2. it('should fail when supplied duplicate key', function() { + * 3. That a single child and an array with one item have the same key pattern. + * }); + */ + +/** + * @param {?*} children Children tree container. + * @param {!string} nameSoFar Name of the key path so far. + * @param {!number} indexSoFar Number of children encountered until this point. + * @param {!function} callback Callback to invoke with each child found. + * @param {?*} traverseContext Used to pass information throughout the traversal + * process. + * @return {!number} The number of children in this subtree. + */ +var traverseAllChildrenImpl = + function(children, nameSoFar, indexSoFar, callback, traverseContext) { + var subtreeCount = 0; // Count of children found in the current subtree. + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var nextName = nameSoFar + '[' + ReactComponent.getKey(child, i) + ']'; + var nextIndex = indexSoFar + subtreeCount; + subtreeCount += traverseAllChildrenImpl( + child, + nextName, + nextIndex, + callback, + traverseContext + ); + } + } else { + var type = typeof children; + var isOnlyChild = nameSoFar === ''; + // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows + var storageName = isOnlyChild ? + '[' + ReactComponent.getKey(children, 0) + ']' : + nameSoFar; + if (children === null || children === undefined || type === 'boolean') { + // All of the above are perceived as null. + callback(traverseContext, null, storageName, indexSoFar); + subtreeCount = 1; + } else if (children.mountComponentIntoNode) { + callback(traverseContext, children, storageName, indexSoFar); + subtreeCount = 1; + } else { + if (type === 'object') { + invariant( + children || children.nodeType !== 1, + 'traverseAllChildren(...): Encountered an invalid child; DOM ' + + 'elements are not valid children of React components.' + ); + for (var key in children) { + if (children.hasOwnProperty(key)) { + subtreeCount += traverseAllChildrenImpl( + children[key], + nameSoFar + '{' + key + '}', + indexSoFar + subtreeCount, + callback, + traverseContext + ); + } + } + } else if (type === 'string') { + var normalizedText = new ReactTextComponent(children); + callback(traverseContext, normalizedText, storageName, indexSoFar); + subtreeCount += 1; + } else if (type === 'number') { + var normalizedNumber = new ReactTextComponent('' + children); + callback(traverseContext, normalizedNumber, storageName, indexSoFar); + subtreeCount += 1; + } + } + } + return subtreeCount; + }; + +/** + * Traverses children that are typically specified as `props.children`, but + * might also be specified through attributes: + * + * - `traverseAllChildren(this.props.children, ...)` + * - `traverseAllChildren(this.props.leftPanelChildren, ...)` + * + * The `traverseContext` is an optional argument that is passed through the + * entire traversal. It can be used to store accumulations or anything else that + * the callback might find relevant. + * + * @param {?*} children Children tree object. + * @param {!function} callback To invoke upon traversing each child. + * @param {?*} traverseContext Context for traversal. + */ +function traverseAllChildren(children, callback, traverseContext) { + if (children !== null && children !== undefined) { + traverseAllChildrenImpl(children, '', 0, callback, traverseContext); + } +} + +module.exports = traverseAllChildren; + +})() +},{"./ReactComponent":23,"./ReactTextComponent":48,"./invariant":78}]},{},[22])(22) +}); +;
\ No newline at end of file diff --git a/frontend/delta/js/main.js b/frontend/delta/js/main.js new file mode 100644 index 0000000..6f8b497 --- a/dev/null +++ b/frontend/delta/js/main.js @@ -0,0 +1,62 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +function _pm_logEvent(anEvent) { +// console.log("####", anEvent); + + anEvent.preventDefault(); +} + +function handleGenericDeferredError(anError) { + var result; + + if (anError instanceof MochiKit.Async.CancelledError) { + result = anError; + } else { +MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); +//console.log(anError); + result = new MochiKit.Async.CancelledError(anError); + } + + return result; +} + + +Clipperz.PM.RunTime = {}; +function run() { + var parameters = {}; + + Clipperz.PM.Strings.Languages.initSetup(); + + + if ((window.location.search.indexOf('registration') != -1) || (window.location.hash.indexOf('registration') != -1)) { + parameters['shouldShowRegistrationForm'] = true; + } else { + parameters['shouldShowRegistrationForm'] = false; + } + + Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.MainController(); + Clipperz.PM.RunTime.mainController.run(parameters); +} + +MochiKit.DOM.addLoadEvent(run); diff --git a/frontend/delta/less/web.less b/frontend/delta/less/web.less new file mode 100644 index 0000000..9ecd96b --- a/dev/null +++ b/frontend/delta/less/web.less @@ -0,0 +1,9 @@ +@import "web/fonts"; +@import "web/overlay"; +@import "web/behavior"; +@import "web/style"; +@import "web/480"; +@import "web/768"; +@import "web/992"; + +@import "web/add2home";
\ No newline at end of file diff --git a/frontend/delta/less/web/480.less b/frontend/delta/less/web/480.less new file mode 100644 index 0000000..bd9b93b --- a/dev/null +++ b/frontend/delta/less/web/480.less @@ -0,0 +1,11 @@ +@media only screen and (min-width: 480px) { + .loginForm { + font-size: 1.2em; + + input { + } + button { + } + } +} + diff --git a/frontend/delta/less/web/768.less b/frontend/delta/less/web/768.less new file mode 100644 index 0000000..e8b8969 --- a/dev/null +++ b/frontend/delta/less/web/768.less @@ -0,0 +1,3 @@ +@media only screen and (min-width: 768px) { + +} diff --git a/frontend/delta/less/web/992.less b/frontend/delta/less/web/992.less new file mode 100644 index 0000000..ca83f77 --- a/dev/null +++ b/frontend/delta/less/web/992.less @@ -0,0 +1,2 @@ +@media only screen and (min-width: 992px) { +} diff --git a/frontend/delta/less/web/add2home.less b/frontend/delta/less/web/add2home.less new file mode 100644 index 0000000..ecff0b1 --- a/dev/null +++ b/frontend/delta/less/web/add2home.less @@ -0,0 +1,160 @@ +/** + * + * Main container + * + */ +#addToHomeScreen { + z-index:9999; + -webkit-user-select:none; + user-select:none; + -webkit-box-sizing:border-box; + box-sizing:border-box; + -webkit-touch-callout:none; + touch-callout:none; + width:240px; + font-size:15px; + padding:12px 14px; + text-align:left; + font-family:helvetica; + background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(0,#fff),color-stop(0.02,#eee),color-stop(0.98,#ccc),color-stop(1,#a3a3a3)); + border:1px solid #505050; + -webkit-border-radius:8px; + -webkit-background-clip:padding-box; + color:#333; + text-shadow:0 1px 0 rgba(255,255,255,0.75); + line-height:130%; + -webkit-box-shadow:0 0 4px rgba(0,0,0,0.5); +} + +#addToHomeScreen.addToHomeIpad { + width:268px; + font-size:18px; + padding:14px; +} + +/** + * + * The 'wide' class is added when the popup contains the touch icon + * + */ +#addToHomeScreen.addToHomeWide { + width:296px; +} + +#addToHomeScreen.addToHomeIpad.addToHomeWide { + width:320px; + font-size:18px; + padding:14px; +} + +/** + * + * The balloon arrow + * + */ +#addToHomeScreen .addToHomeArrow { + position:absolute; + background-image:-webkit-gradient(linear,0 0,100% 100%,color-stop(0,rgba(204,204,204,0)),color-stop(0.4,rgba(204,204,204,0)),color-stop(0.4,#ccc)); + border-width:0 1px 1px 0; + border-style:solid; + border-color:#505050; + width:16px; height:16px; + -webkit-transform:rotateZ(45deg); + bottom:-9px; left:50%; + margin-left:-8px; + -webkit-box-shadow:inset -1px -1px 0 #a9a9a9; + -webkit-border-bottom-right-radius:2px; +} + + +/** + * + * The balloon arrow for iPad + * + */ +#addToHomeScreen.addToHomeIpad .addToHomeArrow { + -webkit-transform:rotateZ(-135deg); + background-image:-webkit-gradient(linear,0 0,100% 100%,color-stop(0,rgba(238,238,238,0)),color-stop(0.4,rgba(238,238,238,0)),color-stop(0.4,#eee)); + -webkit-box-shadow:inset -1px -1px 0 #fff; + top:-9px; bottom:auto; left:50%; +} + + +/** + * + * Close button + * + */ +#addToHomeScreen .addToHomeClose { + -webkit-box-sizing:border-box; + position:absolute; + right:4px; + top:4px; + width:18px; + height:18px; line-height:14px; + text-align:center; + text-indent:1px; + -webkit-border-radius:9px; + background:rgba(0,0,0,0.12); + color:#707070; + -webkit-box-shadow:0 1px 0 #fff; + font-size:16px; +} + + +/** + * + * The '+' icon, displayed only on iOS < 4.2 + * + */ +#addToHomeScreen .addToHomePlus { + font-weight:bold; + font-size:1.3em; +} + + +/** + * + * The 'share' icon, displayed only on iOS >= 4.2 + * + */ +#addToHomeScreen .addToHomeShare { + display:inline-block; + width:18px; + height:15px; + background-repeat:no-repeat; + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAQAAADu6HTYAAADPElEQVR4Xq3TX2gcRRzA8e/M7mVv2+TSNpc/TZtrY6jUGqgaSAmEChKLrYK0YH0RFC2CSCkEfCghiKU04J8qNigq6os+iQV98MHWFwVBrQQRWs21lBw5cw3NNb1/udu72RGG5Y77IzXW77D7sAwf5scyYoL6BGXSDKFZwaGpLvIUaeoCkvX1MmsM0Ny6oRSQYOLuIS+YZOpfQdqslpUxcZrzTVAz4qPwW2O3CeIwC/RSzeY6Ow1QhUrkr+YOWfEKDkEP8Rij7CHKJmrFSDHBdwGEE5wiGChPN+PnT8VdRtEIl1d4gRj/1EVe5ZSBKGh8iqQpo/Fo5+3C/gz0MYg4zgwbqday1/Q4B8BGQ45d/Hi54lakCrU5obOcidJpu1+Lg9whjabyaOYLnrIBFFaRD+xe2ybMDWY66GmP/WA9cGfGp0CWhy0wkMN8inepFiH2rV1j0NQSNQbFLRQnS8/8YSDBBpadfv4CYDub2fmeHDNAsL1MBWUel0iA+Xik6eHcyvD3vAMSU1TGuA/YRS+dD7ovCQN43GKRFCU20Kd3V/avDVVyAZ5niTEuLA5/zBGWg9EEEhfJKN200Tat8CmRAQb9+wv7soPlHt2tQorsz1uPbr0HTY4sJwrH47zJZwABBAKLMBoQXepwgTwdHCo+fXMkQ4lrxEmQ5AaXipPqDY9V2vn09tgvTPI71EEGYxM+/uMJLJ4svpgaWGKOi/xKgmqLSUGSUd5f2vIVJ/CgBaTIUsZ7ZBsn0+NzfMOXLFCXQyTcybN6ep5ZZgUOHn7jpfUpsZshdugPGf+E5zjbyHTSRyQ8xfRPPM/s63RHeuknSoT22mjmmnAOIMkUZ6D1xSfPPAfd1WFKM3sO2CMaHx8M1NjnXKHaAGGkOW0C02WeYHUz4qMtx+w5gUDS8NckYe5lHsMYwCZEPyEEmjLDZFmAS7CDviMdxyTkMNVBKEmYLvbiQQBIBBbCQG04bGQvFWz6CfsCQLWCigILFwcfkGYBiOpbYuOizTAyYyDdCtrGaRG1LCkIgMYEFhI0WqQZoSlbGRyHKe4qOx7iv2bVQW9dp4dlM/x6kmwnWQcd/Q3FCqwTEiT5s+6D5v/pb0SSHyg7uhMWAAAAAElFTkSuQmCC); + background-size:18px 15px; + text-indent:-9999em; + overflow:hidden; +} + +#addToHomeScreen .addToHomeShare.addToHomeShareOS7 { + width:11px; + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAA8CAYAAAAQTCjdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAASCQAAEgkB80sG3AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKjSURBVGiB7dpPiFVVHMDxz7m9NCtMyI2bEJEC25WrEkzHUXCRraIwdNE8ZxfYIlcis1ZEbGEzT1QCF4XgH1CyWhUoJKIWNRGEiCNKmkSiYTzfcfGuOokx77x3ZlS8382959zfn+/invvn3RdijHIRBrwkOINCYXEcdjpb7VyiYdBsLScwt5y6IloYdzqXo36Ro0gY9IKWo+5JwmzBt2HQnBw9ehYNazyn5TBee8Dh+Vq+CWu92GufnkTDR6ab7gDeBNHouMM/l9tXTXM0fGBmL726Fg1Dam74EsvKqR8VNowL2Yzj5f7rnnE4DHq2235diYYhhTGfC94up35T0y+6di/ITU0rKVd+sEi0P7xr2pSJOu8zvF+OzqEv7vDH/WFxt7/cshy/ticsN8sXYUht0kXDOlsF9XJ4UaEvNoz9X3zc5bKaZThbyr5jzJ4wlNY7KTgM+ES0vhz+KeiPw36fKC/ucAF9uFBOrTZm26SJCtaV27+xIo7cXdkTEhvOoh+XyxprU1qnim7CQdGK2HAyKRexYVShT3RItDElN+mkjiP2Ym+S3f01hv2EVal5WW6hU0ElmptaqJuBpXg6MbeFH2LDpU6CQ93zWIKnEvs0cayGU3glMfkOo1jQYewZzOuyz7FC95Jwo5OgUFfgeg993hh/eTqCTxOSm/iuk8DY0Ap1b2GhtHXxsfZN4j/X0fOx4auEIknEhqv4OiUn1L13Z/+xWfWVaG4q0dxUormpRHNTieamEs1NJZqbJ1Q0jHvdiJo5S2cVjSNOCHZhn3/SnuYnIvl3yomIIz7MXZMn9hydRCrR3FSiualEc1OJ5qYSzU0lmptKNDePjWgwcPePT7/g+4cp8wCW4GXaryK3tL+mLdD5x62ppllgu7bso8q/2HIbzGWdNmWnSJwAAAAASUVORK5CYII=); + background-size:11px 15px; +} + +/** + * + * The touch icon (if available) + * + */ +#addToHomeScreen .addToHomeTouchIcon { + display:block; + float:left; + -webkit-border-radius:6px; + border-radius:6px; + -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.5), + inset 0 0 2px rgba(255,255,255,0.9); + box-shadow:0 1px 3px rgba(0,0,0,0.5), + inset 0 0 2px rgba(255,255,255,0.9); + background-repeat:no-repeat; + width:57px; height:57px; + -webkit-background-size:57px 57px; + background-size:57px 57px; + margin:0 12px 0 0; + border:1px solid #333; + -webkit-background-clip:padding-box; + background-clip:padding-box; +} diff --git a/frontend/delta/less/web/behavior.less b/frontend/delta/less/web/behavior.less new file mode 100644 index 0000000..f9d0a3c --- a/dev/null +++ b/frontend/delta/less/web/behavior.less @@ -0,0 +1,111 @@ +// https://github.com/h5bp/Effeckt.css + + +.slide () { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + + &.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + &.center { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + &.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: hidden; + display: none; + + &.transition { + visibility: visible; + display: block; + } + } + + &.transition { + -webkit-transition-duration: .25s; + transition-duration: .25s; + } +} + +// http://coenraets.org/blog/2013/03/hardware-accelerated-page-transitions-for-mobile-web-apps-phonegap-apps/ +.page { + position: absolute; + + top: 0; + left: 0; + width: 100%; + height: 100%; + + .slide(); +} + +/* +.registrationForm { + .steps { + .step { + position: absolute; + +// top: 0; +// left: 0; +// width: 100%; +// height: 100%; + + .slide(); + } + } +} +*/ + +//---------------------------------------------------------------------- +// tentative 3D transformations +/* +.page { + transform: rotateY( 0deg) translateZ( 100px); + + &.left { + transform: rotateY( -90deg) translateZ( 100px); + } + + &.center { + transform: rotateY( 0deg) translateZ( 100px); + } + + &.right { + transform: rotateY( 90deg) translateZ( 100px); + } +} + +#mainDiv { + width: 100%; + height: 100%; + position: absolute; + transform-style: preserve-3d; + + transition: transform 3s; + + &.show-front { transform: translateZ( -100px ) rotateY( 0deg ); } + &.show-back { transform: translateZ( -100px ) rotateX( -180deg ); } + &.show-right { transform: translateZ( -100px ) rotateY( -90deg ); } + &.show-left { transform: translateZ( -100px ) rotateY( 90deg ); } + &.show-top { transform: translateZ( -100px ) rotateX( -90deg ); } + &.show-bottom { transform: translateZ( -100px ) rotateX( 90deg ); } +} +*/ +//======================================================================= + + +//======================================================================= + + + + + + + +//======================================================== diff --git a/frontend/delta/less/web/fonts.less b/frontend/delta/less/web/fonts.less new file mode 100644 index 0000000..071ebba --- a/dev/null +++ b/frontend/delta/less/web/fonts.less @@ -0,0 +1,81 @@ +//======================================================================================== +// +// S o u r c e C o d e P r o +// + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 200; +// src: local('Source Code Pro ExtraLight'), local('SourceCodePro-ExtraLight'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqUMbjGELOEJD5J8DUmxkO-A.ttf) format('truetype'); + src: local('Source Code Pro ExtraLight'), local('SourceCodePro-ExtraLight'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAASvIAAAAOkNGRiC57zEmAABJNAAAxfVEU0lHN9HpJQABLAQAACBYR0RFRi8sL9AAARa0AAAA1EdQT1MeKxk7AAEivAAACQxHU1VC3Z7yFQABF4gAAAsyT1MvMnIMzrUAAAFQAAAAYGNtYXDp1MYJAAA/BAAAChBoZWFk++6HegAAAOwAAAA2aGhlYQaHAN8AAAEkAAAAJGhtdHjIHsvPAAEPLAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZYg91ZIAAAGwAAA9VHBvc3T/uAAzAABJFAAAACAAAQAAAAEEWtZRnFVfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/6v5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/q/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWADIAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwMJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAGgBFAAEAAAAAAAIABwBfAAEAAAAAAAMAKQBmAAEAAAAAAAQAGgBFAAEAAAAAAAUAOQCPAAEAAAAAAAYAGADIAAEAAAAAAAcAYADgAAEAAAAAAAgAGgFAAAEAAAAAAAkADAFaAAEAAAAAAAsAGQFmAAEAAAAAAA0R2QF/AAEAAAAAAA4AJBNYAAEAAAAAABAADxN8AAEAAAAAABEAChOLAAEAAAAAAQAAFhOVAAEAAAAAAQEACxOrAAEAAAAAAQIACxO2AAEAAAAAAQMAFRPBAAMAAQQJAAAAihPWAAMAAQQJAAEANBRgAAMAAQQJAAIADhSUAAMAAQQJAAMAUhSiAAMAAQQJAAQANBRgAAMAAQQJAAUAchT0AAMAAQQJAAYAMBVmAAMAAQQJAAcAwBWWAAMAAQQJAAgANBZWAAMAAQQJAAkAGBaKAAMAAQQJAAsAMhaiAAMAAQQJAA0jthbUAAMAAQQJAA4ASDqKAAMAAQQJABAAHjrSAAMAAQQJABEAFDrwAAMAAQQJAQAALDsEAAMAAQQJAQEAFjswAAMAAQQJAQIAFjtGAAMAAQQJAQMAKjtcQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIEV4dHJhTGlnaHRSZWd1bGFyMS4wMTc7QURCRTtTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHQ7QURPQkVWZXJzaW9uIDEuMDE3O1BTIDEuMDAwO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU5MDBTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9FeHRyYUxpZ2h0VHlwb2dyYXBoaWMgYWx0ZXJuYXRlc0FsdGVybmF0ZSBhQWx0ZXJuYXRlIGdBbHRlcm5hdGUgZG9sbGFyIHNpZ24AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AIABFAHgAdAByAGEATABpAGcAaAB0AFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBFAHgAdAByAGEATABpAGcAaAB0ADsAQQBEAE8AQgBFAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAxADcAOwBQAFMAIAAxAC4AMAAwADAAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADkAMAAwAFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBFAHgAdAByAGEATABpAGcAaAB0AFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZABQAGEAdQBsACAARAAuACAASAB1AG4AdABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgACgAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AKQAsACAAdwBpAHQAaAAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACAAJwBTAG8AdQByAGMAZQAnAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AIABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgANAAoADQAKAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4ADQAKAA0ACgBUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGMAbwBwAGkAZQBkACAAYgBlAGwAbwB3ACwAIABhAG4AZAAgAGkAcwAgAGEAbABzAG8AIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAgAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATAANAAoADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoAUwBJAEwAIABPAFAARQBOACAARgBPAE4AVAAgAEwASQBDAEUATgBTAEUAIABWAGUAcgBzAGkAbwBuACAAMQAuADEAIAAtACAAMgA2ACAARgBlAGIAcgB1AGEAcgB5ACAAMgAwADAANwANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgANAAoAUABSAEUAQQBNAEIATABFAA0ACgBUAGgAZQAgAGcAbwBhAGwAcwAgAG8AZgAgAHQAaABlACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACAAKABPAEYATAApACAAYQByAGUAIAB0AG8AIABzAHQAaQBtAHUAbABhAHQAZQAgAHcAbwByAGwAZAB3AGkAZABlACAAZABlAHYAZQBsAG8AcABtAGUAbgB0ACAAbwBmACAAYwBvAGwAbABhAGIAbwByAGEAdABpAHYAZQAgAGYAbwBuAHQAIABwAHIAbwBqAGUAYwB0AHMALAAgAHQAbwAgAHMAdQBwAHAAbwByAHQAIAB0AGgAZQAgAGYAbwBuAHQAIABjAHIAZQBhAHQAaQBvAG4AIABlAGYAZgBvAHIAdABzACAAbwBmACAAYQBjAGEAZABlAG0AaQBjACAAYQBuAGQAIABsAGkAbgBnAHUAaQBzAHQAaQBjACAAYwBvAG0AbQB1AG4AaQB0AGkAZQBzACwAIABhAG4AZAAgAHQAbwAgAHAAcgBvAHYAaQBkAGUAIABhACAAZgByAGUAZQAgAGEAbgBkACAAbwBwAGUAbgAgAGYAcgBhAG0AZQB3AG8AcgBrACAAaQBuACAAdwBoAGkAYwBoACAAZgBvAG4AdABzACAAbQBhAHkAIABiAGUAIABzAGgAYQByAGUAZAAgAGEAbgBkACAAaQBtAHAAcgBvAHYAZQBkACAAaQBuACAAcABhAHIAdABuAGUAcgBzAGgAaQBwACAAdwBpAHQAaAAgAG8AdABoAGUAcgBzAC4ADQAKAA0ACgBUAGgAZQAgAE8ARgBMACAAYQBsAGwAbwB3AHMAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAZAAgAGYAbwBuAHQAcwAgAHQAbwAgAGIAZQAgAHUAcwBlAGQALAAgAHMAdAB1AGQAaQBlAGQALAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGYAcgBlAGUAbAB5ACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABlAHkAIABhAHIAZQAgAG4AbwB0ACAAcwBvAGwAZAAgAGIAeQAgAHQAaABlAG0AcwBlAGwAdgBlAHMALgAgAFQAaABlACAAZgBvAG4AdABzACwAIABpAG4AYwBsAHUAZABpAG4AZwAgAGEAbgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAsACAAYwBhAG4AIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIABlAG0AYgBlAGQAZABlAGQALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABhAG4AZAAvAG8AcgAgAHMAbwBsAGQAIAB3AGkAdABoACAAYQBuAHkAIABzAG8AZgB0AHcAYQByAGUAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAYQBuAHkAIAByAGUAcwBlAHIAdgBlAGQAIABuAGEAbQBlAHMAIABhAHIAZQAgAG4AbwB0ACAAdQBzAGUAZAAgAGIAeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALgAgAFQAaABlACAAZgBvAG4AdABzACAAYQBuAGQAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALAAgAGgAbwB3AGUAdgBlAHIALAAgAGMAYQBuAG4AbwB0ACAAYgBlACAAcgBlAGwAZQBhAHMAZQBkACAAdQBuAGQAZQByACAAYQBuAHkAIABvAHQAaABlAHIAIAB0AHkAcABlACAAbwBmACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAGYAbwBuAHQAcwAgAG8AcgAgAHQAaABlAGkAcgAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAuAA0ACgANAAoARABFAEYASQBOAEkAVABJAE8ATgBTAA0ACgAiAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABzAGUAdAAgAG8AZgAgAGYAaQBsAGUAcwAgAHIAZQBsAGUAYQBzAGUAZAAgAGIAeQAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYQBuAGQAIABjAGwAZQBhAHIAbAB5ACAAbQBhAHIAawBlAGQAIABhAHMAIABzAHUAYwBoAC4AIABUAGgAaQBzACAAbQBhAHkAIABpAG4AYwBsAHUAZABlACAAcwBvAHUAcgBjAGUAIABmAGkAbABlAHMALAAgAGIAdQBpAGwAZAAgAHMAYwByAGkAcAB0AHMAIABhAG4AZAAgAGQAbwBjAHUAbQBlAG4AdABhAHQAaQBvAG4ALgANAAoADQAKACIAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABuAGEAbQBlAHMAIABzAHAAZQBjAGkAZgBpAGUAZAAgAGEAcwAgAHMAdQBjAGgAIABhAGYAdABlAHIAIAB0AGgAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAcwB0AGEAdABlAG0AZQBuAHQAKABzACkALgANAAoADQAKACIATwByAGkAZwBpAG4AYQBsACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAGMAbwBsAGwAZQBjAHQAaQBvAG4AIABvAGYAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAGEAcwAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGIAeQAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAuAA0ACgANAAoAIgBNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAG0AYQBkAGUAIABiAHkAIABhAGQAZABpAG4AZwAgAHQAbwAsACAAZABlAGwAZQB0AGkAbgBnACwAIABvAHIAIABzAHUAYgBzAHQAaQB0AHUAdABpAG4AZwAgAC0ALQAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUAIAAtAC0AIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAG8AZgAgAHQAaABlACAATwByAGkAZwBpAG4AYQBsACAAVgBlAHIAcwBpAG8AbgAsACAAYgB5ACAAYwBoAGEAbgBnAGkAbgBnACAAZgBvAHIAbQBhAHQAcwAgAG8AcgAgAGIAeQAgAHAAbwByAHQAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIAB0AG8AIABhACAAbgBlAHcAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQALgANAAoADQAKACIAQQB1AHQAaABvAHIAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcwBpAGcAbgBlAHIALAAgAGUAbgBnAGkAbgBlAGUAcgAsACAAcAByAG8AZwByAGEAbQBtAGUAcgAsACAAdABlAGMAaABuAGkAYwBhAGwAIAB3AHIAaQB0AGUAcgAgAG8AcgAgAG8AdABoAGUAcgAgAHAAZQByAHMAbwBuACAAdwBoAG8AIABjAG8AbgB0AHIAaQBiAHUAdABlAGQAIAB0AG8AIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFAARQBSAE0ASQBTAFMASQBPAE4AIAAmACAAQwBPAE4ARABJAFQASQBPAE4AUwANAAoAUABlAHIAbQBpAHMAcwBpAG8AbgAgAGkAcwAgAGgAZQByAGUAYgB5ACAAZwByAGEAbgB0AGUAZAAsACAAZgByAGUAZQAgAG8AZgAgAGMAaABhAHIAZwBlACwAIAB0AG8AIABhAG4AeQAgAHAAZQByAHMAbwBuACAAbwBiAHQAYQBpAG4AaQBuAGcAIABhACAAYwBvAHAAeQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAdABvACAAdQBzAGUALAAgAHMAdAB1AGQAeQAsACAAYwBvAHAAeQAsACAAbQBlAHIAZwBlACwAIABlAG0AYgBlAGQALAAgAG0AbwBkAGkAZgB5ACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAYQBuAGQAIABzAGUAbABsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAB1AG4AbQBvAGQAaQBmAGkAZQBkACAAYwBvAHAAaQBlAHMAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAAYwBvAG4AZABpAHQAaQBvAG4AcwA6AA0ACgANAAoAMQApACAATgBlAGkAdABoAGUAcgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG4AbwByACAAYQBuAHkAIABvAGYAIABpAHQAcwAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAIABjAG8AbQBwAG8AbgBlAG4AdABzACwAIABpAG4AIABPAHIAaQBnAGkAbgBhAGwAIABvAHIAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuAHMALAAgAG0AYQB5ACAAYgBlACAAcwBvAGwAZAAgAGIAeQAgAGkAdABzAGUAbABmAC4ADQAKAA0ACgAyACkAIABPAHIAaQBnAGkAbgBhAGwAIABvAHIAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABhAG4AZAAvAG8AcgAgAHMAbwBsAGQAIAB3AGkAdABoACAAYQBuAHkAIABzAG8AZgB0AHcAYQByAGUALAAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABlAGEAYwBoACAAYwBvAHAAeQAgAGMAbwBuAHQAYQBpAG4AcwAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAHAAeQByAGkAZwBoAHQAIABuAG8AdABpAGMAZQAgAGEAbgBkACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlAHMAZQAgAGMAYQBuACAAYgBlACAAaQBuAGMAbAB1AGQAZQBkACAAZQBpAHQAaABlAHIAIABhAHMAIABzAHQAYQBuAGQALQBhAGwAbwBuAGUAIAB0AGUAeAB0ACAAZgBpAGwAZQBzACwAIABoAHUAbQBhAG4ALQByAGUAYQBkAGEAYgBsAGUAIABoAGUAYQBkAGUAcgBzACAAbwByACAAaQBuACAAdABoAGUAIABhAHAAcAByAG8AcAByAGkAYQB0AGUAIABtAGEAYwBoAGkAbgBlAC0AcgBlAGEAZABhAGIAbABlACAAbQBlAHQAYQBkAGEAdABhACAAZgBpAGUAbABkAHMAIAB3AGkAdABoAGkAbgAgAHQAZQB4AHQAIABvAHIAIABiAGkAbgBhAHIAeQAgAGYAaQBsAGUAcwAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAbwBzAGUAIABmAGkAZQBsAGQAcwAgAGMAYQBuACAAYgBlACAAZQBhAHMAaQBsAHkAIAB2AGkAZQB3AGUAZAAgAGIAeQAgAHQAaABlACAAdQBzAGUAcgAuAA0ACgANAAoAMwApACAATgBvACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAdQBzAGUAIAB0AGgAZQAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACgAcwApACAAdQBuAGwAZQBzAHMAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuACAAcABlAHIAbQBpAHMAcwBpAG8AbgAgAGkAcwAgAGcAcgBhAG4AdABlAGQAIABiAHkAIAB0AGgAZQAgAGMAbwByAHIAZQBzAHAAbwBuAGQAaQBuAGcAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByAC4AIABUAGgAaQBzACAAcgBlAHMAdAByAGkAYwB0AGkAbwBuACAAbwBuAGwAeQAgAGEAcABwAGwAaQBlAHMAIAB0AG8AIAB0AGgAZQAgAHAAcgBpAG0AYQByAHkAIABmAG8AbgB0ACAAbgBhAG0AZQAgAGEAcwAgAHAAcgBlAHMAZQBuAHQAZQBkACAAdABvACAAdABoAGUAIAB1AHMAZQByAHMALgANAAoADQAKADQAKQAgAFQAaABlACAAbgBhAG0AZQAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAG8AcgAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABzAGgAYQBsAGwAIABuAG8AdAAgAGIAZQAgAHUAcwBlAGQAIAB0AG8AIABwAHIAbwBtAG8AdABlACwAIABlAG4AZABvAHIAcwBlACAAbwByACAAYQBkAHYAZQByAHQAaQBzAGUAIABhAG4AeQAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4ALAAgAGUAeABjAGUAcAB0ACAAdABvACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlACAAdABoAGUAIABjAG8AbgB0AHIAaQBiAHUAdABpAG8AbgAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAGEAbgBkACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AcgAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuACAAcABlAHIAbQBpAHMAcwBpAG8AbgAuAA0ACgANAAoANQApACAAVABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABtAG8AZABpAGYAaQBlAGQAIABvAHIAIAB1AG4AbQBvAGQAaQBmAGkAZQBkACwAIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACwAIABtAHUAcwB0ACAAYgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZQBuAHQAaQByAGUAbAB5ACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUALAAgAGEAbgBkACAAbQB1AHMAdAAgAG4AbwB0ACAAYgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAdQBuAGQAZQByACAAYQBuAHkAIABvAHQAaABlAHIAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAVABFAFIATQBJAE4AQQBUAEkATwBOAA0ACgBUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGIAZQBjAG8AbQBlAHMAIABuAHUAbABsACAAYQBuAGQAIAB2AG8AaQBkACAAaQBmACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAIABhAHIAZQAgAG4AbwB0ACAAbQBlAHQALgANAAoADQAKAEQASQBTAEMATABBAEkATQBFAFIADQAKAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAEkAUwAgAFAAUgBPAFYASQBEAEUARAAgACIAQQBTACAASQBTACIALAAgAFcASQBUAEgATwBVAFQAIABXAEEAUgBSAEEATgBUAFkAIABPAEYAIABBAE4AWQAgAEsASQBOAEQALAAgAEUAWABQAFIARQBTAFMAIABPAFIAIABJAE0AUABMAEkARQBEACwAIABJAE4AQwBMAFUARABJAE4ARwAgAEIAVQBUACAATgBPAFQAIABMAEkATQBJAFQARQBEACAAVABPACAAQQBOAFkAIABXAEEAUgBSAEEATgBUAEkARQBTACAATwBGACAATQBFAFIAQwBIAEEATgBUAEEAQgBJAEwASQBUAFkALAAgAEYASQBUAE4ARQBTAFMAIABGAE8AUgAgAEEAIABQAEEAUgBUAEkAQwBVAEwAQQBSACAAUABVAFIAUABPAFMARQAgAEEATgBEACAATgBPAE4ASQBOAEYAUgBJAE4ARwBFAE0ARQBOAFQAIABPAEYAIABDAE8AUABZAFIASQBHAEgAVAAsACAAUABBAFQARQBOAFQALAAgAFQAUgBBAEQARQBNAEEAUgBLACwAIABPAFIAIABPAFQASABFAFIAIABSAEkARwBIAFQALgAgAEkATgAgAE4ATwAgAEUAVgBFAE4AVAAgAFMASABBAEwATAAgAFQASABFACAAQwBPAFAAWQBSAEkARwBIAFQAIABIAE8ATABEAEUAUgAgAEIARQAgAEwASQBBAEIATABFACAARgBPAFIAIABBAE4AWQAgAEMATABBAEkATQAsACAARABBAE0AQQBHAEUAUwAgAE8AUgAgAE8AVABIAEUAUgAgAEwASQBBAEIASQBMAEkAVABZACwAIABJAE4AQwBMAFUARABJAE4ARwAgAEEATgBZACAARwBFAE4ARQBSAEEATAAsACAAUwBQAEUAQwBJAEEATAAsACAASQBOAEQASQBSAEUAQwBUACwAIABJAE4AQwBJAEQARQBOAFQAQQBMACwAIABPAFIAIABDAE8ATgBTAEUAUQBVAEUATgBUAEkAQQBMACAARABBAE0AQQBHAEUAUwAsACAAVwBIAEUAVABIAEUAUgAgAEkATgAgAEEATgAgAEEAQwBUAEkATwBOACAATwBGACAAQwBPAE4AVABSAEEAQwBUACwAIABUAE8AUgBUACAATwBSACAATwBUAEgARQBSAFcASQBTAEUALAAgAEEAUgBJAFMASQBOAEcAIABGAFIATwBNACwAIABPAFUAVAAgAE8ARgAgAFQASABFACAAVQBTAEUAIABPAFIAIABJAE4AQQBCAEkATABJAFQAWQAgAFQATwAgAFUAUwBFACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAATwBSACAARgBSAE8ATQAgAE8AVABIAEUAUgAgAEQARQBBAEwASQBOAEcAUwAgAEkATgAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAuAA0ACgBoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAC8AbABlAGcAYQBsAC4AaAB0AG0AbABTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBFAHgAdAByAGEATABpAGcAaAB0AFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARlTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHQAAQEBLvr2APr3Afr4DAD6+QL6+gP6+wSMDAF1/CT5Vvp8BRwvFQ8cMY8Rxx0AALOjEgLhAgABAAgADgAVABwAIwAqADEAOAA/AEYATQBUAFsAYgBpAHAAdwB9AIgAjgCYAJ4ApQCsALIAuAC/AMUAzwDWAN0A5ADrAPIA+QEAAQcBDgEZAR8BKQEwATYBPQFIAVMBWgFhAWUBawFyAXkBgwGKAZEBmAGfAaoBsQG3Ab0BxAHIAc8B1gHdAeQB6gHwAfcB/gIFAgwCEwIaAicCLgI1AjwCQwJKAlECWAJfAmQCawJyAnkCgAKHAo4ClAKaAqECqAKvArYCvALHAs4C1QLcAuMC6gLwAvcC/gMFAwwDEgMZAx8DJAMxAzgDPwNGA00DVANbA2IDaQNuA3UDfAODA4oDkQOXA50DqAOxA7cDwgPJA9AD1wPeA+QD7gP1A/wEAwQJBBAEFwQeBCUELAQzBDoEQQRIBE8EVgRdBGQEawRyBHgEgwSJBJMEmQSgBKcErQSzBLoEwATKBNEE2ATfBOYE7QT0BPsFAgUJBRQFGgUkBSsFMQU4BUMFTgVVBVwFYAVmBW0FdAV7BYIFiQWQBZkFpAWrBbcFvQXDBccFzgXVBdwF4wXqBfAF9gX9BgQGCwYSBh0GJAYrBjgGPwZGBk0GVAZbBmIGaQZwBnUGfAaDBooGkQaYBp8GpQasBrIGuQbABscGzQbYBt8G5gbtBvQG+gcBBwgHDwcWBx0HIwcqBzAHNQdCB0kHUAdXB14HZQdsB3MHegd/B4YHjQeUB5sHogeoB64HuQfCB8gH0wfaB+EH6AfvB/UH/wgGCA0IFAgbCCIIKQgwCDcIPghFCEwIUwhaCGEIaAhrCHMIewiICJAImwikCKwIswi8CMUIzgjXCOAI6QjyCPsJBAkNCRYJHwkoCTEJNAlBCUkJVQleCWYJbwl8CYUJjQmVCZ8JqAmxCbkJwwnNCdYJ3QnkCesJ8gn5CgMKCwoUChwKJQotCjUKPwpIClEKWQpjCm0KdgqECpMKngqoCrEKuQrBCssK1ArdCuUK7wr5CwILEAsfCyoLNAs9C0ULTQtXC2ALaQtxC3sLhQuOC5wLqwu2C8ALyQvRC9kL4wvsC/UL/QwHDBEMGgwoDDcMQgxMDFkMXwxlDGsMcQx3DH0MgwyJDI8MlQybDKEMpwytDLMMuQy/DMUMywzRDNcM3QzjDOkM7wz1DQANCw0XDR0NIw0nDS4NMg05DT8NQw1KDVENWA1fDWYNbQ13DX4Nhw2TDZsNpg2oDbANtw3CDcoN0Q3YDd8N6A3vDfYN/w4GDg0OFA4dDiQOKw4yDjkOQA5HDk4OVQ5cDmMOag5xDngOfw6GDo0OlA6bDqIOqQ6wDrcOvg7FDswO0w7aDuEO6A7zDvoPBQ8MDxcPHg8pDzAPOw9CD00PVA9fD2YPcQ94D4MPig+VD5wPpw+uD7kPwA/LD9IP2Q/gD+cP7g/1D/wQBxAOEBkQIBAnEDIQQRBMEFsQZhB1EIAQjxCaEKkQtBDDEM4Q3RDoEPcRAhERERwRKxE2EUURUBFfEWoReRGCEYsRkhGZEaMRrxG2Eb0RxBHLEdIR2RHgEecR7hH1EfwSAxIKEhESGBIfEiYSLRI0EjsSQhJJElASVxJeEmUSbBJzEnoSgRKIEo8SlhKdEqQSqxKyErkSwBLHEs4S1RLcEuMS6hLxEvgS/xMGEw0TFBMbEyITKRMwEzcTPhNFE0wTUxNaE2ETaBNvE3YTfROEE4sTkhOZE6ATpxOuE7UTvBPDE8oT0RPYE98T5hPtE/QT+xQCFAkUEBQXFB4UJRQsFDMUOhRBFEgUTxRWFF0UZBRrFHIUeRSAFIcUjhSVFJwUoxSqFLEUuBS/FMYUzRTUFNsU4hTpFPAU9xT+FQUVDBUTFRoVIRUoFS8VNhU9FUQVSxVSFVkVYBVnFW4VdRV8FYMVihWRFZgVnxWmFa0VtBW7FcIVyRXQFdcV3hXlFewV8xX6FgEWCBYPFhYWHRYiFoIWxxbhFvAW+kFtYWNyb25BYnJldmV1bmkwMUNEdW5pMUVBMHVuaTFFQTJ1bmkxRUE0dW5pMUVBNnVuaTFFQTh1bmkxRUFBdW5pMUVBQ3VuaTFFQUV1bmkxRUIwdW5pMUVCMnVuaTFFQjR1bmkxRUI2QW9nb25la3VuaTAyNDNDYWN1dGVDY2lyY3VtZmxleENjYXJvbkNkb3RhY2NlbnREY2Fyb251bmkxRTBDdW5pMUUwRURjcm9hdEVjYXJvbkVtYWNyb25FYnJldmVFZG90YWNjZW50dW5pMUVCOHVuaTFFQkF1bmkxRUJDdW5pMUVCRXVuaTFFQzB1bmkxRUMydW5pMUVDNHVuaTFFQzZFb2dvbmVrR2NpcmN1bWZsZXhHYnJldmVHZG90YWNjZW50dW5pMDEyMkdjYXJvbnVuaTFFMjB1bmkwMDQ3MDMwM0hjaXJjdW1mbGV4dW5pMUUyNHVuaTFFMkFIYmFySXRpbGRlSW1hY3JvbnVuaTAxMkNJZG90YWNjZW50dW5pMDFDRnVuaTFFQzh1bmkxRUNBSW9nb25la0pjaXJjdW1mbGV4dW5pMDEzNkxhY3V0ZUxjYXJvbnVuaTAxM0JMZG90dW5pMUUzNnVuaTFFMzh1bmkxRTNBdW5pMUU0Mk5hY3V0ZU5jYXJvbnVuaTAxNDV1bmkxRTQ0dW5pMUU0NnVuaTFFNDhPbWFjcm9udW5pMDE0RU9odW5nYXJ1bWxhdXR1bmkwMUQxdW5pMUVDQ3VuaTFFQ0V1bmkxRUQwdW5pMUVEMnVuaTFFRDR1bmkxRUQ2dW5pMUVEOE9ob3JudW5pMUVEQXVuaTFFREN1bmkxRURFdW5pMUVFMHVuaTFFRTJ1bmkwMUVBUmFjdXRlUmNhcm9udW5pMDE1NnVuaTFFNUF1bmkxRTVDdW5pMUU1RVNhY3V0ZVNjaXJjdW1mbGV4dW5pMDE1RXVuaTAyMTh1bmkxRTYwdW5pMUU2MnVuaTFFOUVUY2Fyb251bmkwMTYydW5pMDIxQXVuaTFFNkN1bmkxRTZFVXRpbGRlVW1hY3JvblVicmV2ZVVyaW5nVWh1bmdhcnVtbGF1dHVuaTAxRDN1bmkwMUQ1dW5pMDFEN3VuaTAxRDl1bmkwMURCdW5pMUVFNHVuaTFFRTZVb2dvbmVrVWhvcm51bmkxRUU4dW5pMUVFQXVuaTFFRUN1bmkxRUVFdW5pMUVGMFdncmF2ZVdhY3V0ZVdjaXJjdW1mbGV4V2RpZXJlc2lzWWdyYXZlWWNpcmN1bWZsZXh1bmkxRThFdW5pMUVGNHVuaTFFRjZ1bmkxRUY4WmFjdXRlWmRvdGFjY2VudHVuaTFFOTJ1bmkwMThGYW1hY3JvbmFicmV2ZXVuaTAxQ0V1bmkxRUExdW5pMUVBM3VuaTFFQTV1bmkxRUE3dW5pMUVBOXVuaTFFQUJ1bmkxRUFEdW5pMUVBRnVuaTFFQjF1bmkxRUIzdW5pMUVCNXVuaTFFQjdhb2dvbmVrdW5pMDE4MGNhY3V0ZWNjaXJjdW1mbGV4Y2Nhcm9uY2RvdGFjY2VudGRjYXJvbnVuaTFFMER1bmkxRTBGZGNyb2F0ZWNhcm9uZW1hY3JvbmVicmV2ZWVkb3RhY2NlbnR1bmkxRUI5dW5pMUVCQnVuaTFFQkR1bmkxRUJGdW5pMUVDMXVuaTFFQzN1bmkxRUM1dW5pMUVDN2VvZ29uZWtnY2lyY3VtZmxleGdicmV2ZWdkb3RhY2NlbnR1bmkwMTIzZ2Nhcm9udW5pMUUyMXVuaTAwNjcwMzAzaGNpcmN1bWZsZXh1bmkxRTI1dW5pMUUyQmhiYXJpdGlsZGVpbWFjcm9udW5pMDEyRHVuaTAxRDB1bmkxRUM5dW5pMUVDQmlvZ29uZWtpb2dvbmVrLmRqY2lyY3VtZmxleHVuaTAxMzdrZ3JlZW5sYW5kaWNsYWN1dGVsY2Fyb25sZG90dW5pMDEzQ3VuaTFFMzd1bmkxRTM5dW5pMUUzQnVuaTFFNDNuYWN1dGVuY2Fyb251bmkwMTQ2dW5pMUU0NXVuaTFFNDd1bmkxRTQ5bmFwb3N0cm9waGVvbWFjcm9udW5pMDE0Rm9odW5nYXJ1bWxhdXR1bmkwMUQydW5pMUVDRHVuaTFFQ0Z1bmkxRUQxdW5pMUVEM3VuaTFFRDV1bmkxRUQ3dW5pMUVEOW9ob3JudW5pMUVEQnVuaTFFRER1bmkxRURGdW5pMUVFMXVuaTFFRTN1bmkwMUVCcmFjdXRldW5pMDE1N3JjYXJvbnVuaTFFNUJ1bmkxRTVEdW5pMUU1RnNhY3V0ZXNjaXJjdW1mbGV4dW5pMDE1RnVuaTAyMTl1bmkxRTYxdW5pMUU2M3RjYXJvbnVuaTAxNjN1bmkwMjFCdW5pMUU2RHVuaTFFNkZ1bmkxRTk3dXRpbGRldW1hY3JvbnVicmV2ZXVyaW5ndWh1bmdhcnVtbGF1dHVuaTAxRDR1bmkwMUQ2dW5pMDFEOHVuaTAxREF1bmkwMURDdW5pMUVFNXVuaTFFRTd1b2dvbmVrdWhvcm51bmkxRUU5dW5pMUVFQnVuaTFFRUR1bmkxRUVGdW5pMUVGMXdncmF2ZXdhY3V0ZXdjaXJjdW1mbGV4d2RpZXJlc2lzeWdyYXZleWNpcmN1bWZsZXh1bmkxRThGdW5pMUVGNXVuaTFFRjd1bmkxRUY5emFjdXRlemRvdGFjY2VudHVuaTFFOTN1bmkwMjM3dW5pMDI1MHVuaTAyNTF1bmkwMjUydW5pMDI1OXVuaTAyNjF1bmkwMjY1dW5pMDI2RnVuaTAyNzl1bmkwMjg3dW5pMDI4Q3VuaTAyOER1bmkwMjhFdW5pMDI5RWEuYWFncmF2ZS5hYWFjdXRlLmFhY2lyY3VtZmxleC5hYXRpbGRlLmFhZGllcmVzaXMuYWFtYWNyb24uYWFicmV2ZS5hYXJpbmcuYXVuaTAxQ0UuYXVuaTFFQTEuYXVuaTFFQTMuYXVuaTFFQTUuYXVuaTFFQTcuYXVuaTFFQTkuYXVuaTFFQUIuYXVuaTFFQUQuYXVuaTFFQUYuYXVuaTFFQjEuYXVuaTFFQjMuYXVuaTFFQjUuYXVuaTFFQjcuYWFvZ29uZWsuYWcuYWdjaXJjdW1mbGV4LmFnYnJldmUuYWdkb3RhY2NlbnQuYXVuaTAxMjMuYWdjYXJvbi5hdW5pMUUyMS5hdW5pMDA2NzAzMDMuYXplcm8ub251bW9uZS5vbnVtdHdvLm9udW10aHJlZS5vbnVtZm91ci5vbnVtZml2ZS5vbnVtc2l4Lm9udW1zZXZlbi5vbnVtZWlnaHQub251bW5pbmUub251bXVuaTAwQUR1bmkyMDE1dW5pMjExN3VuaTIxMjBhdC5jYXNlYXN0ZXJpc2suYWh5cGhlbi5hdW5pMDBBRC5hZG9sbGFyLmF6ZXJvLnN1cHNvbmUuc3Vwc3R3by5zdXBzdGhyZWUuc3Vwc2ZvdXIuc3Vwc2ZpdmUuc3Vwc3NpeC5zdXBzc2V2ZW4uc3Vwc2VpZ2h0LnN1cHNuaW5lLnN1cHNwYXJlbmxlZnQuc3Vwc3BhcmVucmlnaHQuc3Vwc3BlcmlvZC5zdXBzY29tbWEuc3Vwc3plcm8uc3Vic29uZS5zdWJzdHdvLnN1YnN0aHJlZS5zdWJzZm91ci5zdWJzZml2ZS5zdWJzc2l4LnN1YnNzZXZlbi5zdWJzZWlnaHQuc3Vic25pbmUuc3Vic3BhcmVubGVmdC5zdWJzcGFyZW5yaWdodC5zdWJzcGVyaW9kLnN1YnNjb21tYS5zdWJzemVyby5kbm9tb25lLmRub210d28uZG5vbXRocmVlLmRub21mb3VyLmRub21maXZlLmRub21zaXguZG5vbXNldmVuLmRub21laWdodC5kbm9tbmluZS5kbm9tcGFyZW5sZWZ0LmRub21wYXJlbnJpZ2h0LmRub21wZXJpb2QuZG5vbWNvbW1hLmRub216ZXJvLm51bXJvbmUubnVtcnR3by5udW1ydGhyZWUubnVtcmZvdXIubnVtcmZpdmUubnVtcnNpeC5udW1yc2V2ZW4ubnVtcmVpZ2h0Lm51bXJuaW5lLm51bXJwYXJlbmxlZnQubnVtcnBhcmVucmlnaHQubnVtcnBlcmlvZC5udW1yY29tbWEubnVtcm9yZGZlbWluaW5lLmFhLnN1cHNiLnN1cHNjLnN1cHNkLnN1cHNlLnN1cHNmLnN1cHNnLnN1cHNoLnN1cHNpLnN1cHNqLnN1cHNrLnN1cHNsLnN1cHNtLnN1cHNuLnN1cHNvLnN1cHNwLnN1cHNxLnN1cHNyLnN1cHNzLnN1cHN0LnN1cHN1LnN1cHN2LnN1cHN3LnN1cHN4LnN1cHN5LnN1cHN6LnN1cHNlZ3JhdmUuc3Vwc2VhY3V0ZS5zdXBzdW5pMDI1OS5zdXBzYS5zdXBhZy5zdXBhRXVyb3VuaTAxOTJsaXJhdW5pMjBBNnBlc2V0YWRvbmd1bmkyMEIxdW5pMjBCMnVuaTIwQjV1bmkyMEI5dW5pMjBCQXVuaTIyMTVzbGFzaC5mcmFjdW5pMjIxOWxlc3NlcXVhbGdyZWF0ZXJlcXVhbG5vdGVxdWFsYXBwcm94ZXF1YWxwaWluZmluaXR5dW5pMDBCNXBhcnRpYWxkaWZmaW50ZWdyYWxyYWRpY2FsdW5pMjIwNnVuaTIxMjZzdW1tYXRpb25wcm9kdWN0dW5pMjExM2VzdGltYXRlZHVuaTIxOTBhcnJvd3VwdW5pMjE5MmFycm93ZG93bnVuaTI1QTB1bmkyNUM2dW5pMjVDOXVuaTI3NTJ0cmlhZ3VwdW5pMjVCM3VuaTI1QjZ1bmkyNUI3dHJpYWdkbnVuaTI1QkR1bmkyNUMwdW5pMjVDMXVuaTI2MTB1bmkyNjExdW5pMjcxM3VuaTI2NkFsb3plbmdldW5pMjAzMnVuaTIwMzN1bmkwMkJCdW5pMDJCQ3VuaTAyQkV1bmkwMkJGdW5pMDJDOHVuaTAyQzl1bmkwMkNBdW5pMDJDQnVuaTAyQ0N1bmkwMzAwdW5pMDMwMC5jYXB1bmkwMzAxdW5pMDMwMS5jYXB1bmkwMzAydW5pMDMwMi5jYXB1bmkwMzAzdW5pMDMwMy5jYXB1bmkwMzA0dW5pMDMwNC5jYXB1bmkwMzA2dW5pMDMwNi5jYXB1bmkwMzA3dW5pMDMwNy5jYXB1bmkwMzA4dW5pMDMwOC5jYXB1bmkwMzA5dW5pMDMwOS5jYXB1bmkwMzBBdW5pMDMwQS5jYXB1bmkwMzBCdW5pMDMwQi5jYXB1bmkwMzBDdW5pMDMwQy5jYXB1bmkwMzBGdW5pMDMwRi5jYXB1bmkwMzEydW5pMDMxM3VuaTAzMUJ1bmkwMzIzdW5pMDMyNHVuaTAzMjZ1bmkwMzI3dW5pMDMyNy5jYXB1bmkwMzI4dW5pMDMyOC5jYXB1bmkwMzJFdW5pMDMzMXVuaTAzMDgwMzA0dW5pMDMwODAzMDQuY2FwdW5pMDMwODAzMDF1bmkwMzA4MDMwMS5jYXB1bmkwMzA4MDMwQ3VuaTAzMDgwMzBDLmNhcHVuaTAzMDgwMzAwdW5pMDMwODAzMDAuY2FwdW5pMDMwMjAzMDF1bmkwMzAyMDMwMS5jYXB1bmkwMzAyMDMwMHVuaTAzMDIwMzAwLmNhcHVuaTAzMDIwMzA5dW5pMDMwMjAzMDkuY2FwdW5pMDMwMjAzMDN1bmkwMzAyMDMwMy5jYXB1bmkwMzA2MDMwMXVuaTAzMDYwMzAxLmNhcHVuaTAzMDYwMzAwdW5pMDMwNjAzMDAuY2FwdW5pMDMwNjAzMDl1bmkwMzA2MDMwOS5jYXB1bmkwMzA2MDMwM3VuaTAzMDYwMzAzLmNhcHVuaTAzMDIwMzA2dW5pMDMwMjAzMDYuY2FwdW5pMDMwQy5hdW5pMDMyNi5hdW5pMDBBMHVuaTIwMDdzcGFjZS5mcmFjbmJzcGFjZS5mcmFjdW5pMjUwMHVuaTI1MDF1bmkyNTAydW5pMjUwM3VuaTI1MDR1bmkyNTA1dW5pMjUwNnVuaTI1MDd1bmkyNTA4dW5pMjUwOXVuaTI1MEF1bmkyNTBCdW5pMjUwQ3VuaTI1MER1bmkyNTBFdW5pMjUwRnVuaTI1MTB1bmkyNTExdW5pMjUxMnVuaTI1MTN1bmkyNTE0dW5pMjUxNXVuaTI1MTZ1bmkyNTE3dW5pMjUxOHVuaTI1MTl1bmkyNTFBdW5pMjUxQnVuaTI1MUN1bmkyNTFEdW5pMjUxRXVuaTI1MUZ1bmkyNTIwdW5pMjUyMXVuaTI1MjJ1bmkyNTIzdW5pMjUyNHVuaTI1MjV1bmkyNTI2dW5pMjUyN3VuaTI1Mjh1bmkyNTI5dW5pMjUyQXVuaTI1MkJ1bmkyNTJDdW5pMjUyRHVuaTI1MkV1bmkyNTJGdW5pMjUzMHVuaTI1MzF1bmkyNTMydW5pMjUzM3VuaTI1MzR1bmkyNTM1dW5pMjUzNnVuaTI1Mzd1bmkyNTM4dW5pMjUzOXVuaTI1M0F1bmkyNTNCdW5pMjUzQ3VuaTI1M0R1bmkyNTNFdW5pMjUzRnVuaTI1NDB1bmkyNTQxdW5pMjU0MnVuaTI1NDN1bmkyNTQ0dW5pMjU0NXVuaTI1NDZ1bmkyNTQ3dW5pMjU0OHVuaTI1NDl1bmkyNTRBdW5pMjU0QnVuaTI1NEN1bmkyNTREdW5pMjU0RXVuaTI1NEZ1bmkyNTUwdW5pMjU1MXVuaTI1NTJ1bmkyNTUzdW5pMjU1NHVuaTI1NTV1bmkyNTU2dW5pMjU1N3VuaTI1NTh1bmkyNTU5dW5pMjU1QXVuaTI1NUJ1bmkyNTVDdW5pMjU1RHVuaTI1NUV1bmkyNTVGdW5pMjU2MHVuaTI1NjF1bmkyNTYydW5pMjU2M3VuaTI1NjR1bmkyNTY1dW5pMjU2NnVuaTI1Njd1bmkyNTY4dW5pMjU2OXVuaTI1NkF1bmkyNTZCdW5pMjU2Q3VuaTI1NkR1bmkyNTZFdW5pMjU2RnVuaTI1NzB1bmkyNTcxdW5pMjU3MnVuaTI1NzN1bmkyNTc0dW5pMjU3NXVuaTI1NzZ1bmkyNTc3dW5pMjU3OHVuaTI1Nzl1bmkyNTdBdW5pMjU3QnVuaTI1N0N1bmkyNTdEdW5pMjU3RXVuaTI1N0Z1bmkyNTgwdW5pMjU4MXVuaTI1ODJ1bmkyNTgzdW5pMjU4NHVuaTI1ODV1bmkyNTg2dW5pMjU4N3VuaTI1ODh1bmkyNTg5dW5pMjU4QXVuaTI1OEJ1bmkyNThDdW5pMjU4RHVuaTI1OEV1bmkyNThGdW5pMjU5MHVuaTI1OTF1bmkyNTkydW5pMjU5M3VuaTI1OTR1bmkyNTk1dW5pMjU5NnVuaTI1OTd1bmkyNTk4dW5pMjU5OXVuaTI1OUF1bmkyNTlCdW5pMjU5Q3VuaTI1OUR1bmkyNTlFdW5pMjU5RnVuaTAyNTh1bmkwMjU0MS4wMDBTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5Db3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIElu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+wUGCxX3Ban7BQYLyv//yYAAuQt3AfcwqQup96SnCxX3wKn7ovkjbQYL97AB/wEVgAC4Awv7LKL4H6P4H6IBC/fA+UFt/SP7ogYL+Vylx+kB91KlAwt7CvexCwf7IHw1+xD7UhoLpRLRqwu5+My5C6n3KqkLAAAAAlgAVAAAADIAdwBKAGQAhACcAD0AXABwAGIAegCcAF8AYAA4AHwAPAB8AFAAMgBcAEEADwBTADgASABgAG4AWgBGAFAAeABYAG4AZABCAIIAYQBQAG4ARgBuAEYAqgBXAFQAWgBCAAwAVgBAAEgAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAAACoASgBKAEoASgBKAGQAZABkABwAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAD0APQA9AD0APQA9AD0AXABcAFwAEABwAHAAcABwAHAAcABwAHAAcABwAHAAcABiAHoAmgCcAJwAnACcAEwAnABFAF8AYABgAGAAYABgAGAAYAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgALAA4ADgAOAA4ADgAOAA4AHwAfAB8AHwAfAB8AFAAUABQAFAAUABQAFAAWgAyADIAMgAyADIAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAA8ADwAPAA8AOAA4ADgAOAA4ADgAOAA4AEgASABIAEgAHAB8AEIAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAARACAAWgBaAFoAWgBaAEYARgBGAEYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFgAWABYAFgAWABYAFgAIABuAG4AIABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAEIAggCCAGEAYQBDAGEAYQBhAGEAYQBQAG4AbgBuAG4AbgBuAG7//gBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYACgBGAEYARgBGAEYARgBGAKoAgACqAJ4AngBWAFcAVwBXAFcAVwBXAFcAbgBUAFQAVABUAFQAVABaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoADAAMAAwADABAAEAAQABAAEAAQABAAEAASABIAEgASABGAG4AQgBwAEYAbgBEAEYAUABGAFoAOgBIADoAQgAMAEAAJABYAF0ARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgA5AFQAcABTAEYAKwBAAFoATABKAE4AVABwAFMARgArAEAAXABMAEoATgD4ANAA+ADQADoA+AD4AHYAigEMAKgA5gDmAIIAggDmAIIA1wDjAHMAfwBiAGIAUAAUAFAAFAD4AKQAPADmAHYA9gBeAIQAXgB4AR4AeAEeAGUAngCeAGoAXAAoACgAeAACACIAQABAAGQAeQCOAI4AZgCoANoAugCyALQAsgC6ALsAtgC0AP4A4AEMAQIAqADaALoAsgC0ALIAugC7ALYAtAD+AOABDAECAKgA2gC6ALIAtACyALwAuwC2ALQA/gDgAQwBAgCoANoAugCyALQAsgC6ALsAtgC0AP4A4AEMAQIAsgCQAJYAsgC6AL0AkACqANIAogC+ALQAkgDUAM8AjwC+AJYAugCQAQsArwCvAKoAqwBRALwAlACOAKoAqgCgAJAAkAC+AEwAZgBSAEYARAB+ADQAbgBUAD4APAB8ADwAYgBuAHsASAAmACYAJgAcAD4AJgAmACYAJgAmACYAJgAmACYAYgBiAHQAYgDyAGIAfAByAGIAYgBiAIQAYgBgAGAAYgA8AAQAWgBaANkAVgA2ACoATgBKAJYAGgAUACIAHAAiANkAswCIALYAMQAxAFMAUwAxADEALQAt/+r/6gACAGEAcgEWANYA5gDmAP8A4wDcAPgAwADAAQ0AvgD2ANoBDQC2ALQAvgC4AN4A4AEEAPAA+gDcAMIA+AEMAMAAvgC2ALAAvgC+ALgAvAEEAQoAtADAAPoA+gDeAN4A4ADWAMAAvgCMAIwBBAEEASQBBADAAOYA5gDeAPoA/AC4ALwAvAC+AMAAwADAAL4AwADAAMoAxADKAMQAygDEALYAtgC4AL4AuAC+ALgAvgC2ALYAwgC+AQ4A9AAAAAAAAAAA//H/8QEdAQ4AIQAhAR0BDgASABIBHQEOAR0BHQEOAQ7/8f/x//H/8QEdAR0BDgEO//H/8f/x//EBHQEdAQ4BDgEOAQ4BDgEO//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//EASwBLAR0BDv/xAP8BHQD/AP//8f/x//EBHQD/AP//8f/x//EBHQD/AP//8f/x//H/8f/x//H/8f/x//H/8f/x//EBHf/x//EBHf/x//H/8f/xAR0BHQEd//EBDgEdAQ7/8QEO//EBDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAAAAAAAAAINAAABLAAAAAAAAAAAAAABLAAAAAAAAQAAAAwAAAAAAL4AAgAdAAIANQABAEsATAABAGcAZwABAG4AbgACAH4AfgABAKEAowABAKkAqQABAM0AzgABAOYA5gABAPwA/AABAQQBBAACARgBGAABARwBHAACAR8BHwACAS4BLgACAS8BMAABATUBNQACAVUBVwABAV0BXQABAWwBbAACAYIBgwABAZoBqgABAa0BrQABAcMBxAABAcgByAACAs0CzQABAtcC1wABAt0DHAADAx4DHgADAAIAAwLdAvgAAQMDAxwAAQMeAx4AAQABAAAACgBsAhoAAkRGTFQADmxhdG4AOAAEAAAAAP//ABAAAAACAAQABgAIAAoADAAOABAAEgAUABYAGAAaABwAHgAEAAAAAP//ABAAAQADAAUABwAJAAsADQAPABEAEwAVABcAGQAbAB0AHwAgYWFsdADCYWFsdADKY2FzZQDSY2FzZQDYY2NtcADeY2NtcADsZG5vbQD6ZG5vbQEAZnJhYwEGZnJhYwEQbnVtcgEabnVtcgEgb251bQEmb251bQEsb3JkbgEyb3JkbgE4c2FsdAE+c2FsdAFKc2luZgFWc2luZgFcc3MwMQFic3MwMQFoc3MwMgFuc3MwMgF0c3MwMwF6c3MwMwGAc3MwNAGGc3MwNAGMc3VicwGSc3VicwGYc3VwcwGec3VwcwGmAAAAAgAAAAEAAAACAAAAAQAAAAEAEAAAAAEAEAAAAAUAAwAEAAUABgAHAAAABQADAAQABQAGAAcAAAABAAkAAAABAAkAAAADAAgACgALAAAAAwAIAAoACwAAAAEACAAAAAEACAAAAAEADwAAAAEADwAAAAEADAAAAAEADAAAAAQAEQASABMAFAAA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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 300; +// src: local('Source Code Pro Light'), local('SourceCodePro-Light'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqcw1o1eFRj7wYC6JbISqOjY.ttf) format('truetype'); + src: local('Source Code Pro Light'), local('SourceCodePro-Light'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAATmEAAAAOkNGRiCTrBH5AABI+AAA0/1EU0lHvkvMtAABOcAAACBYR0RFRi8sL9AAASSAAAAA1EdQT1NNQOJiAAEwiAAACPpHU1VC3Z7yFQABJVQAAAsyT1MvMnJwz7UAAAFQAAAAYGNtYXDp1MYJAAA+yAAAChBoZWFk++2HegAAAOwAAAA2aGhlYQaGAN8AAAEkAAAAJGhtdHjAa8POAAEc+AAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZdEIqPsAAAGwAAA9GHBvc3T/uAAzAABI2AAAACAAAQAAAAEEWjTEiMVfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/6f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/p/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAEsAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwQJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFQBFAAEAAAAAAAIABwBaAAEAAAAAAAMAJABhAAEAAAAAAAQAFQBFAAEAAAAAAAUAOQCFAAEAAAAAAAYAEwC+AAEAAAAAAAcAYADRAAEAAAAAAAgAGgExAAEAAAAAAAkADAFLAAEAAAAAAAsAGQFXAAEAAAAAAA0R2QFwAAEAAAAAAA4AJBNJAAEAAAAAABAADxNtAAEAAAAAABEABRN8AAEAAAAAAQAAFhOBAAEAAAAAAQEACxOXAAEAAAAAAQIACxOiAAEAAAAAAQMAFROtAAMAAQQJAAAAihPCAAMAAQQJAAEAKhRMAAMAAQQJAAIADhR2AAMAAQQJAAMASBSEAAMAAQQJAAQAKhRMAAMAAQQJAAUAchTMAAMAAQQJAAYAJhU+AAMAAQQJAAcAwBVkAAMAAQQJAAgANBYkAAMAAQQJAAkAGBZYAAMAAQQJAAsAMhZwAAMAAQQJAA0jthaiAAMAAQQJAA4ASDpYAAMAAQQJABAAHjqgAAMAAQQJABEACjq+AAMAAQQJAQAALDrIAAMAAQQJAQEAFjr0AAMAAQQJAQIAFjsKAAMAAQQJAQMAKjsgQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIExpZ2h0UmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1MaWdodDtBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tTGlnaHRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9MaWdodFR5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAATABpAGcAaAB0AFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBMAGkAZwBoAHQAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEwAaQBnAGgAdABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8ATABpAGcAaAB0AFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCm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8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBMaWdodFNvdXJjZSBDb2RlIFBy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9z/3YXWfBQuxAda39/S3A/esCxVjp3Spqaeisx4L+TrrChWpBq8LXV+IHwufUI0eCwAAAAJYAE4AAAAtAHMASABgAH8AlgA7AFkAawBdAHMAlgBbAFwANgB2ADkAdQBMADAAWQA7AA4ASwAzAEYAXABpAFcAQwBNAHMAVABpAGEAPwB7AF0ASwBpAEMAaQBDAKMAUwBQAFcAPgALAFAAPABIAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0AAAAmAEgASABIAEgASABgAGAAYAAZAH8AfwB/AH8AfwB/AH8AfwB/AH8AfwB/AH8AfwB/AH8AfwA7ADsAOwA7ADsAOwA7AFkAWQBZAA4AawBrAGsAawBrAGsAawBrAGsAawBrAGsAXQBzAJYAlgCWAJYAlgBJAJYAQQBbAFwAXABcAFwAXABcAFwANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ACkANgA2ADYANgA2ADYANgB1AHUAdQB1AHUAdQBMAEwATABMAEwATABMAFcAMAAwADAAMAAwAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQAOAA4ADgAOADMAMwAzADMAMwAzADMAMwBGAEYARgBGABkAdgBBAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAEQAdAFcAVwBXAFcAVwBAAEMAQwBDAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBUAFQAVABUAFQAVABUABoAaQBpAB0AYQBhAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQA/AHsAewBdAF0APABdAF0AXQBdAF0ASwBpAGkAaQBpAGkAaQBp//kAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAAoAQwBDAEMAQwBDAEMAQwCjAH0AowCYAJgAUwBTAFMAUwBTAFMAUwBTAGgAUABQAFAAUABQAFAAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAAsACwALAAsAPAA8ADwAPAA8ADwAPAA8AEgASABIAEgAQwBpAD8AawBDAGkAQgBEAE0AQwBWADcARgA5AD4ACwA8ACEATgBTAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMANQBRAGwATwBDACoAPgBWAEoASABLAFEAbABPAEMAKgA+AFgASgBIAEsA8ADNAPAAzQAzAPIA8gB0AIYBBgCeAOAA4wB4AHsA4wB7ANIA3wBqAHcAXwBfAFAAFABQABQA8AChADwA4AB3APAAXwCBAF8AcgEYAHIBGABgAJYAlgBmAFcAJQAlAHYAAAAdADwAPABgAHQAjACMAGEApgDXALcAsACyALAAtwC6ALQAsgD5AN0BCAD+AKYA1wC3ALAAsgCwALcAugC0ALIA+QDdAQgA/gCmANcAtgCwALIAsAC5ALoAtACyAPkA3QEIAP4ApgDXALcAsACyALAAtwC6ALQAsgD5AN0BCAD+AK8AjgCUAK8AtgC7AI4ApwDPAJ4AugCzAJAAzgDMAIwAugCUALYAjgEFAKsArACnAKUAUQC0AJIAjwCnAKcAngCOAI4AugBHAGEAUQBBAEEAegAzAGoAUgA6ADcAeAA3AF4AagB3AEQAIwAjACMAGwA6ACMAIwAmACMAIwAjACMAIwAjAF8AXwBwAF8A6wBfAHsAcABfAF8AXwB+AF8AWwBbAF8ANgACAFcAVgDQAFAAMQAmAEwARACNABoAEwAiABwAIgDVAK4AgwCyAC4ALgBQAFAALgAuACoAKv/p/+kAAABcAG4BEADJAOAA4wD8AOEA0wD0ALkAuQEHALsA8wDRAQcAsACsALsAtADaANoA/QDrAPYA0wC7APQBBwC5ALcAsACqALsAugC0ALkA/QEEAKwAuQD2APYA2gDaANoA0AC5ALcAgwCDAQEBAgEkAP0AuQDiAOIA2wD2APcAtQC5ALkAugC6ALoAugC3ALoAugDFAL0AxQC9AMUAvQCzALIAtQC7ALUAuwC1ALsAswCyAL0AuwEMAPAAAAAAAAAAAP/q/+oBFgEBACEAIQEWAQEAEgASARYBAQEWARYBAQEB/+r/6v/q/+oBFgEWAQEBAf/q/+r/6v/qARYBFgEBAQEBAQEBAQEBAf/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q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AaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSAMYA2ADeAOQA6gDGAPAA9gD8AMYBAgDGAQgBDgECARQBGgDqAOoAxgEgAMYBCAEmASwBMgE4AT4BRAFKAVABVgFWAVwBYgFoAW4AwAF0AXoBgAGGAYwBkgGYAMAAwAGeAW4AxgGkANgAxgDqAaoA6gDGAOoAxgEIASYBPgGwAbAAwAG2AMAAwAGSAZIBLAGwAbwBngHCAcgBzgGGAdQB2gHgAeYB7AGYAMAB8gH4AZ4BngH+AgQCCgABASwB9gABASwCqQABAScCqQABAVcCqQABAVACqQABAVoCqQABAUwCqQABASsCqQABAUACqQABAUcCqQABALsCqQABATICqQABATwCqQABASsCtAABATkCqQABASoCqQABAS0CqQABAT0B9gABAIMC2gABAVgB9gABAcYC2gABATwB9gABAagC5AABATUB9gABAJcC2gABAV0CpgABALkC2gABASMC2gABATkB9QABAT8B9gABATYB9gABASkB9gABAVcB9gABASoB9gABAQYCeQABASYB9gABAS0B9gABAS8B9gABAdsCtgABAaECqQABAV0B9gABAUEB9gABATgB9gABAToB9gABARkB9gABAR8B9gABATEB9gABASQB9gABASMB9QABAZIB9gABAOMB9gABAS4B9gABARMB9gABATIB9gABASwCxQABASwCvAABBFgEYAABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVoAAAABAT4AAAABAVcAAAABATsAAAABAXkAAAABBCgENgABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmACYAKQAyACYAJgAmADOANQA2gCYAMIA4ADmAOwAmADyAMIA+AD+AQQBCgCqARABFgEcASIBKAEuAPIBNACYAToBQAFGAUwBUgFYAV4AmACYAWQBCgDCAJgBCgEcAJgBWACeAWoA5gDa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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; +// src: local('Source Code Pro'), local('SourceCodePro-Regular'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/mrl8jkM18OlOQN8JLgasD9zbP97U9sKh0jjxbPbfOKg.ttf) format('truetype'); + src: local('Source Code Pro'), local('SourceCodePro-Regular'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT80AAAAOkNGRiD9qd9kAABIiAAA2ktEU0lHYnpAEAABP3AAACBYR0RFRi8sL9AAASpcAAAA1EdQT1MK+gbMAAE2ZAAACNBHU1VC3Z7yFQABKzAAAAsyT1MvMnLU0PUAAAFQAAAAYGNtYXDp1MYJAAA+WAAAChBoZWFk+92HfAAAAOwAAAA2aGhlYQZ2AN8AAAEkAAAAJGhtdHisN66qAAEi1AAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZQWUCakAAAGwAAA8pnBvc3T/uAAzAABIaAAAACAAAQAAAAEEWlvC/ZlfDzz1AAMD6AAAAADNFZ/1AAAAAM0Vn/X/2f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/Z/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAGQAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwUJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAQAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAIgGeAAEAAAAAAAAARQAAAAEAAAAAAAEADwBFAAEAAAAAAAIABwBUAAEAAAAAAAMAJgBbAAEAAAAAAAQADwBFAAEAAAAAAAUAOQCBAAEAAAAAAAYAFQC6AAEAAAAAAAcAYADPAAEAAAAAAAgAGgEvAAEAAAAAAAkADAFJAAEAAAAAAAsAGQFVAAEAAAAAAA0R2QFuAAEAAAAAAA4AJBNHAAEAAAAAAQAAFhNrAAEAAAAAAQEACxOBAAEAAAAAAQIACxOMAAEAAAAAAQMAFROXAAMAAQQJAAAAihOsAAMAAQQJAAEAHhQ2AAMAAQQJAAIADhRUAAMAAQQJAAMATBRiAAMAAQQJAAQAHhQ2AAMAAQQJAAUAchSuAAMAAQQJAAYAKhUgAAMAAQQJAAcAwBVKAAMAAQQJAAgANBYKAAMAAQQJAAkAGBY+AAMAAQQJAAsAMhZWAAMAAQQJAA0jthaIAAMAAQQJAA4ASDo+AAMAAQQJAQAALDqGAAMAAQQJAQEAFjqyAAMAAQQJAQIAFjrIAAMAAQQJAQMAKjreQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1SZWd1bGFyO0FET0JFVmVyc2lvbiAxLjAxNztQUyAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41OTAwU291cmNlQ29kZVByby1SZWd1bGFyU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWRQYXVsIEQuIEh1bnRodHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgKGh0dHA6Ly93d3cuYWRvYmUuY29tLyksIHdpdGggUmVzZXJ2ZWQgRm9udCBOYW1lICdTb3VyY2UnLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy4NCg0KVGhpcyBGb250IFNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTSUwgT3BlbiBGb250IExpY2Vuc2UsIFZlcnNpb24gMS4xLg0KDQpUaGlzIGxpY2Vuc2UgaXMgY29waWVkIGJlbG93LCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgd2l0aCBhIEZBUSBhdDogaHR0cDovL3NjcmlwdHMuc2lsLm9yZy9PRkwNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClNJTCBPUEVOIEZPTlQgTElDRU5TRSBWZXJzaW9uIDEuMSAtIDI2IEZlYnJ1YXJ5IDIwMDcNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBSRUFNQkxFDQpUaGUgZ29hbHMgb2YgdGhlIE9wZW4gRm9udCBMaWNlbnNlIChPRkwpIGFyZSB0byBzdGltdWxhdGUgd29ybGR3aWRlIGRldmVsb3BtZW50IG9mIGNvbGxhYm9yYXRpdmUgZm9udCBwcm9qZWN0cywgdG8gc3VwcG9ydCB0aGUgZm9udCBjcmVhdGlvbiBlZmZvcnRzIG9mIGFjYWRlbWljIGFuZCBsaW5ndWlzdGljIGNvbW11bml0aWVzLCBhbmQgdG8gcHJvdmlkZSBhIGZyZWUgYW5kIG9wZW4gZnJhbWV3b3JrIGluIHdoaWNoIGZvbnRzIG1heSBiZSBzaGFyZWQgYW5kIGltcHJvdmVkIGluIHBhcnRuZXJzaGlwIHdpdGggb3RoZXJzLg0KDQpUaGUgT0ZMIGFsbG93cyB0aGUgbGljZW5zZWQgZm9udHMgdG8gYmUgdXNlZCwgc3R1ZGllZCwgbW9kaWZpZWQgYW5kIHJlZGlzdHJpYnV0ZWQgZnJlZWx5IGFzIGxvbmcgYXMgdGhleSBhcmUgbm90IHNvbGQgYnkgdGhlbXNlbHZlcy4gVGhlIGZvbnRzLCBpbmNsdWRpbmcgYW55IGRlcml2YXRpdmUgd29ya3MsIGNhbiBiZSBidW5kbGVkLCBlbWJlZGRlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3Igc29sZCB3aXRoIGFueSBzb2Z0d2FyZSBwcm92aWRlZCB0aGF0IGFueSByZXNlcnZlZCBuYW1lcyBhcmUgbm90IHVzZWQgYnkgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlIGZvbnRzIGFuZCBkZXJpdmF0aXZlcywgaG93ZXZlciwgY2Fubm90IGJlIHJlbGVhc2VkIHVuZGVyIGFueSBvdGhlciB0eXBlIG9mIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgZm9udHMgb3IgdGhlaXIgZGVyaXZhdGl2ZXMuDQoNCkRFRklOSVRJT05TDQoiRm9udCBTb2Z0d2FyZSIgcmVmZXJzIHRvIHRoZSBzZXQgb2YgZmlsZXMgcmVsZWFzZWQgYnkgdGhlIENvcHlyaWdodCBIb2xkZXIocykgdW5kZXIgdGhpcyBsaWNlbnNlIGFuZCBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLiBUaGlzIG1heSBpbmNsdWRlIHNvdXJjZSBmaWxlcywgYnVpbGQgc2NyaXB0cyBhbmQgZG9jdW1lbnRhdGlvbi4NCg0KIlJlc2VydmVkIEZvbnQgTmFtZSIgcmVmZXJzIHRvIGFueSBuYW1lcyBzcGVjaWZpZWQgYXMgc3VjaCBhZnRlciB0aGUgY29weXJpZ2h0IHN0YXRlbWVudChzKS4NCg0KIk9yaWdpbmFsIFZlcnNpb24iIHJlZmVycyB0byB0aGUgY29sbGVjdGlvbiBvZiBGb250IFNvZnR3YXJlIGNvbXBvbmVudHMgYXMgZGlzdHJpYnV0ZWQgYnkgdGhlIENvcHlyaWdodCBIb2xkZXIocykuDQoNCiJNb2RpZmllZCBWZXJzaW9uIiByZWZlcnMgdG8gYW55IGRlcml2YXRpdmUgbWFkZSBieSBhZGRpbmcgdG8sIGRlbGV0aW5nLCBvciBzdWJzdGl0dXRpbmcgLS0gaW4gcGFydCBvciBpbiB3aG9sZSAtLSBhbnkgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhlIE9yaWdpbmFsIFZlcnNpb24sIGJ5IGNoYW5naW5nIGZvcm1hdHMgb3IgYnkgcG9ydGluZyB0aGUgRm9udCBTb2Z0d2FyZSB0byBhIG5ldyBlbnZpcm9ubWVudC4NCg0KIkF1dGhvciIgcmVmZXJzIHRvIGFueSBkZXNpZ25lciwgZW5naW5lZXIsIHByb2dyYW1tZXIsIHRlY2huaWNhbCB3cml0ZXIgb3Igb3RoZXIgcGVyc29uIHdobyBjb250cmlidXRlZCB0byB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KUEVSTUlTU0lPTiAmIENPTkRJVElPTlMNClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIEZvbnQgU29mdHdhcmUsIHRvIHVzZSwgc3R1ZHksIGNvcHksIG1lcmdlLCBlbWJlZCwgbW9kaWZ5LCByZWRpc3RyaWJ1dGUsIGFuZCBzZWxsIG1vZGlmaWVkIGFuZCB1bm1vZGlmaWVkIGNvcGllcyBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQoNCjEpIE5laXRoZXIgdGhlIEZvbnQgU29mdHdhcmUgbm9yIGFueSBvZiBpdHMgaW5kaXZpZHVhbCBjb21wb25lbnRzLCBpbiBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucywgbWF5IGJlIHNvbGQgYnkgaXRzZWxmLg0KDQoyKSBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucyBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgYmUgYnVuZGxlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3Igc29sZCB3aXRoIGFueSBzb2Z0d2FyZSwgcHJvdmlkZWQgdGhhdCBlYWNoIGNvcHkgY29udGFpbnMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbGljZW5zZS4gVGhlc2UgY2FuIGJlIGluY2x1ZGVkIGVpdGhlciBhcyBzdGFuZC1hbG9uZSB0ZXh0IGZpbGVzLCBodW1hbi1yZWFkYWJsZSBoZWFkZXJzIG9yIGluIHRoZSBhcHByb3ByaWF0ZSBtYWNoaW5lLXJlYWRhYmxlIG1ldGFkYXRhIGZpZWxkcyB3aXRoaW4gdGV4dCBvciBiaW5hcnkgZmlsZXMgYXMgbG9uZyBhcyB0aG9zZSBmaWVsZHMgY2FuIGJlIGVhc2lseSB2aWV3ZWQgYnkgdGhlIHVzZXIuDQoNCjMpIE5vIE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZvbnQgU29mdHdhcmUgbWF5IHVzZSB0aGUgUmVzZXJ2ZWQgRm9udCBOYW1lKHMpIHVubGVzcyBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCBieSB0aGUgY29ycmVzcG9uZGluZyBDb3B5cmlnaHQgSG9sZGVyLiBUaGlzIHJlc3RyaWN0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgcHJpbWFyeSBmb250IG5hbWUgYXMgcHJlc2VudGVkIHRvIHRoZSB1c2Vycy4NCg0KNCkgVGhlIG5hbWUocykgb2YgdGhlIENvcHlyaWdodCBIb2xkZXIocykgb3IgdGhlIEF1dGhvcihzKSBvZiB0aGUgRm9udCBTb2Z0d2FyZSBzaGFsbCBub3QgYmUgdXNlZCB0byBwcm9tb3RlLCBlbmRvcnNlIG9yIGFkdmVydGlzZSBhbnkgTW9kaWZpZWQgVmVyc2lvbiwgZXhjZXB0IHRvIGFja25vd2xlZGdlIHRoZSBjb250cmlidXRpb24ocykgb2YgdGhlIENvcHlyaWdodCBIb2xkZXIocykgYW5kIHRoZSBBdXRob3Iocykgb3Igd2l0aCB0aGVpciBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24uDQoNCjUpIFRoZSBGb250IFNvZnR3YXJlLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkLCBpbiBwYXJ0IG9yIGluIHdob2xlLCBtdXN0IGJlIGRpc3RyaWJ1dGVkIGVudGlyZWx5IHVuZGVyIHRoaXMgbGljZW5zZSwgYW5kIG11c3Qgbm90IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGFueSBvdGhlciBsaWNlbnNlLiBUaGUgcmVxdWlyZW1lbnQgZm9yIGZvbnRzIHRvIHJlbWFpbiB1bmRlciB0aGlzIGxpY2Vuc2UgZG9lcyBub3QgYXBwbHkgdG8gYW55IGRvY3VtZW50IGNyZWF0ZWQgdXNpbmcgdGhlIEZvbnQgU29mdHdhcmUuDQoNClRFUk1JTkFUSU9ODQpUaGlzIGxpY2Vuc2UgYmVjb21lcyBudWxsIGFuZCB2b2lkIGlmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4NCg0KRElTQ0xBSU1FUg0KVEhFIEZPTlQgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBDT1BZUklHSFQsIFBBVEVOVCwgVFJBREVNQVJLLCBPUiBPVEhFUiBSSUdIVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBGT05UIFNPRlRXQVJFIE9SIEZST00gT1RIRVIgREVBTElOR1MgSU4gVEhFIEZPTlQgU09GVFdBUkUuaHR0cDovL3d3dy5hZG9iZS5jb20vdHlwZS9sZWdhbC5odG1sVHlwb2dyYXBoaWMgYWx0ZXJuYXRlc0FsdGVybmF0ZSBhQWx0ZXJuYXRlIGdBbHRlcm5hdGUgZG9sbGFyIHNpZ24AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AUgBlAGcAdQBsAGEAcgAxAC4AMAAxADcAOwBBAEQAQgBFADsAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAAAAwAAAAMAAAIUAAEAAAAAABwAAwABAAACFAAGAfgAAAAJAPcAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB5gHrAhUCdgKJAcwB6gH/AgACCQKUAeIB9gHhAgUBzQHOAc8B0AHRAdIB0wHUAdUB1gHjAeQCmgKZApsB6AITAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwIBAgcCAgKfAf4CywAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUCAwIGAgQCoQAAADoAPQBOAFgAjACVAMEA6ADnAOkA6wDqAO4A/wEJAQgBCgEMASUBJAEmASgBPwFGAUUBRwFJAUgBcwFyAXQBdgIKAnQCegJ3AgwB/QINAWsCEAIOAhECzALVAqAATAChAqUCngKcAp0CeAKmAqcCrAKtAqQCqAJSAlQAAAD9AVUB6QHnAqMCqQJ7AqICqgH0AfUB5QMfADYAOQCUAKIBVgH4AfkB7gHvAewB7QKXAsQBkADbAoYCeQHyAfMBqwGsAgsB/AHwAfECigA4AFkANwBbAFcAdAB1AHcAcwCSAJMAAACRAL4AvwC9ATACzQLUAtYC1wLaAtgC2wLZAtwCzgAEB/wAAAEWAQAABwAWAC8AOQBAAFoAYAB6AH4AvwDEANEA1gDfAOQA8QD2ATEBSQFlAX4BgAGPAZIBoQGwAdwB5wHrAhsCNwJDAlICVAJZAmECZQJvAnkChwKOAp4CsAKzArgCvAK/AswC3QLjAwQDDAMPAxMDGwMkAygDLgMxA8AdQx1JHU0dUB1SHVgdWx2cHaAdux4PHiEeJR4rHjseSR5jHm8ehR6PHpMelx6eHvkgByAVIBogHiAiICYgMCAzIDogRCBxIHkgfyCJII4glCChIKQgpyCsILIgtSC6IRMhFyEgISIhJiEuIVQhXiGTIgIiBiIPIhIiFSIaIh4iKyJIImAiZSWfJaAlsyW3Jb0lwSXGJcomESZqJxMnUvsC//8AAAAgADAAOgBBAFsAYQB7AKAAwADFANIA1wDgAOUA8gD3ATQBTAFoAYABjwGSAaABrwHNAeYB6gIYAjcCQwJQAlQCWAJhAmUCbwJ5AocCjAKeArACsgK3ArsCvgLGAtgC4QMAAwYDDwMSAxsDIwMmAy4DMQPAHUMdRx1NHU8dUh1WHVsdnB2gHbseDB4gHiQeKh42HkIeWh5sHoAejh6SHpcenh6gIAcgEiAYIBwgICAmIDAgMiA5IEQgcCB0IH0ggCCNIJQgoSCkIKYgqyCxILUguSETIRchICEiISYhLiFTIVshkCICIgYiDyIRIhUiGSIeIisiSCJgImQlACWgJbIltiW8JcAlxiXJJhAmaicTJ1L7Af//AAABnQAA/8EAAP+7AAAAAP92AAD/vwAAAAcAAABTAAAAAAAA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dQN8A4MDigORA5cDnQOoA7EDtwPCA8kD0APXA94D5APuA/UD/AQDBAkEEAQXBB4EJQQsBDMEOgRBBEgETwRWBF0EZARrBHIEeASDBIkEkwSZBKAEpwStBLMEugTABMoE0QTYBN8E5gTtBPQE+wUCBQkFFAUaBSQFKwUxBTgFQwVOBVUFXAVgBWYFbQV0BXsFggWJBZAFmQWkBasFtwW9BcMFxwXOBdUF3AXjBeoF8AX2Bf0GBAYLBhIGHQYkBisGOAY/BkYGTQZUBlsGYgZpBnAGdQZ8BoMGigaRBpgGnwalBqwGsga5BsAGxwbNBtgG3wbmBu0G9Ab6BwEHCAcPBxYHHQcjByoHMAc1B0IHSQdQB1cHXgdlB2wHcwd6B38HhgeNB5QHmweiB6gHrge5B8IHyAfTB9oH4QfoB+8H9Qf/CAYIDQgUCBsIIggpCDAINwg+CEUITAhTCFoIYQhoCGsIcwh7CIgIkAibCKQIrAizCLwIxQjOCNcI4AjpCPII+wkECQ0JFgkfCSgJMQk0CUEJSQlVCV4JZglvCXwJhQmNCZUJnwmoCbEJuQnDCc0J1gndCeQJ6wnyCfkKAwoLChQKHAolCi0KNQo/CkgKUQpZCmMKbQp2CoQKkwqeCqgKsQq5CsEKywrUCt0K5QrvCvkLAgsQCx8LKgs0Cz0LRQtNC1cLYAtpC3ELewuFC44LnAurC7YLwAvJC9EL2QvjC+wL9Qv9DAcMEQwaDCgMNwxCDEwMWQxfDGUMawxxDHcMfQyDDIkMjwyVDJsMoQynDK0Mswy5DL8MxQzLDNEM1wzdDOMM6QzvDPUNAA0LDRcNHQ0jDScNLg0yDTkNPw1DDUoNUQ1YDV8NZg1tDXcNfg2HDZMNmw2mDagNsA23DcINyg3RDdgN3w3oDe8N9g3/DgYODQ4UDh0OJA4rDjIOOQ5ADkcOTg5VDlwOYw5qDnEOeA5/DoYOjQ6UDpsOog6pDrAOtw6+DsUOzA7TDtoO4Q7oDvMO+g8FDwwPFw8eDykPMA87D0IPTQ9UD18PZg9xD3gPgw+KD5UPnA+nD64PuQ/AD8sP0g/ZD+AP5w/uD/UP/BAHEA4QGRAgECcQMhBBEEwQWxBmEHUQgBCPEJoQqRC0EMMQzhDdEOgQ9xECERERHBErETYRRRFQEV8RahF5EYIRixGSEZkRoxGvEbYRvRHEEcsR0hHZEeAR5xHuEfUR/BIDEgoSERIYEh8SJhItEjQSOxJCEkkSUBJXEl4SZRJsEnMSehKBEogSjxKWEp0SpBKrErISuRLAEscSzhLVEtwS4xLqEvES+BL/EwYTDRMUExsTIhMpEzATNxM+E0UTTBNTE1oTYRNoE28TdhN9E4QTixOSE5kToBOnE64TtRO8E8MTyhPRE9gT3xPmE+0T9BP7FAIUCRQQFBcUHhQlFCwUMxQ6FEEUSBRPFFYUXRRkFGsUchR5FIAUhxSOFJUUnBSjFKoUsRS4FL8UxhTNFNQU2xTiFOkU8BT3FP4VBRUMFRMVGhUhFSgVLxU2FT0VRBVLFVIVWRVgFWcVbhV1FXwVgxWKFZEVmBWfFaYVrRW0FbsVwhXJFdAV1xXeFeUV7BXzFfoWARYIFg8WFhYdFiIWghbHFtZBbWFjcm9uQWJyZXZldW5pMDFDRHVuaTFFQTB1bmkxRUEydW5pMUVBNHVuaTFFQTZ1bmkxRUE4dW5pMUVBQXVuaTFFQUN1bmkxRUFFdW5pMUVCMHVuaTFFQjJ1bmkxRUI0dW5pMUVCNkFvZ29uZWt1bmkwMjQzQ2FjdXRlQ2NpcmN1bWZsZXhDY2Fyb25DZG90YWNjZW50RGNhcm9udW5pMUUwQ3VuaTFFMEVEY3JvYXRFY2Fyb25FbWFjcm9uRWJyZXZlRWRvdGFjY2VudHVuaTFFQjh1bmkxRUJBdW5pMUVCQ3VuaTFFQkV1bmkxRUMwdW5pMUVDMnVuaTFFQzR1bmkxRUM2RW9nb25la0djaXJjdW1mbGV4R2JyZXZlR2RvdGFjY2VudHVuaTAxMjJHY2Fyb251bmkxRTIwdW5pMDA0NzAzMDNIY2lyY3VtZmxleHVuaTFFMjR1bmkxRTJBSGJhckl0aWxkZUltYWNyb251bmkwMTJDSWRvdGFjY2VudHVuaTAxQ0Z1bmkxRUM4dW5pMUVDQUlvZ29uZWtKY2lyY3VtZmxleHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTGRvdHVuaTFFMzZ1bmkxRTM4dW5pMUUzQXVuaTFFNDJOYWN1dGVOY2Fyb251bmkwMTQ1dW5pMUU0NHVuaTFFNDZ1bmkxRTQ4T21hY3JvbnVuaTAxNEVPaHVuZ2FydW1sYXV0dW5pMDFEMXVuaTFFQ0N1bmkxRUNFdW5pMUVEMHVuaTFFRDJ1bmkxRUQ0dW5pMUVENnVuaTFFRDhPaG9ybnVuaTFFREF1bmkxRURDdW5pMUVERXVuaTFFRTB1bmkxRUUydW5pMDFFQVJhY3V0ZVJjYXJvbnVuaTAxNTZ1bmkxRTVBdW5pMUU1Q3VuaTFFNUVTYWN1dGVTY2lyY3VtZmxleHVuaTAxNUV1bmkwMjE4dW5pMUU2MHVuaTFFNjJ1bmkxRTlFVGNhcm9udW5pMDE2MnVuaTAyMUF1bmkxRTZDdW5pMUU2RVV0aWxkZVVtYWNyb25VYnJldmVVcmluZ1VodW5nYXJ1bWxhdXR1bmkwMUQzdW5pMDFENXVuaTAxRDd1bmkwMUQ5dW5pMDFEQnVuaTFFRTR1bmkxRUU2VW9nb25la1Vob3JudW5pMUVFOHVuaTFFRUF1bmkxRUVDdW5pMUVFRXVuaTFFRjBXZ3JhdmVXYWN1dGVXY2lyY3VtZmxleFdkaWVyZXNpc1lncmF2ZVljaXJjdW1mbGV4dW5pMUU4RXVuaTFFRjR1bmkxRUY2dW5pMUVGOFphY3V0ZVpkb3RhY2NlbnR1bmkxRTkydW5pMDE4RmFtYWNyb25hYnJldmV1bmkwMUNFdW5pMUVBMXVuaTFFQTN1bmkxRUE1dW5pMUVBN3VuaTFFQTl1bmkxRUFCdW5pMUVBRHVuaTFFQUZ1bmkxRUIxdW5pMUVCM3VuaTFFQjV1bmkxRUI3YW9nb25la3VuaTAxODBjYWN1dGVjY2lyY3VtZmxleGNjYXJvbmNkb3RhY2NlbnRkY2Fyb251bmkxRTBEdW5pMUUwRmRjcm9hdGVjYXJvbmVtYWNyb25lYnJldmVlZG90YWNjZW50dW5pMUVCOXVuaTFFQkJ1bmkxRUJEdW5pMUVCRnVuaTFFQzF1bmkxRUMzdW5pMUVDNXVuaTFFQzdlb2dvbmVrZ2NpcmN1bWZsZXhnYnJldmVnZG90YWNjZW50dW5pMDEyM2djYXJvbnVuaTFFMjF1bmkwMDY3MDMwM2hjaXJjdW1mbGV4dW5pMUUyNXVuaTFFMkJoYmFyaXRpbGRlaW1hY3JvbnVuaTAxMkR1bmkwMUQwdW5pMUVDOXVuaTFFQ0Jpb2dvbmVraW9nb25lay5kamNpcmN1bWZsZXh1bmkwMTM3a2dyZWVubGFuZGljbGFjdXRlbGNhcm9ubGRvdHVuaTAxM0N1bmkxRTM3dW5pMUUzOXVuaTFFM0J1bmkxRTQzbmFjdXRlbmNhcm9udW5pMDE0NnVuaTFFNDV1bmkxRTQ3dW5pMUU0OW5hcG9zdHJvcGhlb21hY3JvbnVuaTAxNEZvaHVuZ2FydW1sYXV0dW5pMDFEMnVuaTFFQ0R1bmkxRUNGdW5pMUVEMXVuaTFFRDN1bmkxRUQ1dW5pMUVEN3VuaTFFRDlvaG9ybnVuaTFFREJ1bmkxRUREdW5pMUVERnVuaTFFRTF1bmkxRUUzdW5pMDFFQnJhY3V0ZXVuaTAxNTdyY2Fyb251bmkxRTVCdW5pMUU1RHVuaTFFNUZzYWN1dGVzY2lyY3VtZmxleHVuaTAxNUZ1bmkwMjE5dW5pMUU2MXVuaTFFNjN0Y2Fyb251bmkwMTYzdW5pMDIxQnVuaTFFNkR1bmkxRTZGdW5pMUU5N3V0aWxkZXVtYWNyb251YnJldmV1cmluZ3VodW5nYXJ1bWxhdXR1bmkwMUQ0dW5pMDFENnVuaTAxRDh1bmkwMURBdW5pMDFEQ3VuaTFFRTV1bmkxRUU3dW9nb25la3Vob3JudW5pMUVFOXVuaTFFRUJ1bmkxRUVEdW5pMUVFRnVuaTFFRjF3Z3JhdmV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3lncmF2ZXljaXJjdW1mbGV4dW5pMUU4RnVuaTFFRjV1bmkxRUY3dW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmkxRTkzdW5pMDIzN3VuaTAyNTB1bmkwMjUxdW5pMDI1MnVuaTAyNTl1bmkwMjYxdW5pMDI2NXVuaTAyNkZ1bmkwMjc5dW5pMDI4N3VuaTAyOEN1bmkwMjhEdW5pMDI4RXVuaTAyOUVhLmFhZ3JhdmUuYWFhY3V0ZS5hYWNpcmN1bWZsZXguYWF0aWxkZS5hYWRpZXJlc2lzLmFhbWFjcm9uLmFhYnJldmUuYWFyaW5nLmF1bmkwMUNFLmF1bmkxRUExLmF1bmkxRUEzLmF1bmkxRUE1LmF1bmkxRUE3LmF1bmkxRUE5LmF1bmkxRUFCLmF1bmkxRUFELmF1bmkxRUFGLmF1bmkxRUIxLmF1bmkxRUIzLmF1bmkxRUI1LmF1bmkxRUI3LmFhb2dvbmVrLmFnLmFnY2lyY3VtZmxleC5hZ2JyZXZlLmFnZG90YWNjZW50LmF1bmkwMTIzLmFnY2Fyb24uYXVuaTFFMjEuYXVuaTAwNjcwMzAzLmF6ZXJvLm9udW1vbmUub251bXR3by5vbnVtdGhyZWUub251bWZvdXIub251bWZpdmUub251bXNpeC5vbnVtc2V2ZW4ub251bWVpZ2h0Lm9udW1uaW5lLm9udW11bmkwMEFEdW5pMjAxNXVuaTIxMTd1bmkyMTIwYXQuY2FzZWFzdGVyaXNrLmFoeXBoZW4uYXVuaTAwQUQuYWRvbGxhci5hemVyby5zdXBzb25lLnN1cHN0d28uc3Vwc3RocmVlLnN1cHNmb3VyLnN1cHNmaXZlLnN1cHNzaXguc3Vwc3NldmVuLnN1cHNlaWdodC5zdXBzbmluZS5zdXBzcGFyZW5sZWZ0LnN1cHNwYXJlbnJpZ2h0LnN1cHNwZXJpb2Quc3Vwc2NvbW1hLnN1cHN6ZXJvLnN1YnNvbmUuc3Vic3R3by5zdWJzdGhyZWUuc3Vic2ZvdXIuc3Vic2ZpdmUuc3Vic3NpeC5zdWJzc2V2ZW4uc3Vic2VpZ2h0LnN1YnNuaW5lLnN1YnNwYXJlbmxlZnQuc3Vic3BhcmVucmlnaHQuc3Vic3BlcmlvZC5zdWJzY29tbWEuc3Vic3plcm8uZG5vbW9uZS5kbm9tdHdvLmRub210aHJlZS5kbm9tZm91ci5kbm9tZml2ZS5kbm9tc2l4LmRub21zZXZlbi5kbm9tZWlnaHQuZG5vbW5pbmUuZG5vbXBhcmVubGVmdC5kbm9tcGFyZW5yaWdodC5kbm9tcGVyaW9kLmRub21jb21tYS5kbm9temVyby5udW1yb25lLm51bXJ0d28ubnVtcnRocmVlLm51bXJmb3VyLm51bXJmaXZlLm51bXJzaXgubnVtcnNldmVuLm51bXJlaWdodC5udW1ybmluZS5udW1ycGFyZW5sZWZ0Lm51bXJwYXJlbnJpZ2h0Lm51bXJwZXJpb2QubnVtcmNvbW1hLm51bXJvcmRmZW1pbmluZS5hYS5zdXBzYi5zdXBzYy5zdXBzZC5zdXBzZS5zdXBzZi5zdXBzZy5zdXBzaC5zdXBzaS5zdXBzai5zdXBzay5zdXBzbC5zdXBzbS5zdXBzbi5zdXBzby5zdXBzcC5zdXBzcS5zdXBzci5zdXBzcy5zdXBzdC5zdXBzdS5zdXBzdi5zdXBzdy5zdXBzeC5zdXBzeS5zdXBzei5zdXBzZWdyYXZlLnN1cHNlYWN1dGUuc3Vwc3VuaTAyNTkuc3Vwc2Euc3VwYWcuc3VwYUV1cm91bmkwMTkybGlyYXVuaTIwQTZwZXNldGFkb25ndW5pMjBCMXVuaTIwQjJ1bmkyMEI1dW5pMjBCOXVuaTIwQkF1bmkyMjE1c2xhc2guZnJhY3VuaTIyMTlsZXNzZXF1YWxncmVhdGVyZXF1YWxub3RlcXVhbGFwcHJveGVxdWFscGlpbmZpbml0eXVuaTAwQjVwYXJ0aWFsZGlmZmludGVncmFscmFkaWNhbHVuaTIyMDZ1bmkyMTI2c3VtbWF0aW9ucHJvZHVjdHVuaTIxMTNlc3RpbWF0ZWR1bmkyMTkwYXJyb3d1cHVuaTIxOTJhcnJvd2Rvd251bmkyNUEwdW5pMjVDNnVuaTI1Qzl1bmkyNzUydHJpYWd1cHVuaTI1QjN1bmkyNUI2dW5pMjVCN3RyaWFnZG51bmkyNUJEdW5pMjVDMHVuaTI1QzF1bmkyNjEwdW5pMjYxMXVuaTI3MTN1bmkyNjZBbG96ZW5nZXVuaTIwMzJ1bmkyMDMzdW5pMDJCQnVuaTAyQkN1bmkwMkJFdW5pMDJCRnVuaTAyQzh1bmkwMkM5dW5pMDJDQXVuaTAyQ0J1bmkwMkNDdW5pMDMwMHVuaTAzMDAuY2FwdW5pMDMwMXVuaTAzMDEuY2FwdW5pMDMwMnVuaTAzMDIuY2FwdW5pMDMwM3VuaTAzMDMuY2FwdW5pMDMwNHVuaTAzMDQuY2FwdW5pMDMwNnVuaTAzMDYuY2FwdW5pMDMwN3VuaTAzMDcuY2FwdW5pMDMwOHVuaTAzMDguY2FwdW5pMDMwOXVuaTAzMDkuY2FwdW5pMDMwQXVuaTAzMEEuY2FwdW5pMDMwQnVuaTAzMEIuY2FwdW5pMDMwQ3VuaTAzMEMuY2FwdW5pMDMwRnVuaTAzMEYuY2FwdW5pMDMxMnVuaTAzMTN1bmkwMzFCdW5pMDMyM3VuaTAzMjR1bmkwMzI2dW5pMDMyN3VuaTAzMjcuY2FwdW5pMDMyOHVuaTAzMjguY2FwdW5pMDMyRXVuaTAzMzF1bmkwMzA4MDMwNHVuaTAzMDgwMzA0LmNhcHVuaTAzMDgwMzAxdW5pMDMwODAzMDEuY2FwdW5pMDMwODAzMEN1bmkwMzA4MDMwQy5jYXB1bmkwMzA4MDMwMHVuaTAzMDgwMzAwLmNhcHVuaTAzMDIwMzAxdW5pMDMwMjAzMDEuY2FwdW5pMDMwMjAzMDB1bmkwMzAyMDMwMC5jYXB1bmkwMzAyMDMwOXVuaTAzMDIwMzA5LmNhcHVuaTAzMDIwMzAzdW5pMDMwMjAzMDMuY2FwdW5pMDMwNjAzMDF1bmkwMzA2MDMwMS5jYXB1bmkwMzA2MDMwMHVuaTAzMDYwMzAwLmNhcHVuaTAzMDYwMzA5dW5pMDMwNjAzMDkuY2FwdW5pMDMwNjAzMDN1bmkwMzA2MDMwMy5jYXB1bmkwMzAyMDMwNnVuaTAzMDIwMzA2LmNhcHVuaTAzMEMuYXVuaTAzMjYuYXVuaTAwQTB1bmkyMDA3c3BhY2UuZnJhY25ic3BhY2UuZnJhY3VuaTI1MDB1bmkyNTAxdW5pMjUwMnVuaTI1MDN1bmkyNTA0dW5pMjUwNXVuaTI1MDZ1bmkyNTA3dW5pMjUwOHVuaTI1MDl1bmkyNTBBdW5pMjUwQnVuaTI1MEN1bmkyNTBEdW5pMjUwRXVuaTI1MEZ1bmkyNTEwdW5pMjUxMXVuaTI1MTJ1bmkyNTEzdW5pMjUxNHVuaTI1MTV1bmkyNTE2dW5pMjUxN3VuaTI1MTh1bmkyNTE5dW5pMjUxQXVuaTI1MUJ1bmkyNTFDdW5pMjUxRHVuaTI1MUV1bmkyNTFGdW5pMjUyMHVuaTI1MjF1bmkyNTIydW5pMjUyM3VuaTI1MjR1bmkyNTI1dW5pMjUyNnVuaTI1Mjd1bmkyNTI4dW5pMjUyOXVuaTI1MkF1bmkyNTJCdW5pMjUyQ3VuaTI1MkR1bmkyNTJFdW5pMjUyRnVuaTI1MzB1bmkyNTMxdW5pMjUzMnVuaTI1MzN1bmkyNTM0dW5pMjUzNXVuaTI1MzZ1bmkyNTM3dW5pMjUzOHVuaTI1Mzl1bmkyNTNBdW5pMjUzQnVuaTI1M0N1bmkyNTNEdW5pMjUzRXVuaTI1M0Z1bmkyNTQwdW5pMjU0MXVuaTI1NDJ1bmkyNTQzdW5pMjU0NHVuaTI1NDV1bmkyNTQ2dW5pMjU0N3VuaTI1NDh1bmkyNTQ5dW5pMjU0QXVuaTI1NEJ1bmkyNTRDdW5pMjU0RHVuaTI1NEV1bmkyNTRGdW5pMjU1MHVuaTI1NTF1bmkyNTUydW5pMjU1M3VuaTI1NTR1bmkyNTU1dW5pMjU1NnVuaTI1NTd1bmkyNTU4dW5pMjU1OXVuaTI1NUF1bmkyNTVCdW5pMjU1Q3VuaTI1NUR1bmkyNTVFdW5pMjU1RnVuaTI1NjB1bmkyNTYxdW5pMjU2MnVuaTI1NjN1bmkyNTY0dW5pMjU2NXVuaTI1NjZ1bmkyNTY3dW5pMjU2OHVuaTI1Njl1bmkyNTZBdW5pMjU2QnVuaTI1NkN1bmkyNTZEdW5pMjU2RXVuaTI1NkZ1bmkyNTcwdW5pMjU3MXVuaTI1NzJ1bmkyNTczdW5pMjU3NHVuaTI1NzV1bmkyNTc2dW5pMjU3N3VuaTI1Nzh1bmkyNTc5dW5pMjU3QXVuaTI1N0J1bmkyNTdDdW5pMjU3RHVuaTI1N0V1bmkyNTdGdW5pMjU4MHVuaTI1ODF1bmkyNTgydW5pMjU4M3VuaTI1ODR1bmkyNTg1dW5pMjU4NnVuaTI1ODd1bmkyNTg4dW5pMjU4OXVuaTI1OEF1bmkyNThCdW5pMjU4Q3VuaTI1OER1bmkyNThFdW5pMjU4RnVuaTI1OTB1bmkyNTkxdW5pMjU5MnVuaTI1OTN1bmkyNTk0dW5pMjU5NXVuaTI1OTZ1bmkyNTk3dW5pMjU5OHVuaTI1OTl1bmkyNTlBdW5pMjU5QnVuaTI1OUN1bmkyNTlEdW5pMjU5RXVuaTI1OUZ1bmkwMjU4dW5pMDI1NDEuMDAwU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvATACAAEARgB9AK4A0QD4AUABkQGkAbwB6AH3AjgCQwJfAnYCegKZAsAC5gLqAvMDFQMtA2YDlQOiA+kD7wP+BAcEDgQSBCUEOARLBIAEiASdBKgEqwSwBMEE3AThBQUFFQUvBUQFSQVXBWsFcwWCBYYFigXQBdcF2wXlBfsGFAYlBmMG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AF8AXwBfAF8AUQBiAIYAhgCGAIYAhgBCAIYANQBRAFMAUwBTAFMAUwBTAFMAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAtACEAMAAwADAAMAAwADAAMABkAGQAZABkAGQAZABDAEMAQwBDAEMAQwBDAE8AKgAqACoAKgAqAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAKAAoACgAKACYAJgAmACYAJgAmACYAJgBBAEEAQQBBABAAZQA+AFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAEQAUAFAAUABQAFAAUAAyADwAPAA8AEUARQBFAEUARQBFAEUARQBFAEUARQBFAEUARQBFAEUARQBIAEgASABIAEgASABIAAoAXQBdABQAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgA3AGoAagBRAFEAKgBRAFEAUQBRAFEAPABdAF0AXQBdAF0AXQBd/+oAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAsAPAA8ADwAPAA8ADwAPACSAHMAkgCGAIYATABIAEgASABIAEgASABIAFgARQBFAEUARQBFAEUATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAAgACAAIAAgAMQAxADEAMQAxADEAMQAxAEcARwBHAEcAPABdADcAXgA8AF0APQA/AEUAPABNAC4APwA2ADMACAAxABoANAA5ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAKgBHAGIARQA5ACcAOABNAEYARABDAEcAYgBFADkAJwA4AE4ARgBEAEMA2wDFANsAxQAgAOMA4wBtAHsA9QCCANEA2QBfAGcA2QBnAMUA0wBSAGAAVQBVAFAAFABQABQA2wCXADwA0AB6AOIAYwB4AGMAYwEHAGMBBwBUAH8AfwBbAEgAHgAeAHD/+wAPADEAMQBXAGgAhgCGAFUAoQDQAK0ArACsAKwArwC3AK8ArQDsANUA/gD0AKEA0ACtAKwArACsAK8AtwCvAK0A7ADVAP4A9AChANAArQCsAKwArACw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AbYBvADAAcIByAGAAc4B1AFoAMABdAHaAT4BPgE+AeAB5gABASwB/AABASwCpgABASMCpgABAVsCpgABASsCpgABAUsCpgABAVMCpgABAUECpgABAL4CpgABATICpgABATsCpgABAS0CrgABATECpgABATcCpgABAS0CpgABAToB/AABAIoC2gABAVcB/AABAcEC2gABATsB/AABAaQC5AABATMB/AABAJcC2gABAVwCtgABALIC2gABARwC2gABATwB/AABAT4B/AABAS0B/AABAVYB/AABAS8B/AABAQcCgwABAScB/AABATAB/AABAUAB/AABAcMCtgABAZgCpgABAT0CpgABAVwB/AABAT8B/AABATgB/AABARoB/AABASAB/AABATIB/AABASUB/AABAZEB/AABAOsB/AABARcB/AABASwCzwABASwCwgABBFIEWgABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVsAAAABATkAAAABAVYAAAABAToAAAABAXgAAAABBCIEMAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAA5gCYAMIAmADsAPIAmAD4AOwAmAD+AQQBCgEQARYBHAEiASgAvAEuATQBOgCYAUABRgFMAOYBUgFYAMgAmACYAV4BZADCAJgBWAEiAJgBWAEEAWoAngEEAWoAngFwAXYBfAF8AYIBiADIAJgBXgGOAJ4BlAABASz/6gABATT/6gABAVv/6gABASL/6gABAUz/6gABALz/6gABAU//6gABASv/6gABAS3/6gABAVL/6gABAVr/6gABAJX/6gABAUD/6gABATb/6gABAS//6gABASf/6gABATf/6gABAVb/6gABATL/6gABATv/6gABASP/6gABASn/GgABATr/6gABAVz/6gABAOz/GQABAXP/6gABATX/6gABATn/6gABAIj/JgABAcH/JgABAMj/6gABAXv/6gABAUH/6gABAQr/DgABAT3/6gABAUP/6gABASD/6gABAcv/JgABASr/6gABAHb/6gABAW3/6gABAP7/6gABAcz/JgABAsACxgABAAwAEgABAAAADgADAA4AFAAaAAEBLAHmAAEBpAKGAAEB9wKaAAEBnQHm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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; +// src: local('Source Code Pro Medium'), local('SourceCodePro-Medium'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqU6EJOknnpZ4Yy-3LjgZKxo.ttf) format('truetype'); + src: local('Source Code Pro Medium'), local('SourceCodePro-Medium'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT1oAAAAOkNGRiDLPo+VAABJBAAA2CNEU0lHEXcESwABPaQAACBYR0RFRjJdMx0AASiwAAAA4EdQT1MzPM2kAAE0xAAACKJHU1VC3Z7yFQABKZAAAAsyT1MvMnM40LUAAAFQAAAAYGNtYXDp1MYJAAA+1AAAChBoZWFk+9WHfAAAAOwAAAA2aGhlYQZuAN8AAAEkAAAAJGhtdHijJaU6AAEhKAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZe4mG4MAAAGwAAA9JHBvc3T/uAAzAABI5AAAACAAAQAAAAEEWkwQeqtfDzz1AAMD6AAAAADNFZ/1AAAAAM0Vn/X/0f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/R/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAH0AAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwUJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFgBFAAEAAAAAAAIABwBbAAEAAAAAAAMAJQBiAAEAAAAAAAQAFgBFAAEAAAAAAAUAOQCHAAEAAAAAAAYAFADAAAEAAAAAAAcAYADUAAEAAAAAAAgAGgE0AAEAAAAAAAkADAFOAAEAAAAAAAsAGQFaAAEAAAAAAA0R2QFzAAEAAAAAAA4AJBNMAAEAAAAAABAADxNwAAEAAAAAABEABhN/AAEAAAAAAQAAFhOFAAEAAAAAAQEACxObAAEAAAAAAQIACxOmAAEAAAAAAQMAFROxAAMAAQQJAAAAihPGAAMAAQQJAAEALBRQAAMAAQQJAAIADhR8AAMAAQQJAAMAShSKAAMAAQQJAAQALBRQAAMAAQQJAAUAchTUAAMAAQQJAAYAKBVGAAMAAQQJAAcAwBVuAAMAAQQJAAgANBYuAAMAAQQJAAkAGBZiAAMAAQQJAAsAMhZ6AAMAAQQJAA0jthasAAMAAQQJAA4ASDpiAAMAAQQJABAAHjqqAAMAAQQJABEADDrIAAMAAQQJAQAALDrUAAMAAQQJAQEAFjsAAAMAAQQJAQIAFjsWAAMAAQQJAQMAKjssQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIE1lZGl1bVJlZ3VsYXIxLjAxNztBREJFO1NvdXJjZUNvZGVQcm8tTWVkaXVtO0FET0JFVmVyc2lvbiAxLjAxNztQUyAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41OTAwU291cmNlQ29kZVByby1NZWRpdW1Tb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9NZWRpdW1UeXBvZ3JhcGhpYyBhbHRlcm5hdGVzQWx0ZXJuYXRlIGFBbHRlcm5hdGUgZ0FsdGVybmF0ZSBkb2xsYXIgc2lnbgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwAgAE0AZQBkAGkAdQBtAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBNAGUAZABpAHUAbQA7AEEARABPAEIARQBWAGUAcgBzAGkAbwBuACAAMQAuADAAMQA3ADsAUABTACAAMQAuADAAMAAwADsAaABvAHQAYwBvAG4AdgAgADEALgAwAC4ANwAwADsAbQBhAGsAZQBvAHQAZgAuAGwAaQBiADIALgA1AC4ANQA5ADAAMABTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0ATQBlAGQAaQB1AG0AUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvAE0AZQBkAGkAdQBtAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARVTb3VyY2VDb2RlUHJvLU1lZGl1bQABAQEu+vYA+vcB+vgMAPr5Avr5A/gXBIwMAVz8JPlW+nwFHDGmDxw0IBHHHQAAxCsSAt8CAAEACAAOABUAHAAjACoAMQA4AD8ARgBNAFQAWwBiAGkAcAB3AH0AiACOAJgAngClAKwAsgC4AL8AxQDPANYA3QDkAOsA8gD5AQABBwEOARkBHwEpATABNgE9AUgBUwFaAWEBZQFrAXIBeQGDAYoBkQGYAZ8BqgGxAbcBvQHEAcgBzwHWAd0B5AHqAfAB9wH+AgUCDAITAhoCJwIuAjUCPAJDAkoCUQJYAl8CZAJrAnICeQKAAocCjgKUApoCoQKoAq8CtgK8AscCzgLVAtwC4wLqAvAC9wL+AwUDDAMSAxkDHwMkAzEDOAM/A0YDTQNUA1sDYgNpA24DdQN8A4MDigORA5cDnQOoA7EDtwPCA8kD0APXA94D5APuA/UD/AQDBAkEEAQXBB4EJQQsBDMEOgRBBEgETwRWBF0EZARrBHIEeASDBIkEkwSZBKAEpwStBLMEugTABMoE0QTYBN8E5gTtBPQE+wUCBQkFFAUaBSQFKwUxBTgFQwVOBVUFXAVgBWYFbQV0BXsFggWJBZAFmQWkBasFtwW9BcMFxwXOBdUF3AXjBeoF8AX2Bf0GBAYLBhIGHQYkBisGOAY/BkYGTQZUBlsGYgZpBnAGdQZ8BoMGigaRBpgGnwalBqwGsga5BsAGxwbNBtgG3wbmBu0G9Ab6BwEHCAcPBxYHHQcjByoHMAc1B0IHSQdQB1cHXgdlB2wHcwd6B38HhgeNB5QHmweiB6gHrge5B8IHyAfTB9oH4QfoB+8H9Qf/CAYIDQgUCBsIIggpCDAINwg+CEUITAhTCFoIYQhoCGsIcwh7CIgIkAibCKQIrAizCLwIxQjOCNcI4AjpCPII+wkECQ0JFgkfCSgJMQk0CUEJSQlVCV4JZglvCXwJhQmNCZUJnwmoCbEJuQnDCc0J1gndCeQJ6wnyCfkKAwoLChQKHAolCi0KNQo/CkgKUQpZCmMKbQp2CoQKkwqeCqgKsQq5CsEKywrUCt0K5QrvCvkLAgsQCx8LKgs0Cz0LRQtNC1cLYAtpC3ELewuFC44LnAurC7YLwAvJC9EL2QvjC+wL9Qv9DAcMEQwaDCgMNwxCDEwMWQxfDGUMawxxDHcMfQyDDIkMjwyVDJsMoQynDK0Mswy5DL8MxQzLDNEM1wzdDOMM6QzvDPUNAA0LDRcNHQ0jDScNLg0yDTkNPw1DDUoNUQ1YDV8NZg1tDXcNfg2HDZMNmw2mDagNsA23DcINyg3RDdgN3w3oDe8N9g3/DgYODQ4UDh0OJA4rDjIOOQ5ADkcOTg5VDlwOYw5qDnEOeA5/DoYOjQ6UDpsOog6pDrAOtw6+DsUOzA7TDtoO4Q7oDvMO+g8FDwwPFw8eDykPMA87D0IPTQ9UD18PZg9xD3gPgw+KD5UPnA+nD64PuQ/AD8sP0g/ZD+AP5w/uD/UP/BAHEA4QGRAgECcQMhBBEEwQWxBmEHUQgBCPEJoQqRC0EMMQzhDdEOgQ9xECERERHBErETYRRRFQEV8RahF5EYIRixGSEZkRoxGvEbYRvRHEEcsR0hHZEeAR5xHuEfUR/BIDEgoSERIYEh8SJhItEjQSOxJCEkkSUBJXEl4SZRJsEnMSehKBEogSjxKWEp0SpBKrErISuRLAEscSzhLVEtwS4xLqEvES+BL/EwYTDRMUExsTIhMpEzATNxM+E0UTTBNTE1oTYRNoE28TdhN9E4QTixOSE5kToBOnE64TtRO8E8MTyhPRE9gT3xPmE+0T9BP7FAIUCRQQFBcUHhQlFCwUMxQ6FEEUSBRPFFYUXRRkFGsUchR5FIAUhxSOFJUUnBSjFKoUsRS4FL8UxhTNFNQU2xTiFOkU8BT3FP4VBRUMFRMVGhUhFSgVLxU2FT0VRBVLFVIVWRVgFWcVbhV1FXwVgxWKFZEVmBWfFaYVrRW0FbsVwhXJFdAV1xXeFeUV7BXzFfoWARYIFg8WFhYdFiIWghbHFtZBbWFjcm9uQWJyZXZldW5pMDFDRHVuaTFFQTB1bmkxRUEydW5pMUVBNHVuaTFFQTZ1bmkxRUE4dW5pMUVBQXVuaTFFQUN1bmkxRUFFdW5pMUVCMHVuaTFFQjJ1bmkxRUI0dW5pMUVCNkFvZ29uZWt1bmkwMjQzQ2FjdXRlQ2NpcmN1bWZsZXhDY2Fyb25DZG90YWNjZW50RGNhcm9udW5pMUUwQ3VuaTFFMEVEY3JvYXRFY2Fyb25FbWFjcm9uRWJyZXZlRWRvdGFjY2VudHVuaTFFQjh1bmkxRUJBdW5pMUVCQ3VuaTFFQkV1bmkxRUMwdW5pMUVDMnVuaTFFQzR1bmkxRUM2RW9nb25la0djaXJjdW1mbGV4R2JyZXZlR2RvdGFjY2VudHVuaTAxMjJHY2Fyb251bmkxRTIwdW5pMDA0NzAzMDNIY2lyY3VtZmxleHVuaTFFMjR1bmkxRTJBSGJhckl0aWxkZUltYWNyb251bmkwMTJDSWRvdGFjY2VudHVuaTAxQ0Z1bmkxRUM4dW5pMUVDQUlvZ29uZWtKY2lyY3VtZmxleHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTGRvdHVuaTFFMzZ1bmkxRTM4dW5pMUUzQXVuaTFFNDJOYWN1dGVOY2Fyb251bmkwMTQ1dW5pMUU0NHVuaTFFNDZ1bmkxRTQ4T21hY3JvbnVuaTAxNEVPaHVuZ2FydW1sYXV0dW5pMDFEMXVuaTFFQ0N1bmkxRUNFdW5pMUVEMHVuaTFFRDJ1bmkxRUQ0dW5pMUVENnVuaTFFRDhPaG9ybnVuaTFFREF1bmkxRURDdW5pMUVERXVuaTFFRTB1bmkxRUUydW5pMDFFQVJhY3V0ZVJjYXJvbnVuaTAxNTZ1bmkxRTVBdW5pMUU1Q3VuaTFFNUVTYWN1dGVTY2lyY3VtZmxleHVuaTAxNUV1bmkwMjE4dW5pMUU2MHVuaTFFNjJ1bmkxRTlFVGNhcm9udW5pMDE2MnVuaTAyMUF1bmkxRTZDdW5pMUU2RVV0aWxkZVVtYWNyb25VYnJldmVVcmluZ1VodW5nYXJ1bWxhdXR1bmkwMUQzdW5pMDFENXVuaTAxRDd1bmkwMUQ5dW5pMDFEQnVuaTFFRTR1bmkxRUU2VW9nb25la1Vob3JudW5pMUVFOHVuaTFFRUF1bmkxRUVDdW5pMUVFRXVuaTFFRjBXZ3JhdmVXYWN1dGVXY2lyY3VtZmxleFdkaWVyZXNpc1lncmF2ZVljaXJjdW1mbGV4dW5pMUU4RXVuaTFFRjR1bmkxRUY2dW5pMUVGOFphY3V0ZVpkb3RhY2NlbnR1bmkxRTkydW5pMDE4RmFtYWNyb25hYnJldmV1bmkwMUNFdW5pMUVBMXVuaTFFQTN1bmkxRUE1dW5pMUVBN3VuaTFFQTl1bmkxRUFCdW5pMUVBRHVuaTFFQUZ1bmkxRUIxdW5pMUVCM3VuaTFFQjV1bmkxRUI3YW9nb25la3VuaTAxODBjYWN1dGVjY2lyY3VtZmxleGNjYXJvbmNkb3RhY2NlbnRkY2Fyb251bmkxRTBEdW5pMUUwRmRjcm9hdGVjYXJvbmVtYWNyb25lYnJldmVlZG90YWNjZW50dW5pMUVCOXVuaTFFQkJ1bmkxRUJEdW5pMUVCRnVuaTFFQzF1bmkxRUMzdW5pMUVDNXVuaTFFQzdlb2dvbmVrZ2NpcmN1bWZsZXhnYnJldmVnZG90YWNjZW50dW5pMDEyM2djYXJvbnVuaTFFMjF1bmkwMDY3MDMwM2hjaXJjdW1mbGV4dW5pMUUyNXVuaTFFMkJoYmFyaXRpbGRlaW1hY3JvbnVuaTAxMkR1bmkwMUQwdW5pMUVDOXVuaTFFQ0Jpb2dvbmVraW9nb25lay5kamNpcmN1bWZsZXh1bmkwMTM3a2dyZWVubGFuZGljbGFjdXRlbGNhcm9ubGRvdHVuaTAxM0N1bmkxRTM3dW5pMUUzOXVuaTFFM0J1bmkxRTQzbmFjdXRlbmNhcm9udW5pMDE0NnVuaTFFNDV1bmkxRTQ3dW5pMUU0OW5hcG9zdHJvcGhlb21hY3JvbnVuaTAxNEZvaHVuZ2FydW1sYXV0dW5pMDFEMnVuaTFFQ0R1bmkxRUNGdW5pMUVEMXVuaTFFRDN1bmkxRUQ1dW5pMUVEN3VuaTFFRDlvaG9ybnVuaTFFREJ1bmkxRUREdW5pMUVERnVuaTFFRTF1bmkxRUUzdW5pMDFFQnJhY3V0ZXVuaTAxNTdyY2Fyb251bmkxRTVCdW5pMUU1RHVuaTFFNUZzYWN1dGVzY2lyY3VtZmxleHVuaTAxNUZ1bmkwMjE5dW5pMUU2MXVuaTFFNjN0Y2Fyb251bmkwMTYzdW5pMDIxQnVuaTFFNkR1bmkxRTZGdW5pMUU5N3V0aWxkZXVtYWNyb251YnJldmV1cmluZ3VodW5nYXJ1bWxhdXR1bmkwMUQ0dW5pMDFENnVuaTAxRDh1bmkwMURBdW5pMDFEQ3VuaTFFRTV1bmkxRUU3dW9nb25la3Vob3JudW5pMUVFOXVuaTFFRUJ1bmkxRUVEdW5pMUVFRnVuaTFFRjF3Z3JhdmV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3lncmF2ZXljaXJjdW1mbGV4dW5pMUU4RnVuaTFFRjV1bmkxRUY3dW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmkxRTkzdW5pMDIzN3VuaTAyNTB1bmkwMjUxdW5pMDI1MnVuaTAyNTl1bmkwMjYxdW5pMDI2NXVuaTAyNkZ1bmkwMjc5dW5pMDI4N3VuaTAyOEN1bmkwMjhEdW5pMDI4RXVuaTAyOUVhLmFhZ3JhdmUuYWFhY3V0ZS5hYWNpcmN1bWZsZXguYWF0aWxkZS5hYWRpZXJlc2lzLmFhbWFjcm9uLmFhYnJldmUuYWFyaW5nLmF1bmkwMUNFLmF1bmkxRUExLmF1bmkxRUEzLmF1bmkxRUE1LmF1bmkxRUE3LmF1bmkxRUE5LmF1bmkxRUFCLmF1bmkxRUFELmF1bmkxRUFGLmF1bmkxRUIxLmF1bmkxRUIzLmF1bmkxRUI1LmF1bmkxRUI3LmFhb2dvbmVrLmFnLmFnY2lyY3VtZmxleC5hZ2JyZXZlLmFnZG90YWNjZW50LmF1bmkwMTIzLmFnY2Fyb24uYXVuaTFFMjEuYXVuaTAwNjcwMzAzLmF6ZXJvLm9udW1vbmUub251bXR3by5vbnVtdGhyZWUub251bWZvdXIub251bWZpdmUub251bXNpeC5vbnVtc2V2ZW4ub251bWVpZ2h0Lm9udW1uaW5lLm9udW11bmkwMEFEdW5pMjAxNXVuaTIxMTd1bmkyMTIwYXQuY2FzZWFzdGVyaXNrLmFoeXBoZW4uYXVuaTAwQUQuYWRvbGxhci5hemVyby5zdXBzb25lLnN1cHN0d28uc3Vwc3RocmVlLnN1cHNmb3VyLnN1cHNmaXZlLnN1cHNzaXguc3Vwc3NldmVuLnN1cHNlaWdodC5zdXBzbmluZS5zdXBzcGFyZW5sZWZ0LnN1cHNwYXJlbnJpZ2h0LnN1cHNwZXJpb2Quc3Vwc2NvbW1hLnN1cHN6ZXJvLnN1YnNvbmUuc3Vic3R3by5zdWJzdGhyZWUuc3Vic2ZvdXIuc3Vic2ZpdmUuc3Vic3NpeC5zdWJzc2V2ZW4uc3Vic2VpZ2h0LnN1YnNuaW5lLnN1YnNwYXJlbmxlZnQuc3Vic3BhcmVucmlnaHQuc3Vic3BlcmlvZC5zdWJzY29tbWEuc3Vic3plcm8uZG5vbW9uZS5kbm9tdHdvLmRub210aHJlZS5kbm9tZm91ci5kbm9tZml2ZS5kbm9tc2l4LmRub21zZXZlbi5kbm9tZWlnaHQuZG5vbW5pbmUuZG5vbXBhcmVubGVmdC5kbm9tcGFyZW5yaWdodC5kbm9tcGVyaW9kLmRub21jb21tYS5kbm9temVyby5udW1yb25lLm51bXJ0d28ubnVtcnRocmVlLm51bXJmb3VyLm51bXJmaXZlLm51bXJzaXgubnVtcnNldmVuLm51bXJlaWdodC5udW1ybmluZS5udW1ycGFyZW5sZWZ0Lm51bXJwYXJlbnJpZ2h0Lm51bXJwZXJpb2QubnVtcmNvbW1hLm51bXJvcmRmZW1pbmluZS5hYS5zdXBzYi5zdXBzYy5zdXBzZC5zdXBzZS5zdXBzZi5zdXBzZy5zdXBzaC5zdXBzaS5zdXBzai5zdXBzay5zdXBzbC5zdXBzbS5zdXBzbi5zdXBzby5zdXBzcC5zdXBzcS5zdXBzci5zdXBzcy5zdXBzdC5zdXBzdS5zdXBzdi5zdXBzdy5zdXBzeC5zdXBzeS5zdXBzei5zdXBzZWdyYXZlLnN1cHNlYWN1dGUuc3Vwc3VuaTAyNTkuc3Vwc2Euc3VwYWcuc3VwYUV1cm91bmkwMTkybGlyYXVuaTIwQTZwZXNldGFkb25ndW5pMjBCMXVuaTIwQjJ1bmkyMEI1dW5pMjBCOXVuaTIwQkF1bmkyMjE1c2xhc2guZnJhY3VuaTIyMTlsZXNzZXF1YWxncmVhdGVyZXF1YWxub3RlcXVhbGFwcHJveGVxdWFscGlpbmZpbml0eXVuaTAwQjVwYXJ0aWFsZGlmZmludGVncmFscmFkaWNhbHVuaTIyMDZ1bmkyMTI2c3VtbWF0aW9ucHJvZHVjdHVuaTIxMTNlc3RpbWF0ZWR1bmkyMTkwYXJyb3d1cHVuaTIxOTJhcnJvd2Rvd251bmkyNUEwdW5pMjVDNnVuaTI1Qzl1bmkyNzUydHJpYWd1cHVuaTI1QjN1bmkyNUI2dW5pMjVCN3RyaWFnZG51bmkyNUJEdW5pMjVDMHVuaTI1QzF1bmkyNjEwdW5pMjYxMXVuaTI3MTN1bmkyNjZBbG96ZW5nZXVuaTIwMzJ1bmkyMDMzdW5pMDJCQnVuaTAyQkN1bmkwMkJFdW5pMDJCRnVuaTAyQzh1bmkwMkM5dW5pMDJDQXVuaTAyQ0J1bmkwMkNDdW5pMDMwMHVuaTAzMDAuY2FwdW5pMDMwMXVuaTAzMDEuY2FwdW5pMDMwMnVuaTAzMDIuY2FwdW5pMDMwM3VuaTAzMDMuY2FwdW5pMDMwNHVuaTAzMDQuY2FwdW5pMDMwNnVuaTAzMDYuY2FwdW5pMDMwN3VuaTAzMDcuY2FwdW5pMDMwOHVuaTAzMDguY2FwdW5pMDMwOXVuaTAzMDkuY2FwdW5pMDMwQXVuaTAzMEEuY2FwdW5pMDMwQnVuaTAzMEIuY2FwdW5pMDMwQ3VuaTAzMEMuY2FwdW5pMDMwRnVuaTAzMEYuY2FwdW5pMDMxMnVuaTAzMTN1bmkwMzFCdW5pMDMyM3VuaTAzMjR1bmkwMzI2dW5pMDMyN3VuaTAzMjcuY2FwdW5pMDMyOHVuaTAzMjguY2FwdW5pMDMyRXVuaTAzMzF1bmkwMzA4MDMwNHVuaTAzMDgwMzA0LmNhcHVuaTAzMDgwMzAxdW5pMDMwODAzMDEuY2FwdW5pMDMwODAzMEN1bmkwMzA4MDMwQy5jYXB1bmkwMzA4MDMwMHVuaTAzMDgwMzAwLmNhcHVuaTAzMDIwMzAxdW5pMDMwMjAzMDEuY2FwdW5pMDMwMjAzMDB1bmkwMzAyMDMwMC5jYXB1bmkwMzAyMDMwOXVuaTAzMDIwMzA5LmNhcHVuaTAzMDIwMzAzdW5pMDMwMjAzMDMuY2FwdW5pMDMwNjAzMDF1bmkwMzA2MDMwMS5jYXB1bmkwMzA2MDMwMHVuaTAzMDYwMzAwLmNhcHVuaTAzMDYwMzA5dW5pMDMwNjAzMDkuY2FwdW5pMDMwNjAzMDN1bmkwMzA2MDMwMy5jYXB1bmkwMzAyMDMwNnVuaTAzMDIwMzA2LmNhcHVuaTAzMEMuYXVuaTAzMjYuYXVuaTAwQTB1bmkyMDA3c3BhY2UuZnJhY25ic3BhY2UuZnJhY3VuaTI1MDB1bmkyNTAxdW5pMjUwMnVuaTI1MDN1bmkyNTA0dW5pMjUwNXVuaTI1MDZ1bmkyNTA3dW5pMjUwOHVuaTI1MDl1bmkyNTBBdW5pMjUwQnVuaTI1MEN1bmkyNTBEdW5pMjUwRXVuaTI1MEZ1bmkyNTEwdW5pMjUxMXVuaTI1MTJ1bmkyNTEzdW5pMjUxNHVuaTI1MTV1bmkyNTE2dW5pMjUxN3VuaTI1MTh1bmkyNTE5dW5pMjUxQXVuaTI1MUJ1bmkyNTFDdW5pMjUxRHVuaTI1MUV1bmkyNTFGdW5pMjUyMHVuaTI1MjF1bmkyNTIydW5pMjUyM3VuaTI1MjR1bmkyNTI1dW5pMjUyNnVuaTI1Mjd1bmkyNTI4dW5pMjUyOXVuaTI1MkF1bmkyNTJCdW5pMjUyQ3VuaTI1MkR1bmkyNTJFdW5pMjUyRnVuaTI1MzB1bmkyNTMxdW5pMjUzMnVuaTI1MzN1bmkyNTM0dW5pMjUzNXVuaTI1MzZ1bmkyNTM3dW5pMjUzOHVuaTI1Mzl1bmkyNTNBdW5pMjUzQnVuaTI1M0N1bmkyNTNEdW5pMjUzRXVuaTI1M0Z1bmkyNTQwdW5pMjU0MXVuaTI1NDJ1bmkyNTQzdW5pMjU0NHVuaTI1NDV1bmkyNTQ2dW5pMjU0N3VuaTI1NDh1bmkyNTQ5dW5pMjU0QXVuaTI1NEJ1bmkyNTRDdW5pMjU0RHVuaTI1NEV1bmkyNTRGdW5pMjU1MHVuaTI1NTF1bmkyNTUydW5pMjU1M3VuaTI1NTR1bmkyNTU1dW5pMjU1NnVuaTI1NTd1bmkyNTU4dW5pMjU1OXVuaTI1NUF1bmkyNTVCdW5pMjU1Q3VuaTI1NUR1bmkyNTVFdW5pMjU1RnVuaTI1NjB1bmkyNTYxdW5pMjU2MnVuaTI1NjN1bmkyNTY0dW5pMjU2NXVuaTI1NjZ1bmkyNTY3dW5pMjU2OHVuaTI1Njl1bmkyNTZBdW5pMjU2QnVuaTI1NkN1bmkyNTZEdW5pMjU2RXVuaTI1NkZ1bmkyNTcwdW5pMjU3MXVuaTI1NzJ1bmkyNTczdW5pMjU3NHVuaTI1NzV1bmkyNTc2dW5pMjU3N3VuaTI1Nzh1bmkyNTc5dW5pMjU3QXVuaTI1N0J1bmkyNTdDdW5pMjU3RHVuaTI1N0V1bmkyNTdGdW5pMjU4MHVuaTI1ODF1bmkyNTgydW5pMjU4M3VuaTI1ODR1bmkyNTg1dW5pMjU4NnVuaTI1ODd1bmkyNTg4dW5pMjU4OXVuaTI1OEF1bmkyNThCdW5pMjU4Q3VuaTI1OER1bmkyNThFdW5pMjU4RnVuaTI1OTB1bmkyNTkxdW5pMjU5MnVuaTI1OTN1bmkyNTk0dW5pMjU5NXVuaTI1OTZ1bmkyNTk3dW5pMjU5OHVuaTI1OTl1bmkyNTlBdW5pMjU5QnVuaTI1OUN1bmkyNTlEdW5pMjU5RXVuaTI1OUZ1bmkwMjU4dW5pMDI1NDEuMDAwU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvASICAAEARwB5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CxVktchs3Bv3H/cWC6qlYLobuKuyxpAfCxXWBjH3LQUhBg73kRX4Hun3Fx0V9wXp+wUGC7RYG15sZlAL9xUK92R3C/trufcNvgELfQr3jgv3iBX7NguFHpRdBQuPH1AGCxPc9wQmBxPs+wQLN54fjwcT+NqmwQsVIAb3BvsFBdsGCwHW9yr3KvcqA9YL/CQcBXhJCgv3ZvsD7vsd+wgmC3AdwgoL9yH3HAoL92P8xOj5IfvABgsVWK9qt7evrL4eC2ppWl2qbLiTk40LGZAGiWaJXIpnCAv5IfUdb7YfDgACWAA3AAAAGgBiAD8AUABuAIAAMwBLAFoASwBaAH8ATQBPAC0AXgAuAFwAPwAnAEsAIwAJAC0AIQA/AEwAWABMADgAQQBiAEMAWABXADQAYgBMADYAWAA4AFgAOACKAEMAQABJAC4ABwA5AC0ARwAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAa//4AFwA/AD8APwA/AD8AUABQAFAADABuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AMwAzADMAMwAzADMAMwBLAEsASwAIAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAEsAWgB/AH8AfwB/AH8APwB/ADAATQBPAE8ATwBPAE8ATwBPAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0AKQAdAC0ALQAtAC0ALQAtAC0AXABcAFwAXABcAFwAPwA/AD8APwA/AD8APwBLACcAJwAnACcAJwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsACQAJAAkACQAhACEAIQAhACEAIQAhACEAPwA/AD8APwAMAF4APQBMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMABEAEABMAEwATABMAEwAKwA4ADgAOABBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQwBDAEMAQwBDAEMAQwACAFgAWAAQAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcANABiAGIATABMACIATABMAEwATABMADYAWABYAFgAWABYAFgAWP/kADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAALADgAOAA4ADgAOAA4ADgAigBvAIoAfwB/AEkAQwBDAEMAQwBDAEMAQwBRAEAAQABAAEAAQABAAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQAHAAcABwAHAC0ALQAtAC0ALQAtAC0ALQBHAEcARwBHADgAWAA0AFkAOABYADoAPABBADgASQAqADwANQAuAAcALAAXACgALQA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ACUAQwBeAEAANQAmADUASQBEAEIAPwBDAF4AQAA1ACYANQBKAEQAQgA/ANIAwQDSAMEAFwDcANwAagB2AO0AdgDLANUAUwBeANUAXgC/AM4ASABXAFEAUQBQABQAUAAUANIAkwA8AMkAewDbAGQAdABkAF0BAABdAQAATwB1AHUAVgBCABsAGwBt//kACQAtAC0AUwBjAIMAgwBQAJ4AzQCpAKoAqQCqAKsAtQCsAKoA5wDRAPoA8ACeAM0AqQCqAKkAqgCrALUArACqAOcA0QD6APAAngDNAKkAqgCpAKoArAC1AKwAqgDnANEA+gDwAJ4AzQCpAKoAqQCqAKsAtQCsAKoA5wDRAPoA8ACkAIcAjACkAKcAsgCHAJ0AwgCRAKoArgCKALUAwAB+AKoAjACnAIcA7ACeAKAAmwCMAFIAlgCJAJMAnQCdAJkAhwCHAKoANABQAEsALwA2AG0AMQBcAEsAKgAlAGkAJgBQAFwAZwAzABkAGQAZABoALAAZABkAJgAZABkAGQAZABkAGQBRAFEAYQBRAM8AUQB3AGgAUQBRAFEAaQBRAEYARgBRACH/+gBJAEgAsAA3AB8AGQBDAC0AagAaABAAIAAeACAAxACZAHIAoQAiACIARABEACIAIgAdAB3/5v/m//cARwBdAPkAmQDLANUA8gDYAK4A5wCgAKAA8gCtAOUArQDyAJcAjACtAKYAygDDAOIA2ADlAK4AoQDnAPMAoACcAJcAlQCtAKwApgCtAOIA7ACMAJwA6ADoAMoAygDDALgAoACcAGIAYgDzAPoBIwDiAJwA0wDTAM4A5QDkAKoArAChAKEAoQChAKEAnAChAKEAsgCkALIApACyAKQApQCkAKoArgCqAK4AqgCuAKUAogCqAKQBBADjAAAAAAAAAAD/0f/RAP0AzwAhACEA/QDPABIAEgD9AM8A/QD9AM8Az//R/9H/0f/RAP0A/QDPAM//0f/R/9H/0QD9AP0AzwDPAM8AzwDPAM//0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0QBLAEsA/QDP/9EAoAD9AKAAoP/R/9H/0QD9AKAAoP/R/9H/0QD9AKAAoP/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0QD9/9H/0QD9/9H/0f/R/9EA/QD9AP3/0QDPAP0Az//RAM//0QDPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAAAAAAAAAAg0AAAEsAAAAAAAAAAAAAAEsAAAAAAABAAAADAAAAAAAygACAB8AAgA1AAEASwBMAAEAZwBnAAEAbgBuAAIAfgB+AAEAoQCjAAEAqQCpAAEAzQDOAAEA5gDmAAEA/AD8AAEBBAEEAAIBGAEYAAEBHAEcAAIBHwEfAAIBLgEuAAIBLwEwAAEBNQE1AAIBVQFXAAEBXQFdAAEBbAFsAAIBggGDAAEBmgGbAAEBnQGdAAEBoQGiAAEBrQGtAAEBwwHEAAEByAHIAAICzQLNAAEC1wLXAAEC3QMcAAMDHgMeAAMAAgADAt0C+AABAwMDHAABAx4DHgABAAEAAAAKAGwCGgACREZMVAAObGF0bgA4AAQAAAAA//8AEAAAAAIABAAGAAgACgAMAA4AEAASABQAFgAYABoAHAAeAAQAAAAA//8AEAABAAMABQAHAAkACwANAA8AEQATABUAFwAZABsAHQAfACBhYWx0AMJhYWx0AMpjYXNlANJjYXNlANhjY21wAN5jY21wAOxkbm9tAPpkbm9tAQBmcmFjAQZmcmFjARBudW1yARpudW1yASBvbnVtASZvbnVtASxvcmRuATJvcmRuAThzYWx0AT5zYWx0AUpzaW5mAVZzaW5mAVxzczAxAWJzczAxAWhzczAyAW5zczAyAXRzczAzAXpzczAzAYBzczA0AYZzczA0AYxzdWJzAZJzdWJzAZhzdXBzAZ5zdXBzAaYAAAACAAAAAQAAAAIAAAABAAAAAQAQAAAAAQAQAAAABQADAAQABQAGAAcAAAAFAAMABAAFAAYABwAAAAEACQAAAAEACQAAAAMACAAKAAsAAAADAAgACgALAAAAAQAIAAAAAQAIAAAAAQAPAAAAAQAPAAAAAQAMAAAAAQAMAAAABAARABIAEwAUAAAABAARABIAEwAUAAAAAQAOAAAAAQAOBAQAAQARA/4AAQARBAgAAQASBAIAAQASBDgAAQATBDIAAQATBEgAAQAUBEIAAQAUAAAAAQAOAAAAAQAOAAAAAgAMAA0AAAACAAwADQAXADAAOABAAEgAUABaAGIAagByAHoAggCKAJYAngCmAK4AtgC+AMYAzgDWAN4A5gABAAAAAQP6AAMAAAABBLAAAgAAAAEArgAGAAAAAQDMAAYAAAACANYA6gAEAAAAAQDyAAQAAAABAWQABgAAAAECKgABAAAAAQI0AAEAAAABAk4AAQAAAAECaAAGAAAAAwJmAngCigABAAAAAQKSAAEAAAABAsoAAQAAAAEC5AABAAAAAQL+AAEAAAABAvwAAQAAAAEC/gABAAAAAQMGAAEAAAABAzoAAQAAAAEDTgAEAAAAAQTcAAEAAAABBOYAAQU+AAQADgAUABoAIAACAAYC4QACABAC4QACACAC4QACACoC4QADAAAAAQUYAAEFJAABAAAAAgADAAAAAgUYBR4AAQUkAAEAAAAVAAMAAAABBRYAAQUQAAEAAAAWAAEFCgADAAwANgBYAAUADAASABgAHgAkAw0AAgLdAwsAAgLfAxEAAgLjAxsAAgLnAw8AAgLtAAQACgAQABYAHAMVAAIC3QMTAAIC3wMZAAIC4wMXAAIC7QAEAAoAEAAWABwDCQACAt0DBQACAt8DAwACAuUDBwACAvMAAQSaABAAJgAwADoARABOAFgAYgBsAHYAgACSAJwApgCwALoAxAABAAQASwACAv8AAQAEAGcAAgL/AAEABABuAAIC4wABAAQAfgACAv8AAQAEAKkAAgL/AAEABADNAAIC/wABAAQA/AACAv8AAQAEAQQAAgLzAAEABAEYAAIC/wACAAYADAEfAAIC4wEcAAIC/QABAAQBLgACAv8AAQAEATUAAgLzAAEABAFdAAIC/wABAAQBbAACAvMAAQAEAYIAAgL/AAEABAHIAAIC/QADAAED8AABBBIAAAABAAAAFgACBDwADgJEAkUCRgJHAkgCSQJKAksCTAJNAlACUQJOAk8AAgQaAA4CNgI3AjgCOQI6AjsCPAI9Aj4CPwJCAkMCQAJBAAEEDgCDAAMAAQQOAAEEGAAAAAEAAAAWAAMAAQQOAAEEHgAAAAEAAAAWAAMAAgQgBBYAAQQMAAAAAQAAABYAAgQUAB0CVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAAIDegAOAhoCGwIcAh0CHgIfAiACIQIiAiMCJgInAiQCJQACA1gADgIoAikCKgIrAiwCLQIuAi8CMAIxAjQCNQIyAjMAAQOmAAoAAQOqAAEAAAEAAAID3gADAhcCGAIWAAABAQACA9gAGQGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMCUwJyAAABAgACA7gACQHEAcUBxgHHAcgByQHKAcsCcwAAAQMAAQOy/6MAAgOyAFwCVgJXAlgCWQJaAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwJvAnABxQHGAccByAHJAcoBywJxAhcCGAIWAhQCUwJyAnMCGQLeAuAC4gLkAuYC6ALqAuwC7gLwAvIC9AL2Av4DAAMEAwYDCAMKAwwDDgMQAxIDFAMWAxgDGgMcAAEDsAAQACYALAAyAD4ASgBWAGIAbgB6AIYAkgCeAKoAtAC+AMgAAgJVAa0AAgJbAcQABQJEAjYCGgIoAdcABQJFAjcCGwIpAdgABQJGAjgCHAIqAdkABQJHAjkCHQIrAdoABQJIAjoCHgIsAdsABQJJAjsCHwItAdwABQJKAjwCIAIuAd0ABQJLAj0CIQIvAd4ABQJMAj4CIgIwAd8ABQJNAj8CIwIxAeAABAJQAkICJgI0AAQCUQJDAicCNQAEAk4CQAIkAjIABAJPAkECJQIzAAEAhAABAAgAAQAEAS8AAgL/AAIC7gAtAyEBLwI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMC3gLgAuIC5ALmAugC6gLsAu4C8ALyAvQC9gL+AwADBAMGAwgDCgMMAw4DEAMSAxQDFgMYAxoDHAMiAAEABABZ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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; +// src: local('Source Code Pro Semibold'), local('SourceCodePro-Semibold'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqdNE-IuDiR70wI4zXaKqWCM.ttf) format('truetype'); + src: local('Source Code Pro Semibold'), local('SourceCodePro-Semibold'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT8cAAAAOkNGRiC2ZBOfAABJHAAA2XlEU0lHBLtt/AABP1gAACBYR0RFRi8sL9AAASogAAAA1EdQT1MlURFbAAE2KAAACPRHU1VC3Z7yFQABKvQAAAsyT1MvMnOc0bUAAAFQAAAAYGNtYXDp1MYJAAA+7AAAChBoZWFk+82HfgAAAOwAAAA2aGhlYQZmAOAAAAEkAAAAJGhtdHialJxBAAEimAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZXGkOKIAAAGwAAA9PHBvc3T/uAAzAABI/AAAACAAAQAAAAEEWrrz6QNfDzz1AAMD6AAAAADNFZ/2AAAAAM0Vn/b/yv5wAsED6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/K/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAJYAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwYJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAGABFAAEAAAAAAAIABwBdAAEAAAAAAAMAJwBkAAEAAAAAAAQAGABFAAEAAAAAAAUAOQCLAAEAAAAAAAYAFgDEAAEAAAAAAAcAYADaAAEAAAAAAAgAGgE6AAEAAAAAAAkADAFUAAEAAAAAAAsAGQFgAAEAAAAAAA0R2QF5AAEAAAAAAA4AJBNSAAEAAAAAABAADxN2AAEAAAAAABEACBOFAAEAAAAAAQAAFhONAAEAAAAAAQEACxOjAAEAAAAAAQIACxOuAAEAAAAAAQMAFRO5AAMAAQQJAAAAihPOAAMAAQQJAAEAMBRYAAMAAQQJAAIADhSIAAMAAQQJAAMAThSWAAMAAQQJAAQAMBRYAAMAAQQJAAUAchTkAAMAAQQJAAYALBVWAAMAAQQJAAcAwBWCAAMAAQQJAAgANBZCAAMAAQQJAAkAGBZ2AAMAAQQJAAsAMhaOAAMAAQQJAA0jthbAAAMAAQQJAA4ASDp2AAMAAQQJABAAHjq+AAMAAQQJABEAEDrcAAMAAQQJAQAALDrsAAMAAQQJAQEAFjsYAAMAAQQJAQIAFjsuAAMAAQQJAQMAKjtEQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIFNlbWlib2xkUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1TZW1pYm9sZDtBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tU2VtaWJvbGRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9TZW1pYm9sZFR5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAAUwBlAG0AaQBiAG8AbABkAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBTAGUAbQBpAGIAbwBsAGQAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFMAZQBtAGkAYgBvAGwAZABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AUwBlAG0AaQBiAG8AbABkAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARdTb3VyY2VDb2RlUHJvLVNlbWlib2xkAAEBAS769gD69wH6+AwA+vkC+voD+BoEjAwBVfwk+VX6fAUcMZ4PHDQYEckdAADFDxIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3xbuQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2Vy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ACsAKwArACsAKwArACsAKwAmABoAKwArACsAKwArACsAKwBUAFQAVABUAFQAVAA6ADoAOgA6ADoAOgA6AEcAJAAkACQAJAAkAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASAAHAAcABwAHABsAGwAbABsAGwAbABsAGwA9AD0APQA9AAkAVwA8AEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcAEAANAEkASQBJAEkASQAlADUANQA1AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+//sAUgBSAA0AVABUAFQAVABUAFQAVABUAFQAVABUAFQAVAAxAFoAWgBHAEcAGwBHAEcARwBHAEcAMABSAFIAUgBSAFIAUgBS/94ANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1AAsANQA1ADUANQA1ADUANQCCAGwAggB4AHgARgA+AD4APgA+AD4APgA+AEoAOwA7ADsAOwA7ADsARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAAYABgAGAAYAKAAoACgAKAAoACgAKAAoAEcARwBHAEcANQBSADEAUwA1AFIAOAA6AD4ANQBEACcAOgA0ACkABgAnABQAHQAiADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUAIABAAFoAPAAyACUAMwBEAEIAQAA8AEAAWgA8ADIAJQAzAEUAQgBAADwAyQC9AMkAvQAPANUA1QBoAHEA5gBqAMQA0gBIAFYA0gBWALoAyQA+AE0ATgBOAFAAFABQABQAyQCQADwAwgB8ANUAZgBxAGYAVgD5AFYA+QBKAGwAbABRADwAGAAYAGr/9wADACgAKABOAF4AgQCBAEoAnADKAKYAqACmAKgAqAC0AKoAqADhAM4A9QDrAJwAygCmAKgApgCoAKgAtACqAKgA4QDOAPUA6wCcAMoApACoAKYAqACpALQAqgCoAOEAzgD1AOsAnADKAKYAqACmAKgAqAC0AKoAqADhAM4A9QDrAKEAhQCJAKEAowCvAIUAmgC+AI0ApQCsAIgArgC9AHsApQCJAKMAhQDlAJkAnQCXAIUAUwCNAIYAlQCaAJoAlwCFAIUApQAvAEoASQAqADMAaAAwAFcASQAlACAAZAAgAEsAVwBiAC4AFgAWABYAFwAnABYAFgAlABYAFgAWABYAFgAWAE4ATgBdAE4AxwBOAHYAZgBOAE4ATgBiAE4AQABAAE4AGv/3AEYARACmADAAGQAUAEAAJgBfABoADwAgAB4AIAC/AJMAbACcAB4AHgBAAEAAHgAeABkAGf/l/+X/9QBBAFgA8wCLAMQA0gDvANYApADiAJgAmADsAKoA4gCjAOwAkACDAKoAoQDFALwA2gDSAOAApACZAOIA7QCYAJQAkACOAKoApwChAKoA2gDlAIMAlADjAOMAxQDFALwAsQCYAJQAWABYAPAA+AEjANoAlADOAM4AywDgAN4ApwCpAJoAmgCaAJoAmgCUAJoAmgCsAJwArACcAKwAnACiAJwApwCrAKcAqwCnAKsAogCdAKQAnAEBAN4AAAAAAAAAAP/K/8oA9gDAACEAIQD2AMAAEgASAPYAwAD2APYAwADA/8r/yv/K/8oA9gD2AMAAwP/K/8r/yv/KAPYA9gDAAMAAwADAAMAAwP/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/KAEsASwD2AMD/ygCKAPYAigCK/8r/yv/KAPYAigCK/8r/yv/KAPYAigCK/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/KAPb/yv/KAPb/yv/K/8r/ygD2APYA9v/KAMAA9gDA/8oAwP/KAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAA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ASoCpAABAUYCpAABAU0CpAABAUsCpAABASsCpAABAUECpAABATwCpAABAMECpAABATICpAABAToCpAABAS8CqQABATACpAABATUCpAABATsCpAABATcCAQABAJEC2gABAVYCAQABAb0C2gABAToCAQABAaAC5QABATICAQABAJcC2gABAVoCxQABAKwC2gABARUC2gABAT8CAgABATwCAQABAT4CAQABATACAQABAVQCAQABATQCAQABAQgCigABAScCAQABAS4CAQABAS0CAQABAUICAQABAa8CtgABAS8CpAABAZECpAABAT4CpAABATkCAQABAVoCAQABAT0CAQABATgCAQABATYCAQABARwCAQABASICAQABASUCAQABASoCAgABAZACAQABAPICAQABARoCAQABASwC1gABASwCxwABBEYETgABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVsAAAABATQAAAABAVUAAAABATgAAAABAXYAAAABBBYEJAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAAngCYAJgAwgDmAOwAmADyAPgA5gD+AQQBCgDsARAA8gEWARwAzgEiAPgAngCYASgBLgE0AQQBOgDgAMgBQACYAUYBTACYAJgBUgEWAJgA4AFYAV4BZADIAVIAngCqAWoBcADIAXYBfADIAUABggGIAWQBjgABASz/6gABATb/6gABAVv/6gABASL/6gABAUb/6gABAMD/6gABAU//6gABASv/6gABAS7/6gABAUr/6gABAVP/6gABAJn/6gABAUD/6gABAS//6gABAST/6gABATf/6gABATL/6gABAVX/6gABATT/6gABATr/6gABASL/GwABAVr/6gABAO7/FwABAW7/6gABAIv/JgABAb//JgABAMr/6gABAXb/6gABAS3/6gABAQv/DwABAT3/6gABAUX/6gABATP/6gABAUP/6gABATj/6gABAcn/JgABASn/6gABAIH/6gABAW//6gABAQn/DwABAQD/6gABAcr/JgABAroCwAABAAwAEgABAAAADgADAA4AFAAaAAEBLAHrAAEBpgKEAAEB/AKYAAEBnQHrAAECmAKgAAEADAAWAAIAAAAk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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; +// src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqbsbIrGiHa6JIepkyt5c0A0.ttf) format('truetype'); + src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAUlwAAAAOkNGRiAHSupxAABIqAAA5CBEU0lHE/UMPwABSawAACBYR0RFRi8sL9AAATRQAAAA1EdQT1MlBRrrAAFAWAAACRhHU1VC3Z7yFQABNSQAAAsyT1MvMnQA0tUAAAFQAAAAYGNtYXDp1MYJAAA+eAAAChBoZWFk+7+HegAAAOwAAAA2aGhlYQZXAOAAAAEkAAAAJGhtdHiJeIp6AAEsyAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZU1Di90AAAGwAAA8x3Bvc3T/uAAzAABIiAAAACAAAQAAAAEEWmW2IDdfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/u/5wAsED6AABAAMAAgAAAAAAAAABAAAD2P7vAAACWP+7/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAK8AAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwcJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAIAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAIgGeAAEAAAAAAAAARQAAAAEAAAAAAAEADwBFAAEAAAAAAAIABABUAAEAAAAAAAMAIwBYAAEAAAAAAAQAFAB7AAEAAAAAAAUAOQCPAAEAAAAAAAYAEgDIAAEAAAAAAAcAYADaAAEAAAAAAAgAGgE6AAEAAAAAAAkADAFUAAEAAAAAAAsAGQFgAAEAAAAAAA0R2QF5AAEAAAAAAA4AJBNSAAEAAAAAAQAAFhN2AAEAAAAAAQEACxOMAAEAAAAAAQIACxOXAAEAAAAAAQMAFROiAAMAAQQJAAAAihO3AAMAAQQJAAEAHhRBAAMAAQQJAAIACBRfAAMAAQQJAAMARhRnAAMAAQQJAAQAKBStAAMAAQQJAAUAchTVAAMAAQQJAAYAJBVHAAMAAQQJAAcAwBVrAAMAAQQJAAgANBYrAAMAAQQJAAkAGBZfAAMAAQQJAAsAMhZ3AAMAAQQJAA0jthapAAMAAQQJAA4ASDpfAAMAAQQJAQAALDqnAAMAAQQJAQEAFjrTAAMAAQQJAQIAFjrpAAMAAQQJAQMAKjr/Q29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvQm9sZDEuMDE3O0FEQkU7U291cmNlQ29kZVByby1Cb2xkO0FET0JFU291cmNlIENvZGUgUHJvIEJvbGRWZXJzaW9uIDEuMDE3O1BTIDEuMDAwO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU5MDBTb3VyY2VDb2RlUHJvLUJvbGRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxUeXBvZ3JhcGhpYyBhbHRlcm5hdGVzQWx0ZXJuYXRlIGFBbHRlcm5hdGUgZ0FsdGVybmF0ZSBkb2xsYXIgc2lnbgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBCAG8AbABkADEALgAwADEANwA7AEEARABCAEUAOwBTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0AQgBvAGwAZAA7AEEARABPAEIARQBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwAgAEIAbwBsAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEIAbwBsAGQAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAADAAAAAwAAAhQAAQAAAAAAHAADAAEAAAIUAAYB+AAAAAkA9wABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHNAc4BzwHQAdEB0gHTAdQB1QHWAeMB5AKaApkCmwHoAhMAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbAgECBwICAp8B/gLLABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQIDAgYCBAKhAAAAOgA9AE4AWACMAJUAwQDoAOcA6QDrAOoA7gD/AQkBCAEKAQwBJQEkASYBKAE/AUYBRQFHAUkBSAFzAXIBdAF2AgoCdAJ6AncCDAH9Ag0BawIQAg4CEQLMAtUCoABMAKECpQKeApwCnQJ4AqYCpwKsAq0CpAKoAlICVAAAAP0BVQHpAecCowKpAnsCogKqAfQB9QHlAx8ANgA5AJQAogFWAfgB+QHuAe8B7AHtApcCxAGQANsChgJ5AfIB8wGrAawCCwH8AfAB8QKKADgAWQA3AFsAVwB0AHUAdwBzAJIAkwAAAJEAvgC/AL0BMALNAtQC1gLXAtoC2ALbAtkC3ALOAAQH/AAAARYBAAAHABYALwA5AEAAWgBgAHoAfgC/AMQA0QDWAN8A5ADxAPYBMQFJAWUBfgGAAY8BkgGhAbAB3AHnAesCGwI3AkMCUgJUAlkCYQJlAm8CeQKHAo4CngKwArMCuAK8Ar8CzALdAuMDBAMMAw8DEwMbAyQDKAMuAzEDwB1DHUkdTR1QHVIdWB1bHZwdoB27Hg8eIR4lHiseOx5JHmMebx6FHo8ekx6XHp4e+SAHIBUgGiAeICIgJiAwIDMgOiBEIHEgeSB/IIkgjiCUIKEgpCCnIKwgsiC1ILohEyEXISAhIiEmIS4hVCFeIZMiAiIGIg8iEiIVIhoiHiIrIkgiYCJlJZ8loCWzJbclvSXBJcYlyiYRJmonEydS+wL//wAAACAAMAA6AEEAWwBhAHsAoADAAMUA0gDXAOAA5QDyAPcBNAFMAWgBgAGPAZIBoAGvAc0B5gHqAhgCNwJDAlACVAJYAmECZQJvAnkChwKMAp4CsAKyArcCuwK+AsYC2ALhAwADBgMPAxIDGwMjAyYDLgMxA8AdQx1HHU0dTx1SHVYdWx2cHaAdux4MHiAeJB4qHjYeQh5aHmwegB6OHpIelx6eHqAgByASIBggHCAgICYgMCAyIDkgRCBwIHQgfSCAII0glCChIKQgpiCrILEgtSC5IRMhFyEgISIhJiEuIVMhWyGQIgIiBiIPIhEiFSIZIh4iKyJIImAiZCUAJaAlsiW2JbwlwCXGJckmECZqJxMnUvsB//8AAAGdAAD/wQAA/7sAAAAA/3YAAP+/AAAABwAAAFMAAAAAAAAAAP9+/1cA6QAAAAAAAAAAAAAAAP9k/gr/TP9L/0j/Qf8+/zX/LP8f/xv/DP+sAAAAAAAMAAsABwAAAAAAAAAA/+b/5f/e/9cAAP/T/9H+5OUSAADlDgAA5REAAOUP5LvkuuSzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLa4hkAAOMZAAAAAAAAAADhv+Ja4pPhueJCAADhqgAA4ajhpeHd4dvh2eHYAADh0OHO4cvhm+D44PLg7+GF4YHhO+E14SDgpeCk4J4AAOByAADgh+B94FrgQOA43iPdFN0G3QTdANz+3O8AANyw3Fnbr9tlBqoAAQEWAAABMgAAATwAAAFEAUoAAAGGAAABnAAAAaoAAAHAAjQCXgKQAAAAAAAAArYCuAK6AtgC2gLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyALKAAAAAAAAAsYC0ALUAtwAAAAAAAAAAALgAAAAAAAAAAAC3AAAAt4AAALeAAAAAAAAAAAC2gLgAuIC5ALmAvAC/gMQAxYDIAMiAAAAAAMgAAAD0APWA9oD3gAAAAAAAAAAAAAD2AAAA9gAAAAAAAAAAAAAAAAD0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0AAADtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOeAAAAAAAAAAAAAAAAAAEB5gHrAhUCdgKJAcwB6gH/AgACCQKUAeIB9gHhAgUB4wHkApoCmQKbAegCEwIBAgcCAgKfAf4CywIDAgYCBAKhAx8B5wJ6AncCdQJ4AggCDALVAg4CUgH0AqMB9wIQAtYCdAKeAhwCHQLMAqYCDQH8AtsCGwJUAfUCiwKMAo0B6QA9AEwATgBXAFgAWQBbAHMAdAB1AHcA5ACMApYAoQC9AL4AvwDBANkA5QFrAO4A/QD/AQgBCQEKAQwBJAElASYBKAGZAT8ClwFVAXIBcwF0AXYBjgGaAZAAOwDsADwA7QBLAPwATwEAAFABAQBSAQMAUQECAFMBBABWAQcAXAENAF0BDgBeAQ8AZwEYAFoBCwBoARkAaQEaAGoBGwBrARwAbwEgAHIBIwB2AScAeAEpAHkBKgB+AS4AegEwAH8BMQCAATIBMwCBATQAgwE3AIIBNQCEATYAiAE7AIoBPQCNAUAAiwE+AUQAlgFKAJcBSwCYAUwAogFWAKoBXgCsAV8AqwFgALABZACxAWUAswFnALIBZgC5AW0AuAFsAMABdQDCAXcAwwF4AMQBeQDFAXoAzQGCANYBiwDaAY8A2wDgAZUA4gGXAOEBlgCjAVcAzgGDAD4A7wB7ASsAmQFNAMYBewDHAXwAyAF9AMkBfgDKAX8AbAEdAKkBXQC0AWgAugFuAl4CZgJrAm0C1wLaAtgC3ALUAtkCYAJnAmwC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC/AL9Av8CVgJYAlkCXwJhAmQCaAJpAFQBBQBVAQYAbQEeAHABIQBxASIAhQE4AIYBOQCHAToAiQE8AI4BQQCPAUIAkAFDAK0BYQCuAWIArwFjALUBaQC2AWoAuwFvALwBcADUAYkA1QGKANcBjADcAZEA4wGYAD8A8ABAAPEAQQDyAEIA8wBDAPQARAD1AEUA9gBGAPcARwD4AEgA+QBJAPoASgD7AF8BEABgAREAYQESAGIBEwBjARQAZAEVAGUBFgBmARcAfAEsAH0BLQCaAU4AmwFPAJwBUACdAVEAngFSAJ8BUwCgAVQApAFYAKUBWQCmAVoApwFbAKgBXADLAYAAzAGBAM8BhADQAYUA0QGGANIBhwDTAYgA2AGNAN0BkgDeAZMA3wGUAfoB+AH5AfsB7AHtAfAB7gHvAfECCgILAf0CGgJdAiQCJQJiAoACeQKsApUCmAKpArYCxAADAAAAAAAA/7UAMgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAEAgABAQETU291cmNlQ29kZVByby1Cb2xkAAEBAS769gD69wH6+AwA+vkC+voD+BQEjAwBRvwk+VX6fAUcMkMPHDS9EcsdAADOrhIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW2xbqQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBCb2xkU291cmNlIENvZGUgUHJvAS4CAAEASACAAKYAxwEKAVsBpAG+AfMCSwJlAm4CcgKMApYCswLXAuQC8AM/A0cDZAOLA64DswPNA9cEDQQZBCkELQQ6BIIEmQThBOwFdAWB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AEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAABAAEAAQABAAQABAAEAAQABAAEAAQABAAOAA4ADgAOAACAEkAOgA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9ABAABgBDAEMAQwBDAEMAGQAvAC8ALwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANAA0ADQANAA0ADQANP/uAEgASAAGAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AKgBMAEwAPgA+AAwAPgA+AD4APgA+ACQASABIAEgASABIAEgASP/SAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAMAC8ALwAvAC8ALwAvAC8AdABkAHQAaQBpAEEANQA1ADUANQA1ADUANQA9ADEAMQAxADEAMQAxAD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgAEAAQABAAEAB8AHwAfAB8AHwAfAB8AHwBGAEYARgBGAC8ASAAqAEgALwBIADQANgA3AC8APAAgADQAMgAfAAQAHQAPAAcACwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvABcAOABSADMAKgAjAC4APAA+AD0ANQA4AFIAMwAqACMALgA9AD4APQA1ALgAtgC4ALb//wDIAMgAYgBnANcAUgC4AMoAMwBFAMoARQCvAMAAKgA7AEYARgBQABQAUAAUALgAiAA8ALUAfgDJAGkAagBpAEoA6wBKAOsAQABZAFkARwAwABMAEwBl//P/9wAfAB8ARgBUAHwAfABAAJgAxACeAKUAoQClAKEAsQCmAKQA1gDHAO0A4wCYAMQAngClAKEApQChALEApgCkANYAxwDtAOMAmADEAJwApQChAKUAogCxAKYApADWAMcA7QDjAJgAxACeAKUAoQClAKEAsQCmAKQA1gDHAO0A4wCaAIAAhQCaAJoAqgCAAJQAtwCFAJwAqQCFAKAAtgBzAJwAhQCaAIAA1gCRAJYAkAB2AFMAfACBAJcAlACUAJQAgACAAJwAJABAAEMAHwAtAGAALgBPAEMAGwAVAFsAFgBDAE8AWAAkABEAEQAR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) format('truetype'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 900; +// src: local('Source Code Pro Black'), local('SourceCodePro-Black'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqRPPOa1q11iOmmM9mDHHHX4.ttf) format('truetype'); + src: local('Source Code Pro Black'), local('SourceCodePro-Black'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAATq8AAAAOkNGRiDcZxQDAABI+AAA1VlEU0lHIymbLAABOvgAACBYR0RFRi8sL9AAASXcAAAA1EdQT1NOSdIWAAEx5AAACNZHU1VC3Z7yFQABJrAAAAsyT1MvMnTI07UAAAFQAAAAYGNtYXDp1MYJAAA+yAAAChBoZWFk+7OHeAAAAOwAAAA2aGhlYQZMAOAAAAEkAAAAJGhtdHh8E3yCAAEeVAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZbSud8oAAAGwAAA9GHBvc3T/uAAzAABI2AAAACAAAQAAAAEEWpUd6D1fDzz1AAMD6AAAAADNFZ/zAAAAAM0Vn/P/sP5wAsED6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP+w/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAOEAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwgJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFQBFAAEAAAAAAAIABwBaAAEAAAAAAAMAJABhAAEAAAAAAAQAFQBFAAEAAAAAAAUAOQCFAAEAAAAAAAYAEwC+AAEAAAAAAAcAYADRAAEAAAAAAAgAGgExAAEAAAAAAAkADAFLAAEAAAAAAAsAGQFXAAEAAAAAAA0R2QFwAAEAAAAAAA4AJBNJAAEAAAAAABAADxNtAAEAAAAAABEABRN8AAEAAAAAAQAAFhOBAAEAAAAAAQEACxOXAAEAAAAAAQIACxOiAAEAAAAAAQMAFROtAAMAAQQJAAAAihPCAAMAAQQJAAEAKhRMAAMAAQQJAAIADhR2AAMAAQQJAAMASBSEAAMAAQQJAAQAKhRMAAMAAQQJAAUAchTMAAMAAQQJAAYAJhU+AAMAAQQJAAcAwBVkAAMAAQQJAAgANBYkAAMAAQQJAAkAGBZYAAMAAQQJAAsAMhZwAAMAAQQJAA0jthaiAAMAAQQJAA4ASDpYAAMAAQQJABAAHjqgAAMAAQQJABEACjq+AAMAAQQJAQAALDrIAAMAAQQJAQEAFjr0AAMAAQQJAQIAFjsKAAMAAQQJAQMAKjsgQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIEJsYWNrUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1CbGFjaztBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tQmxhY2tTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9CbGFja1R5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAAQgBsAGEAYwBrAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBCAGwAYQBjAGsAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEIAbABhAGMAawBTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AQgBsAGEAYwBrAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCm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8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBCbGFja1NvdXJjZSBDb2RlIFBybwEPAgABADEANABbAIwAsQDKAOYBDgFOAYQBnQIZAk0CrQL/AxEDJgMtA0oDZAOBA5QDzwPcA+AEEQQtBEsEUQRzBJkEvATHBMwE1gTiBPgE/AUWBR4FOQVJBW0FegV/BYcFkgXOBdcF6gX5Bf0GBQYIBhIGGQZzBpkGogbYB0EHRgdPB2sHggeHB6kHvAgcCDwIcgh2CMIIxgjKCOMI9gj9CQYJFAkXCR8JOglBCVoJYgl8CZcJoAnkCe0KBQoRClEKcQp/Co4KlQqdCrYK4QsUCx4LIgs0C14LbwuLC5MLnAujC68LtAu7C8wL9gwNDDMMSQxZDF0MYQxwDHcMlQypDK0MsAy3DLsMzQzfDPAM9wz9DQwNGA0fDSMNLw0zDTkNPg1ZDWkNdg2ADYoNjw2XDZ4Now2+DcsN4w37DgoOEA4VDhoOMw4+DkUOUA5bDmEOaQ5vDoAOhw6PDpgOrQ63DsYOyw7YDuUO7w75DwMPCg8RDxYPGw8uD0EPRg9ND2EPdQ+HD48PlA+aD6APqA+uD7MPxA/ND9IP1w/bD+IP5w/yEAEQBhAWEB4QKBAwEDcQPRBDEEcQVhBlEHQQgxCIEI0QkRCWEKQQqhC4EMYQzBDRENoQ4xDrEPQQ+hD/EQQRCREWESMRKhEyETwRQRFGEU0RUhFXEWMRaBF0EXkRgRGNEZkRnRGnEawRtBG6EcARxRHKEc4R2RHjEe4R+RH/Egj3bveQFeOxq7WjoYV5nx77TAdveHaDbxtabq3lH/tEiRX7Nt8n9xC3v6OtrR6PBgsV3gqXVwX3IPeqBvc4L9H7Ijc9c2E/Hsf7BAWnx7WZtRvDrXtnkR9QHQu1944Vyh33GPcS6/c69zr7Euv7GPsY+xIr+zoe90QW16O7xcWjWz8/c1tRUXO71x4LxfeQFfs21SX3Pvc+0fH3Nh74Ivs6/DYHU3hjVFR6s8Mevh0HC/c4mRWtqaf3Do8eSwd3cGx5YxtneZiiHwvdj8+r0xrBYbH7Ho8edzcFxYef9xUdeYZ1iB4LFeEGs5WYl6ClqVe9G8u9uvcBmR81BmOBfn92cWy/WhtLWVz7AX0fDvc75NPp5S2wNqIfS5xUlqUan6CTv7u6d3G5HtfxBaxWQbAtG/smLUspOehh3XMfzHjFfnEad3WBUFFToa1RHgv3S1UVmZOVnJceh5yfibIbvQa9p4dxb1p5SEhdmasf+x9vFTHwafcQ90/3C9X3AOc/sfsYHgvhFvhW9yT7qvcI93j3JPt48feg9yT8TAYL9yo59zcT9hApHRP0oDYGU3WToZmPkZeUH4ajoImdG/cL57v3Cp+En4SXH+X3EPteBhPtIJNybY9tG/sIIlH7EFGpXbFzH4cHE/SgaHNyZ2kaYaFxp3kehwcT9hBZc3FsYhoT7SD3g/fqFWpwobu5pqGsrKd1XVtvdWofC8cW9zj3UAbbe+mD1R6PBsD7JfcB+7cF90L5Hvs4+1AGO5spk0UehwZW9yb7Afe2BftCBgsTzoBEHRPWgPhq+xoHE86AfVkFhwa1Z1+fWRv7BCcn+yz7IN8j9xC1vpunqh+HWQVohWtuSRtlVZWjXR/3PPdCFV1psNIfE+aA1rWusaWhhXmfHvswBxPOgG13dYNxGwsVl5OYlZEepYSbf3waf3+BeXp+lJseE9hBChPk+yj7DBVYxGLc3cO2vLxxnmidHo8HE9irmaCbrBrEUq9CRFBnUmKhf6l3HocHE+Rue2x5YRoOv6+xvb1nsVdXZ2VZWa9lvx8LFVtRBYcGW8X3Bx3r+xAF9zwG6goOFbvFBTIKC2uDfYF7b2W1VRtVWV8lfx/hBquTmZWbp7FhwRsLzRb4aPck+yj3/vco9yT8aPsk9yj7/vsoBgsV8rzX4/cHCmGGeW1mG2Z5qbWGHy0GM428P/IbCxX3DAa7v9cKV9gdK/cKBfsoBgvJ944V+zr3Div3Ms3coL7JHkf3AAV2aWJ2WhtFWLvX17+71qurgnKwH9n1BbNhRqU9G/sv+x4r+zofCznFQ/PJxqevvB6PBgt/PB0LFWi/uom0G9vFvsgfE+jHYa9JHhPwf3mJiYMfE7CNoQX3F+/7cwYT8H77NwUT6HsKDrl/lX19GnFpf12HHpdJBfGP46vTGrVzoWmXHguloWfBG7e1reOVH0MGcYV/gXtxda9VG19haTOBHw73ICBLCgv3KPhsFZKAlHp3GmJyf2qEHppqZ5JmG/sY+xIr+zrKHR8LFeHNz/LyScs1NUlLJCTNR+Ef5QR5eZzLy52YnZ2dfktLeXp5Hws3/DYGU3hjVFR6s8Mevh38Igf7NtUl9z73PtHx9zYe9+UHC/cYKHb3cvG/9xwLAUwdAwt29x73GfeP9xQLFftCBjP7QgX3EAYL9xR3FVP7CAVlx919vxv3R+ba9x8fC39OCgtYChO8T/vWBiMKE3x4CvhUBhN6xZ21s81NHUsd92o9ah0L9wJezDhPX2BIT7RkxZGRjIyRHodOZWFCbQgL1fgCFfdS/AL3QPiI+/4GC1EdTvfhFZW4mcmc2ZnNGY8Gm0qcPJlNlV4YvPgPFZMK90oGDrVNBfMGO/cYBfscBgv3cPc0Cxqve6t7nR4O5be52ZMfLwZZCg5cCt33QhK190L3KPdAE49EHROXigoTj2VVlaNdHxPn9zz3QhVdabDS1rWusaWhhXmfH/swB213dYNxGwv7eH8zUfsEGgsVS11hT0+5Y8vLubPHx121Sx8LWAoT+D8dE/TVmcO02U0df1cdC3/3HveM9x4LQx0O9yT3CPck8fckC/cm+wWuHQv7VPxWFZeTmJWRHqWEm398Gn9/gXl6fpSbHhNDAEEKE4SA+yj7DBVYxGLc3cO2vLxxnmidHo8HE0MAq5mgm6waxFKvQkRQZ1JioX+pdx6HBxOEgG57bHlhGg4V07u1y8tbtUNDW2FLS7th0x/JBHZ6naWlnJ2goJx5cXF6eXYfDvcW2/cE0/cWCxXFBs+veVNTZ21HH1EG+AL79hX7IfeQBcqttcjoGvc2+wy7+yAe+4b9HvdA927JBvcE+24FDn/3FPc49wz3APceAcH3MfdL9zAD98z3CBVpXp/leh+yrK2arBu3rXdTSGJ2Yh/3evhWFbVfQrEsG/sh+xv7Avt6+3r3GzP3E/cR9wHb9xz3HDPH+wBiUHRhYB/3FZLHt88bs7V1daMfDvdwVQoL+Kj4iBX7QAYLwBb4hfck+7EG9674JgXz/Gf7JPeTB/uu/CYFCxX3Aga3wwWPBrdTBfcCBj33BgX7MAYLf0AdyQsV+wCzP889HufBBVfLbdPTGtOp07/LHi/BBUc9Yz/7ABoOrfckBZdvdpNdG0BDZzlbH4cGC/eY3fc46AH3KfcG1vcLA/cp9/YVVrRay66sm6KmHo4Gk2wF7PdLBvcCUbk0V1Z7b1setT4Fnq6olKIbp56CdY4f+xp+VGRGGvcGlRWcnZvEkx5hB3+Ae4J5G3iAk5kfDhXjo7vF3RrPb7FZY2tvZWGsc68ejIyLjBtkb3dVeh4O90ATroC1944VE86AmgoTroBwChPWgPdEjRXjsau1o6GFeZ8e+0wHb3h2g28bWm6t5R8TrQALaQobC/eY46gK94v4PxXEo56hmZ+HgJce+woHeYB8h3obb3agxR/7DokVIMNJ3qium6GhHo4Gk20F7PffLwaBagWIBqhybZdsG0FHSvsBHw5NUR0LFUoKCxXlt7nZkx8/Bm2De3dhG2F7n6mDHz91HQsVUXO719eju8XFo1s/P3NbUR8LQAr7hPc0CxX3tPcA+7QGC+sW+FX3JPup+I77QAYLRwoOrfdE90j3RAv7ArhK3se3ts7HYrJRhYWKioUej8ixtdSpCAtMHQFACgMLFfMG7fcuBfsaBvcE+y4V8wbt9y4F+xoGDgY9k7dd5RsLxRb3QPeW9yD7lvdA+R77QPuG+yD3hvtABgv3MR3p90IS8/dAE6y0ChPMgQoTrGMdE5zWHQsSwfc49yz3QAvFFvcc9y0G2H33RYPXHo8GvvtVrfsJBdUGrfcJwfdVBY4Ggz99+0U+Gvst9x75Hvs9B1f7aHk3BYgGed9U92gF+z0GCxX7tPsA97QGDuXBy53vEv8AxYAA/wDlgAAg9wwTqPc2C/cAJ/cAt/cAJ/cAC/fcB6WUlJeXG5iSgnYf++T3FvfcB6WUlpeYG5iPgnYf++T3NvfwB+9hy0VTZmVhfR6/gGunYhtQbWlkeh+HBgsVq8cFbZOBlZsaoa2TuY8ef80FJYcza0MaV6tx7YMeDtj3StoS9zZ8HRPk96IL9zL3APcS92r0cd5dxB8Lwh079yAVC8X3QPcm9zoL95/3Zftl+EES90L3BxNg9/33Ix0ToHIdDvto92oB92L3BgP3YvsKFU29a8nlHR6zCnd3laOnmaOtpx8vBnN7XV9PGg4H+yZ4KWD7Aho+wEjVwq+jr6MejwaXWwXlBvt09xwVsaSb2JcePQd9enp/cRtwfJqiHw4Bi/js9wYK+OwLFl0KCxX3Kx1N+xAF91AW9wYG9ysdDhUT9bOnqbGxb6ljHxP5Y29tZWWnbbMf9yIdHxP6Y29tZR8T+WWnbbMeC/cQ984rBml2doJVhQhC3AcO+XwV9yQG3/cGBfsGBmNTBYcGY8MF+wYGv9gKC/cKCvuE9zQL9wYdJHb5OncLAfdq90ADC/jg9xEK9zD44G4dDvmAQx0LAUAKA/cgC+Wz0rrlAfc09wDL9wQD96ALA8QW90H3NgbJ4/cK+44F91EG+2P4FvdT95wF+1EG+zT7hgWH94b7QQYLFdNL90b3LAX3QAf7RvcsQ0v3FPtCBQsV07uzyclbs0NDW2NNTbtj0x/JBHZ6m6OjnJugoJx7c3N6e3YfDsGrQ98bzcm39wC5HyW7BVl5cm1wGwvl9zLlAfco9wjT9wgD98ALi6kdC/jSXgrvEvdD96T7cfcVE6D3dgs9jblJ6xsLFeu5zdmNHxP8LQZth3x1bBtsfKGphx8tBhP6mx0OyRXLubPHx121S0tdYU9PuWPLHwsGmx0LrwoO95r5RKoKC1UKOwvv9xTtEvc896H7FPcKE6D3PAtRsV3JybG5xcRluk1NZVxSHgv4FPlQFT33EPcuCvcO+xAFC8f3NPchHQu1yQWPBgv7NP0A+zT3FQr9APsgBg4V9zAd+yD4YPs0Bgv3JPf+9yQL+8AGDpsKqfcGCqkGbb0FC/mMvAr7XPp8AQt2+Ih3C/cKXNExRVRdSEPFYskejo2LjhuMVGBbMm4IDvhB+2X3ZRL3y/cHE6D3gwv5SvccqfcQEvcUvR0Li/ce9yT3Htt3C3b3/vcqd59/dwuvFb0KC/hs9wz8bAYL+LD3cPfUC+8K9xoLGvcSLN37HCdLa0VGHuYvBamtsKm6G8OvcFILUx3p90J3Cmv3GBN8C/lQFev3EPcHHVtRBYcGW8X3Bx3r+xAFC/dMB6WjoJWmG7ykaTkrZ2thdHORnXYfDhX3BAa/91qo9zYF+0AGC/cc0/ccC/g2+0ALwfciFQu59xoFjwZ/+wwFO+v30PsIB201eUcFhwYLf/co8fcg9xz3KAtACgFACgML9yIB93r3IAP3egv4oAH3qPcKA/geC/s0/QCqHev3DAX7EAYO+8D3Lx0LUwrH/CQV9zQcBXj7NAb31AvbHfcm90QL+zr3Eiv3GAtsCtH3EPcJCgv3VPcSAdv4TAPb91QV+Ez3EvxMBg73NPhg9yD3NKodE6A79yAVtgoGE2D3Hh0L98BpHQsVvQf8zvpKBW0G+OwLBXd9X2NPGk29a8keC3b3bvcc9zT3HAsV+xNTTzX7BBoL9xgB98LZA/eIC/tw+QD71At+9QX7IQYL98B/FQsF9wwGCxVLuVzLy7m6y8tduEtLXV5LHg4Vy126S0tdXEtLuV7Ly7m4yx4OEsv3QAsT6EkdE/ALmZyWlJ8bp5R8Zx/7UPcL918H3Qv7JjlCbVdKHuEjBa23r525G72pCxX4yI0G+6z4qgWHBvus/KoFDvUKEvdS90AL9yjyCgvJCjH3GAv71Pyw6x33oskV+xAGC627maGnC/0A9zQLjQb4qvesBY8H/Kr3rAWJBg4V9wX31PsFBgv3QnYKCwX3FgYL+3AGDmMKvfcbHQtACkEdCxWpBvve+LoFWQcLFfdA0wfLr3VRUWtpRx8OO/dwFQv40hUz90IF+0IG9x77QgUL9zT7cPkA4woV67nDz40fPQYL9zT3UPs0Bgt/G3d3laML+VD3EAEL+2jvYHYL/OwGDvcaAfft9zcDvxb4fPckC5nBBY8GX7K4dbgb9wHzC2B6oaOFHz0GR425U+sbC/EBo/cIy/cQ8fcOA/i8C/tQ9xoLBfsWBgv7NAYO4h0T+Av7EgdZbVp5P30IIfcVC/ckHfhgC/c8Afd990AD+Cn3HhUL9zAS9wr3ME/3QE/3MAv3Jh33IAuuHcoKC3b3lvcq94Z3C3b4Avcm90x3CwH3LwoD98ALFfcF9zT7BQYL99gV8wYLgXsaewv7WPcAC10d93ALgcv4pOkBbMv4jOkDCwGs9xrN9xrN9xoDrAtjCsmpHRIL9yb7BfcPHQv3cBX4YPc09wAK9xMKEgv5AEwdC/dw/QD31Av3EL4KC/c09zQL92QWs6epsbFvqWML+UzTHQv3IPxg9zT5APvABgv3MgqvC/wkHAV4QR0LB/cr1QXnB/srQQULV8HYZfcBG/ca9wwL+QDFHfsy+x74ZvceBw7n9yAdC/cp95gV9wsLEvdq90AL9yD7C3YL+LD7NAv3wPc0C6CzHQtht9Rl6hv3IfcbC/cFClHFUfcMEgv5zBX7vPsA97wGC/cc+wT3vPsE9xwL9173Eh0LIfiC9yT7qAcOAQABAAAiGQBCGQCuAACrAQCwAACtAAGHAQCvAAGJDQCKAAGXAACxAAGYBwC1AACyAQGgAAC0AAGhFgC5AAC2AQG4AAC4AAG5DwCMAAHJAgC6AAHMAwC+AAC7AQC/AAC9AAHQCgCNAQHbDgDAAAHqCQDEAADBAQH0AADDAAH1FgDFAAIMAADGAAINBADHAAISAQCaAACdAAIUAADLAADIAQDNAADKAAIVAQDMAAIXDQCQAAIlAADOAAImBwDSAADPAQIuAADRAAIvFgDWAADTAQJGAADVAAJHBgCRAAJOCQCSAAJYAgDXAAJbBADbAADYAQDcAADaAAJgCgCTAQJrDgDdAAJ6AwCVAAJ+BQDhAADeAQKEAADgAAKFFgDiAAKcAADjAAKdBADkAAKiAQCnAACiAAKkAwRhAARgAAKoCQBtAQKyHgAHAAARCQLRCQAPAAANAAAbAQB5AAACAABgAAAgAAB7AABoAAADAABBAAAIAABpAAB3AAB1AQBrAQBqAAB4AAAOAALbAABvAACJAAE6AALcAAByAAB0AABAAAAJAQA8AAA+AABcAABeAAAQAABdAAA9AACgAAALAABwAQBmAABzAACqAALdAAClAACZAALeAAAhAALfAAAEAALgOwCLAAMcAACPAAMdHgChAABnAAAFAABiAABkAAM8AABhAAM9AAEsAAM+CABjAANHAQAGAAB6AACeAACbAACjAAFEAQFAAwAMAACmAACoAACfAANJAAAeAAAdAAAfAANKAQCcAAA/AANMAABfAANNAACXAANOJgB8AgCIAAN1BAB/AACDAACAAQCEAACGAACCAACFAACHAAN65QPDAgABAE4ATwBdAMQAzQDdAOgBDQEbASsBMgE8AUUBUAFiAXABeQGdAgcCEgIgAikCMgJqAnMCwQLIAtIC6AMjAy0DYQNtA60ELwQ/BFIEbgR7BIsEqATBBMoFEgVyBYoFogWuBcYF+QYCBk8GZQZ0BoYGmQazBtEG6wcCByAHVQdpB3sHjwf6CDIIbwjACOUJFAlECXYJsAnZCiUKfQr0C0sLXQtvC4ALlAusC8UL3wvhC/MMBwwaDC0MSQxgDHMMiwyjDLkM1Qz7DRkNPg1aDXoNsQ3IDd8N+g4eDjQOTw5vDocOow69DxMPIg8yD0IPWw9tD4YPlg+wD78P2A/uEDwQTxBkEHgQnhC4ENIQ6hEJESIRVxFzEYoRoBG/EdsR9RIQEigSOBJKElsSdRKSEqwSvBLMEtwS9BMPEzMTTxNxE5ITtRQfFHQUpRSuFLcU+hUVFVYVxhXYFekWIRY+FmwWgRaYFq8WxRc8F1gXcheMF/gYCRg6GFMYbBh+GI4YoBixGMsZARkQGSEZOxlLGVwZshndGf8aWhp2GpAa3Rr2GwEbDBs6G1UbfxuPG6EbshvGG9Qb5BvzHAQcHRw1HE0cZhx5HIscnhy0HLYc3h04HVMdbx2LHaYd2x4DHi4efR6YHr4e5x8hH1sfkh+8H+8gGSBDIHgg0iELIXgiHSKVIuci+CMJIxojMiOQI6AjsiQrJD0kTiRhJHMk3yT6JXkljSWgJgYmGCZDJm4m5ycAJxwnnyetKDwoUShmKHIoiSiWKK0oySjjKUMpVSloKXopiym/KdUp7Sn/KhkqNyp0KqQqryrGKt4rDSsmK04rbCuGK58ryyvlLDEsZyyILKgsxyzrLQ8tNS1XLcwt2y3rLfsuCi4rLkMuWy5qLnkujS6mLsou7i8VLzAvSy+2MEIwbjCBMJYw1TEQMUYxujHCMecx7jIUMk0ybjKOMq4yzjNDM2szkDO0NCk0RDSmNME02jT1NRg1MjVMNWk1hTWyNdA2EjZaNnY2kjbKNug2+DcMNys3UTe3N+I37zf8ODo4djilOLU4xjjXOO45DjkuOU45dDmYOcQ55zoGOh06NDpSOm866TtDO1M7wTvWPDg8fDzMPSQ9Jj1qPck+Dj5QPoU+7j9MP4U/30BFQFpAeUCYQLdA1UEHQTJBW0GHQaZB0EH8QjlCdkKwQtxDDkNBQ3RDqEP3RCxEqESqRLNEzkTnRQBFB0UiRWRF/0ZTRmVGiEbYRwxHUUdTR4RHhkfnSDdISUhqSL5I70k5STtJa0ltSdNJ3En8Sg1KREpiSopKskr/S0tLXEt1S3dLhEugS6lLtku+S81L3EvwTANMBUwHTAlMC0wNTA9MGUw4TExMikzFTORNAU1jTcRN3k3sTgZOHk5VTnFOq09BT21Puk/+UG9QrFEtUWNRlVHoUh9SIVIjUqdSsFK5UtFS3lLmUu5S9lL/UwdTD1MXUx9TJ1MvUzhTQFNYU2VTbFN0U3tTg1OKU5FTmFOfU6dTr1O2U71T4VPsU/NT+VP/VAZUDFQTVBpUIVQnVC5UN1RAVFhUZVRtVHVUfVSGVI5UllSeVKZUrlS2VLhUulS8VL5U81U2VV9VaVWiVlxWgVawVvpXMVdkV8hX9Ff2WCdYUFiNWOZZIlljWZVaBFpUWqZa2FryWwxbXVtfW8xcBFx3XOZdPF2WXhBeal7iX4pf4GBgYLVhM2HWYl1iwmMiY3pjh2OUY6FjzmQHZHJksWUgZVRlzWX4ZiZmkGbTZvlm+2cvZ3Fne2eUZ79n6mghaFpoi2i/aQJpI2lcaXZp1GpfasdrMGuTa9RsCGxxbKJsw20sbbBt224HbjNuXm51bpBu5m8Sbx5vOG9Eb19veG+jb79v6nAKcGRwn3DscS5xP3FUcVZxY3GNcbdxuXG7ccxx3HHxcfNx9XH3cgxyHHIycjRyRXJPcl9yaHJqcmxybnJ7cn1yh3KYcqZytnLQctJy4nLzcwFzCnMaczBzOnNMc1pzZHNuc35zi3Obc6hzznPxdB90TXR5dIJ0jHSadJx0nnSgdLx043TtdQZ1JnU8dVZ1aXV5dYV1oHW0ddd163YEdiB2RnZddnt2lnasdsd23nb4dxh3RXdld5Z3yHfdd+x37Xfud+938Hf7eA54HHgpeFF4eXimeMd45nkBeSN5RHlSeWF5bnl6eYd5k3meeah5tnnFedR543ntefV5/XoFehR6JHo+ell6ZnqEeqB6rHq5esV61Xrleu97CHsfeyh7NntMe197cHt7e417mXuje6t7vXvOe9l733vwe/98C3wZfDV8VnxofHx8jnyZfLZ82nzxfRF9L31HfVd9cX19fZl9tX3Sfe5+An4OfhN+L35GflN+bn6GfqR+vn7UfuB+7H8Cfwt/KX88f01/Z3+Ef55/tH/Rf+9//4AUgDKAToBmgIWApYDHgOiBBoESgUOBToFfgWyBd4GCgZKBn4Gqgb+B0oHpgfqCDYIYgiOCLoI5gkSCT4JagmWCdIKDgpKCn4Kugr2CyYLUguSDGIO4g8uD3IPtg/iECoQbhDWER4RchHGEiYSci/P4WPMBo/cE99z3BAOjFvi8+Sj8vAb3BPx8FffkB937PAX3OBbd9zwF++QH+3hHFaXDr+sFjwavK6VTBUn31BVj63mv2B15Z2MrBQ4OoEIdAYv47AP3g/ejIQqL9xj3IvcM9xD3GBLX90D3Cvc8+yD3PBP01xb3fgb3IPcExfca4V27L50fjwcT+NefrcvDGvcU+wCt+xwe+2oG90D7lBX3ELEHw6N7Y2Nzb1MfZfuaFfciBxP0vQbPp3dbW29xRx8ORR0BvvdENAoOi/cfCgHF90D3LPdEA1QKDotWHQHh90ADKh0OoHb3gvck9xD3JAHt90AD7Rb3QPeC93r3JPt69xD3ofck/E0GDsEdAbP3RfdK9y0DJgoOoPcQHQHF90D3IPdAA3YdDpgdjh0zHQ5/9yj4BvckjgoOrAoBxPdBkx0Oi/YKAev3QANvHQ6gdvh39zsBxfcc92b3HgN5HQ6sCgHH9zj3LPc4AywdDkUdAXEdAyAKDqB292L3HPdA9xwByvdA90D3PAPKFvdA92LrCvuQBvdA+8jvHftM9xz4xvcoAar3RPdG90QD97z4lhXDrEf7CvsKakFTU2rV9wr3CqzPwx/3nPy4FYR9d4R3G2Ralrd0H/G2y/cF9zka92kg9w37MvsyIPsM+2r7RNP7CPcFZx77AbbpQPcZG7mvlZmhHw73NArTCvd6+JZbHUUdAc/3Qvce90QDJQoOoPcsCo4deQoObAoBgh0DJB0Oi/c0+x/NChKP+OQTcPdYFvdkBvdU+R4F+0QGSfuwBROwekZ+SHlFCIcGedF/znnQR/ewGPtKBg6kCgGN+OktCg6sCgGP+OQDjxb3TAbD9wibrZqtmrMZjwacY5ppnWnH+wgY91QG+1D32vdF99gF+0wGXSF+bXxnfGEZhwZ4tXyvfKlX9Rj7VAb3RfvQBQ6sCo4dKQoOmB0BwPiFA18dDn9AHXgdE3y/HRO8Nx0TfCIdE7wlHQ5/9y4drHb4CPcg90x3yR0TPssW9xoGE173Ax3t90H3LT3v+w1eXXlrZx+P0wX3NvtABxOe90D8tBW7HVQdAcn3RAM2HQ5/ogr3JvdAE161944VE56aChNecAoTrvdEjRXjsau1o6GFeZ8e+0wHb3h2g28bWm6t5R8Of1odAfge9zADIgoO9ysK9xoB9173QAP44Pk+FZdjVZlPG/s4Ry37BB+JB/sUhQX7FPcU/AL3QPgC9zL3GvsyjQfAp57Br6+DgaceDmUKdAr3IPcqOfc3E/RAKR0T8YA2BlN1k6GZj5GXlB+Go6CJnRv3C+e79wqfhJ+Elx/l9xD7XgYT6oCTcm2PbRv7CCJR+xBRqV2xcx+HBxPxgGhzcmdpGmGhcad5HocHE/RAWXNxbGIaE+qA94P36hVqcKG7uaahrKyndV1bb3VqHw6g9xEdAcv3QPce90ADUAoOtx3J914S9373cPtS90DcHZUKDvcGHfg49xrJ914S9373cPtS90AT6GsKE/CVCg6grh33bHcBy/dAkgoOf/UKAfdS90ADwfjGFTMKDqCdCqv3JwoUDhOepRb3NgYTzn0dE65/yAX7FQYOoJ0K2x33HvdAE7jLFvdABhPYNQoTuMYKDlQdAaUKAyMdDvsvdvc49y4d+BT3IH93yR0Trvd6sRVrrLJ5thv3AfPt90AfE7b3Lj7v+w1YWHNpZR6HBhOuf7kF+yD9OPdA9x4GE9b3UgS7Hfsvdvc49yD3iFEKbQoTzrX3jhX7Nt0n9xO0up+pqx6ERAX7I/dABxPW+Tj7GgcTzn1ZBYcGt2RjnVUbIiOmCvdEjRUT5uOxq7WjoYV5nx77TAdveHaDbxsTzlpureUfDvcxHRLz90ATqLQKE8iBChOoYx0TmNYdDn/WCgHY9z/3E/c/A7nLFWHL6WnhGygdDn/UCgH3NvdAAzAKDn/3Gx33GPdAE3heHRO4+9YHIwoTeKkKDov3EvgKdwGj+LwD92AW91oG90L4iAX7OAZK+258WX9XfVUZhwZ9wX+/fL1K924Y+0AGDrIdAY346CsKDqCuHQGm+LUDphb3Rwaw0ZiomqiYpxmPBpxvn22cb7lFGPdMBvs794T3MveYBftHBmpFgG99bYBvGYcGfKd3qX2nYtEY+0wG9zH7hAUOjR0So/i+E7DsWxUTcG37FgUTsCQKDov3Gvd89xoB0fhvA18KDqBCHb33EAGL+OwDpB2C/EEhCqBCHb33EAGL+OwDsAr7BfxBIQqgQh299xABi/jsA/e++YoVMgr3FgaA/EEhCqBCHb33JgGL+OwD+B754hUyHcG9t/GXH/uF/NMhCqBCHbfiCvgo+UoVXQpXCvtkhx1XCrb8OyEKoEIdzfcAAfcs97wD+FT3NB37ZfxRIQqgQh299xABi/jsA/fy+cwVWQrlt7nZkx/7X/y9IQqgQh25ydvBCvnaFaCce3Nzent2dnqbo6Ocm6Af+yIE07uzyclbs0NDW2NNTbtj0x9O/D0hCqBCHb33EAGL+OwD+BS6HaL8QSEK+5z3Xt5CHQH3UvdwA/fATUodoEIdsc3B3wH3tvcOA6AdgPx3IQqgQh299x4Ki/j/E+z4//oSFfsWBhP0R/sQBesG+295FY8Gu1fYHSv3CgX7KAYr+wrYHYD8QRWVuJnJnNmZzRmPBptKnDyZTZVeGPsz+A8V+1j9HgX3RAar9x4F90YGq/seBfdKBvtY+R4FDqBCHb33HgqL+OwT7PjD+ZYVR/cQ9wcd8fsQBRP0+zl5FY8Gu1fYHSv3CgX7KAYr+wrYHYD8QSEKoEIdvfcKRb/BzxL4YvcAE/b4UvmAFWAKE+57f4Z7iB4T9vscWxWPBrtX2B0r9woF+ygGK/sK2B2A/EEhCqBCHb33Cq/3DgH3JNP3PNMD+BT6ZBVxhX+Be3Ftr1UbX2FpM4Ef0wa9CqWpZ8Ebt7Wt45Uf+zL7dBWPBrtX2B0r9woF+ygGK/sK2B2A/EEhCvuc917eQh299xASi/js/C73cBN89775ihUyCvcWBhP6vf2OSh3QCq+ZAYv47AP4S/o6FfsSBk/7EAXfBqiZFW2De3dhG2F7n6mDHz/ICvtf/L0hCtAKr5kBi/jsA/fv+b4VT3wK+xIG8fsQBfKZFW2De3dhG2F7n6mDHz/ICvtf/L0hCtAKrZvlzwH3rPcAA/ec+bwVYAp7f4Z7iB73BmcVbYN7d2EbYXufqYMfP8gK+1/8vSEK0Arb9w4B9zLD9zrVA/gQ+mQV7grmCvu8+ywVPZO3XeUb5be52ZMfPwZtg3t3YRthe5+pgx+Q/L0hCvuc917eQh299xASi/js/C73cBN89/L5zBVZCuW3udmTHxP6+yL+Ckod+3j3AvcfQh0B+BL3EAP3g/ejFZW4msmb2ZnNGY8Gm0qbPJpNlV4Y93X8CxWEgn2EfBt3e5ehs6+3xR/7WPkeBZMKuwZreldbSpAKDov3JH/3GYj3JO/3JPsU9xQS98n3KxNM94b3nRWh3pe/m8eZyRmO+5UGE7T3K/sNFfcK9vckIO/3FPck/CYH+1L9HgX3RAYTVK73GAXxBhO0+xj3s/ckBw6L9w6/2D7bve/3EPcOEtf3QPcM9zj7Gvc4E733jPcOFb/n2y+9vQfPq3FNT2ppSB9Z+CoVE76xBsOle2NfcHNUH2UGE733RGcVE97XnqvCvxr3DCGv+xwe+2r8IAZBhQVB1ftC934HE733IPcEyPch512+L54fDvt0zfdBdvic9ygBvvdE5vcOA/h191AVbW9pdWEbM03P9w73CsnR27epe3GpH+n1BbddR7M3G/tE+yL7EPtu+1P3APsA9x5wH2hFBTodl6jQksqqvMQZDkUdsfcQAb73RDQK+HP4jEgKDkUdsfcQAb73RDQK95P4EDEdDkUdsfcQAb73RDQK9/f4jDAdRR2t90ABvvdErPdUNAr3xfgMTQqL9x8KvfcQAcX3QPcs90QDVAr3BvlCMB1jCsn3HwrbCln3cHn3RBN0VAoT6MX8JiEd9xYd4/cfCtsKN/e0V/cgClQKE+j3Xvt2eh1nCotWHb33EAHh90ADKh33SL1+CotWHb33EAHh90ADKh34KvdCSAoOi1YdvfcQAeH3QAMqHfdKvTEdDotWHb33EAHh90ADKh33rvdCMB2LVh239zAS4fdA+w73ML/3MBPoKh0T9vcUtzYKi1YdzfcAEuH3QDP3vBP4Kh0T9N/Nnx2LVh299xAB4fdAAyod93y9FU4di1YdufdAEuH3QGf3VBPoKh0T9Pd8uU0KYwrJVh0S4fdAV/dwE3gqHRP093r+JiEdi1Yd9zLfAeH3QL33DgMqHfdWsaoKDotWHb33JgHh90ADKh33vL0Vwb238ZcfNQYyHQ6LVh299x4K4fdAE/QqHff19wwV6wYT7PH3EPcHHRP0+/v7VjUdDotWHb33Hgrh90AT9CodE+z4O/eI7QoT9PxBRTUdDotWHb33Cq/PAeH3QPdy9wADKh34Du0VYAp7f4Z7iB77xCc1HQ6LVh299wqv9w4B4fdA9yTTAyodyb01HYG0HYMKYwrJVh299xAS4fdAV/dwE3wqHfdKvTEdE/r3Rv5YIR37ePcC9wpWHQHh90DL9xAD4Rb30AZqd1xcTIsKtLG2uR+R9yT7qvcI93j3JPt48feg9yT8TAYOwR2x9xABs/dF90r3LQMmCveE+BAxHQ7BHbH3EAGz90X3SvctAyYK97b4EBVOHcEdrfdAErP3RZz3VHD3LRPqJgoT/Pe2+AxNCvt+zfcw9yjx9yD3HPcoErP3ReL3DnD3LRN6JgoT/PeU+/woCsEdsfcQAbP3RfdK9y0DJgr36PiMMB3BHcH3ABKz90Vo97w89y0T+iYKE/T3Ivggnx3BHbH3JgGz90X3SvctAyYK9/b4EBXBvbfxlx81BjIdDqD3EB3R9xABxfdA9yD3QAN2HfdTvTEdDvuc917e9xAd2wpi93Bk90ATenYdE/T3hf4mIR37aPck5PcQHdsK9wvpQvdAE/p2HfeF/fKcHaB295b3KtfXP9s79zrbCvcg90ATzvgG+CwV+yDX9yAGE9b3etsVUQYTzuH7QAcT1jX7IAcTzuH7QAcT5jQHUYYFE85Bxfx490D3lvcg+5b3QPh4xQcO9xAK9xCOHTMd90r4wH4K9xAK9xCOHTMd+Cz5PEgKDvcQCvcQjh0zHfdM+MAxHQ73EAr3Jo4dMx33vvjAFcG9t/GXHzUGMh0OmB239w0dE8gzHRP09xb4ujYKmB3N9wAS9yz3vPt+90AT6DMdE/Dh+NCfHfcQCvcQjh0zHfd++MAVTh2YHbn3QBL3YPdU+0r3QBPIMx0T8Pd++LxNCvcQCvcQjh0zHfew+TwwHZgd9zLf9y0dK/cOE9AzHfdY+LQVE+gmHQ73Gh33Lwr7WPdAE2gzHRPw9378LCEd+3j3AvcKqR0S90z3EC33QBNozRYT8PdXBm95Wl1JkApl4QWFg32Dfht4d5Wjq5+txZ0f9yj3JAYTaPso9/73KPck/Gj7JPco+/77KAYOf/co+Ab3JL33EI4K9xD4hjEdDvcdCvkedwHE90HF9w6THfdz/UYoCov2CtH3EAHr90ADbx33p/dCSAoOi/ck+AD3Ivsi93YS6/dA9wbzE9hvHff9+yIVE7iyChPYkft2BQ77fs33PPYKEuv3QKf3DhPwbx0T+PdU/UYoCov3JPcE9173VHcB6/dA3/dwA28d+AL8HiEdYwrJ9goS6/dAV/dwE/BvHRPo93r+JiEdYwrJ9grh9wAS6/dAV/dwE/hvHVzNrwoT9Pep/tQhHfcWHeP2ChLr90A197QT8G8dE+j4Cv12eh2L9goB6/dAA/eg9yQV9xMH91v3AwX3GAf7W/sDBfeL+0D73wdEYgX7GAfStAX7T/hV9yQHDrUK+Hf3OxLF9xyH93CF9x4T9HkdE+j3hv4mIR2sCtH3EAHH9zj3LPc4Aywd+Dj3QkgKDqwK0fcQAcf3OPcs9zgDLB33vPdCMB2sCtH3JgHH9zj3LPc4Aywd98q9FcG9t/GXHzUGMh0O9x0K+R53Esf3OLn3Dnv3OBP0LB0T+Pde/UYoCqwKzfdAEsf3OH33VHH3OBP0LB0T6PeKuU0KtQr5HncSx/c4afdwafc4E/QsHRPo94T+JiEd9xYd9wHNCgHH9zj3LPc4Aywd+BT9dnodRR2x9xABcR0DIApX+Mh+CkUdsfcQAXEdAyAK90L5REgKDkUdsfcQAXEdAyAKWfjIMR0ORR2x9yYBcR0DIArL+MgVwb238ZcfNQYyHQ5FHav3MBKt90Qv9zC/9zAv90QT8iAKE+wj+MI2CkUdwfcAEq33RFH3vFH3IAogChPo+yj42J8dRR2x9xABcR0DIAr4yAROHUUdsfcQAXEdAyAKafjIiB1FHbH3EAFxHQMgCr35RDAdYwq9TgoSrfdEd/dwd/cgCiAKE+j8JNkKRR33Jt8SrfdE2/cOdfcgCiAKZfi8FRP4Jh0O9zIKW/cQyQoT7CAK9w35DhXrBhPc8fcQ9wcdE+z7+/tWNR0O9zIKW/cQyQoT7CAKE9z3U/mK7QoT7PxBRTUdDvclHc/JCiP3ABPsIAr3Jvj4FRP6YAp7f4Z7iB77xCc1HQ73JR33DhKt90T3QtNJ90QT+iAK+z74yDUdgbQdGxP8gwpjCr1OCrH3EBKt90R393B390QTeiAKWfjIMR0T9PdI/lghHUUdAXEdA/ga9/QVg4uDgxr7CmlBU3p7kpl+HmH3EhWKmYqamxr3Cq3Pw6CdgnmZHvd/9ysVMcVWPgWnYlqaVBv7MvsA+wz7ajCfP61TH0su5VG90wVysrl+vhv3MvcA9xL3auB60WzBHw6L9x77HlYd+x73HhKZ90Tt9ywTdpn33BX7evcLKfcrHvfM9yT7MPcI9wL3JPsC8fcm9yT7uAb7MPsQL/t6HxOu90QW9y6wqboemfwKfQZcZq/3Lh8ORR3iHRPw98D3HBVTadX3CvcKrc/Dw61H+wr7CmlBUx8T6DsKE/CAHRPozZy7s9NNHccKsApX/Mg8CscKpB2//Mg8CkUdpc3B3xKt90Tb9w5190Qx9xgT/KAdE9q9/P4VU2nV9wr3Cq3Pw8OtR/sK+wppQVMfE9k7ChPagB0T2c2cu7PTTR1FHbH3JvcJHfge+eIVMh3Bvbfxlx/7SP1aPApjCr1OChKt90R393B390Qx9xgT6M8dE/T3WgRTadX3CvcKrc/Dw61H+wr7CmlBUx8T8jsKE/SAHRPyzZy7s9NNHft49wL3FXb4oPcoEq33RIP3EMv3RBPs+CQjFYWCfoP1HaibsL2hH/O50e/3Rhr3afsA9w37Mh4T9Psy+wD7DPtq+0DV+yT3MnUfE+xvc2dhVZAKE/T7HvfaFVNp1fcK9wqtz8PDrUf7CvsKaUFTHw73NAq99xDTCvhwoAr7EPtOWx33NAq99xDTCvgWuh2X+05bHft+zfdR0h3bCsf3Dnf3PBP693r4lkIKE/yfJxWpg5WBexp1aYNdhx6XSQXxj+Or0xq/a6Upkx4O+5z3Xt7SHdsKd/dwZfc8E/r3eviWQgoT9OVpHQ77nPde3tIdzfcA2wo/97z7hPdwZfc8E/oA+Fb3NB0T/ID7cPteQgoT+QDlaR0O9xYd9wHSHdMK93r4lkIKVftYbh0ORR2x9xABz/dC9x73RAMlCvfm+QVICg5FHbH3EAHP90L3HvdEAyUK9wb4iTEdDkUdsfcQAc/3Qvce90QDJQr3avkFMB37dM33Pnb4n/coEs/3Qqf3Dn/3IAr37PgpFUqjZpWqGqilmru/sHtsuh7h9wAFxkw5pz4b+ygnMPsDLclQ1m8f3GkFyHWsgWwabnZ6UFhRpbBaHin7CgUT+MZY1W3SgmlIGDodmKoFE/T3G53V5O0a5VnDNKseDvt+zfcwTgoSz/dCsfcOdfcgCiUKE/j3FvuDKApFHa33QBLP90Jr91R19yAKJQoT6Pc4+IVNCmMKvU4KEs/3QmH3cGP3IAolChPo9zz8YyEdf/ce+xK7ZHb4rPceEsb3RPcs90cTXMYW90T4PAbMmq66qZ9zcZMeUfsGligFE5y4eq1taxppgnWEhn2Rn3geE1gzIwUTPG6lu2zXG/cLv9/3AO9PuWarH8L3AgX3CHk22fsMG/tESSr7Cx8OoPcsCr33EI4deQr3HPfSMB37dM33R/csCvctHfsI9w4T8PgWFviO90/3JPy2+yT3T/yOsQdlPwUT6DodE/CbswUO9x0K+I73JPctHfsI9w4T8HkKE+i7/LYoCrUK+I73JBL3Lwr7WPdAE+h5ChPw4f2WIR33Fh33AfcsCo4deQr3evzmeh1sCtH3EAGCHQMkHfdSvX4KbArR9xABgh0DJB34NPdCSAoObArR9xABgh0DJB33VL0xHQ5sCtH3JgGCHQMkHffGvRXBvbfxlx81BjIdDmwKy/cw2wr7BPcwv/cwIfc6E/IkHfcetxUT6l0KHxPyVwr3ZIcdHxP0XWtpXx8T8l+rabkeDmwK4fcAAYIdAyQd6c2fHWwK0fcQAYIdAyQd94a9FU4dbArNydvJ2wpZ3dfdX/c6E/kkHRP294a5lR1sCtH3EAGCHQMkHfdkvYgdbArR9xABgh0DJB33uPdCMB1sCsv3HLnZ2wol9zUdK/c6E/iAJB0T8gDp93YV97zZ+7wGE/iAt/uYFRP0gLOnqbGxb6ljHxP4gGNvbWVlp22zH/ciHR8T+QBjb21lHxP4gGWnbbMeDmwKy/ccqfcQ2wolvR0r9zoT2SQd9zL3ZhX3HAb3DHwK+0YGE/kp+7aJHQ5sCsv3HKn3ENsKJb0dK/c6E9kkHRP59x63iR0T2VX3tjAdbArL9xyp9xDbCiW9HSv3OhPZJB33jPfiFftGBvcM+xAF9xwGE/mf+zoVs6epsbFvqWMfE/pjb21lHxP5Zadtsx77ZBYT9bOnqbGxb6ljHxP5Y29tZWWnbbMfDmMKvfco+JZ32wpj93Bp9zoT9CQdE+j3hv4mIR1sCvdG39sKx/cOZ/c6E/QkHfdgsRUT+CYdDvt49wL3FXb5KHfbCm/3EL33OhP0xfeQFfsuzyv3IH8eE+x9fllgS4sKpZeo27If4LSy3fcLGvgi+zr8NgdTeGNUHhP0VHqzwx++HQcObArgChPo+KD5ilgKE/A/HRPo1ZnDtNlNHcsdsAoT9PdAxVIdyx2kHRP096jFUh1sCsXNwd/bCsf3Dmf3Oon3GBP695r5RBUT/SYd96aPWAoT+j8dE/nVmcO02U0dbArR9yb3CQr4HvniFTIdwb238ZcfE/S3M1IdYwq99yj4lnfbCmP3cGn3Oon3GBPqzx33dPnIWAoT9D8dE/LVmcO02U0dpArR9xABjfjpLQr3ir1+CqQK0fcQAY346S0K+Gz3QkgKDqQK0fcQAY346S0K94y9MR0OpArL9zAB9wr3ML/3MC0K91a3NgqsCtH3EI4dKQqt+Hl+CqwK0fcQjh0pCveY+PVICg6sCtH3EI4dKQqv+HkxHQ6sCsv3DR0T6CkKE/R5+HM2CqwKzfdAEvdg91T7SvdAE+gpChPw4fh1TQq1CvkedxL3Lwr7WPdAE+gpChPw4fxzIR2sCvdG3/ctHSv3DhPwKQq7+G0VE+gmHQ6sCtH3Jo4dKQr3Kvh5FcG9t/GXHzUGMh0O9xAK9xABwPiFA18d+Ef5ZEgKDvcQCvcQAcD4hQNfHffL+WQwHZgdufdAAfdu91QDXx33mfjkTQr3Gh3A+IX78vdwE3BfHRPo95X8BCEdZwqgdvcE9xz3QPcc6XcByfdA90D3PAPJFvdA9wTrCjvp+0AG90D8Ju8df/cm9w73EPcc9yYBw/dE9zT3QAP4GveUFTqAbGJlG2Ftsd+FH2f3bBWho6ihthvFrF4wlB/74AaJd4l3eRr7avP7DPcq9yrz9xD3avdqI/cO+yY1T21hXR4OYR33QngdE36/HRO+Nx0TfiIdE74lHb/4Nl4KYR33QngdE36/HRO+Nx0TfiIdE74lHfea+ORVHWEd90J4HRN+vx0TvjcdE34iHRO+JR01+DYsCg5hHfcweB0Tfr8dE743HRN+Ih0TviUdLfg2Jx1/QB2/90QSwfc4+wbkCvse90ATfIC/HRO8gDcdE3yAIh0TvIAlHRN7AHH4LBUvHfd4Fi8dDn9AHdf3ABLB9zhT97Q790ATfb8dE703HRN9Ih0TvSUdE3pT+ERuHQ5hHecSwfc4Sen3DOkx90ATfIC/HRO8gDcdE3yAIh0TvIAlHRN7AOP4Nj8Kf0AdscnjyRLB9zhr3dfdU/dAE75Avx03HRN9QJdXBfcg96oG9zgv0fsiNz1zYT8ex/sEBafHtZm1G8Ote2eRHxO+QFAdJR0TfYDj+B5ZHWEd90J4HRN+vx0TvjcdE34iHRO+JR2b+DYvCmMKvUAdEsH3OHv3cFf3QBO9vx0T3TcdE70iHRPdJR0Tuun8OCEdf0Ad9zrfEsH3ONn3Dlv3QBN9vx0TvTcdE30iHRO9JR29+CYVE34mHQ5hHfcFClHFUfcMeB0TeMC/HRO4wDcdE3jAIh0TuMAlHU/4NhXzBhN0wKYdE3jASx0TcsD0ChNxwMYdYR33BQpRxVH3DHgdE3jAvx0TuMA3HRN4wCIdE7jAJR1P+DYV8wYTdMCmHRN4wEsdE3HA5B0TcsDaCmEd9wUKi3e/0XgdQfcCE3nAvx0TucA3HRN5wCIdE7nAJR1P+DYV8wYTdcCmHRN5oEcdE3OgoQphHfcGr/cOeB37MNMTfwC/HRO/ADcdE38AIh0TvwAlHUf4NmcdE36AOx1jCr1AHcn3QhLB9zh793BX90ATvoC/HRPegDcdE76AIh0T3oAlHTX4NiwKE70A2f6IIR1hHd21n3gdE3+/HRO/Nx0TfyIdE78lHbH4shXfBuX3DAX7DAaH+4g3Cg5hHd21n3gdE3+/HRO/Nx0TfyIdE78lHd/5KhX7DAbl+wwF3wZZ+xA3Cg5hHd26murREsH3OM33AnP3QBN/QL8dE79ANx0Tf0AiHRO/QCUd4/g2Nwpl9xUVE3+ASgqhCmEd2T33EKX3DhLB9zhL0/ck90D7MNMTdUC/HRO1QDcdE3VAIh0TtUAlHeP4NvMdE3lAc4V6dWAbE3VAYHqho4UfPQYTtUBHjblT6xsTdqD7LPcqFdMGvQo7HWMKvUAdyecSwfc4Self93BT6TH3QBO+IL8dE94gNx0TviAiHRPeICUdE71A4/g2NB0TvICR/dohHfcAHfc49xgkdqR293Lxv/ccEsH3OPcO9wY390ATT0C/HRNngDcdE5eAmVPRHRNPQOUdHxOPgLMKd3eVox8TT0Cnn63Pmx73qgf3OC/R+yI3PXNhPx7H+wQFp8e1mbUbw617Z5EfUB0TZ0AlHQ5/9xrX89X3HPsW9xYSm/ct97P3GxPcm/ciFTm6Q+i3sZ+/vx5frblv0xuxw5ursx9R9wIFeXF2hXT3MwqOl4+lqRr3GlT3BCRUandfaB6zc2mjUxtUVndnTx8T7Mf7BAWgr7GWoxunmHtokB8T3PsmbEVbIxr38vc0FcWSoaGhG6mUZ18f+7P7JhWonaS2lx6NeI13j3KSeRl/f3yDfRt1fpiiHw5/9y4drHb39Pcgxf8ATIAA//+zgADbO/cmyR0TM4D3gPfQFaWjoJWmG7ykbEAfE5OAMmduYXRzkZ12Hvf+BK/3PgcTNYDb+z4HEzOAzftABxM5gEgHS4YFEzOAQcv8uvcaBxNTgPcDHen3O/cnPev7DV5deWtnHw77dM33P3b4EvceAcn3RNP3DgP4F4IVwpPHoLyzR/cAGHZpYnZaG0VYu9fXv7vWq6uCcrAf2fUFs2FGpT0b+y/7Hiv7Ovsn6jD3F3cfaUcFOh0Obgr3QgHJ90QDNh34WPiGVR1uCvdCAcn3RAM2HfP32CwKDm4K90IByfdEAzYd92L32C8KVB29914SyfdEg/dwE/A2HRPo96r3zCEdf/cgIHb4CPcgi3fD9yj7KPd2Epr3RPcm90Cr8xNbgJr3jhUTm4CaChNbgHAKE6uA90SNFeOxq7WjoYV5nx77TAdveHaDbxtabq3lH/g997wVE1eAsgoTW4CR+3YFDmMKvaIKefdwU2Yd5/yYIR33Fh3XogpX97QxZh33gPvoeh1/9yAgdvf09yDF2zv3Jv//cYAA/wCOgABtChOz+AD3OBVveHaDbxtabqre3LGouKChhHqfH/eA98IVSwYTa837QAcTc0n7KAcTqzv3KGcHkUMFqWxqn1QbIiMt+zL7MN0r9xO4vKOtrh+PBhNnl10F9yD4uwbLkAUOjAr3QgH4HvcwAyIK+wr3nF4KjAr3QgH4HvcwAyIK5/hKVR2MCvdCAfge9zADIgr7lPecLAoOjAr3QgH4HvcwAyIK+y73nC8Kf1odv/dEEvcB5Ar7C/cwE+y9944V+zr3Div3MsnZn7HHHlPxBXdfZ4FjG05Uncl/HxPq99EGjZeQqaka9xo79wD7Mh4T7Psa+xSmCvdCxxUT+r+XsJ+2G8Wfa2Mf+1n3khUvHRP893gWLx0Of1od1/cAEvc897RN9zAT9CIKE/j7dveqbh0OjArnEvcy6fcM6UP3MBP8vfeOFfs69w4r9zLJ2Z+xxx5T8QV3X2eBYxtOVJ3Jfx8T+vfRBo2XkKmpGvcaO/cA+zIeE/z7GvsUpgr3QscVE/q/l7CfthvFn2tjHzn3nBUT/PK81+P3BwphhnltZhtmeam1hh8tBhP6M428P/IbDn9aHb33XvcPChPkIgoT+Dn3kCEdYwq9Wh33DwoTdCIKE/g5/NIhHX9aHfc63xL3wvcObfcwE+i9944V+zr3Div3MsnZn7HHHlPxBXdfZ4FjG05Uncl/HxPk99EGjZeQqaka9xo79wD7Mh4T6Psa+xSmCvdCxxUT5L+XsJ+2G8Wfa2Mf+wz3jBUT+CYdDowK9zAB+B73MAMiCvuc95wnHX/3Ftv3BNP3FvcjCvge9zAT8SIK+3r3nBXzBhPpph0T8UsdE+X0ChPjxh1/9xbb9wTT9xb3Iwr4HvcwE/EiCvt695wV8wYT6aYdE/FLHRPj5B0T5doKjAr3BQqLd7/REvge9zA/9wIT8IC9944V+zr3Div3MsnZn7HHHlPxBXdfZ4FjG05Uncl/HxPxAPfRBo2XkKmpGvcaO/cA+zIeE/CA+xr7FKYK90LHFRPxAL+XsJ+2G8Wfa2Mf+3r3nBXzBhPogKYdE/KARx0T5IChCowK9x0d+BzTRfcwE/oiCvuC95xnHRP8Ox1jCr1aHcn3QvcPChN6Igr7lPecLAoT/NP+iCEd9wAd9zhaHRL3zPcEbfcwE3z4bvcoFXdfZ4FjG05Uncl/HxN699EGjZeQqaka9xo79wD7Mvsa+xQp+zgeE7z7OvcOK/cylpGLjZ4ecnVuZVsaTbtryR4TfOUdHxO8adcFhYJ/hX8bdHmWorGdpePHH/vG95wVE3q/l7CfthvFn2tjHw5lCsn3QicK+y73ziwKDmUKyed0ClTp8Pcq+xfpXvc3E/YIKR0T9KA2BlN1k6GZj5GXlB+Go6CJnRv3C+e79wqfhJ+Elx/l9xD7XgYT7SCTcm2PbRv7CCJR+xBRqV2xcx+HBxP0kGhzcmdpGmGhcad5HocHE/YIWXNxbGIaE+0g94P36hVqcKG7uaahrKyndV1bb3VqHxP0UJ/3zj8KZQq99150CoD3cEYrHRP0QJ/3wiEdZQr3Ns10CpL3DpYrHRP0YMX3sn4dZQrJ90InClf3zi8KZQrX9wB0Cl73tCQrHRP0QPsQ99xuHQ5lCsn3MCcK+zb3zicdoPcRHdX3EAHL90D3HvdAA1AKsMExHQ77nPde3vcRHdsdYvdwYvdAE/pQChP094X+VCEd+2j3JOT3ER3bHfcL6UD3QBP6UAr3hf4gnB2gdvfu9ybF/wBMgAD//7OAANs79ybbHfce90ATzveA+JYVr/c+BxPW2/s+BxPOzftABxPmSAdLhgUTzkHL/LqtCqOloZmrG7eZc1Mf+573QPe0B/cQW9v7AkFVaWtqHg73Kwr3QgH3nPdAA0kd937VXgr3Kwr3QgH3nPdAA0kd+FD3jFUd9ysK90IB95z3QANJHevVLAoO9ysK9zAB95z3QANJHePVJx23Hcv3RBL3IvdEVfdASfdE3B33MMsVLx0T6Pd4FhPkv6+xvb1nsVcfE+hXZ2VZWa9lvx8Otx3j9wAS91z3tPt090DcHfcS424dDvcrCucS91Lpd/dAa+kT6EkdE/T3otU/CvcrCvdCAfec90ADSR33WtUvCrcd90bfEvec90Al9w4T8Ekd93zFFRPoJh0OtQr4AvcayfdeEvd+93D7UvdAE/RJHRP4lQr9ztkK9wAd91l2+AL3Gsn3XhL3fvdw+2L3Bin3QBN595wWE7q9BnN6YWFQGk29a8keE3nlHR8Tua4KE3zb91ghHfcAHfdZdvgC9xoS94z3Bin3QBN095wWE7i9BnN6YWFQGk29a8keE3TlHR8TtK4KDrcdAfec90ADSR0O9wYd+Dj3GtX3QgH3nPdAA2sK69UsCg73HQr4iHf3bHcBy/dAwfcOkgr3bv10KAqgrh0By/dA9y0K9wwGxsX3AftGBfdOBvtZ97j3TfdkBftOBvss+0IFh/dC+0AGDn/1Csf3EAH3UvdAA8H4xhUzCvgQ90xICg5/9x74Ovd2+2j3GhL3UvdAwfMTuMH4xhUzChPY+En7KBWyCpH7dgUOf/ce9xT3XvX3GgH3HPdAzfdwA/jGBDMK+Hj8TiEd+37N9zDgHWn3DhPwwfjGFTMKE+j3nv10KApjCr3gHfsG93AT8MH4xhUzChPo98T+VCEdYwq99Qrv9wAS9w73tPtw90D7BvdwE/TB+MYVMwoT+M/vbh0T8veAHPtwIR33Fh3X4B37KPe0E/DB+MYVMwoT6PhU/aR6HX/1CgH3UvdAA/iR9yAVgW51h3YbaGObxR/3Hwf3I9gF9xwH+yM+Bfdx+8j7Gvcc+z8H+wFOBfscB/cByAVaB/sWzzP3GcyvlZvBHg77nPde3p0Kq3cSpfc2j/dw+0L3Fr33NhPNgKUW9zYGE+WAfR0T1YB/yAX7FQYTygD3qP2QIR2gnQrp90LbHfce90ATvMsW90AGE9w1ChO8xgr4PPeMVR2gnQrp90LbHfce90ATvMsW90AGE9w1ChO8xgr3RtUvCqCdCun3MNsd9x73QBO8yxb3QAYT3DUKE7zGCs/VJx37fs33UZ0K2x2x9w5190AT2ssW90AGE+o1ChPcxgr3XvywKAqgnQrd917bHWv3cFn3QBO6yxb3QAYT2jUKE7rGChO0947JIR37nPde3p0K2x1h93Bj90AT2ssW90AGE+o1ChPaxgoT1PeE/ZAhHfcWHfcBnQrbHfce90AT3MsW90AGE+w1ChPcxgr4FPzgeh23HX73ZftYd6t392B3Esf3B7z3QOn3QBOPgH/3n40K9wJezDhPX2BIHhOjgE+0ZMWRkYyMkR6HTmVhQm0IE4+A+EPfFROXgH/HBfsg/Ij3QAYTx4D33Aejn5eZoxunlXNTH/uyrQoTj4D3EGHbKktgaWVnHg5uCvdCAaUKAyMduffYXgpuCvdCAaUKAyMd95T4hlUdbgr3QgGlCgMjHS/32CwKDm4K9zABpQoDIx0n99gnHVQdv/dEdgr7DOQK+wz3RBPyIx0T7Gv3zhUvHfd4Fi8dDlQd1/cAdgpN97RN9yAKIx0T6E335m4dDm4K53YKQ+n3DOlD90QT8iMdE+zd99g/Cm4K9y4BpQoDIx1V99h0HW4K90IBpQoDIx2V99gvCt8Kdgpv93Bv9yAKIx0T6N38liEdVB33Ot92CtP3Dm33IAojHbf3yBUT+CYdDn/3HveM9x73IwqlChPjIx1J9xQdE9OmHRPjSx0Ty/QKE8fGHX/3HveM9x73IwqlChPjIx1J9xQdE9OmHRPjSx0Tx+QdE8vaCm4K9wUKi3e/0RKlCiv3AhPnACMdSfcUHRPXAKYdE+aARx0TzoChCm4K9x0dtfdE9zbTRfdEE/ojHUH32GcdE/w7Hd8Kyekdb/dwb/dEE3ojHS/32CwKE/TT/oghHX/3GPeY9xgBpQoD+BD3shWMgIx/fho/c1VReXyQlX8eaNwVipWKl5ca16PBxZ2ZhoKXHvdY9wYVTbtgVwWjYl2XWxv7GPsSK/s6Q6NQsV8fX1bJW7W+BXO0un67G/cY9xLr9zrUc8Zktx8Of/ca+xr3HtPz0/ce+xb3FhKX9y7g9wfl9xoTd/c6944V15i7rKWYWz8/fltxan671x77Lhb7Ot8r8cWtobWoHmKouXS6G7LDm6uzHxO3UfcCBXlxd4Vz9zMKj6GNm6ka9xpS9wQlYF9xW3Aet3RmqVQbE3ckNCv7Oh/39r8VE2/FkaGhoxupk2dfHw5UHRKlCi33GBPw98D3EmwdE+g9HRPw9xj3Euv3OtlvyWC4HxPoypy5s9FNHW4K90ISpQot9xgT+JcKZ/xUPgpuCvdCEqUKLfcYE/j4GPEdr/xUPgpUHbnNwd92CtP3Dm33RC33GBP695r4whUT/CYdE/q9/IZsHRP5PR0T+vcY9xLr9zrZb8lguB8T+cqcubPRTR1uCvcwEqUKLfcYE/j4IPluFWOBfn92cWy/WhtLWVz7AX0f4QazlZiXoKWpV70by7269wGZH/tK/PA+Ct8Kdgpw93Bu90Qt9xgT6PfBaR0T9Ir3UGwdE/I9HRP09xj3Euv3OtlvyWC4HxPyypy5s9FNHfcAHfdQdvgT9x52Cn/3Bsn3RBO292L7ChVNvWvJHhN65R0fE7Zp1wWFgn6F9R2lmqq8oh/zudHT9xYa9zr7Eev7GR4TevsZ+xEr+zr7KfEu9wl6HxO2c3ZsZVkaE3qX+AQV16O7xcWjWz8/c1tRUXO71x4Odx34LPeMVR37fs33UbMdEvP3QCX3DhPUtAoT5IEKE9RjHRPM1h0T0sn8sCgKdx33NtUvCvuc917esx0S6fdw+2b3QBPStAoT4oEKE9JjHRPK1h0T1O/9kCEd+5z3Xt6zHfcA9wAS6fdw+2b3QDn3tBPVALQKE+UAgQoT1QBjHRPNANYdE9SA5eNuHRPWAJX+VCEd9xYd9wGzHRLz90AT1LQKE+SBChPUYx0TzNYd94j84Hodf9YKyfdCAdj3P/cT9z8DucsVYcvpaeEbKB34BPjWVR1/1grJ90IB2Pc/9xP3PwO5yxVhy+lp4RsoHZ/4KCwKDn/WCsn3QgHY9z/3E/c/A7nLFWHL6WnhGygd9w74KC8K+3TN9yj3ECR2+CD3EhLY9z+r9w5w9z8TvPiu+E4VrFZBsC0b+yYtSykfE9o56GHdcx7MeMV+cRp3dYFQUVOhrVEePyEFE7zDZtpt14RqSRg6HZirBRO69xCczMzbGuUtsDaiHkucVJalGp+gk7+7undxuR4O+37N9zDWChLY9z+n9w509z8T6LnLFWHL6WnhGxP0KB0T6Pcm+2YoCn/WCr33XhLY9z9h93BY9z8T9LnLFWHL6WnhGygdE+j3VvgcIR1jCr3WChLY9z9X93Bi9z8T9LnLFWHL6WnhGygdE+j3TPxGIR1/9xL7BqH4vPcaEr33QMP3MvsB9zNF9zITdL0W90D4cgbDnbO6o5t0bh4TeEFabz8aE7L7FPcef08ad36BfXVykpxvHhN0U/sIBROydbmwf8Eb9wzG1+kfE3j3IPsemcEaE3S3vafpGuNO4/se+zdBKfsQHg5/1Aq73QH3NvdAvvMDMAr3vvdKFbIKkft2BQ77dM33J/cZ+wR2pXb4CPcaEvc290CT9w4TrPg2gBXAjreXsJUIE8xtfAqCcG2EaRtLaqHSH/cr91r3Gvta9xb7Igd1+xb7FIUF+xT3DPsuBxOc+wa3OPcHdh4TrmhFBTodDvt+zfcw1AoS9zb3QIv3DhPwMAoT6Pc4/CooCmMKvdQKEvc290A793AT8DAKE+j3Xv0KIR33Fh3X1AoS9zb3QPsG97QT8DAKE+j37vxaeh1/1Ar3YvdEEsv3RD33QGH3RBPoMAoT9IH36BUvHfd4Fi8dDlMd6fdCdwoTfF4dE7z71gcjChN8qQr7pJkdUx3p90J3ChN8Xh0TvPvWByMKE3ypCk2QHQ5THen3QncKE3xeHRO8+9YHIwoTfKkK/C740iwKDlMd6fcwdwoTfF4dE7z71gcjChN8qQr8NvjSJx1THd/3RMoK+xrkCvse90ATeV4dE7n71gcjChN1qQr78vjIFS8dE3r3eBYvHQ5THfcA9wB3ChN8Xh0TvPvWByMKE3ypCvwQ+OBuHQ5THennygo16fcM6TH3QBN5Xh0TufvWByMKE3WpCvuA+NIVE3byvNfj9wcKYYZ5bWYbZnmptYYfLQYTdTONvD/yGw5THdHJ48nKClfd191TRgoTeoCpCvuA+LoVE3sA07u1y8tbtUNDW2FLHxN6gEu7YdMeE3sAyQR2ep2lpZydoKCceXFxenl2Hw5THen3LncKE3xeHRO8+9YHIwoTfKkK/Aj40nQdUx3p90J3ChN8Xh0TvPvWByMKE3ypCvvI+NIvClMd3/ccxdnKCiP3NQr7APdAE3xAXh0TvED71gcjChN6QKkK++j4yBUqChN8gPdkFioKE3kA9w4KQwoTeoCpCvvK+XwV9wAG9wz3Br4K+wbYChN9AMsKQwoTeoCpCvvIix0TfQDLCkMKE3yAqQr7ivcEChN7AKn7SG8K7B1393BH90ATul4dE9r71gcjChO6qQoTtPtq+5whHVMd91rfygrF9w5b90ATel4dE7r71gcjChN6qQr7pvjCFRN8Jh0O9wAd9zj3JvsRdqh2pPcPHfH3Bjf3QBNHQF4dE2NA+9YHZ3F3g24bXn+jwx/3svtA+8gH+xC5O/cEHhNTgNG9qbu1H48GE4uAmUXRHRNHQOUdHxOHgLMKd3eWoh8TR0Cnn63Pmx4Of/cbHfcY90Br9xgTdPh4+PRYChO4T/vWBiMKE3h4CvhUBhN0xZ21s81NHbkd+GiQHRN69y6tRh25HfgS8R0Tevd2rUYdUx3ZzcHfygrD9w5d90Br9xgTfQD3lPjCFRN+gCYd94R7WAoTvQBP+9YGIwoTfQB4CvhUBhN8gMWdtbPNTR1THen3MHcKa/cYE3z4GvluFWOBfn92cWy/WhtLWVz7AX0f4QazlZiXoKWpV70by7269wGZHxN6k/sORh3sHW33cFH3QGv3GBO198hpHfdE+TJYChPaT/vWBiMKE7p4CvhUBhO5xZ21s81NHbId6fdCAY346CsK95vVXgqyHen3QgGN+OgrCvht94xVHbId6fdCAY346CsK9xHVLAoOsh3f90QB7uQKKwr3TcsVLx33eBYvHQ6NHen3QhKj+L4TuOxbFRN4bfsWBRO4JAoTePdD+QJeCo0d6fdCEqP4vhO47FsVE3ht+xYFE7gkChN4+BX5sFUdjR3p90ISo/i+E7jsWxUTeG37FgUTuCQKE3iw+QIsCg6NHd/3RBL15AoTvOxbFRN8bfsWBRO8JAoTfOz4+BUvHfd4Fi8dDo0d3fdeEqP4vvwQ93ATuOxbFRN4bfsWBRO4JAoTdPdn+PYhHfuS9177HPcaJHb5OncSo/jb+3D3cBNY7FsVEzht+xYFE1gkChOU+CT7YiEdjR33Wt8S97v3DhO47FsVE3ht+xYFE7gkCvc++PIVE3gmHQ6NHen3MBKj+L4TuOxbFRN4bfsWBRO4JAoTeKj5Aicdi/ca93z3GtX3QgHR+G8DXwr4QPkkVR2L9xr3fPca1fdCAdH4bwNfCvdK+HYvCov3Gvd89xrJ914S0fhv+9/3cBPQXwoT6PeS+GohHWMKyfca93z3GhLR+G/75fdwE3BfChPo94z7+CEdf/ce92L3EgG19zD3Wvc0A/fA9xIVU12t0da0psWxqn9sqB+MgouBgRotYWNVHvdy+KgVX9b7HUZeqlqlWaIZQSOqfaZ8pHwZ+wZSt0H3KdazZ6hjnVoZqm5hl2Ib+wL7ADn7Jvso9wYt9x73Ouv3DPc29yhS9TfbHw77L3b3OPcuHfgU9yD3THfJHRO+94BlFYfXBW+pr3W7G/X17fdA9y497/sMXV15a2cfj9IF9zf7QP3890AHE9733AT3TAelo6GVpRu9o2k5K2VrY3VxkZ13Hw73Bh34OPcaAfec90ADawoOf/ccv/Hx9xh/d9sd9yz3OBPc+Lz3+hUT7N1R0yNNUG9nWh6HBhPcf78F+yD7qgb7OOdF9yLf2aO11x5P9wQFb09hfWEbU2mbr4Uf93iX48X3BBoT7Ps4fRVpbW/7DoceywefpqqdsxuvnX50Hw44HW0KE6YgHRNWPQoTTjgKE6ZWCg5/9y4drHb4CPcgf3fJHROW+BL3jBUzZWthc3WRnXce90wHp56gk6cbvKhpMR/3RJcV9yw97/sMVVdzaWkehwYTLn+5Bfsg/Ij3GgYTTpnBBY8GX7G5dbcbE5b3AvPt90IfDlQdAff+90QD+K73jhX3OvsS6/suOT9xY18e2SEFpLSulK4b0LtbPz9UWz9eZqCgbB9F+wAFWMbXdtAb9zL3FOv3Oh8Of1odAb33MAP4uveOFfc4+w7t+xX7OTf7APsabZBtjX8e99EGS3lae04bY2eVn18fUyUFZcfZd8kb9zL3Duv3Oh/77McVs6Srxbasd1eWHg5/9xbT9wTb9xYBvfcwA733ehX7Gtn7APc29xz3EO/3Nvc2+wDv+zRMPnllTx7DIQWftLaXsxvEsnlNmx/70QaJf4ZtbRr3MGMV9z4GVYFmeWAbUXWtsR8OTwr7L3b3OPcm+AJ3AcH3QPce90AD+Kz4iBX7QPvcBnNxdX1rG199o8Mf97L7QPvIB/sQuzv3AtXBrausHoIzBfsi90AHDn/3JvsFdviI9ycKE3z42PiIFfs2BhO8+9wHcYKCf38bfoSUoB/35PsW+9wHcYKAf34bfoeUoB/35Ps2+/AHJ7VL0cOwsbWZHleWq2+0G8aprbKcH48GE3yXTgX3FQYOf5939yr7Ca4dEvfY90ATmPiE+IgV+0D7jAYTWDdmTm1SG2d2kJRtHxOYafskBX+noIO5G9bTr927H48GEziYIQX3IQYOi9QKAfee90AD+Er3tBX3Gk/l+zhHVX1/Xx6p+xAFlKapkq0by6x1RB/7K/ta+xr3WvsW9yIHofcWBfcU9xr7DAYOoHb4CvcSAaP4vAP4IPiIFftaBvtC/IgF9zgGzPdumr2Xv5nBGY8GmVWXV5pZzPtuGPdABg6gdtv3Hvck9x4BjfjoA/ii+IgV+1YGe/sag0KIYohpGYcGhsKGuoW5e/caGPtaBkn8iAX3MAae92aRvYu9kb8ZjwaSV5JZlFmh+xYY9wgGn/cWlbuRv5C/GY4GkVeMWZFZnvtmGPc8Bg6gdvjS9xqBdxKh+L4T0PiM+MwVE7Cp9xYFE9CRdHKPbBv7FVJK+xtWH/tW/JAF9zYGx/dUmr2bvpe+GY8GmVWZWZxb0ftUGPc+Bvtm+HaZsQWpmKSjvhuWlomHmB8O+y9291muHQH4APdAA/is+IgV+0D7DAZQUfsB90YF+04G91n7uPtN+2QF904G9yz3QgWP+/L3QAYO7wr/AIKAAP//fYAA9xrJ92L7Vvcai3fKCvdE90ATy8P4hxVJhgUTq7kKE6ep9xIFE6v3FgoTs/i49zMVx1u2SEhbYE9Pu2DOzru2xx77XP0tFfdA+Ij7QAYOf/ce+wl2rHb4Av8AgoAA//99gAD3GtX3GnoKEsf3QPcy90ATNMDH+IcVSYYFEyzAuQoTKcCp9xIFE4zA9xYK+Lj8DhWJg4eLhRt/e5WtHxNKwPii+0D8nAf7BLE/9wixp5GTnR4OOB1tChOmIB0TVj0KE044ChOmVgoOOB3d90JtChOnIB0TVz0KE084ChOnVgoTT/eC99heCjgd3fdCbQoTpyAdE1c9ChNPOAoTp1YKE0/4VPiGVR04Hd33Qm0KE6cgHRNXPQoTTzgKE6dWChNP7/fYLAoOOB3d9zBtChOnIB0TVz0KE084ChOnVgoTT+f32CcdOB3T90R2CiPkCvsu90ATpkAgHRNWQD0KE05AOAoTpkBWChNNgPc0984VLx33eBYvHQ44Hev3AHYKXfe0K/dAE6aAIB0TVoA9ChNOgDgKE6aAVgoTTQD3Fvfmbh0OOB3d53YKU+n3APdA+zTpE6aAIB0TVoA9ChNOgDgKE6aAVgoTTUCfCg44HcXJ48l2CnXd191D90ATpyAgHRNXID0KE08gOAoTpyBWChNOwPem98BZHTgd3fdCbQoTpyAdE1c9ChNPOAoTp1YKE0/3XvfYLwpjCr08HXYKgfdwS/dAE9KAIB0TqoA9ChOmgDgKE9KAVgoTpQD3qPyWIR04HfdO33YK4/cOS/dAE6aAIB0TVoA9ChNOgDgKE6aAVgr3gPfIFRNPACYdDjgd3fczHbX3RPcm90ATpGAgHRNUYD0KE0xgOAoTpGBWChNMYPcS9xQdE0pgph0TTGBLHRNJYPQKE0jgxh04Hd33Mx2190T3JvdAE6RgIB0TVGA9ChNMYDgKE6RgVgoTTGD3EvcUHRNKYKYdE0xgSx0TSODkHRNJYNoKOB3d9wUKi3e/0W0KUfcCE6TgIB0TVOA9ChNM4DgKE6TgVgoTTOD3EvcUHRNK4KYdE0zQRx0TSdChCjgd3fcGr/cObQr7INMTp4AgHRNXgD0KE0+AOAoTp4BWChNPQPcK99hpCjsdYwq9PB3d6R2B93BL90ATU0AgHRMrQD0KEydAOAoTU0BWChMnQO/32CwKE6aA1f6IIR04Hd3dtZ9tChOngCAdE1eAPQoTT4A4ChOngFYKE0+A93T4VBXfBuX3DAX7DAaH+4g3Cg44Hd3dtZ9tChOngCAdE1eAPQoTT4A4ChOngFYKE0+A96L4zBX7DAbl+wwF3wZZ+xA3Cg44Hd3duprq0XYK1/cCY/dAE6egIB0TV6A9ChNPoDgKE6egVgoTT8D3pvfYNwpl9xVqHaEKOB3d2T33EKX3DnYKVdP3FPdA+yDTE6KgIB0TUqA9ChNKoDgKE6KgVgoTSqD3pvfY8x0TTKBzhXp1YBsTSqD3BB0TS1D7LPcqFdMGvQo7HWMKvTwd3ed2ClPpW/dwS/dA+zTpE9MgIB0TqyA9ChOnIDgKE9MgVgoTppCfChOmQI392iEd9wAd9zj3IPsDdqRLCnYK9wj3Bjf3QBNkoPdu95AV47GrtaOhhXmfHvtMB294doNvG1pureUf+0SJFfs23yf3EB4TYcC3v6OtrR+PBhORwJlZ0R0TSaDlHR8TicCzCnZ4lqIfE0qgp5+tz5se+Ij7GgcTSaA4ChNkoFYKDk8KTx37NPg4LAoOXArd5xK190JP6fcG90D7OuktHRPNQJn4OD8KXArR914StfdCe/dwU/dALR0TzQCZ+CwhHVwK90rNErX3Qo33DqP3QC0dE82Av/gcfh1PHVH4OC8KXArr9wAStfdCWfe0MfdALR0TzQD7FvhGbh0OXArd9zAStfdC9yj3QBPPRB0T14oKZVWVo10f9zz3QhVdabDSHxPn1rWusaWhhXmfHvswBxPPbXd1g3Eb+zz4OCcdf/cW+ET3BBKb9zYh9yHM9xYT6PdG904VnZCclJoeqmauZ7BrCIN9fIZ9G11vp7MfE9iu98AVtZmhnKSUfW9pdnJtdB6CoIafnhr3c/sEFYFXe153ZWenaapvqwjFucW93RrpS8cjI0s5LWSaXKZaHhPoVmReWDYaKdEx9yTTx6GwvB65brl4uoCz9x4YcpBvl22dss2m0p7XCA5/9xj3DPc09wbOCvcH9233bSb3Afsp+ykm+wH7bftt8PsH9ykf+KIEwLhn+zL7Ml5hVlZetfcy9zK4r8AfE/z7pgS5rau7u2mrXV1pa1tbrWu5Hw6L9x733PcMHfiE9wod+9z3Kh2L9yT4BPcCHfsUBmxbh4doH/Pj9fcE8bgdNfsQIfs9+x4fDn/3Hvcc9wz3FvcDChPkr9kV9yQKzfcMHxPw21G9PaEejwcT6NaptLnIGvcHKcveHXdlHxPwX2Fv+wYe+wwHE+T3Ia5vW2Nfd01bVaOvYR8OoHb3IvcW93L3MQr3pBXN9wCisab3GwpDB/d9FkL3/vtoBvuJ/AgF+wz3vfsi9zT3ItQHDn/3Hvc49wrd9yQB7/cs9wT3QAO12RX3KB3d9yL3GiTJ+wdyeImDcR+T5wX3kPck/CQGe/va9ygKb1VTYXFJWVylrWIfDlwdoHb4fvckAfdI90AD90gW90AGmPeLnvcC9zL3Pwj1/Hf7JPfAB/sU+zdl+xN++1wIDkwKf/ce9wD3DPc49xQBu/cw90v3MQP3rvf2FV9pn8POtKC0rbh3MZwfZGppfGob+3b7shX3Mh33Avd693r7G+P7E/sR+wE7+xz7HONP9wC0xqK1th/7FYRPX0cbY2GhoXMfDn/3GOn3NOHOCvcC91j3WCbx+yn7KSYl+1j7WPD7AvcpH/hsBMC4a/sa+xpeY1ZWXrP3GvcauKvAHxP8+4oEua2surpprF1daWpcXK1quR8Oi/ce96b3DB34TvcKHfum9yodi/ck9873Ah0pBmxbh4doH+3T3dvruB1E+wsq+0L7AB8OL/cecHb3WvcM9yL3AwoTcq+JFROy9yQK0fcSHxN44FG7PaIejwcTdNartLvMGvcHKc/eHXNlHxN4WWFt+wYe+wwHE7L3Ia5wVlxfdE1bVaOvYR8O2fcW93z3MQr3ZBXP9wqisaT3Gwo5B/d9FkL4CPtoBvuJ/BIF+wz3vfsy9zT3MtQHDi/3HnB293j3Cuf3JBLv9yz3BPdAE3y1iRUTvPcoHeH3KPchJMj7B3J4i4FxH5PxBfeQ9yT8JAZ7++T3KApwTkxhbklZXKWtYh8OXB34SPckAfdI90AD90g7FfdABpf3lp/3DPcy90QI9fx3+yT3wAf7Ffs8ZvsgfvtkCA5MCi/3HmZ29zz3DPdQ9xQSu/cw90r3MhN89673qBVfaajK1rSgtLC7cyGZH2FpaHtpG/t2+7QVE7z3Mh33B/eP93r7G+P7E/sR+wE5+yL7I+NG9wCzxaK0tx/7GX9SYkobY2GhoXMfDn/CCvcKFX8KDvtu+Fz7dvd2EvfI9xoToPdu+24V9ym11ur3FxoTYK8df/eYvcIK+EAVfwr7ygR/Cg6X93bH95gS9z73mPsO9xoTYPfA974V2b/F09JXxj09V1BEQ79R2R85/JgVE5D3KbXW6vcXGq8df/dkAX73XJj3XJj3XAN+5xWjHfdpFqMd92kWox0Of/dw+1t29yEK94j3nBUTUPcEBqP3lpH3KAX7QAaR+ygFE6Bt/DvZHfe493CLd/chCvf494AVE1D7BAZz+5aF+ygF90AGhfcoBROgqfg72h1/93D7W3b4wPceEvdE93BT9zgTaPdk95wV9yoGgfcC9zCX9xYa9wgrvfsIO0ZlU1oe6TUFo6iknbEbqal9Z0v7LGef+xYfE7Br+znZHftK9x735Pdwi3cS6/c4U/dwE7D4HPeAFfsqBpX7Avswf/sWGvsI61n3CNvQscO8Hi3hBXNucnllG21tma/L9yyvd/cWHxPIq/c52h33sPgkAfdj904D94z3sKMKDvew+CQBzvdO6fdOA/cA97CjCvfS+4ajCg6DHfefsB33n40KE2BIHQ73n/dlAa33B/c59wcD93H3Ix1yHfeB5NMdch0O+Hv3DQr3n3EK+32wHft9jQoTYEgdDn73DQr7fXEKmfhwAfc6944D9+yZlgoOmfhwAfdM944D90zZlB0OmfhwAaX4pgP3YJmWCvhe+yyWCg6Z+HABt/imA7fZlB33LPtClB0OlAqUCswdzArMHcwK93bCCvf4FX8KDuv34AH3FvfoA/fA6xXt09Pp6UPTKSlDQy0t00PtHw77QvcSAcf4dAPHWxX7Evh09xIHDvtI+igB9z73IgP4DftIFerVBfsF9wlc9wX3Lhr3Lrr3BfcF9wkeLNUF+xP7Cjv7LvtOGvtO2/su9xP7Ch4O+0j6KAH3tPciA/dz+0gV9xP3Ctv3LvdOGvdOO/cu+xP3Ch4sQQX3BfsJuvsF+y4a+y5c+wX7BfsJHg77LOX5POUB91P3FgP3U/ssFffD5ftB+Tz3QeX7wwYO+yzl+TzlAfer9xcD9k0VMffD+fD7wzH3QP08Bw73MArv9zhj9yQT6Pd0hRX7AsRn9xYe3uVmBj96lb8fvo+6xRrbbKdClx6PB9SXqqfbxYe6vhq/nJXXHrDlOAb7FlJn+wIfRZVtTRoT8GltZyOJHicHE+jzialnaU2BbUUaDvcwCvd99yRj9zgT8PZNFTHeB/cWxK/3Ah/RgKnJGq2pr/SNHhPo7wcT8CKNba+tyZap0Rr3AlKv+xYeODGwBtacgVcfWIhcURo7qm/Ufx6HB0J/bG87UY5cWBpXeoFAHg77NPn6Acv4bAP4rPlaFfsiBvve/foF9yIGDvcYCvuOFfcs+nz7LAYO+zT5+gHL+GwD+B77NBX3Igb73vn6BfsiBg73GAr31BX3LPhC+ywG/LoE/Fb3LPhWBw7e+HsB943xA/dO3hX3Bvcc9wb7HNS9Lvct9yrOcd37NGR990IFMwZ9+0L7NLJxOfcqSC77LQUO+DH3EgH3gfcSA/d8OxX3HAaB+Ib3PIG4CpUFDuj3EPda9xAB94H3EgPV4xX3PJWB+0YF9xwGgfdG9zyBBfccB/s8fZX1gfX3PH24CpmBIZUh+zyZBQ4v9xJ8dvjM9xISy/ckLfcuwfcuN/ckE3L3ZPfgFZ6Tm5yYHtdn3ndVGneDe3p+HkGxNp/AGvew97gVrGFJrjkbE2r7CURLKWmVcJx1HxO0W2xuWV37UveWi0sad31/Z2llm61rHhNyKTUFE7RNud1v1Rv3Hc7T6amDpH6fHxNqwK2nuMP3SPugm8MaoZqTqKqzdnCqHg75HncBsfetvvdAA/gGOxX3QPlu+0AGWBZiBvsU+wRV+0D7L/cEOPcTH7UGDoPPz+33Vu3RzwGZ0733DfeV0wOZ99qCCr2JFfsM1T/ztLCbo6seVdkFf3l/g3UbZXSxx7+ht7ibl4N9mB/K0QWmb2miVRsvNz/7Ch8Og8/3NuH3AOXdzwGZ09/3DMf3CLvTA/c+9yAV9wzdmQbh17jy8UOtMR/7Ggb3DPtaFfcAkweunH1nY3x5Zh/7sJ2CCg73yMH3Ara7ur/BAezHxcu3z73HA/e/98gV9wTl4fcK9wox4fsE+wQxNfsK+wrlNfcEH8EEN1HF5+fFxd/fxVEvL1FRNx83wRXLw6MGp1MFzQZj1QWjl5WfoRq3aaFbHi0GyywVu50Hm5WBfn+DfnkfDvg+67H3CCfvEsP3AvHr9yDrE7z3oPf8FevbBvcZChPcwB0TvHnPbeEF+wgG+2j70BX3Avds0+/7kifTBg738N2H67H3CEXdEontre+x6/cg6xOf7/fwFdu9wMK9daNjnR9jnQV0lYKOlhqTkZOboaF9faEeE6+90QUTn6FtY51fGz1fWlRWp3Krex+0dwWggZWHfxqBg4d9cXWbn3UeU0cFabOte7cb9zyXFevbBhNv9xkKwB15z23hBfsIBg77KPH3GvcC9/D3BR34JBX3H0f3Afsx+zf7IPsI+6r7qfct+xHcCuX3Yvdw79fe3rVPSR97hR1v8dX3AvfC9wUd+EwV9w5I7/sq+zj7Jyn7jvt/9y0g3ArT9zj3VPcAxd7XtGFbH4WFHaB290j3AOv3AAH3Lu3n7QP3BhbtBqH3SAXnBnX7SAXtBqH3SAXr9wA3BpfrBef3AD33Jgov9yYKMfsA1wZ/KwU3+wDTBvcC9wAVl+sF5wZ/KwUO9534UwH3jfED91z3nRXv9wzv+wzUvTz3HfcWwnHd+yBwffcqBTMGffsq+yCmcTn3FlQ8+x0FDsAKwAr4dPceAdP3OPce9zgD9+f3gRWggZmAfRp5e4FsiR5T94oVdpR9lJcanpqWqo0e7ngVnYScgZ9/3+0YbKpmpF6apfcdGCeXcvsYBYmIi4kb+yEzRyMl5V/cbx98NmyVbJpnnxlB+wizasFzvn4Zb/sq73+n9yoF9zGO29rtGu4ytzmoHg74QJcd+EA+HQ75GcQK+EwVih34TKId+EwV96HvBhPQRAoToG1IU0FfHg74QIkK+GUuChPocgoO+ISnCvjPWgr4QHsd+GU5HfhAkQr4mjkK+SKaHfhMFWgK+EB/HfimLh34QJId+SA6Cvfuwwr49GId9+7EHfj0Ygr4RMMd+IqFCvhO1B33xGUd+0qXHftKPh0OrsQK+z4Vih37PqId+z4V96HvBhPQRAoToG1IU0FfHg77SokK+yUuChPocgoO+wanCmRaCvtKex37JTkd+0qRCi85CreaHfs+FWgK+0p/HTsuHftKkh21Ogr7nMMKiWId+5zEHYliCvtGwx37AIUK+zzUHfvGZR1/lx1/Ph0O92HEChaKHYvv9xTtEvc696H7FPcKE6D3Ohb3oe8GE9BEChOgbUhTQV8eDn+JCqQuChPocgoOw6cK9xdaCn97HaQ5HX+RCtk5Cvdqmh0WaAp/fx3lLh1/kh33aDoKLcMK9zxiHS3EHfc8YgqDwx3JhQqN1B37HGUd98iXHffIPh0O+KHECvfUFYod99SiHffUFfeh7wYT0EQKE6BtSFNBXx4O98iJCvftLgoT6HIKDvgMpwr4V1oK98h7HfftOR33yJEK+CI5Cviqmh331BVoCvfIfx34Li4d98iSHfioOgr3OsMK+EBiHfc6xB34QGIK95DDHffWhQr3mtQd9xBlHWQdaB19CmQd95jj9xcK9yf3mBXoBpWvBY0GbqWpfKkb1NDM9wbwV846bmx/dnQfjboF9fsLB/cL+/kVuwr3kOn3MuoB9zr3DgP3Ovg9FfsB2kvxsbqXqK8eXNUFgXp4gHMbYWyqu7yoqbuZmYh/mx/B1AWhc2aaXxsmMEv7Ah8O95DrqAr3Efg9FSDCSeCorJuhoh6OBpNtBez4X/sLIQaPXAWed3WZmAr3kOS+0rrkSQoO+Ifnt+cB9433CwP4kvlZFZNwZ5ViG/sDXVBBH4gHQ4cFM9P7g/cL94Pz5yOOB6eemK2jpIWFnR4O9xHTueSr0dPgRdkS9xPrN/cDIejl81D3BRP0QPdz93YVk5CRlZIeiZeYiaUbqwarnol7emuAYGBsk6AfK3cVUNB13fcS3LvUyFekMh4T8YBTBmZ9kJmUjY6TkR+Im5iJlxvcyaral4eYh5IfxeD7GwaQenaOdxsT8oA9RGU4ZZ9spXsfiQcT8YBze3pzdRpvmnqefx6IBxP0QGl7endwGhPqgPc193gVdnqYqqicmaCgnX1ubHl+dh8O+IfvAfcp9wvg9wsD9ywd92wG3R1swUBbaHR3dh6RxAX1+wsHDviH57L3HRL3ofcr+xr3CxOQ9zv4hxX3C/uD9wv33/uCBhPg9wsKbG5jYqpwtx8O9x3n96LnsvcdEveU9yz7GvcLE8j3L/iHFfcL+2YGX357ZHx6jZdxHmk4BX6nqoG0G/cUrtbcH/e++4IHE/D3CwprbmNiq3C3Hw73mPff+9/4XxL3KfcLE2D3LB3aBq+vBROg0fsHBfcVBvsX91X3EPceBfsVBiv7AwWI94P7CwYO95Dp963nAfeE9wsD90X5BxXK+3kGNbJP7bKgkJOrHnjmBYV7fod/G213lbEf99n7SgcO95j35yfnEvcB9wSo56f3BROw9wH3mBX3BAYTcPdrBxNQm5GQk5Ibk46Gfx/7cuf3awcTeJuQkZOTG5KNhn8f+3L3Bfd6B81vtlxlcnFwgh6thHWecBtkd3Ryfx+JBoKzBTIGDveY998v7xL3KfcL4PcLE7D3LB0GE3D3bAfdHWvBQVppdHNxHogGg7IFKgYOfQr3kOv3Fwr3mvexFXahpH+oG9TQzPcG8FjOOmlpe3VyH4gGg6kFKvxS9wvlBvcTBLsK95DrqAr3Efg9FSDCSeCmqpieoB6GXQUu9wv4Ui4HgmkFiAapcXGXmAr3mPffLPIS91/3CxOg91/3mBX3CwYTYPc2B8KhsZ6rG6OZiIWfH6LtBZN5fZFsG15ec1VuH4gGgtEFKQYO95Dh90LiAfc09wvN9woD9x/3wBVvtMl3whv3AMW7ysZQpFaaH2SWapKbGpeWj6epqIF6qB7A0AWhaFyiThssTmBKVMZvvnsfs3+ug3saf3+FaWdpl6FmHg73kOf3L+cB92f3DAP3Z/glFTK0T/cDt66Uk6Yed+AFhXt4h3cbYnWYuR/r9w/n+w/gKAd8NkOHBTPNBw73kO8v998S9x/3C973DBNw+GH44xX7DAYTsPtoB3R7f4d4G2+Dmq4f91H7C/tgBzqqVda5rZ+qpx6NBpRgBewGDveY4QH2+AoD93j3mBX3HQb3CPffBfsFBmH7IYFpg2mBZxmJBoGvg62BrWH3IRj7CwYO95jp4eoS93K//wAagAD/ADaAABPg9xb3mBX3HAaT3pC8jaWNoRmNBhPwjmePbI9tlDgY9x4GtfffBfsABoD7HIdqi2qHaBmIBoeuh6yFrH3bGBPgPAZ/O4Rsh2iIaBmJBoeui6yHrH/3HBj7CAYO95j33wH3AvgGA/cC95gV9xAGo7eTnpWelJ4ZjQaWeJl4lnipXxj3Ewb7BPcy9vdBBfsRBndeg3mCd4R4GYgGgZ5+n4KdcLgY+xMG9PszBQ73HeYB9xH38QP3RPd8FXczBYeamIiiG9+vs+avH/cD99cF+wYGbPsPg2uFbIRsGYkGg6yFqYGqZfcPGPsLBvcS+9KIfQV5hH5+bBuFgo6MhR8O95jn9yfnEvct99P7wPe7E+D3LfeYFffT5/svBhPQ9yr3RAXK+7sv9xcHE+D7KvtEBQ73kOS+0rrks/cISQo690QV4QZQ9wgF+wwGDveQ5L7SuuSz9whJCsz3uBX7DQZQ+wgF4QYO95DkudK/5AH3JfD3APcFA/cl+DAVM7tD9eLczfb2Rc4jY1t/cWQeskMFmKWjk6MbsKWAYpUf+14GiYOIenYa8HIV9wAGZ4RzgXAbZX+gpB8OaB33H+a06fce6wH3EfcN6PcLA/dM95AVZD8FcbPDgK0b9wjOueIf99MsB4JsBYkGp3NtlmwbR0FIJy/DRt6nqJWdoB+IbAV2iXh6YBtyZ5KabR/3BPcFFW91ori8o6CimZ+HgJcfKAd4f32GehsO+Bbb9yDbAfcp4/cU4wP3wfgWFeHNy+HhScs1NUlLNTXNS+Ef2wRlcae1taWnsbGlb2FhcW9lHw73J+73PO0B1fcs9yj3LAP3BMMV5uYFqn6shayrrZGqDCTmMODgOtsFoKmYr7YatX+vdqge29s24DExBWyYaZJqammEbAwkMeU2Nto7BXduf2dhGmCXZ6BtHjs7Bfdb91EVv6urtbWra1dXa2thYWurvx4O+wL56vuc95wS3fc4jPcEkPc4E5D4nPimFWG2WKpHlggTUPcV+wT7FwcTaCR5TU00+1D3rpdHGnd4gWZRV5+zRx5B+wgFE5C/XtdwyoMI+yb3BPcrBxNo9wSgxNDe90r7rofDGqCdlq++sHtrux4Oi/ck9w7z9x73HhL3F/c3+wj3KRPo9633KBWsrZimshqRi5GKkR73HPMGE/D7NAaGnYicnBq6CniRdZN2Hz6FBSkHE+j3AQaMhouFhhpFV1lMcx73Nx2L93I7273b96539y0dE3ii+Q4V9y77rgX7Ezv3OFn7ODv3OAYTuPsi90AHE3j3Ivc42/s4vfc42/sTB/cu964F+0AGWvsKemB5X3pgGYcGebV7t3m3WvcKGA5/9xjj37ff6fcYAef3QAP4hPc8FW1va3lhG1VkqcV2H/dU3/tjBoqTi5SUkYuRkRr3jN/7fwbInbCswxuzqXt1qR/p5wW/V0elRxv7JPsCOvsmZx9LhgU9wAeKg4uDg4SLg4QaV4cFPcoH+yau9wFB9x0b29Grx8MfDl/5UAHl9zrB5wP3yvdbFWifeLG8GrycsbCfHvcs+1sVen53f3SGCPeJB5mImYSbftn1GG6oYKBZkAjkLy0H+xR0LzD7Ihr7KOEv9xp4HjDn5ge2krqesawIDiv3GveS9xD3AvcceXcSuPiT/Dz3/hPY+MD5GBUT6JV1WJNxGxPk+ydUUvsrch+HZQV5Bj+FBfsK2gd++wp6+wp8e1uJGXqMeY16kHb7Exibg7GFuooI9yy07/cKmh+g9z4F9wv3ECMGkb8FsZShn7gboZyFh5kfDpV2pXb4nPcYhnekdxLT90DbwRNm9/r4lhWPjouOG5STioqSH138GX+OgI+BkRlcxBV9q4O1vhrgn8exqR73QvvZFXVzc3tthbf4BhiThpOGk4Xp5xhtqWigZ5iY9wQYVQZ/JwWMgoGMgomJi4kbl+0FVQYTVn8kBfsrcyr7CftQGvsz0CbyYR59+wwFwQaX85aJl4qWihkTjn8nBcEGl+7TkMqqvsIZDov3JM3ft9/h9x4B9xf3NwP3rfcoFaChmJ6SoAj3IN/7IAaImoeahpkI9yzf+zwGugqHi4iMhx9LhgU94weRfJB9j3wIcAY/hQU98wd7WmBnWXgI9zcdi/cP9wPLt8v09w8B4/cO90j3DgP4Jve+FWIGfbcFvQak+28VhwZn9wMFpgb7YssVhrcFsgaZXwVC92kVjwatIgVxBvgaSxXLR/d4+w77eEsHh5c992wF+zD7eAZHhQVRz18HR4UFUc/7fvcO937JB5F52ftsBfcw937Py0e3Bg6gdvdf9cTzxfUB2fc2A/eE98kVxPcGB2d+bHZeG/dvBLiqeGSYH/sGxQb35lEVTQb3DXQmtvsKG/tY+zkGSoYFKcz8Avc291+tB/cI8773BKEfyQYOi9+t9wT3JPcGq9839xIS3/ck9xb3IBPu7Rb4Rt/8Rgb3mPdEFXV2eoNvG2VxocK4rqGso56FfZ4fE/b3IPeOFRPutfsgBxP2YfsuBxPuN/cugwePTwWjbnGXXBs2MEn7BvsOz0fzt7Sbp6gfjQaVaQX3CPgcBhP20pEF2QcOoHb3X/Wky7P/ADyAAP//w4AAy6X1Etn3NvcO92wTpveE+CIVE6+z9w0HjIOLg4MahYuGioYeE+b7DTIVE6ak6QcT5nt7c4JuG/dvBBOuqqKDeZwfKwYTpqUHE6/35nEVRQYTp+xpLq4gG/tYBhO2+xkHS4YFUctiB0uGBVHL++L3NgcT5vdfrQcTr/PqtOWtH9LLUgaQi5GQGpOLk4qTHsUGDvsC94D7BHb3hfcg9yD3eiJ3oncSx/dAw/cEgfcsE7KA9973fhXHIwaIgn6Kfxs/W8v3FPcQtdPXs6l7cakfE2aA6ecFE2cAYrRZplaVCBNzAPH7BAcTawAiB/sbbi77B/tLGvtQ7CD3F3MeE6cAJPcEBxNnAPIHE2aAv5W9pLOtCPfM+2gHDpd2oc0KoHcS0/dA1+cTXPfU9xgVWqVwyuwa7KXMvaMe9zD75BV4d3Z8c4QI+BEHn4SdgJ1+6ecYYbVWpFSTCBOs5C8xB/sndCb7CftSGvtY8yD3JHkeJucHE1zxB8eVwam3uwgOoHb3Svccv9+39xw33xLc+E4T7Pif+Q4V/E4GE/T7HNIHyrWAapwf+wIGOIUFPfdTB2l6YnlNG0T7HN4G9yv7SgX3Uwb7Sfdpy6i4vpjYGdffPQYT7IKyc6xoowj3JgYOlHb5GncB9fdA9xn3JQP3qvcoFfcg9ycdu/cnHfcG+0D7Wgc9ZQUvB9mxBVsHPWUFLwfZsQX7bAf3toP3NPP3TxqUiaCGnh77IWsFjn6Lg4gaUVJaP4IeDqX46gGX+NQD7aUxCg6l+OoBl/jUA+2lMQoOpfjqAZf41APtpTEKDn/l9zLleeX3MuUSovcI0/cIVfcI0/cIE733Q/fIPh0//AgxChPD+zj8vD4dDn/R9wrR9yLR9wrREqPr0+ul69PrE/33MPgYcwr4FsMV/Fr7WKFZ+G73HgX8QPw2cwoTw/e2RXMKDov3F0DW9wfP92fSCvc89wATrvcCCvwY+5oV4Tf3NPdaUcEF+xn3ixXc+2H3EPfOKwYTtml2doJVhQj31fxnFaTBqcgFjgaFIQWCB/c0Flf3S/syBhNu+wH7WwVQ9zMHE65T9wAHE27DvwcOi+/3FO33W9IKn/eh+xT3ChPY4R0T6Gl2doJVhQgT2ELcB1n8hzEKE9z7vPywFfeh7wYT2kQKE9xtSFNBXx4Oi/cXQNb3B8+F5b7JuOUS9xf3QPsA9wz3EvcAE56A9wIK+/9wLgoTnYByCkX7yxXhN/c091pRwQX3UfsnFROugKTBqcgFjgaFIQWCB/c0Flf3S/syBhNegPsB+1sFUPczBxOegFP3AAcTXoDDvwcOf+W+ybjl91vSCvcC90D7APcME+7hHRP2aXZ2glWFCBPuQtwHWfyHMQr7wPyXLgoT7XIKDn/lvsm45YXv9xTtEvdL9wqCntL3QPsA9wwTmwC199QV96HvBhOdAEQKE5sAbUhTQV8ew/v5MQr7wPyXFWi/u4mzG9XLt8Wve6VamR8T6wC0mZefrxrAU7BIUVp6dGseukMFlZ+gl6Ebn5eDf3V2iGwfTQcT2oByCg5/2PdK2vdb0gqbfB0T2ADhHRMoAGl2doJVhQgTGABC3AdZ/IcxChOEgFgdf9j3Stp55b7JuOUS9xj3QPsA9wxvfB0TvCCx9+0uChMyALiegXh9e4N5cmpFCn/Y90raeeXBy53vEv8ASYAA/wDlgAAg9wxvfB0TqiCx9+0VaL+6ibQb28W+yB8TEgDHYa9JHhMUAH95iYmDHxMMAI2hBfcX7/tzBhMUAH77NwUTMgC7awWUnJePnRudm4N3eXuDeHJrRQp/2PdK2vdk7xK+96T7cfcVxHwdE+yA8ffUFfcVBhMwAJD0mcrU3gjK+6QnBxMoAPcdBhPsgFY+b1eGNgiH+7oxClgd96L3DAH3gvcQA/eC5RX3EPdI90L3DPtC90j7EPtI+0L7DPdCBg6UCvX4UgHY+FID9zb1Ffce9x73Hvse4OD7Hvce9x73Hjbg+x77Hvse9x42Nvce+x77HvseBQ7L90Ct9wyt90AB92T3TAP3wPg8Fb+zr729Y69XV2NnWVmzZ78fL/umFVmzZ7+/s6+9vWOvV1djZ1ke+yT3DBW1HQ73dsIK9/gVfwoO9yr3DPcM9wwBy/hsA8v4GhW1Hfv8BLUdDqP4/AH3BvcgA/cG96YV+Bz7jgX3Lgf7kPcsBY8H95D3LAX3Lgf8HPuOBQ6j+PwB9+73IAP4evgaFfwc944F+y4H95D7LAWHB/uQ+ywF+y4H+Bz3jgUOi/cMEsv3QvtC+GwToMsWtR0TwPdABPhs+x4F9yAH+zKv+yCpBY8H9yCp9zKvBfcgB/xs+x4FDov3DBLL+Gz7QvdCE8DLFrUdE6D4bPfMFfxs9x4F+yAH9zJn9yBtBYcH+yBt+zJnBfsgB/hs9x4FDov3DPc+9wwB94L3EAP3gvc+FfcQ9wz3QvcM+0L3NPsQ+zT7QvsM90IG+0L7thW1HQ73ovgk+y73LhLX+FQToNf3ohX3IAax9wIFE2C39xwFjwa3+xyx+wIF9yAG+zD4JAX7HAYO9yr3DPcM9wwBy/hsA9mpFfUG0fcMBfeu9wz7bAbN9wwF9yr3DDcG0fcMBSEGRfsMBfuu+wz3bAZJ+wwF+yr7DN8GDvd+9wxb9wwStfiYE2D3JPd2Fb2dpamlGxOglh0TYNEKDvcG9wxb9wy79wxb9wwStfiYE5j3JPfuFb2dpamlGxOolh0TWNEK8fu0Fb2dpamlGxOolh0TaNEKDvei9wwB+DD3EAPL96IV9/D7SPcQ98D8bAYOf/ce94T3GgHv9zXk9zYD9/L3RBX7BLM/9xCwqJOTnR539xIFiYKFiYQbb3uVrZmL85HZH9n3GvyYBj+FBfsU6wclg/sYefsYHvdAgQWT9xSS9xz3BBroBkGHLXUaDvcC9zL7FvcQ8/cy+wD3EBJ69xD4FvcQE1z3FvceFcW1pr6qH48GE5w1wb130hvt2tz3K/cGP98wSVtzRVwfhwYTrMBtYaRPGyVHP/saHxNcL8s33h4TnPdh92wVtqapnqobtadvWWZzamNgcavBch8TbPtILxVteaimpZehqaOkfGCcH2l8dn9zGw5/9x77GPcgygr3GPc2E3DD+1wV90IGg9OJzInSCH+ZoYmdG7exqb+hH48GE7BToLZr0RuwqJGTnR939xIFiYOHi4UbdXuVrdGR9yqR9wIf+0IGE3D7wgdgdnR2aRtpd5vLH/ey+0AHDn/3Hvc69xb3BPceAcD3MfdE9zYD96b3EhVqbKC90rKjs6uqfWSgHzF3YXRmGzb4ABWoqqmasRvXoUcwH4iLh4gar2xfoF8b+w4vK/sf+w7mPvcD9z/3Dvcs93r3QT/3Ffs5Qk9vW1EfDvsy9xT5SvcUEvdm9y77CvcuE9D3KHEVe/sQBYiXo4akG/dBrfcB9yUfE+D3QGf3CvcwGuWXq72Zl4qIlR6bfAqOf3OQchv7QWn7AfslHxPQ+0Cv+wr7MBovf21ZfX+MjoEeDkH3OPs4+hISofjeE2D3aPhaFftSP6c916kFE6D3KvwoBfcIBvds+hIF+wQG+yr9FIVthW2HbRmHBoWpg6mDqQgOi/ck+A73FAGR+OADkRb44PMG+1L4tgX7ZAb7Uvy2BfdMsxXB91K991AFjwa/+1DD+1IFDov3HvgM9ygSkfeU+4T3RPcg95T7VPdEE9SRFhPk95T3EAYT1FnLfc3jGvGv0c3Nr0UlHhPYM31JWUse+xD3lPceJY8HE9Sxs7vb7Rr3SPsC9w77PPs8+wL7DvtIKbs7sWMehwcT5CUGDvsM9yT4ZvckAcL4jgPCdxUn+I73JPu6jwf3MPd4+yr3egWP9573JPxuJwf3TPuqBQ74ePcqAZn3QPd490ADmfsMFfdA+PD3ePzw90D5hvzQBg5/9yL4ZvcQAfc19zzT9xwD9934fRXcn6WhnZd4a0t0W1pcHvc6+2gVd3Nrc2UbY2uiwx+hB/cs9sPc9xEa9wBIzyL7CjU7+0Ee+14HbHhpd2Z1yiMYm5WblJqUCC6m31zoG9bHs7W8Hw5/n/fInffGnwGl9xb3tvcUA/c4zxWHkYeRkxr3dAeNjY2NHvgyBo2Lj40a9077D/cq+yv7K/sP+yr7TvtO9w/7Kvcr5dm/28EeZQZHXUlfRRtVWaGxaR+H954ViYmNjx/3cAeSj5SPkR6vrb2hwRu9vXdprR+RhY+Dgxr7dAeHiYmHHg73TPccAZf4wAOX944V96z7oNvn+xb3AgX32vcc+9oG9xb3Ajvn+6z7oAUOcfjAAfd89xwD9774phX7oPus5zv3AvcWBfva9xz32gf3AvsW59v7oPesBQ73TPccAav4wAP44PeSFfus96A7L/cW+wIF+9r7HPfaBvsW+wLbL/es96AFDnH4wAH3fPccA/fCcRX3oPesL9v7AvsWBffa+xz72gf7AvcWLzv3oPusBQ73GveUAfdC95AD90L3GhX3kPeU+5AGDuP38AH3EvfwA/fA4xX3QvdC+0L3QvtC+0IFDr3fwvcmwt8B5eO/9yC/4wP3wPdRFbOpq7S0batjY21rYmKpa7Mf+x8E9wzl5PcP9w8x5PsM+wwxMvsP+w/lMvcMH98ERVfB1dW/wdHRv1VBQVdVRR8O6cH3UN8B9x/B90zfA/dV9ygV91D3TPtQB/uCVRX3mgbH0QX3lPuQB0VPBQ6Z+KwBnfjIA52Z3x2Z9wIBnfjIA/dj9xAV6PdQ6ftQBfwM+wLfHYv4yAG/+KwDvxbnHYv4yAG/9wID9zb3UBX3Twf3UC4F+777rhXnHZn4rAGd+MgD976ZFY8G96z4qgWN/MiJBw74TPcCAZ34yAP4HvhMFS37UC73UAX7UfcAFfes/KoFjwb3rPiqBY38yAcOi/jIAZf4rAOX96wV+Kr7rAWN+MiJBvyq+6wFDov4yAH4SvcCA/eO964V91DoBftPB/cC+AwViQb8qvusBYcH+Kr7rAWNBg73GB2swRX4pPiM/KQH/MxLFfjkBtHbBfjy/NoHO0UFDvcYHfitwRX8jPik+CEGUSRZ+wpm+xEIhwZw03DRX9P7AEUYyi6zQLAl9zKdGLb3M8X3FMryCMv3whVlYmRbZ1QI/EsGO0UF/Pz45AfR2wX42AekqaOlpKMIDnf5WgF3+R4D976JFd33vPcQ91D3EvcKI+UY+xT7GPsE+2hD+4QIhwZq3GbdV9z7AEUY1CW3N7b7BggObfd4Afeo5/PrA7fHFUvHccP3FtnV9x4e9+sHzXWxUFEaZ4dxgW0ewXUFp6+nx8Ua3WnFK8seWa2Bk3+hCDH8kAaRg3ORcRssPE0/Hw6B9yT4HPckAdH4YAP3fIEV9xwG9zb36Ps29+gF+xwG+zb76AX3ePtYFVn3CGXbsdu99wgFjwa9+wixO2U7WfsIBQ732Pf8Afdv91UD92/32LwdDvfY9/wB5PhZA+T32Lwd94P7/LwdDoMd95+wHfefjQoTYEgdDviSyfcUyQH3zd0D93n4khX3B4e+wdca11jB+weHHk0HzZ1xZWV5cUkfDviSyfcUyQH3Yd0D+Af5jhX7B49YVT8aP75V9wePHskHSXmlsbGdpc0fDogKhwr40vdCAfcS9/AD9xL40iwKDvjS90IB9xL38AP3ePjSLwr4BvgQjh33jPgGFfMGrfgQBftABg6PHYcKiAr7ovgQjh339PcCFSMGafwQBfdABg740vcwAfcK+AAD9wr40icd+Mj3RAHt5AoD9074yBUvHfd4Fi8dDo8d+NLnAfcm6fcM6QP3wPjSPwr4usnjwQr4ulkd+NL3LgH3OPgSA/c4+NJ0HfjG9zYd+MYhHWQKhB2ICvYd9xL3lgP3jPlQfgqHCvYd92z3lgOwCg740vdCAfcS9/AD9xL40iwKDvYd9wz3/AP3jvlQMR0O+NL3MAH3CvgAA/cK+NInHflQ9yYB9wz3/AP4APlQFcG9t/GXHzUGMh0Ojx35YPcAAfcs97wD9yz5YJ8d+NLnAfcm6fcM6QP3wPjSPwr2Hfcy97AD98D5UBVOHfjG9zYd+MYhHflM90AB92D3VAP3wPlMTQr4yPdEAe3kCgP3TvjIFS8d93gWLx0O+UriCvdY+Uo2CvjCzcHfAfe29w4D95r4wqoKDvlEzcHfAfe29w4DoB0O+LrJ48EK+LpZHflMydvBCvlMlR340vcuAfc4+BID9zj40nQd9h33LPgeA/ee+VCIHfjS90IB9xL38AP3ePjSLwr2HfcM9/wD9/L5zDAd+NL3LgHB+BID+AT5bBX7Ggbt+y4F8wb7jPcuFfsaBu37LgXzBg72HcH4HgP4VPlQFU33IB3n+xAF+xz3EBX7JAbn+xAF9wYGDvi09woB93bMA/fg+ZIVQ3FpWlAaUqNsu6ulo7GtcaFsiImLiogekKWinLCXCA75GPcKAffFzAP3nPiwFdOlrbzGGsRzqltrcXNlaaV1qo6Ni4yOHoZxdHpmfwgO+Dz3dAH38vcYA/fC+DwV7I/es+kar3ure50e+whZBZKAlHp3GmFxgGmEHg77nPc2HfucIR37cuIK91j7cjYK+37NAfei9w4D95pjKApkCmQKhB37ePd6Afde9xAD96qNFXJ6WFlKiwqnn6mtpx8O+2j3JAH3MOnv6QP3wPtoFeu5zdn3Bwpth3x1bBtsfKGphx8tnh0O+1j3EQr4UDN6HfjI9xzF2RL3FPc1ChPo91j4yEcKE9D3Dgr5SvccudkS9xT3NR0TUPcs+gAV97zZ+7wGE+i3+5hwHasK93b5fBX3AAb3DPcGvgr7Bvu6cB2xHRNw92z58BX3HAb3DHwK+0YGE/Ap+7ZwHasK93iLHfciHWNvbWVlp22zHw6xHRf3WPlKRwoTcFX3tjAdqwr3tvcECqn7SG8KsR0TcPfG+mwV+0YG9wz7EAX3HAYT8J/7Om8K+NL3GFH3DBL3LPhYtwr0ChNgxh35UPceCvcW+H0ToPg5+ZYV6wYTYPH3EPcHHROg+/v7VjUdDvjS9xhR9wwS9yz4NLcKE2DkHdoK+VD3Hgr3FvhBE2D4f/oS7QoToPxBRTUdDvjS9xir0QH4YvcCA/cs+NIV8wa1yQWPBkcdoQr5UPcKRb/BzxL4YvcAE7D4UvmAFWAKE3B7f4Z7iB4TsPvEJzUdDvjS9x0d9yT3zD/TE+D3JPjSZx0T0Dsd+VD3Cq/3DhL3FvfoNdMT4PcW+VA1HYG0HRsT0IMK+NLdtZ/pCveO+U4V3wbl9wwF+wwGh/uINwoO9yIK95H5vhXfBvF8CvsSBn77fmsdDvjS3bWf6Qr3vPnGFfsMBuX7DAXfBln7EDcKDvciCvez+joV+xIG8fsQBd8GXPsCax0O+NLduprq0QH3qvcCA/fA+NI3CmX3FWodoQr5UNWtm+XPAfes9wAD95z5vBVgCnt/hnuIHrv7NGsdDvjS2dP3DhL3KNND98RD0xPQ98D40vMdc4V6dWAb9wQdE+j7LPcqFdMGvQo7HflQ1dv3DgH3MsP3OtUD98D5UGsd+zT3LhXmCkEG7goO+NL3EwoB9yT3zAP3JPjSYB3ZrxXktsHPjR89BnOGfHdnG2d8n6OGHz0GR422VeQbDvlQ9wqv1QH3FvfoA/cW+VA1HdWvFeW3t9mTHz8GbYN7eWEbYXudqYMfPwY9k7df5RsO+Lj3dgH3kPMD99v4uBWyCpH7dgUO+TbNAfdk9w4D9+b4tn4dDg4ODkwdATv5jAPwHawdQAoBO/mMAzv3IBX5jPfU/YwGDvwkHAV4ZgocBXj7NAYO/CQcBXiEChwFePc3Ckwd9xkd93AV9xr3NPsaBvdc+zQV9xr3NPsaBvdc+zQV9xr3NPsaBg5ACvcZHfcgFfca99T7Ggb3XPvUFfca99T7Ggb3XPvUFfca99T7GgYO+yX3cvcD93L3A/dy9xIK+yUV9zT3cvs0BvcDBPc093L7NAb3AwT3NPdy9wgd+yX3cvcD93L3A/dykR37JRX3Kgr3AwT3Kgr3AwT3KgoOTB3wCvdw9xMd9yr7NPcTHfcq+zT3Ex33Kvs09xMdDkAK8Ar3IOgd9yr71Ogd9yr71Ogd9yr71OgdDvs991DJ91DJ91DJ91D3Egr7PRX0HckE9B3JBPQdyQT0HQ77PfdQyfdQyfdQyfdQkR37PRXzCskE8wrJBPMKyQTzCg73cPc0Zgr5APcwHfcACvcg99RmCviw98D31PcACvdw9zSECvceHfywBg73IPfUhAq2HfywBg5dHfAd98DmHfmg9wAKgAr3wPcUCvnw9wAKagr3Hx35oPywBg6BHbYK+fD8sAYO9xcd93AV+GD3NOgKBg7tHfdw9yAV+GD31McdBg5zHfcg93AV+LD3NNUdBg7CHfcg9yAV+LD31NUKBg5dHfAd+GD5oMUdgAr4YPnwxQpqCviw+aDjCoEd+LD58OMd93D3NGYK+QD3MB3oCgYO9yD31GYK+LD3wPfUxx0GDo8KE8D3IPdwFROg2+Yd+QD3MB0GE8DVHQYOjwoTwPcg/CQV99T3Hh0GE6DoCv0ABhPAOwYO93D3NIQK9x4d1R0GDkAKWwoTwPcg9yAVE6Db9xQK+LD3wPfUBhPA1QoGDkAKWwoTwPcg/CQV99S2HQYToMcd/LAGE8A7Bg73IPfUhAq2HdUKBg5dHfAd98DmHRwFeMUdgAr3wPcUChwFeMUKhgr3wOYd+QAGE8Db+aDjCoYKE8D3Hx35oAYToDv3KR1qCvcfHRwFeOMKQApbChOgO/cgFffA9xQK+LAGE8Db+fDjHUAKWwoToDv3IBUTwLYK+fAGE6A79ykKgR22ChwFeOMdXR3wHffA5h35APfAvApdHTv3IBX3wPcUCvkA9zAd+8Db9wAKXR3wHffA5h34sPfA99T8YDuqHYAK98D3FAr4sPfA99T9jAYOagr3Hx35APdwvApzHTv3IBW2CvceHftw2/ywBg5qCvcfHbYd/LA76x2BHbYKth39jAYOXR3wHfmM8QpdHTv3IBX4YNv3MB37wPkAxQpdHfAd98A7+GD31PvA+LDFHYAK+Yz31PvA9ykKagr5jPIdcx079yAV+LDbTB37cPkA4x1qCvdwO/iw99T7cPiw4wqBHfmM99T7cPiw4x1dHfAd98DmHfkA98DxCm0dEkwdE6D3JQoTYPkA9zAd6AoHE6D8sPvABw5tHRJMHRNg8B33wOYdBhOg+LD3wPfUxx0HE2D9APvABw6ACvfA9xQK+LD3wPfU+8D3KQqGCvfA5h35APcwHQYTwPtw+QDjCoYKE8D3Hx33Hh0GE6D7wPcpHWoK9x8d+QD3cPIdjB0TkPclChNQ+LDb20wdBxNg1R0GE6D8sPtwBw6MHRNQ8B33cDvb9xQKBhOQ+LD3wPfUBxOg1QoGE2D9APtwBw6MHc4dBxNQ+3DbO/cvHQYTkPyw+8AHDowdE1DwHRNg9x8dBhOgth0HE5DHHQYTUPywOzv7cAcOQApbChOgO/cgFffA9xQK+LD3wPfUBhPA+3D4sOMdQApbChOgO/cgFRPAtgq2HQYToPvA9ykK9woKzh3VHQcToPyw+3AHDvcKChNg8B33Hx0GE6C2HdUKBxNg/QD7cAcOgR22CrYd+3D4sOMdTB33Ngr3cBX3Kvc0+yoG98D7NBX3Kvc0+yoGDkAK9zYK9yAV9yr31PsqBvfA+9QV9yr31PsqBg5A9473jveO9xIKQBX3NPeO+zQG944E9zT3jvcIHUD3jveO946RHUAV99T3jvvUBveOBPfU9473NwqlHQE7+YwDO/gQFfmM5Qr8dASsHfwkHAV4yB0c+ojnCp4K9wAK93BSCsf8JBX3NPkA9zTmHfkA9yD3NPxgBvcIHewK/CQV9zT5oPhg9zT9AAb31P5AFc0ddQr3wPxg9zT6QPcACvdwUgr4EPwkFfc0+aD9APs09yDmHfkA9zQGDmEKO/gQFfhg/aD3NPpA/QAG/HQE9yQdDsf3NPc09zT3EgrHFfhg9zT7wPc09zAd+8D4YPcIHfdwUgrH93AV+QD3NPsg9xUK/QD7NPkA9wgd7ArHFfkA9zT8YPmg+zQG99T9AKgdDnUK+GD6QPs0/GCqHfdwUgrwHfkA+aCnHWEKO8cV+QD6QPs0/aD8YAb3NASxCg6eCvvA+GD3CB33cFIK+BD8JBX3NPkA9yD3NPsg9xUKBvvUHPqI5wrH9zT3NPc0yB39AKgdHPqIBM0ddQr3wPxg9zQcBXj7NPxgqh33cFIK8B33IOYdHAV4+zT9APsgBvhg/aDnCmEK+BD8JBX3NBwFePs0Bvxg/kAV9yQd9zQEsQoOx/c09zShHccV98D8YPc0+GD3wOUK9zQErB33cFIK8B33IOYd+QD3NOYd+QD3ILwKYQo7xxX3Cx39ABX3NPhg9yD3NPvABvxg9zQVrB3H9zT3NKEd+BAV+Yz3NPvA+GD7NPxg+8AG/HQErB33cFIK8B35jPc0+yD5AKcdYQo7+BAVsQr4YPs0qB38YP5AFawddQr3wPxg9zT4YPcwHfvA9zT3MB37wPhg+zT8YKod93BSCvAd9yDmHfkA9zTmHfkA9yD3NPsg+QCnHWEKO/gQFbEK/HQE9wsd9zSoHRz6iATNHfdw9zRmCvgkBvcO7e33Dh7b9zQ7Bvtm+z77PvtmHw5dHfgQFvdm+z73PvtmHjv7NNsG9w7tKfsOH/wk9zQHDl0d+BD6fBX7NPwkBvsOKSn7Dh47+zTbBvdm9z73PvdmHw73Fx347BX7Zvc++z73Zh7b9zQ7BvsOKe33Dh/4JPs0Bw77rBwEiAE7+YwDO/sMFfs09zQH+Oz6fAX3NPs0Bw7dCvjs/nwF9yEdBg7dCveQ/Dj7kPw4Bfs09zQH93D4Avdw/AIF9yEdBvuQ+Dj3kPg4Bfc0+zQH+3D8AwUOTB0BO/hgAzv3HB33cPmg9xIK93AV9zT5oPcIHUwdAfdw+GAD93D3HB38JPmgZgr5oPcIHUAKATv4YAM79xwK93D5oJEd93AV99T5oPc3CkAKAfdw+GAD93D3HAr8JPmghAr5oPc3CkwdATv5jAPwHffAO/hg99T8YDuqHfcOHfwkFffU+aA79xUK/QA7Bg5MHQE7+YwDO/cgFfhg2/cwHfvA2/cACvcOHfdwFdvmHfkA2/mg9zcK98D4iAGL+OwD98AE+Oz4iPcBHftc9xGGHfcR9wEd+1z3joYd9473AR37XPgLhh34C/cBHftc+IiGHfiI9wEd+1z5BYYd+QX3AR37XPmChh35gvcBHftc+f+GHfn/9wEd+1z6fIYd+nz3AR2bCvih9wYK+KH6fPyhBg6bCvhW9wYK+Fb6fPxWBg6bCvgL9wYK+Av6fPwLBg6bCvfA9wYK98D6fKodmwr3dfcGCvd1+nz7dQYOmwr3KvcGCvcq+nz7KgYOmwrW9wYK1vp8QAYO+1z6fPcMCvp8qh2rHffAWe4d+Oz8iNAdzwoOqx33KlkVqQb7SPfABVkH98D7ju4d+Fb8iBWpBvx0+bQFWQf47P2C0B33AQrPCvfA9xoKDqsd1lkVqQYi90MFWQf3KvsRFakG+0j3wAVZB/d1+44VqQb7k/g9BVkH98D8C+4d+Av8iBWpBvwp+TcFWQf4Vv0FFakG/HT5tAVZB/ih/YIVqQb8v/oxBVkH+Oz9/9Ad/f8VvQf8g/nNBW0G+KH3AQr9BRW9B/vt+NMFbQb4C88K98D8CxW9B/tX99kFbQb3dfcaCvcq+xEVvQde1gVtBg75N/cRAYv47AP5NwT47PcR9wEdrR34odYD+KH7XBXW+nxABg77XPiIAYv3wPcGCvfA+IiqHftc+Ij3DAr4iKod98D4iAGL98AD98AE98D4iKodmwr3wPcGCvjs+Ij7wPiIqh33CAr5tAT8iPfA+IgHE6D8iAT8iPfA+IgHDpsK98D3Bgr3wPiI98D4iPcBHa0d98D3wAP3wAT3wPyI98D6fPcBHffA+IgB98D3wAP3wPfAFffA+IiqHfcICvtcBPfA+Ij7wAYToPfAFvfA+IiqHa0d98D3wPcGCvjs+nz7wPyIqh1/l/iIl8+XtZePl62XBvtQlwd/l/h6l9eXv5eRl7eXCPttlwkeoGJfDAmLDAv3Ggr3QAv3GgwM90AMDfjsFMsTAQ8CAAEAPQBxALkA2gEdAW8BswIzAlMCgQKTAuwC/wNVA4sDogPbA/gECQQvBG4EjwSbBLQEwAUFBUkFcgWZBaQFwgXFBcoF4wYZBisGTAayBsIGywbXByEHOAc+B8oH3QfkCEkIdAh5CH4IgwivCLQIugjECNEI4QkGCQoJFQkeCSoJRgldCWUJhwmMCaQJtAm9ChIKMAo2CjsKZgptCnQKeAp/CpkKoQqwCtYK4wr2CvsLAgsICxsLIAs4CzwLeguFC5cLngurC+kMBwwPDCIMKQw2DEQMVwyFDJEMlgygDM0M0gzeDO8NFw0uDT4NQw1ZDV4Ngw2HDZYNmg2fDacNvQ3EDckN0A3gDfIN/Q4FDgoOFw4kDigOLA46Dj4ORA5hDmoObw56DoQOjg6WDpsOog6nDsIO3A72Dw4PEQ8XDxwPKA8/D0oPVQ9gD2sPcQ94D4EPig+OD5MPlw+sD7EPxQ/SD9gP5Q/vD/kQABAHEA4QExAZEBwQIxAoEDwQUBBiEGwQcxB4EIQQihCQEJYQqRCyELgQvxDDENUQ2RDkEPUQ+hEKERERGxEjESoRMRE3ETsRShFZEWgRdxF8EYERhhGUEZkRnxGtEbsRyRHVEd4R4hHnEewR8hH3EfwSCRIWEiMSMBI9EkoSVBJbEmISaRJuEnkShRKKEpYSoRKtErkSxRLJEtES1RLbEuES5hLrEvYTARMHExITFhMhEywTMNcd9zL3APcS92r3afsA9w37Mvsy+wD7DPtq+2r3APsS9zIf9ygEU2nV9wr3Cq3Pw8OtR/sK+wppQVMfCxWVuJnJnNmZzRmPBptKnDyZTZVeGMr7oxX3Sgb7WPkeBftkBvtY/R4F90QGq/ceBfdGBg69944V+zr3Div3MsnZn7HHHlPxBXdfZ4FjG05Uncl/H/fRBo2XkKmpGvcaO/cA+zL7GvsUKfs4HvdCxxW/l7CfthvFn2tjHwtncXeDbhtef6PDH/ey+0D7yAf7ELk79wTRvam7tR6PBguFoqWHqhv3F8bI9xvAH/dQ+IAF+zYGT/tUfFl7WH9YGYcGfcF9vXq7RfdUGPs+Bvdm/HaDdQVtfnB3VhuAf42Pfh8Lt9wVTNTpbeAb9zzn7fcC5VnDNKsfQKoFSqNmlaoaqKWau7+we2y6HuH3AAXGTDmnPhv7KCcw+wMtyVDWbx/caQXIdayBbBpudnpQWFGlsFoeC7P31BX7cvce+wL3O97as7O4HvfK+377INwxB4OBeYd7Gy5ez/cO9wrF0dK6pXtxph/p9QW3YEyzMxv7Pfsd+w77cB8LdAr3IPcqOfc3E/YgKR0T9MA2BlN1k6GZj5GXlB+Go6CJnRv3C+e79wqfhJ+Elx/l9xD7XgYT7UCTcm2PbRv7CCJR+xBRqV2xcx+HBxP0wGhzcmdpGmGhcad5HocHE/YgWXNxbGIaE+1A94P36hVqcKG7uaahrKyndV1bb3VqHwsVa08FqYOVgXsadWmDXYcel0kF8Y/jq9Mav2ulKZMeDvdqFvdA92sG92L4R/cuClX7InlZeF15VxmHBnm/ebl6vVX3Ihj7TAb3YvxHBQuzp6mxsW+pY2NvbWVlp22zHwsD1Rb3Vgab9xqT1I60jq0ZjwaQVJBckV2b+xoY91oGzfiIBfswBnj7ZoVZi1mFVxmHBoS/hL2CvXX3Fhj7CAZ3+xaBW4VXhlcZiAaFv4q9hb1492YY+zwGCxX3EAa76dcKLQX3EAYl90K+CgsD3hb3Qgam90aStZC5jrIZjgaMZJJdkmGo+0YY90YG1vkeBfs4BoP71gVVi1NRGocGgsV9xILAavcyGCcGZ/sygVR9UoNTGYcGw4vDwxqD99YF+0QGCxVov7uJsxvVy7fFr3ulWpkftJmXn68awFOwSFFaenRrHrpDBZWfoJehG5+Xg391dohsH00HCxX3JAbx90IF+xAGWy0FhwZb6QX7EAYO9zb3aBX7Gscx9zjPwZmXtx5tfAqCcG2EaRtLaqHSH/cr91r3Gvta9xb7Igd1+xb7FIUF+xT3DAcLFfc091pRwftQ+zwF+H74lhX7NPtaxVX3UPc8BQuPBrtR6h0rfAr7PAYr+xAFC/cc+/gG+xbPM/cZzK+Vm8EeZvcSBYFudYd2G2hjm8Uf+IT7yAcLA7731BX7cvcm+wL3PtvUq8vCHi3zBW1vaXVhGzNNz/cO9wrJ0du3qXtxqR/p9QW3XUezNxv7RPsi+xD7bh8L99wHo6Whmasbt5lzUx/7sq0K9xBb2/sDQlVpZWMehwYLFV0KVwr3ZIcdVwoOFeu5zdmNH0EGZ4V2cWAbYHalr4UfQZ4dC31ZBYcGt2VfnVsbCxV/epGnhB+TlZeQlxucl4R7e4GDeh/3GvdgFaZsZJxeG/sGVTY7J8FC8NXCvsvKYqlRbHOCe3kfro+aqbobop2DfZwfDhWblZOcl5yFb5Ieg4F/hn8ben+Smx8g+0gVcKqyergb9wbB4NvvVdQmQVRYS0y0bcWqo5SbnR9oh3xtXBt0eZOZeh8O9zT47hWSgJR6dxpkdX9thB6fZ2GVXRv7MvsA+wz7avtq9wD7EvcyHwsVU2nV9wr3Cq3Pw8OtR/sK+wppQVMfE/Q7ChP4gB0T9M2cu7PTTR2XXQX3IPiI+xoGC2wdE/Q9HRP49xj3Euv3OtlvyWC4HxP0ypy5s9FNHTQdDvcg99QLs/cCFXWTgZKZGpaVkpaYlYJ9g4eBg4UeCxXFBs+veVNTZ21HH1EG+xwEyQb3BPtuBfdUBvsh95AFyq21yOga9zb7DLv7IB77hv0e90AGC1Md3/cct/cGygojvR37AEYKCz8Gq6qttbYaz1W1OVNgcWNjHtFLBaCbnZaaG6SYfXYfC5eWdh+a/B8xChOBIPtU/FYVl5OYlZEepYSbf3waf3+BeXp+lJseE0DAQQoTgSD7KPsMFVjEYtzdw7a8vHGeaJ0ejwcTQMCrmaCbrBrEUq9CRFBnUmKhf6l3HocHE4EgbntseWEaDvdAE3yAXh0TvID71gcjCgsVKgr3ZBYqCgsV+0gGPfsQBfccBgsB9yP3BvcC8AP3I/g9FfsC2kzysr+YpbIeZNAFfnB0hXMbZGqWs38f92EGjZOOnZ8a41nUIjU3SCAe9waxFa6So5enG7KXdXIfC9GTw5/RGrlnq/sOjx57RQW+h5iBexoLdvgIUQoLf/cK+Dr3ChLF9yj7Evcq9yb3IPsY9zQT5Pdi90oVq5yrpaEe3mu/eV0aW2d5XVdfpb0eE9j3GvdYFUijYKG1GrernbG7p3Ffb39xc3EeE+T7rvtsFSPnRfco9zLj1/HfWL1JrB6PBxPYu6i0ucUa9wA2z/sT+xcuR/sESbFdwGUehwcT5EtrWl9BGg4Vw7Ovvb1jr1NTY2dZWbNnwx8O9yj4DvcoC1wKErX3Qvco90ATzkQdE9b4avsaBxPOfVkFhwa1Z1+fWRv7BCcn+yz7IN8j9xC1vpunqh+HWQVohWtuSRtlVZWjXR/3PPdCFV1psNIfE+bWta6xpaGFeZ8e+zAHE85td3WDcRsOyxb3QPfcBqOloZmrG7eZc1Mf+7KtCvcQW9v7AkFVaWtqHpTjBfc2+0AHC/cgegoL9zRTCgsBpR0DC8UW91UG90T3F+33evd6+xfn+04f+0sG90D8lBX4Co0H3s5r+yz7LEhlOB8L9zRBHQv7AiWmCgtda2lfX6tpuR8LFZKAlHp3GlVdhWkeC3OFfXttG219m6OFHy91HQsVpMGpyAWOBoUhBYIH9zQWV/dL+zIG+wH7WwVQ9zNT9wDDvwcOEm0dC/cGHdH3HvduUQoLuautt7drrV0LFfcQBjP3QgX7QgYO0Rb4b/ca+4MG93z3pgXn/Ev7GvdeB/t7+6YFC9KPwKPJGrdpr/sOjx57RwW+h5iBexoLx/c09zRSCgsV9wBj10fZHi9VBb9LqUNDGkNtQ1dLHudVBc/Zs9f3ABoO+5z3Xgv7dM33CrcB96L3DgP3aj8VOh2dtwUpBg77YvXX9xa/8fcI9xAl9wYL9xIK/CQV9zQLi/ce9zDYPtv3Hvce2x33LPdEE7zLFvdWBvdC9xjt93r3evsY5/tMH/tMBhPc+6gHR4UFQc8H90D7MBUTvPcw6dst9x6NB93Pa/ssHxPc+yxHZTkeDvcVBhPAkPSZytTeCMr7pCcHE6D3HQZWPm9XhjYIDmAdibQdC3Md8B0L1fgCFfdS+9oGR3dxTnFuj51hHlr7DgV3t7x9zBv3Ub/3BPcOH/ha+/4HC3/3KPiWdwt2Cvcm90ALVB3JCxUqCvtkmQqXXQX3IPlM+0D7NgaRQwWpbGqfVBsiI6YKC5wK99cynAoOuJ6BeH17g3lyapeWdh8LFdXFwNraUbpBQVFcPDzFVtUf0QR5eZm7u52TnZ2dhFpbeX15HwsSt/cf+w33Nfst9xoLx/c09zShHfgQFffA+zT7wPs0CxK190QLygr3GPdAC5dJBfcgC/dqFvdA+I73T/ck/Lb7JPdPBgt/d6t3C7trBZScl4+dG52bg3d5e4N4cmuXlnYfC/cQBQv3kOn3MuoB9xX3Du33DgP3Ffg9FfsB3Uvk5N3L9wH3AjnLMjI5S/sCHvcOFryXqbCxlm1aW4BsZWZ/qrseDhX3HAY99xD3LgoOQ79R2dm/xdPSV8Y9PVdQRB4L7R079yAVC9+wyKnEG6+ghoKpHwsV+2T3GvsS9yz3LPca9xL3ZPdk+xr3Dvss+yz7GvsO+2Qe0xb3NOHx9xT3FOEl+zT7NDUh+xT7FDX19zQeC6WpZ8Ebt7Wt45UfQwZxhX+Be3Ftr1UbX2FpM4EfDpEd/CQV99QLFWOpbbOzqamzs22rY2Nta2MeDo8KE6DwHQv40vdCAfdo95oDlwoO+NL3QgH3EveaA/ecmR3lvsm45RL3lPdA+wD3DBPw9zYL+Gr7GgcTz31ZBYcGtWdfn1kb+wQnJ/ss+yDfI/cQtb6bp6ofh1kFaIVrbkkbC5AKZeEFhYJ+g/UdC39aHckLFfcTw8fh9wQaCwH39fdAA77qFTrI43HTG/dPzfcA9xYf+Dz8N/sk94v7ngc5bHVTY2KjtWYeC/dw4QoLGk3BZ8+xu5uhpx4L5brSs+UB9zD3BMv3AAP3xQv3LQr3DgbFy/cC+04F904G+1n3uPdN92QF+04G+yz7RgWH+Ar7QAYL+2QG+1j9HgX3RAar9x4F90YGq/seBQv3ovcMAcv4bAPL96IVtR0O96KdHQsV08v7FPdC9xT3QkPL+0b7LAX7QAcL+G6QHQtnG0VFSvsBH/cOjRXEop6jmpyHgJge+woHeX9+h3kbbXigxR8OFioKDvs23Sf3E7i8o62uHo8GC60diwuNCkgdC3b4Avcmf3cLx/c09zT3NGYK+GD3MB37wPc09zAdC/em99g0HQv5zEgKC3uBhnuIHg73ICB2+Aj3IIt392B3dgoLFfMGsfeGkfcyBftUBpH7MgULi/c09yX3Sfc4dwu190T3OPdECyn7OB8L1vcHzwH30PcAA/ecC/cv6wH3EfcO5/cLAwt4CgYLFSYdC/jI9xy39wYB9xS9HQMLoM0KC/dA98gHC2nXBYWAgIWAG3V4lqKnm63Fmx/4iPv++xr3UgcLFfe89wD7vAYL+G6gCgv3wPcVCvxg+yAGC6f3LI3VBfsABgtp1wWFg32FfxsL8xb3QPeMBgtjCt52C/dw/LD31AsToL8KCwX3HAf7PIGV90YF+xwGlftG+zyVBfscB/c8C/sUzfwC90D4At/3GjeXB7qfmqubnYeFmx4Lya+jwaqkf3GkHufnBcNZUKc6G/scJzn7GAv3CwebmpiRnRupm3ZWTXR4cXx8jpZ+Hw7lCg6lkZeVmwsF+yQGC/cs+NIV8wamHUsdC/dU9xIB9wz3/AP3DPdUFff89xL7/AYOyQH3SN3X3QP3wAv3mAH3PveYA/c+C/igAfdi9woD92IL9wEB96T3EAP3pAv7NPywqh1/xwX7IAYLRR2x9xD3CR0LdR3lt7nZkx8LEnEdCxLD90AL92SZCvdU9xIBn/jEA5/3VBX4xPcS/MQGDnb5HncL9xgSvfcsnfc0nfcsE/TXHfcp8Av8iBW9B/ui+FYFbQYLoEIdvdULVWvTNxtJTV/7AF0fC9RC9wES9yj3EAsBxfdA9zb3PAML9xr3iPcaC/tw+LD71Av3Evek9xILBY8Guwv7uhUqCgsE3grr+wwF6QYOEsX3QAv3NdTAoavFHlvfBXVla31QGyUkC/usHASIATv5jAPb+gQV+zT7NAYLy7mzx8ddtUtLXWFPT7ljyx8OYwq99x73jPceCxKCHYn3GAv3NFsKC/cwAfcK9zC/9zADC/vU/QDrHfdEv/dEC/c0/YwGC9UGo5Cal5ulrme4G7e3reOVHwsV9zQcBXj3CB37wPcVCgsB9zD3tAML63wKC9sG9xz3END3M/c4+wy/+yAfC2EKxwsV+xYG8fsQBesGC3GFfYF7cWevXxtfX2kzgR8LoHb4AgsBnfcFsPcFsPcFsPcFA50L9zT7wPcpHffUFfcQ984rBgv31PdQ+9QGC/dKURXpBgv3HvhI9xoL9yT4jncL/GAGDv2CFb0H/Dj5UAVtBvhWC/jg+LAVNd/7NPtaxVUFC/caEvdQ92hT90D7LPdAC/nuFfskBvcM+wYF9wAGC/cYRdELA/tcBAuNHy0GC/tc+nwSi/fAi/fAE8AL4AoT+AttHRJACgv3RbIVt6umtLNrqF9fCwH3wPfAA/fA+1wV98AL92UB9z/3B/c59wcD7gv7jPdWFfe02fu0Bg4S9173cG/3MAuYHb0L9wDpCgtBHfdwC/cGr/cOC/yw9zQL+QD7NAuTdWWVXRv7KFksIB8L9y/rAfcn9wvn9w4DC/uO+nwB93T3LAP3dAt/9wwFjwa5+xoFywYL+44VvQf7DPdcBW0GC7GgsRmPBolgh0tgGgv3IBX4YPfU9wAK+37N91F2C/cKW/cQEgv3HvgK9x4L90QT9AsS9y8K+1X3OhNgC/lQ1a+ZAfcy97ADC8n3Mx0LU73dafcAG/cd9w8LO/cgFffA9xQKBgsGnfcyBSsGd/syBQt3EqX3Nr33Fr33NgvVWwWjtZ2RsRvDtwv4sMUK99T3cvvUBgu3HdULdviO9yQLA8sW90ALBftIBgv3UvdwC/ss5fe27/e25RIL9yAB9973NAP3VwtFHbH3CgsbZ22fw30f92wGC6DSHQv3HPsA97T7APccCwHW9yr3KvcqA9YL+9QGDgAAAAJYABgAAAAAAEwAMwA6AFYAYgAoADoAQgAzADkAYAA6ADwAIgA/AB8AOgAsABsAOgAEAAIABAAIADUANgBAAD4AKgAyAEoALABAAEoAJQBAADYAGgBAACoAQAAqAGgALgAqADgAGAACABsAGABGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AACADMAMwAzADMAMwA6ADoAOv/8AFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgAoACgAKAAoACgAKAAoADoAOgA6AAAAQgBCAEIAQgBCAEIAQgBCAEIAQgBCAEIAMwA5AGAAYABgAGAAYAAxAGAAGQA6ADwAPAA8ADwAPAA8ADwAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAYAA4AIgAiACIAIgAiACIAIgA6ADoAOgA6ADoAOgAsACwALAAsACwALAAsADsAGwAbABsAGwAbADoAOgA6ADoAOgA6ADoAOgA6ADoAOgA6ADoAOgA6ADoAOgA6ADoAOgA6ADoAOgACAAIAAgACAAgACAAIAAgACAAIAAgACAA1ADUANQA1//wAPgA4ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYAEAAAAD4APgA+AD4APgAPACoAKgAqADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAsACwALAAsACwALAAs/+MAQABAAAAASgBKAEoASgBKAEoASgBKAEoASgBKAEoASgAlAEAAQAA2ADYAAAA2ADYANgA2ADYAGgBAAEAAQABAAEAAQABA/8cAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAAwAKgAqACoAKgAqACoAKgBoAF4AaABeAF4APAAuAC4ALgAuAC4ALgAuADIAKgAqACoAKgAqACoAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAIAAgACAAIAGAAYABgAGAAYABgAGAAYAEYARgBGAEYAKgBAACUAQAAqAEAAMAAyADIAKgA2ABoAMAAwABgAAgAWAAr/9v/6ACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAEAAyAEsALAAkACEAKgA2ADsAOgAwADIASwAsACQAIQAqADYAOwA6ADAAqgCxAKoAqv/zAL4AvgBeAGAAzABAAK4AwgAiADYAwgA2AKYAuAAaACwAQABAAFAAFABQABQAqgCCADwAqgCAAL8AawBkAGsAQADgAEAA4AA4AEoASgBAACYADgAOAGH/8P/uABgAGABAAEwAeAB4ADgAlAC/AJgAogCdAKIAnACvAKIAoADOAMIA5gDcAJQAvwCYAKIAnQCiAJwArwCiAKAAzgDCAOYA3ACUAL8AlgCiAJ0AogCcAK8AogCgAM4AwgDmANwAlAC/AJgAogCdAKIAnACvAKIAoADOAMIA5gDcAJUAfQCBAJUAkwCmAH0AjwCxAH8AlQCnAIIAlQCxAG0AlQCBAJMAfQDLAIsAkQCLAGsAVABuAH0AmQCPAI8AkQB9AH0AlQAbADgAPwAXACgAWgAtAEgAPwAUAA0AVAAOADwASABRABwADAAMAAwADQAYAAwADAAMAAwADAAMAAwADAAMAEAAQABNAEAAqgBAAHIAXgBAAEAAQABMAEAAKgAqAEAABP/vADgANQCEABYABgAGADcADgA7ABoADAAeACAAHgCuAH4AWgCLABIAEgA0ADQAEgASAAwADP/h/+H/7AAsAEYA2wBZAK4AwgDlAM0AfgDUAH4AfgDWAJwA1AB+ANYAdgBiAJwAkgC0AKQAvgC+AM4AfgB+ANQA2AB+AHgAdgB4AJwAmACSAJ4AvgDMAGIAdgDUANQAtAC0AKQAmAB+AHgANgA2AOIA8AEiAL4AdgC+AL4AvgDOAMoAnACcAIAAgACAAIAAgAB4AIAAgACYAIIAmACCAJgAggCQAIIAnACeAJwAngCcAJ4AlACMAJAAggD5ANAAAAAAAAAAAP+w/7AA3ACMACEAIQDcAIwAEgASANwAjADcANwAjACM/7D/sP+w/7AA3ADcAIwAjP+w/7D/sP+wANwA3ACMAIwAjACMAIwAjP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+wAEsASwDcAIz/sAA8ANwAPAA8/7D/sP+wANwAPAA8/7D/sP+wANwAPAA8/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+wANz/sP+wANz/sP+w/7D/sADcANwA3P+wAIwA3ACM/7AAjP+wAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAAABYAAQUKAAMADAA2AFgABQAMABIAGAAeACQDDQACAt0DCwACAt8DEQACAuMDGwACAucDDwACAu0ABAAKABAAFgAcAxUAAgLdAxMAAgLfAxkAAgLjAxcAAgLtAAQACgAQABYAHAMJAAIC3QMFAAIC3wMDAAIC5QMHAAIC8wABBJoAEAAmADAAOgBEAE4AWABiAGwAdgCAAJIAnACmALAAugDEAAEABABLAAIC/wABAAQAZwACAv8AAQAEAG4AAgLjAAEABAB+AAIC/wABAAQAqQACAv8AAQAEAM0AAgL/AAEABAD8AAIC/wABAAQBBAACAvMAAQAEARgAAgL/AAIABgAMAR8AAgLjARwAAgL9AAEABAEuAAIC/wABAAQBNQACAvMAAQAEAV0AAgL/AAEABAFsAAIC8wABAAQBggACAv8AAQAEAcgAAgL9AAMAAQPwAAEEEgAAAAEAAAAWAAIEPAAOAkQCRQJGAkcCSAJJAkoCSwJMAk0CUAJRAk4CTwACBBoADgI2AjcCOAI5AjoCOwI8Aj0CPgI/AkICQwJAAkEAAQQOAIMAAwABBA4AAQQYAAAAAQAAABYAAwABBA4AAQQeAAAAAQAAABYAAwACBCAEFgABBAwAAAABAAAAFgACBBQAHQJVAlYCVwJYAlkCWgJbAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4CbwJwAnEAAgN6AA4CGgIbAhwCHQIeAh8CIAIhAiICIwImAicCJAIlAAIDWAAOAigCKQIqAisCLAItAi4CLwIwAjECNAI1AjICMwABA6YACgABA6oAAQAAAQAAAgPeAAMCFwIYAhYAAAEBAAID2AAZAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwJTAnIAAAECAAIDuAAJAcQBxQHGAccByAHJAcoBywJzAAABAwABA7L/owACA7IAXAJWAlcCWAJZAloCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAm8CcAHFAcYBxwHIAckBygHLAnECFwIYAhYCFAJTAnICcwIZAt4C4ALiAuQC5gLoAuoC7ALuAvAC8gL0AvYC/gMAAwQDBgMIAwoDDAMOAxADEgMUAxYDGAMaAxwAAQOwABAAJgAsADIAPgBKAFYAYgBuAHoAhgCSAJ4AqgC0AL4AyAACAlUBrQACAlsBxAAFAkQCNgIaAigB1wAFAkUCNwIbAikB2AAFAkYCOAIcAioB2QAFAkcCOQIdAisB2gAFAkgCOgIeAiwB2wAFAkkCOwIfAi0B3AAFAkoCPAIgAi4B3QAFAksCPQIhAi8B3gAFAkwCPgIiAjAB3wAFAk0CPwIjAjEB4AAEAlACQgImAjQABAJRAkMCJwI1AAQCTgJAAiQCMgAEAk8CQQIlAjMAAQCEAAEACAABAAQBLwACAv8AAgLuAC0DIQEvAjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwLeAuAC4gLkAuYC6ALqAuwC7gLwAvIC9AL2Av4DAAMEAwYDCAMKAwwDDgMQAxIDFAMWAxgDGgMcAyIAAQAEAFkAkwEKAUcAAQABAucAAQABACQAAQABAv8AAQABAt8AAQABAS4AAQADAuEC5wLrAAEAEAACAAYACAAKABAAFgAcAB8AIAAiACQAJwAqAC8AMAHEAAIABQACABsAAAA2AEwAGgBOAHgAMQB6AJYAXACYAOYAeQABABwC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC9QL9Av8DAwMFAwcDCQMLAw0DDwMRAxMDFQMXAxkDGwACAAMBzQHWAAAB4QHiAAoB/wIAAAwAAQABAgUAAgABAkQCTQAAAAEAAgABAx8AAgACAjYCQwAAAoYCiAAOAAIAAQJEAlEAAAACAAECNgI/AAAAAQACAyEDIgACAAMAHAA1AAABCAEJABoBoQGhABwAAgABAc0B1gAAAAEAHQITAt0C3wLhAuMC5QLnAukC6wLtAu8C8QLzAvUC/QL/AwMDBQMHAwkDCwMNAw8DEQMTAxUDFwMZAxsAAQADAfYB9wIJAAIABAAcABwAAADnAPwAAQJSAlIAFwJVAlUAGAACAAMAIgAiAAABGQEfAAECWwJbAAgAAQABAnYAAQBcAB0AHgAfACAAIQAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AOcA6ADpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwBCAEJARkBGgEbARwBHQEeAR8BoQH2AfcCCQITAlICVQJbAnYC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC9QL9Av8DAwMFAwcDCQMLAw0DDwMRAxMDFQMXAxkDGwACAAUAHAAcAAAAIgAiAAEBzQHWAAIB4QHiAAwB/wIAAA4AAQAtAAEBLgJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlEC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC9QL9Av8DAwMFAwcDCQMLAw0DDwMRAxMDFQMXAxkDGwMfAAAAAQAAAAoAOACSAAJERkxUAA5sYXRuAB4ABAAAAAD//wADAAAAAgAEAAQAAAAA//8AAwABAAMABQAGbWFyawAmbWFyawA2bWttawBGbWttawBMc2l6ZQBSc2l6ZQBWAAAABgAAAAEAAgADAAQABQAAAAYAAAABAAIAAwAEAAUAAAABAAYAAAABAAYAUgAAAE4AAAAHABAAGgAiACoAMgA6AEIAAQAAAAIARABOAAQAAAABAEwABAAAAAEDMgAEAAAAAQNsAAQAAAABBSAABAAAAAEFSgAGAQAAAQWoAGQAAAAAAAAAAAABBqAABf7U/agAAQagAAT9qAABBqIGuAABAAwA6gA3AAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSANgA3gDkAOoA8ADGAOQA9gD8AMYBAgDGAQgBAgEOAQIAxgDGAMYAxgDGAMYBFAEaASABJgEsATIBOAE+AUQBSgFKAVABVgFcAWIAwAFoAW4BdAF6AYABhgGMAZIAwAGYAWgAxgGeAN4AxgECAaQAxgDGAMYAxgGqARoBsAG2AbYAwAFiAMAAwAGGAYYBIAG2ATIBegG8AcIByAHOAdQB2gHgAeYB7AGMAZIBGgHyAXoBegHUAfgB/gABASwCCgABASwCoAABARsCoAABAWQCoAABASgCoAABAT4CoAABAUICoAABAUoCoAABASsCoAABATQCoAABAMUCoAABATICoAABATgCoAABAS4CoAABAToCoAABATICCgABAJwC2gABAVQCCgABAbYC2gABATgCCgABAZoC5QABAS8CCgABAJcC2gABAVgC3QABAKIC2gABAQoC2gABAUQCDAABAToCCgABAUQCCgABATUCCgABAVICCgABATwCCgABAQoCmAABASgCCgABAS4CCgABAS0CCgABATQCCgABAYsCtgABAYQCoAABAUACoAABATcCCgABAVgCCgABAT4CCgABAR4CCgABASQCCgABATECCgABATYCCgABASYCCgABATACDAABAY4CCgABAP4CCgABASACCgABASwC5AABASwC0AABBEAESAABAAwAFgACAAAAGAAAABgABgAUAA4ADgAaACAAJgABASwAAAABAVwAAAABAVQAAAABATYAAAABAXQAAAABBBYEJAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAA5gCYAJgA7ADyAPgAmADmAP4BBAEKAOYA/gEQARYBHAEiASgA4AEuAPIAyACYATQBOgFAAUYBTADOAPIBUgCYAVgAzgCYAJgBXgEiAJgAzgEEAWQAzgDsAWoA/gFwAXYBfADmAYIBiADyAVIBjgGUAM4BdgABASz/6gABATr/6gABAVz/6gABASL/6gABATz/6gABAMj/6gABAU7/6gABASv/6gABATD/6gABAT7/6gABAUb/6gABAKH/6gABAUD/6gABATb/6gABASj/6gABAS7/6gABASD/6gABATj/6gABATP/6gABAVT/6gABASb/6gABART/GwABATH/6gABAVj/6gABAPH/EwABAWb/6gABAJH/JgABAbv/JgABAMz/6gABATL/6gABAWz/6gABAS3/6gABAQv/DwABAUz/6gABAUL/6gABAUf/6gABASX/6gABAcb/JgABASf/6gABAJT/6gABAXL/6gABAQn/DwABAQT/6gABArQCugABAAwAEgABAAAADgADAA4AFAAaAAEBLAH0AAEBqgKAAAECBAKUAAEBngH0AAECkgKaAAEADAAWAAIAAAAkAAAAJAAMACAAJgAsABoAGgAyADgAPgA4ADIARABKAAEBLAAAAAEB7AAAAAEBogAAAAEBGgAAAAEBlAAAAAEBjAAAAAEBYgAAAAEBJQAAAAEBqAAAAAEBHgJQAAEADADqADcAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADmAAAA5gAA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) format('truetype'); +} + +//======================================================================================== +// +// C l i p p e r z I c o n s +// + +@font-face { + font-family: 'clipperz-icons'; + font-style: normal; + font-weight: normal; + src: url(data:application/x-font-ttf;charset=utf-8;base64,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X25fZQdzX2Ffdl9lB3RfYV9nX3MHZF9vX25fZQdiX2FfY19rB2VfZF9pX3QHZV94X2lfdAV0X2FfZwVhX2RfZANnX28AAAAB//8AAgABAAAADgAAACQAAAAAAAIAAwADAAMAAQAEAB4AAgAfADYAAQAEAAAAAgAAAAEAAAAKAB4ALAABbGF0bgAIAAQAAAAA//8AAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQHWAA0AIABiAIoAnAC2ANoBAAEsAXABiAGcAaYByAAEAAoAHAAqADgABQAIACAALwAhACYAIAAkAB8ADgAGACIAKwAkACUAJgASAAYAIgAmACIAKwAiABgABAAgACEAIgADAAgAFAAeABQABQA0ACQAJQAmABoABAAfACUAKwAbAAQANgAlACsAAQAEABAABgAkACUAJgAiAB8AAgAGABIAEwAFACYAIgAsACsAHQADAB8AHwACAAYAFgAMAAcAIAAkAB8AJQAhAC0ADQAGACAAJwAoACIAHwACAAYAGAAIAAgAJgAlADAAMAAiACwAMQAPAAYAJAAhACcAIgAmAAIABgAaAAQACQAhACoAKwAkACwALAAiAB8ABgAIACEAJgAgACcAKAAiAB8ABAAKABwALAA6AAcACAAiACsAKwAlACEALQAqAAkABwArACQALAAsACIAHwARAAYAIgAkACwAJwAuABYABAAkADIAIgACAAYAEAAXAAQAJAAtACoAHAADACQALQABAAQACwAHACIAIwAsACIAKgAuAAEABAAeAAIAIAACAAYAFgAKAAcAJAAzADQAIgAhACsAFQAFAC4AIAAhACIAAQAEABkABAAkACcAKAABAA0AHwAiACMAJAAmACcAKQAqACsALAAtADAANQABAAAACgAcAB4AAWxhdG4ACAAEAAAAAP//AAAAAAAAAAAAAQAAAADJiW8xAAAAAM5FKjwAAAAAzkUqPA==) format('truetype'); +} +/* +@font-face { + font-family: 'blokkregular'; + font-style: normal; + font-weight: normal; + src: url(data:application/x-font-ttf;charset=utf-8;base64,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AUMAAwABBAkACQASAW0AAwABBAkACgBMAX8AAwABBAkACwAuAcsAAwABBAkADABgAfkAAwABBAkADQBQAlkAAwABBAkADgBcAqkAAwABBAkAEwBSAwUAAwABBAkAyAAWA1cAAwABBAkAyQAwA21GaXZlIGJpZyBxdWFja2luZyB6ZXBoeXJzIGpvbHQgbXkgd2F4IGJlZABDAG8AcAB5AHIAaQBnAGgAdAAgAGIAYQBrAGsAZQBtAG8AZQBuACAAMgAwADEAMwBCAEwATwBLAEsAUgBlAGcAdQBsAGEAcgBGAG8AbgB0AFMAdAByAHUAYwB0ACAAQgBMAE8ASwBLAEIATABPAEsASwAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAEIATABPAEsASwBGAG8AbgB0AFMAdAByAHUAYwB0ACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAARgBTAEkAIABGAG8AbgB0AFMAaABvAHAAIABJAG4AdABlAHIAbgBhAHQAaQBvAG4AYQBsACAARwBtAGIASABoAHQAdABwADoALwAvAGYAbwBuAHQAcwB0AHIAdQBjAHQALgBjAG8AbQBiAGEAawBrAGUAbQBvAGUAbiAaAMQA+gBCAEwATwBLAEsgGgDEAPkAIAB3AGEAcwAgAGIAdQBpAGwAdAAgAHcAaQB0AGgAIABGAG8AbgB0AFMAdAByAHUAYwB0AAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGYAbwBuAHQAcwBoAG8AcAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABzAHQAcgB1AGMAdAAuAGMAbwBtAC8AZgBvAG4AdABzAHQAcgB1AGMAdABpAG8AbgBzAC8AcwBoAG8AdwAvADcANwAwADgAMgAzAEMAcgBlAGEAdABpAHYAZQAgAEMAbwBtAG0AbwBuAHMAIABBAHQAdAByAGkAYgB1AHQAaQBvAG4AIABTAGgAYQByAGUAIABBAGwAaQBrAGUAaAB0AHQAcAA6AC8ALwBjAHIAZQBhAHQAaQB2AGUAYwBvAG0AbQBvAG4AcwAuAG8AcgBnAC8AbABpAGMAZQBuAHMAZQBzAC8AYgB5AC0AcwBhAC8AMwAuADAALwBGAGkAdgBlACAAYgBpAGcAIABxAHUAYQBjAGsAaQBuAGcAIAB6AGUAcABoAHkAcgBzACAAagBvAGwAdAAgAG0AeQAgAHcAYQB4ACAAYgBlAGQAVwBlAGIAZgBvAG4AdAAgADEALgAwAFQAaAB1ACAARgBlAGIAIAAgADcAIAAwADkAOgAyADUAOgAwADEAIAAyADAAMQAzAAACAAAAAAAAAMsAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAECAQMAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMAsgCzALYAtwC0ALUBFAEVARYGZ2x5cGgxBmdseXBoMgd1bmkwMEEwB3VuaTAwQUQHdW5pMjAwMAd1bmkyMDAxB3VuaTIwMDIHdW5pMjAwMwd1bmkyMDA0B3VuaTIwMDUHdW5pMjAwNgd1bmkyMDA3B3VuaTIwMDgHdW5pMjAwOQd1bmkyMDBBB3VuaTIwMTAHdW5pMjAxMQpmaWd1cmVkYXNoB3VuaTIwMkYHdW5pMjA1Rgd1bmlFMDAwAAAAuAH/hbABjQBLsAhQWLEBAY5ZsUYGK1ghsBBZS7AUUlghsIBZHbAGK1xYAbABIEWwAytEsAIgRboAAX//AAIrsQNGditEWbAUKwAAAAABURO5PQAA) format('truetype'); +} +*/ +@font-face { + font-family: 'clipperz-password'; +// font-family: 'passwordregular'; + font-style: normal; + font-weight: normal; + src: url(data:application/x-font-ttf;charset=utf-8;base64,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AZP/HwGU/x8Bl/9OAZj/HwGa/04BnP8fAZ7/agGg/7QBo/9qAaT/jwGm/x8Bqv8fAaz/UAGt/x8Brv+PAa//agGxALwBsv9OAbP/HwG0/04AGwAE/9sAEP76ABH/RgAS/voAHv+PAB//jwF4ALwBef9oAXz/aAGA/40Bg/9oAYf/jQGN/40BkP+eAZX/aAGW/7QBmP9GAZr/ngGe/2gBoP+0AaH/aAGj/2gBpv9GAar/RgGt/0YBsQB5AbP/RgADAXn/xQGM/74Bkv++AAoBk/+yAZj/sgGb/7IBn//ZAab/sgGq/7IBrf+yAbD/sgGz/7IBtf+yABUABP/bAXgAqgF5/2gBfP9oAYD/jQGD/2gBh/+NAY3/jQGQ/54Blf9oAZb/tAGY/0YBnv9oAaD/tAGh/2gBo/9oAab/RgGq/0YBrf9GAbEAYgGz/0YABAGi/9kBp//jAav/4wGu/8kAEgGT/3cBlf/bAZj/dwGa/6oBm/+0AZ7/2wGf/54BoP/bAaH/2wGk/6oBpv93Aaf/qgGq/3cBq/+qAa3/dwGw/3cBs/93AbX/dwABAaL/2QANAZP/5wGY/+cBm//nAZ3/5wGf/+cBpf/nAab/5wGp/+cBqv/nAa3/5wGw/+cBs//nAbX/5wANAZP/4QGY/+EBm//hAaX/4QGm/+EBqf/RAar/4QGs/88Brf/bAbD/4QGz/+EBtP/PAbX/4QAKAZP/yQGY/8kBm//JAZ3/yQGl/8kBpv/JAan/yQGq/8kBrf/JAbP/yQAJAZP/4wGY/+MBnf/jAab/4wGp/+MBqv/jAa3/4wGw/+MBtf/jAAMBov/ZAaf/4wGr/+MACgGT/+MBmP/jAZv/4wGd/+MBpv/jAan/4wGq/+MBrf/jAbD/4wG1/+MACwGT/8kBmP/JAZv/yQGd/8kBpv/JAan/yQGq/8kBrf/JAbD/yQGz/8kBtf/JAAUAEP8GABL/BgBu/3cAfv93A5L/0wABA5b/YAABA5b/dwARAckARAHM/+kB0AAtAdP/0wHU/+kB1v/TAdf/YAHY/6YB2f+8Adz/YAHi/9MB5QAXAff/0wH4/+kB+QAXAgIALQOW/40ADgHF/9MBzP/pAdP/6QHW/+kB1/+kAdj/0QHZ/+kB2v/TAdz/pAHf/7wB4v/pAeT/6QHw/+kB+P/TABUBxf+8Acn/0wHL/9MBzP+8AdD/6QHT/7wB1v+8Adf/dwHY/7wB2f+8Adr/pgHc/6QB3/+NAeT/vAHp/+kB8f/pAff/vAH4/+kB+v/pAfz/vAIE/+kAHAAQ/wYAEv8GAG7/dwB+/3cBxf93Acn/dwHM/9MB0P+NAdH/0QHT/40B1v+kAeT/vAHl/40B5/+NAen/dwHq/3cB7f+NAfD/jQHx/40B8v+NAfP/dwH1/40B+P93AgD/jQIB/40CA/+NAgT/dwOS/9MABgHYABcB2f/TAdz/ugHsAEQB8wAXAfgALQACAcz/0wH2/+kACgHM/+kB0//TAdb/6QHXABcB2AAtAd8ALQHlABcB6v/nAfP/6QH4/+kACAHQ/+kB0//pAdb/6QHX/9MB2P/pAdn/6QHc/9MB5P/pAAUBzP/pAdP/6QHW/+kB2AAXAdn/ugADAdn/6QHmABcB+AAXAAkB2f/pAdz/6QHlABcB6gAXAfMAFwH2ABcB+AAXAfz/6QICABcACwHF/9MByf/TAcv/0wHQ/+kB2P/TAdr/pAHc/9MB5P/TAen/0wHw/+kB+v/pABgAEP59ABL+fQAe/9MAH//TAH7/jQHF/3cByf93Acv/6QHM/9MB0P+NAdH/6QHT/9MB1v/pAdf/pAHY/9MB2f/pAdr/pAHk/9MB5f+8Aen/YAHq/6YB8/+mAgL/0wIE/7wADwHF/9MByf/TAcz/6QHQ/7wB0f/pAdP/0wHX/7wB2P+8Adr/jQHc/7wB3/+6AeL/6QHlABcB6wAtAfz/6QAfABD/HQAS/x0Abv+mAH7/pgHF/7wByf+8AcsAFwHM/+kB0P/TAdP/pAHZ/7wB5P/TAeX/pAHn/6YB6v+NAe3/pgHv/6YB8P+kAfH/pgHz/2AB9P+mAfX/jQH2/40B+P+NAfr/pgH+/6YCAP+mAgH/pgID/6YCBP+NA5L/0wAmABD+8AAS/vAAHv/TAB//0wBu/6YAfv+kAcX/dwHJ/6QBzP/TAdD/vAHT/7wB2f+8AeL/0wHk/9MB5v/TAef/jQHo/6QB6f9gAer/dwHr/7wB7P+NAe3/pAHu/7wB7/+kAfD/dwHx/6QB8v+kAfP/dwH0/6QB9f+kAfb/dwH6/6QB+/+kAf3/pAH+/6QCA/+kAgT/dwOS/+kACAHF/9MByf+8AdD/vAHX/40B2P+kAdz/0wHk/7oB8P+8AAcBzP/TAdP/vAHW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AscC5QAnAucC6gBGAuwC7ABKAvgC+ABLAvoC+gBMAxoDHABNBLQEtABQBMcExwBRBNYE1gBSBSsFKwBTAAIArgBUBOgE7ATwBPME9gT5BPwFAwUGBQkFDAUPBRIFFQUYBRsFHgUhBSQFJwUqBTIF+QX7BJsElQSMBg8GEgSPBJgEkgYVBhgEpwSkBhsEqgStBioGLQYwBjMGNgY3BjoF+wY9BkAEngZDBKEFGwSeBkgGSwZOBMwGUQS6BlQEwAZXBL0GWgZdBmAGYwZmBmkEmgZsBI8GcATGBnYE1QZ7Bn4GgQS3BS0FMgUtAAIAEgJlAmUAAAJnAmcAAQJpAm0AAgJyAnkABwJ7AoAADwKDAoMAFQKcAp0AFgKmArQAGALHAuUAJwLnAuoARgLsAuwASgL4AvgASwL6AvoATAMaAxwATQS0BLQAUATHBMcAUQTWBNYAUgUrBSsAUwACASIAjgTjBOQE5QTmBOkE6gTtBO4E8QT0BPcE+gT9BP4E/wUABQEFBAUHBQoFDQUQBRMFFgUZBRwFHwUiBSUFKAUuBS8FMAKcAp0EiQYHBggGCQYKBgsGDASZBJMEigYNBhAEjQSWBJAGEwYWBKUEogYZBKgEqwSxBhwGHQYeBK8ErgSwBh8GIASzBiEGIgYjBiQGJQYmBLIGJwYoBisGLgYxBjQGNwY4As4GOwY+BJwGQQSfBkQGRQZGBkkGTAaIBk8EuAZSBL4GVQS7BlgGWwZeBmEGZAZnBMEEwgZqBm0GbgTDAuwC7QLuBnEE0QTOBM0EzwTSBnIE0AZzBnQGdwTTBngEyATJBnkGfAZ/BLUFLATXBOIFLAU0BTYFOAU6AAIADgJiAnkAAAJ7AoMAGAKcAp0AIQKfAv0AIwMaAxwAggS0BLQAhQTHBMcAhgTWBNYAhwThBOEAiAUrBSsAiQUzBTMAigU1BTUAiwU3BTcAjAU5BTkAjQACASIAjgTjBOQE5QTmBOkE6gTtBO4E8QT0BPcE+gT9BP4E/wUABQEFBAUHBQoFDQUQBRMFFgUZBRwFHwUiBSUFKAUuBS8FMAKcAp0EiQYHBggGCQYKBgsGDASZBJMEigYNBhAEjQSWBJAGEwYWBKUEogYZBKgEqwSxBhwGHQYeBK8ErgSwBh8GIASzBiEGIgYjBiQGJQYmBLIGJwYoBisGLgYxBjQGNwY4As4GOwY+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A+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAjkAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwKAAAAFAAAAAoAAAAUAAAABqgAAAUAAAADVAAAA1QAAAKAAAAEAAAAARwAAA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAQAAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAUAAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXBB8AAAPkAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAAABYAFgAWABYAFgAsAEIAWABuAIQAmgCwAMYA3ADyAQgBHgE0AUoBYAF2AYwBogG4Ac4B5AH6AhACJgI8AlICaAJ+ApQCqgLAAtYC7AMCAxgDLgNEA1oDcAOGA5wDsgPIA94D9AQKBCAENgRMBGIEeASOBKQEugTQBOYE/AUSBSgFPgVUBWoFgAWWBawFwgXYBe4GBAYaBjAGRgZcBnIGiAaeBrQGygbgBvYHDAciBzgHTgdkB3oHkAemB7wH0gfoB/4IFAgqCCoIQAhWCGwIggiYCK4IxAjaCPAJBgkcCTIJSAleCXQJigmgCbYJzAniCfgKDgokCjoKUApmCnwKkgqoCr4K1ArqCwALFgssC0ILWAtuC4QLmguwC8YL3AvyDAgMHgw0DEoMYAx2DIwMogy4DM4M5Az6DRANJg08DVINaA1+DZQNqg3ADdYN7A4CDhgOLg5EDloOcA6GDpwOsg7IDt4O9A8KDyAPNg9MD2IPeA+OD6QPug/QD+YP/BASECgQPhBUEGoQgBCWEKwQwhDYEO4RBBEaETARRhFcEXIRiBGeEbQRyhHgEfYSDBIiEjgSThJkEnoSkBKmErwS0hLoEv4TFBMqE0ATVhNsE4ITmBOuE8QT2hPwFAYUHBQyFEgUXhR0FIoUoBS2FMwU4hT4FQ4VJBU6FVAVZhV8FZIVqBW+FdQV6hYAFhYWLBZCFlgWbhaEFpoWsBbGFtwW8hcIFx4XNBdKF2AXdheMF6IXuBfOF+QX+hgQGCYYPBhSGGgYfhiUGKoYwBjWGOwZAhkYGS4ZRBlaGXAZhhmcGbIZyBneGfQaChogGjYaTBpiGngajhqkGroa0BrmGvwbEhsoGz4bVBtqG4AblhusG8Ib2BvuHAQcGhwwHEYcXBxyHIgcnhy0HMoc4Bz2HQwdIh04HU4dZB16HZAdph28HdId6B3+HhQeKh5AHlYebB6CHpgerh7EHtoe8B8GHxwfMh9IH14fdB+KH6Afth/MH+If+CAOICQgOiBQIGYgfCCSIKggviDUIOohACEWISwhQiFYIW4hhCGaIbAhxiHcIfIiCCIeIjQiSiJgInYijCKiIrgiziLkIvojECMmIzwjUiNoI34jlCOqI8Aj1iPsJAIkGCQuJEQkWiRwJIYknCSyJMgk3iT0JQolICU2JUwlYiV4JY4lpCW6JdAl5iX8JhImKCY+JlQmaiaAJpYmrCbCJtgm7icEJxonMCdGJ1wncieIJ54ntCfKJ+An9igMKCIoOChOKGQoeiiQKKYovCjSKOgo/ikUKSopQClWKWwpgimYKa4pxCnaKfAqBiocKjIqSCpeKnQqiiqgKrYqzCriKvgrDiskKzorUCtmK3wrkiuoK74r1CvqLAAsFiwsLEIsWCxuLIQsmiywLMYs3CzyLQgtHi00LUotYC12LYwtoi24Lc4t5C36LhAuJi48LlIuaC5+LpQuqi7ALtYu7C8CLxgvLi9EL1ovcC+GL5wvsi/IL94v9DAKMCAwNjBMMGIweDCOMKQwujDQMOYw/DESMSgxPjFUMWoxgDGWMawxwjHYMe4yBDIaMjAyRjJcMnIyiDKeMrQyyjLgMvYzDDMiMzgzTjNkM3ozkDOmM7wz0jPoM/40FDQqNEA0VjRsNII0mDSuNMQ02jTwNQY1HDUyNUg1XjV0NYo1oDW2Ncw14jX4Ng42JDY6NlA2ZjZ8NpI2qDa+NtQ26jcANxY3LDdCN1g3bjeEN5o3sDfGN9w38jgIOB44NDhKOGA4djiMOKI4uDjOOOQ4+jkQOSY5PDlSOWg5fjmUOao5wDnWOew6AjoYOi46RDpaOnA6hjqcOrI6yDreOvQ7CjsgOzY7TDtiO3g7jjukO7o70DvmO/w8EjwoPD48VDxqPIA8ljysPMI82DzuPQQ9Gj0wPUY9XD1yPYg9nj20Pco94D32Pgw+Ij44Pk4+ZD56PpA+pj68PtI+6D7+PxQ/Kj9AP1Y/bD+CP5g/rj/EP9o/8EAGQBxAMkBIQF5AdECKQKBAtkDMQOJA+EEOQSRBOkFQQWZBfEGSQahBvkHUQepCAEIWQixCQkJYQm5ChEKaQrBCxkLcQvJDCEMeQzRDSkNgQ3ZDjEOiQ7hDzkPkQ/pEEEQmRDxEUkRoRH5ElESqRMBE1kTsRQJFGEUuRURFWkVwRYZFnEWyRchF3kX0RgpGIEY2RkxGYkZ4Ro5GpEa6RtBG5kb8RxJHKEc+R1RHakeAR5ZHrEfCR9hH7kgESBpIMEhGSFxIckiISJ5ItEjKSOBI9kkMSSJJOElOSWRJekmQSaZJvEnSSehJ/koUSipKQEpWSmxKgkqYSq5KxEraSvBLBkscSzJLSEteS3RLikugS7ZLzEviS/hMDkwkTDpMUExmTHxMfEx8THxMfEx8THxMfEx8THxMfEx8TJJMqEy+TNRM6k0ATRZNLE1CTVhNbk2ETZpNsE3GTdxN8k4ITh5ONE5KTmBOdk6MTqJOuE7OTs5O5E76TxBPJk88T1JPaE9+T35PlE+qT8BP1k/sUAJQGFAuUERQWlBwUIZQnFCyUMhQ3lD0UQpRIFE2UUxRYlF4UY5RpFG6UdBR5lH8UhJSKFI+UlRSalKAUpZSrFLCUthS7lMEUxpTMFNGU1xTclOIU55TtFPKU+BT9lQMVCJUOFROVGRUelSQVKZUvFTSVOhU/lUUVSpVQFVWVWxVglWYVa5VxFXaVfBWBlYcVjJWSFZeVnRWilagVrZWzFbiVvhXDlckVzpXUFdmV3xXkleoV75X1FfqWABYFlgsWEJYWFhuWIRYmliwWMZY3FjyWQhZHlk0WUpZYFl2WYxZolm4Wc5Z5Fn6WhBaJlo8WkpaYFp2Woxaolq4Ws5a5Fr6WxBbJls8W1JbaFt+W5RbqlvAW9Zb7FwCXBhcLlxEXFpccFyGXJxcslzIXN5c9F0KXSBdNl1MXWJdeF2OXaRdul3QXeZd/F4SXihePl5UXmpegF6WXqxewl7YXu5fBF8aXzBfRl9cX3JfiF+eX7Rfyl/gX/ZgDGAiYDhgTmBkYHpgkGCmYLxg0mDoYP5hFGEqYUBhVmFsYYJhmGGuYcRh2mHwYgZiHGIyYkhiXmJ0YopioGK2Ysxi4mL4Yw5jJGM6Y1BjZmN8Y5JjqGO+Y9Rj6mQAZBZkLGRCZFhkbmSEZJpksGTGZNxk8mUIZR5lNGVKZWBldmWMZaJluGXOZeRl+mYQZiZmPGZSZmhmfmaUZqpmwGbWZuxnAmcYZy5nRGdaZ3BnhmecZ7JnyGfeZ/RoCmggaDZoTGhiaHhojmikaLpo0GjmaPxpEmkoaT5pVGlqaYBplmmsacJp2GnuagRqGmowakZqXGpyaohqnmq0aspq4Gr2awxrIms4a05rZGt6a5Brpmu8a9Jr6Gv+bBRsKmxAbFZsbGyCbJhsrmzEbNps8G0GbRxtMm1IbV5tdG2KbaBttm3MbeJt+G4ObiRuOm5QbmZufG6Sbqhuvm7UbupvAG8WbyxvQm9Yb25vhG+ab7Bvxm/cb/JwCHAecDRwSnBgcHZwjHCicLhwznDkcPpxEHEmcTxxUnFocX5xlHGqccBx1nHscgJyGHIuckRyWnJwcoZynHKycshy3nL0cwpzIHM2c0xzYnN4c45zpHO6c9Bz5nP8dBJ0KHQ+dFR0anSAdJZ0rHTCdNh07nUEdRp1MHVGdVx1cnWIdZ51tHXKdeB19nYMdiJ2OHZOdmR2enaQdqZ2vHbSduh2/ncUdyp3QHdWd2x3gneYd653xHfad/B4BngceDJ4SHheeHR4inigeLZ4zHjiePh5DnkkeTp5UHlmeXx5knmoeb551HnqegB6FnosekJ6WHpueoR6mnqwesZ63Hryewh7Hns0e0p7YHt2e4x7onu4e8575Hv6fBB8Jnw8fFJ8aHx+fJR8qnzAfNZ87H0CfRh9Ln1EfVp9cH2GfZx9sn3Ifd599H4KfiB+Nn5MfmJ+eH6OfqR+un7QfuZ+/H8Sfyh/Pn9Uf2p/gH+Wf6x/wn/Yf+6ABIAagDCARoBcgHKAiICegLSAyoDggPaBDIEigTiBToFkgXqBkIGmgbyB0oHogf6CFIIqgkCCVoJsgoKCmIKugsSC2oLwgwaDHIMyg0iDXoN0g4qDoIO2g8yD4oP4hA6EJIQ6hFCEZoR8hJKEqIS+hNSE6oUAhRaFLIVChViFboWEhZqFsIXGhdyF8oYIhh6GNIZKhmCGdoaMhqKGuIbOhuSG+ocQhyaHPIdSh2iHfoeUh6qHwIfWh+yIAogYiC6IRIhaiHCIhoiciLKIyIjeiPSJCokgiTaJTIliiXiJjomkibqJ0InmifyKEoooij6KVIpqioCKloqsisKK2IruiwSLGoswi0aLXItyi4iLnou0i8qL4Iv2jAyMIow4jE6MZIx6jJCMpoy8jNKM6Iz+jRSNKo1AjVaNbI2CjZiNro3EjdqN8I4GjhyOMo5Ijl6OdI6KjqCOto7MjuKO+I8OjySPOo9Qj2aPfI+Sj6iPvo/UAAAAAQAABpwADAACAAAAAAACABAALwBWAAAEDQAAAAAAAAAAABAAxgADAAEECQABABAAAAADAAEECQACAA4AEAADAAEECQADACIAHgADAAEECQAEACAAQAADAAEECQAFABgAYAADAAEECQAGABAAeAADAAEECQAHABAAiAADAAEECQAIACYAmAADAAEECQAJAIoAvgADAAEECQAKBMIBSAADAAEECQALAGIGCgADAAEECQAMAGYGbAADAAEECQANBrQG0gADAAEECQAOAFwNhgADAAEECQDIABYN4gADAAEECQDJADAN+ABQAGEAcwBzAHcAbwByAGQAUgBlAGcAdQBsAGEAcgBNAG8AbgBvAHQAeQBwAGUAOgBQAGEAcwBzAHcAbwByAGQAUABhAHMAcwB3AG8AcgBkACAAUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMQAuADAAMABQAGEAcwBzAHcAbwByAGQAUABhAHMAcwB3AG8AcgBkAE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAG8AZwByAGEAcABoAHkATQBvAG4AbwB0AHkAcABlACAAVAB5AHAAZQAgAEQAcgBhAHcAaQBuAGcAIABPAGYAZgBpAGMAZQAgAC0AIABSAG8AYgBpAG4AIABOAGkAYwBoAG8AbABhAHMALAAgAFAAYQB0AHIAaQBjAGkAYQAgAFMAYQB1AG4AZABlAHIAcwAgADEAOQA4ADIAQwBvAG4AdABlAG0AcABvAHIAYQByAHkAIABzAGEAbgBzACAAcwBlAHIAaQBmACAAZABlAHMAaQBnAG4ALAAgAEEAcgBpAGEAbAAgAGMAbwBuAHQAYQBpAG4AcwAgAG0AbwByAGUAIABoAHUAbQBhAG4AaQBzAHQAIABjAGgAYQByAGEAYwB0AGUAcgBpAHMAdABpAGMAcwAgAHQAaABhAG4AIABtAGEAbgB5ACAAbwBmACAAaQB0AHMAIABwAHIAZQBkAGUAYwBlAHMAcwBvAHIAcwAgAGEAbgBkACAAYQBzACAAcwB1AGMAaAAgAGkAcwAgAG0AbwByAGUAIABpAG4AIAB0AHUAbgBlACAAdwBpAHQAaAAgAHQAaABlACAAbQBvAG8AZAAgAG8AZgAgAHQAaABlACAAbABhAHMAdAAgAGQAZQBjAGEAZABlAHMAIABvAGYAIAB0AGgAZQAgAHQAdwBlAG4AdABpAGUAdABoACAAYwBlAG4AdAB1AHIAeQAuACAAIABUAGgAZQAgAG8AdgBlAHIAYQBsAGwAIAB0AHIAZQBhAHQAbQBlAG4AdAAgAG8AZgAgAGMAdQByAHYAZQBzACAAaQBzACAAcwBvAGYAdABlAHIAIABhAG4AZAAgAGYAdQBsAGwAZQByACAAdABoAGEAbgAgAGkAbgAgAG0AbwBzAHQAIABpAG4AZAB1AHMAdAByAGkAYQBsACAAcwB0AHkAbABlACAAcwBhAG4AcwAgAHMAZQByAGkAZgAgAGYAYQBjAGUAcwAuACAAIABUAGUAcgBtAGkAbgBhAGwAIABzAHQAcgBvAGsAZQBzACAAYQByAGUAIABjAHUAdAAgAG8AbgAgAHQAaABlACAAZABpAGEAZwBvAG4AYQBsACAAdwBoAGkAYwBoACAAaABlAGwAcABzACAAdABvACAAZwBpAHYAZQAgAHQAaABlACAAZgBhAGMAZQAgAGEAIABsAGUAcwBzACAAbQBlAGMAaABhAG4AaQBjAGEAbAAgAGEAcABwAGUAYQByAGEAbgBjAGUALgAgACAAQQByAGkAYQBsACAAaQBzACAAYQBuACAAZQB4AHQAcgBlAG0AZQBsAHkAIAB2AGUAcgBzAGEAdABpAGwAZQAgAGYAYQBtAGkAbAB5ACAAbwBmACAAdAB5AHAAZQBmAGEAYwBlAHMAIAB3AGgAaQBjAGgAIABjAGEAbgAgAGIAZQAgAHUAcwBlAGQAIAB3AGkAdABoACAAZQBxAHUAYQBsACAAcwB1AGMAYwBlAHMAcwAgAGYAbwByACAAdABlAHgAdAAgAHMAZQB0AHQAaQBuAGcAIABpAG4AIAByAGUAcABvAHIAdABzACwAIABwAHIAZQBzAGUAbgB0AGEAdABpAG8AbgBzACwAIABtAGEAZwBhAHoAaQBuAGUAcwAgAGUAdABjACwAIABhAG4AZAAgAGYAbwByACAAZABpAHMAcABsAGEAeQAgAHUAcwBlACAAaQBuACAAbgBlAHcAcwBwAGEAcABlAHIAcwAsACAAYQBkAHYAZQByAHQAaQBzAGkAbgBnACAAYQBuAGQAIABwAHIAbwBtAG8AdABpAG8AbgBzAC4AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAG0AbwBuAG8AdAB5AHAAZQAuAGMAbwBtAC8AaAB0AG0AbAAvAG0AdABuAGEAbQBlAC8AbQBzAF8AYQByAGkAYQBsAC4AaAB0AG0AbABoAHQAdABwADoALwAvAHcAdwB3AC4AbQBvAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBoAHQAbQBsAC8AbQB0AG4AYQBtAGUALwBtAHMAXwB3AGUAbABjAG8AbQBlAC4AaAB0AG0AbABOAE8AVABJAEYASQBDAEEAVABJAE8ATgAgAE8ARgAgAEwASQBDAEUATgBTAEUAIABBAEcAUgBFAEUATQBFAE4AVAANAAoADQAKAFQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAG8AZwByAGEAcABoAHkAIABhAG4AZAAgAGkAdABzACAAdQBzAGUAIABiAHkAIAB5AG8AdQAgAGkAcwAgAGMAbwB2AGUAcgBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAGEAIABsAGkAYwBlAG4AcwBlACAAYQBnAHIAZQBlAG0AZQBuAHQALgAgAFkAbwB1ACAAaABhAHYAZQAgAG8AYgB0AGEAaQBuAGUAZAAgAHQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABzAG8AZgB0AHcAYQByAGUAIABlAGkAdABoAGUAcgAgAGQAaQByAGUAYwB0AGwAeQAgAGYAcgBvAG0AIABNAG8AbgBvAHQAeQBwAGUAIABvAHIAIAB0AG8AZwBlAHQAaABlAHIAIAB3AGkAdABoACAAcwBvAGYAdAB3AGEAcgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAbwBuAGUAIABvAGYAIABNAG8AbgBvAHQAeQBwAGUAJwBzACAAbABpAGMAZQBuAHMAZQBlAHMALgANAAoADQAKAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABhACAAdgBhAGwAdQBhAGIAbABlACAAYQBzAHMAZQB0ACAAbwBmACAATQBvAG4AbwB0AHkAcABlAC4AIABVAG4AbABlAHMAcwAgAHkAbwB1ACAAaABhAHYAZQAgAGUAbgB0AGUAcgBlAGQAIABpAG4AdABvACAAYQAgAHMAcABlAGMAaQBmAGkAYwAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGcAcgBhAG4AdABpAG4AZwAgAHkAbwB1ACAAYQBkAGQAaQB0AGkAbwBuAGEAbAAgAHIAaQBnAGgAdABzACwAIAB5AG8AdQByACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAG0AaQB0AGUAZAAgAHQAbwAgAHkAbwB1AHIAIAB3AG8AcgBrAHMAdABhAHQAaQBvAG4AIABmAG8AcgAgAHkAbwB1AHIAIABvAHcAbgAgAHAAdQBiAGwAaQBzAGgAaQBuAGcAIAB1AHMAZQAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAgAG8AcgAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBJAGYAIAB5AG8AdQAgAGgAYQB2AGUAIABhAG4AeQAgAHEAdQBlAHMAdABpAG8AbgAgAGMAbwBuAGMAZQByAG4AaQBuAGcAIAB5AG8AdQByACAAcgBpAGcAaAB0AHMAIAB5AG8AdQAgAHMAaABvAHUAbABkACAAcgBlAHYAaQBlAHcAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHkAbwB1ACAAcgBlAGMAZQBpAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBvAGYAdAB3AGEAcgBlACAAbwByACAAYwBvAG4AdABhAGMAdAAgAE0AbwBuAG8AdAB5AHAAZQAgAGYAbwByACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAuAA0ACgANAAoATQBvAG4AbwB0AHkAcABlACAAYwBhAG4AIABiAGUAIABjAG8AbgB0AGEAYwB0AGUAZAAgAGEAdAA6AA0ACgANAAoAVQBTAEEAIAAtACAAKAA4ADQANwApACAANwAxADgALQAwADQAMAAwAAkACQBVAEsAIAAtACAAMAAxADEANAA0ACAAMAAxADcAMwA3ACAANwA2ADUAOQA1ADkADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBtAG8AbgBvAHQAeQBwAGUALgBjAG8AbQBoAHQAdABwADoALwAvAHcAdwB3AC4AbQBvAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBoAHQAbQBsAC8AdAB5AHAAZQAvAGwAaQBjAGUAbgBzAGUALgBoAHQAbQBsAFcAZQBiAGYAbwBuAHQAIAAxAC4AMABGAHIAaQAgAEYAZQBiACAAIAA4ACAAMAA5ADoAMgA2ADoANAA0ACAAMgAwADEAMwAAAAIAAAAAAAD/JwCWAAAAAAAAAAAAAAAAAAAAAAAAAAAGnAAAAAEAAgECAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQEDAKMAhACFAL0AlgDoAIYAjgCLAJ0AqQCkAQQAigEFAIMAkwDyAPMAjQEGAIgAwwDeAPEAngCqAPUA9AD2AKIArQDJAMcArgBiAGMAkABkAMsAZQDIAMoAzwDMAM0AzgDpAGYA0wDQANEArwBnAPAAkQDWANQA1QBoAOsA7QCJAGoAaQBrAG0AbABuAKAAbwBxAHAAcgBzAHUAdAB2AHcA6gB4AHoAeQB7AH0AfAC4AKEAfwB+AIAAgQDsAO4AugEHAQgBCQEKAQsBDAD9AP4BDQEOAQ8BEAD/AQABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAD4APkBIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAD6ANcBMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8A4gDjAUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOALAAsQFPAVABUQFSAVMBVAFVAVYBVwFYAPsA/ADkAOUBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgC7AW8BcAFxAXIA5gDnAXMBdACmAXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPANgA4QDaANsA3ADdAOAA2QDfAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIAqAGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AJ8BtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccAlwHIAckBygCbAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwOYA5kDmgObA5wDnQOeA58DoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrAOtA64DrwOwA7EDsgOzALIAswO0A7UAtgC3AMQDtgC0ALUAxQCCAMIAhwCrA7cDuAO5A7oDuwO8AMYDvQO+AL4AvwO/A8AAvAPBA8IDwwPEA8UDxgPHA8gA9wPJA8oDywPMA80DzgPPA9AAjAPRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wCYA+AAmgCZAO8ApQCSA+ED4gCcAKcAjwPjAJQAlQPkA+UD5gPnA+gD6QPqA+sD7APtA+4D7wPwA/ED8gPzA/QD9QP2A/cD+AP5A/oD+wP8A/0D/gP/BAAEAQQCBAMEBAQFBAYEBwQIBAkECgQLBAwEDQQOBA8EEAQRBBIEEwQUBBUEFgQXBBgEGQQaBBsEHAQdBB4EHwQgALkEIQQiBCMEJAQlBCYEJwQoBCkEKgQrBCwELQQuBC8EMAQxBDIEMwQ0BDUENgQ3BDgEOQQ6BDsEPAQ9BD4EPwRABEEEQgRDBEQERQRGBEcESARJBEoESwRMBE0ETgRPBFAEUQRSBFMEVARVBFYEVwRYBFkEWgRbBFwEXQReBF8EYARhBGIEYwRkBGUEZgDAAMEEZwRoBGkEagRrBGwEbQRuBG8EcARxBHIEcwR0BHUEdgR3BHgEeQR6BHsEfAR9BH4EfwSABIEEggSDBIQEhQSGBIcEiASJBIoEiwSMBI0EjgSPBJAEkQSSBJMElASVBJYElwSYBJkEmgSbBJwEnQSeBJ8EoAShBKIEowSkBKUEpgSnBKgEqQSqBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/BMAEwQTCBMMExATFBMYExwTIBMkEygTLBMwEzQTOBM8E0ATRBNIE0wTUBNUE1gTXBNgE2QTaBNsE3ATdBN4E3wTgBOEE4gTjBOQE5QTmBOcE6ATpBOoE6wTsBO0E7gTvBPAE8QTyBPME9AT1BPYE9wT4BPkE+gT7BPwE/QT+BP8FAAUBBQIFAwUEBQUFBgUHBQgFCQUKBQsFDAUNBQ4FDwUQBREFEgUTBRQFFQUWBRcFGAUZBRoFGwUcBR0FHgUfBSAFIQUiBSMFJAUlBSYFJwUoBSkFKgUrBSwFLQUuBS8FMAUxBTIFMwU0BTUFNgU3BTgFOQU6BTsFPAU9BT4FPwVABUEFQgVDBUQFRQVGBUcFSAVJBUoFSwVMBU0FTgVPBVAFUQVSBVMFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVkBWUFZgVnBWgFaQVqBWsFbAVtBW4FbwVwBXEFcgVzBXQFdQV2BXcFeAV5BXoFewV8BX0FfgV/BYAFgQWCBYMFhAWFBYYFhwWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQWaBZsFnAWdBZ4FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtAW1BbYFtwW4BbkFugW7BbwFvQW+Bb8FwAXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwXQBdEF0gXTBdQF1QXWBdcF2AXZBdoF2wXcBd0F3gXfBeAF4QXiBeMF5AXlBeYF5wXoBekF6gXrBewF7QXuBe8F8AXxBfIF8wX0BfUF9gX3BfgF+QX6BfsF/AX9Bf4F/wYABgEGAgYDBgQGBQYGBgcGCAYJBgoGCwYMBg0GDgYPBhAGEQYSBhMGFAYVBhYGFwYYBhkGGgYbBhwGHQYeBh8GIAYhBiIGIwYkBiUGJgYnBigGKQYqBisGLAYtBi4GLwYwBjEGMgYzBjQGNQY2BjcGOAY5BjoGOwY8Bj0GPgY/BkAGQQZCBkMGRAZFBkYGRwZIBkkGSgZLBkwGTQZOBk8GUAZRBlIGUwZUBlUGVgZXBlgGWQZaBlsGXAZdBl4GXwZgBmEGYgZjBmQGZQZmBmcGaAZpBmoGawZsBm0GbgZvBnAGcQZyBnMGdAZ1BnYGdwZ4BnkGegZ7BnwGfQZ+Bn8GgAaBBoIGgwaEBoUGhgaHBogGiQaKBosGjAaNBo4GjwaQBpEGkgaTBpQGlQaWBpcGmAaZBpoGmwacBp0Gngd1bmkwMDBEB3VuaTAwQTAHdW5pMDBBRAlvdmVyc2NvcmUDbXUxB0FtYWNyb24HYW1hY3JvbgZBYnJldmUGYWJyZXZlB0FvZ29uZWsHYW9nb25lawtDY2lyY3VtZmxleAtjY2lyY3VtZmxleARDZG90BGNkb3QGRGNhcm9uBmRjYXJvbgZEc2xhc2gHZG1hY3JvbgdFbWFjcm9uB2VtYWNyb24GRWJyZXZlBmVicmV2ZQRFZG90BGVkb3QHRW9nb25lawdlb2dvbmVrBkVjYXJvbgZlY2Fyb24LR2NpcmN1bWZsZXgLZ2NpcmN1bWZsZXgER2RvdARnZG90CEdjZWRpbGxhCGdjZWRpbGxhC0hjaXJjdW1mbGV4C2hjaXJjdW1mbGV4BEhiYXIEaGJhcgZJdGlsZGUGaXRpbGRlB0ltYWNyb24HaW1hY3JvbgZJYnJldmUGaWJyZXZlB0lvZ29uZWsHaW9nb25lawJJSgJpagtKY2lyY3VtZmxleAtqY2lyY3VtZmxleAhLY2VkaWxsYQhrY2VkaWxsYQxrZ3JlZW5sYW5kaWMGTGFjdXRlBmxhY3V0ZQhMY2VkaWxsYQhsY2VkaWxsYQZMY2Fyb24GbGNhcm9uBExkb3QEbGRvdAZOYWN1dGUGbmFjdXRlCE5jZWRpbGxhCG5jZWRpbGxhBk5jYXJvbgZuY2Fyb24LbmFwb3N0cm9waGUDRW5nA2VuZwdPbWFjcm9uB29tYWNyb24GT2JyZXZlBm9icmV2ZQlPZGJsYWN1dGUJb2RibGFjdXRlBlJhY3V0ZQZyYWN1dGUIUmNlZGlsbGEIcmNlZGlsbGEGUmNhcm9uBnJjYXJvbgZTYWN1dGUGc2FjdXRlC1NjaXJjdW1mbGV4C3NjaXJjdW1mbGV4CFRjZWRpbGxhCHRjZWRpbGxhBlRjYXJvbgZ0Y2Fyb24EVGJhcgR0YmFyBlV0aWxkZQZ1dGlsZGUHVW1hY3Jvbgd1bWFjcm9uBlVicmV2ZQZ1YnJldmUFVXJpbmcFdXJpbmcJVWRibGFjdXRlCXVkYmxhY3V0ZQdVb2dvbmVrB3VvZ29uZWsLV2NpcmN1bWZsZXgLd2NpcmN1bWZsZXgLWWNpcmN1bWZsZXgLeWNpcmN1bWZsZXgGWmFjdXRlBnphY3V0ZQRaZG90BHpkb3QFbG9uZ3MHdW5pMDE4RgVPaG9ybgVvaG9ybgVVaG9ybgV1aG9ybgd1bmkwMUNEB3VuaTAxQ0UHdW5pMDFDRgd1bmkwMUQwB3VuaTAxRDEHdW5pMDFEMgd1bmkwMUQzB3VuaTAxRDQHdW5pMDFENQd1bmkwMUQ2B3VuaTAxRDcHdW5pMDFEOAd1bmkwMUQ5B3VuaTAxREEHdW5pMDFEQgd1bmkwMURDCkFyaW5nYWN1dGUKYXJpbmdhY3V0ZQdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUHdW5pMDI1ORRjb21iaW5pbmdncmF2ZWFjY2VudBRjb21iaW5pbmdhY3V0ZWFjY2VudBRjb21iaW5pbmd0aWxkZWFjY2VudBJjb21iaW5pbmdob29rYWJvdmURY29tYmluaW5nZG90YmVsb3cFdG9ub3MNZGllcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxFpb3RhZGllcmVzaXN0b25vcwVBbHBoYQRCZXRhBUdhbW1hB0Vwc2lsb24EWmV0YQNFdGEFVGhldGEESW90YQVLYXBwYQZMYW1iZGECTXUCTnUCWGkHT21pY3JvbgJQaQNSaG8FU2lnbWEDVGF1B1Vwc2lsb24DUGhpA0NoaQNQc2kMSW90YWRpZXJlc2lzD1Vwc2lsb25kaWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MUdXBzaWxvbmRpZXJlc2lzdG9ub3MFYWxwaGEEYmV0YQVnYW1tYQVkZWx0YQdlcHNpbG9uBHpldGEDZXRhBXRoZXRhBGlvdGEFa2FwcGEGbGFtYmRhAm51AnhpB29taWNyb24DcmhvBnNpZ21hMQVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQxpb3RhZGllcmVzaXMPdXBzaWxvbmRpZXJlc2lzDG9taWNyb250b25vcwx1cHNpbG9udG9ub3MKb21lZ2F0b25vcwZvbWVnYTEJYWZpaTEwMDIzCWFmaWkxMDA1MQlhZmlpMTAwNTIJYWZpaTEwMDUzCWFmaWkxMDA1NAlhZmlpMTAwNTUJYWZpaTEwMDU2CWFmaWkxMDA1NwlhZmlpMTAwNTgJYWZpaTEwMDU5CWFmaWkxMDA2MAlhZmlpMTAwNjEJYWZpaTEwMDYyCWFmaWkxMDE0NQlhZmlpMTAwMTcJYWZpaTEwMDE4CWFmaWkxMDAxOQlhZmlpMTAwMjAJYWZpaTEwMDIxCWFmaWkxMDAyMglhZmlpMTAwMjQJYWZpaTEwMDI1CWFmaWkxMDAyNglhZmlpMTAwMjcJYWZpaTEwMDI4CWFmaWkxMDAyOQlhZmlpMTAwMzAJYWZpaTEwMDMxCWFmaWkxMDAzMglhZmlpMTAwMzMJYWZpaTEwMDM0CWFmaWkxMDAzNQlhZmlpMTAwMzYJYWZpaTEwMDM3CWFmaWkxMDAzOAlhZmlpMTAwMzkJYWZpaTEwMDQwCWFmaWkxMDA0MQlhZmlpMTAwNDIJYWZpaTEwMDQzCWFmaWkxMDA0NAlhZmlpMTAwNDUJYWZpaTEwMDQ2CWFmaWkxMDA0NwlhZmlpMTAwNDgJYWZpaTEwMDQ5CWFmaWkxMDA2NQlhZmlpMTAwNjYJYWZpaTEwMDY3CWFmaWkxMDA2OAlhZmlpMTAwNjkJYWZpaTEwMDcwCWFmaWkxMDA3MglhZmlpMTAwNzMJYWZpaTEwMDc0CWFmaWkxMDA3NQlhZmlpMTAwNzYJYWZpaTEwMDc3CWFmaWkxMDA3OAlhZmlpMTAwNzkJYWZpaTEwMDgwCWFmaWkxMDA4MQlhZmlpMTAwODIJYWZpaTEwMDgzCWFmaWkxMDA4NAlhZmlpMTAwODUJYWZpaTEwMDg2CWFmaWkxMDA4NwlhZmlpMTAwODgJYWZpaTEwMDg5CWFmaWkxMDA5MAlhZmlpMTAwOTEJYWZpaTEwMDkyCWFmaWkxMDA5MwlhZmlpMTAwOTQJYWZpaTEwMDk1CWFmaWkxMDA5NglhZmlpMTAwOTcJYWZpaTEwMDcxCWFmaWkxMDA5OQlhZmlpMTAxMDAJYWZpaTEwMTAxCWFmaWkxMDEwMglhZmlpMTAxMDMJYWZpaTEwMTA0CWFmaWkxMDEwNQlhZmlpMTAxMDYJYWZpaTEwMTA3CWFmaWkxMDEwOAlhZmlpMTAxMDkJYWZpaTEwMTEwCWFmaWkxMDE5MwlhZmlpMTAwNTAJYWZpaTEwMDk4B3VuaTA0OTIHdW5pMDQ5Mwd1bmkwNDk2B3VuaTA0OTcHdW5pMDQ5QQd1bmkwNDlCB3VuaTA0OUMHdW5pMDQ5RAd1bmkwNEEyB3VuaTA0QTMHdW5pMDRBRQd1bmkwNEFGB3VuaTA0QjAHdW5pMDRCMQd1bmkwNEIyB3VuaTA0QjMHdW5pMDRCOAd1bmkwNEI5B3VuaTA0QkEHdW5pMDRCQgd1bmkwNEU4B3VuaTA0RTkFc2hldmEKaGF0YWZzZWdvbApoYXRhZnBhdGFoC2hhdGFmcWFtYXRzBWhpcmlxBXRzZXJlBXNlZ29sBXBhdGFoBnFhbWF0cwVob2xhbQZxdWJ1dHMGZGFnZXNoBW1ldGVnBW1hcWFmBHJhZmUFcGFzZXEHc2hpbmRvdAZzaW5kb3QIc29mcGFzdXEEYWxlZgNiZXQFZ2ltZWwFZGFsZXQCaGUDdmF2BXpheWluA2hldAN0ZXQDeW9kCGZpbmFsa2FmA2thZgVsYW1lZAhmaW5hbG1lbQNtZW0IZmluYWxudW4DbnVuBnNhbWVraARheWluB2ZpbmFscGUCcGUKZmluYWx0c2FkaQV0c2FkaQNxb2YEcmVzaARzaGluA3Rhdglkb3VibGV2YXYGdmF2eW9kCWRvdWJsZXlvZAZnZXJlc2gJZ2Vyc2hheWltCWFmaWk1NzM4OAlhZmlpNTc0MDMJYWZpaTU3NDA3CWFmaWk1NzQwOQlhZmlpNTc0MTEJYWZpaTU3NDEyCWFmaWk1NzQxMwlhZmlpNTc0MTQJYWZpaTU3NDE1CWFmaWk1NzQxNglhZmlpNTc0MTcJYWZpaTU3NDE4CWFmaWk1NzQxOQlhZmlpNTc0MjAJYWZpaTU3NDIxCWFmaWk1NzQyMglhZmlpNTc0MjMJYWZpaTU3NDI0CWFmaWk1NzQyNQlhZmlpNTc0MjYJYWZpaTU3NDI3CWFmaWk1NzQyOAlhZmlpNTc0MjkJYWZpaTU3NDMwCWFmaWk1NzQzMQlhZmlpNTc0MzIJYWZpaTU3NDMzCWFmaWk1NzQzNAlhZmlpNTc0NDAJYWZpaTU3NDQxCWFmaWk1NzQ0MglhZmlpNTc0NDMJYWZpaTU3NDQ0CWFmaWk1NzQ0NQlhZmlpNTc0NDYJYWZpaTU3NDQ4CWFmaWk1NzQ0OQlhZmlpNTc0NTAJYWZpaTU3NDUxCWFmaWk1NzQ1MglhZmlpNTc0NTMJYWZpaTU3NDU0CWFmaWk1NzQ1NQlhZmlpNTc0NTYJYWZpaTU3NDU3CWFmaWk1NzQ1OAd1bmkwNjUzB3VuaTA2NTQHdW5pMDY1NQlhZmlpNTczOTIJYWZpaTU3MzkzCWFmaWk1NzM5NAlhZmlpNTczOTUJYWZpaTU3Mzk2CWFmaWk1NzM5NwlhZmlpNTczOTgJYWZpaTU3Mzk5CWFmaWk1NzQwMAlhZmlpNTc0MDEJYWZpaTU3MzgxCWFmaWk1NzQ2MQlhZmlpNjMxNjcJZ2x5cGgxMzIwCWdseXBoMTMyNAd1bmkwNjcwB3VuaTA2NzEHdW5pMDY3Mgd1bmkwNjczB3VuaTA2NzUHdW5pMDY3Ngd1bmkwNjc3B3VuaTA2NzgHdW5pMDY3OQd1bmkwNjdBB3VuaTA2N0IHdW5pMDY3Qwd1bmkwNjdECWFmaWk1NzUwNgd1bmkwNjdGB3VuaTA2ODAHdW5pMDY4MQd1bmkwNjgyB3VuaTA2ODMHdW5pMDY4NAd1bmkwNjg1CWFmaWk1NzUwNwd1bmkwNjg3B3VuaTA2ODgHdW5pMDY4OQd1bmkwNjhBB3VuaTA2OEIHdW5pMDY4Qwd1bmkwNjhEB3VuaTA2OEUHdW5pMDY4Rgd1bmkwNjkwB3VuaTA2OTEHdW5pMDY5Mgd1bmkwNjkzB3VuaTA2OTQHdW5pMDY5NQd1bmkwNjk2B3VuaTA2OTcJYWZpaTU3NTA4B3VuaTA2OTkHdW5pMDY5QQd1bmkwNjlCB3VuaTA2OUMHdW5pMDY5RAd1bmkwNjlFB3VuaTA2OUYHdW5pMDZBMAd1bmkwNkExB3VuaTA2QTIHdW5pMDZBMwd1bmkwNkE0B3VuaTA2QTUHdW5pMDZBNgd1bmkwNkE3B3VuaTA2QTgHdW5pMDZBQQd1bmkwNkFCB3VuaTA2QUMHdW5pMDZBRAd1bmkwNkFFCWFmaWk1NzUwOQd1bmkwNkIwB3VuaTA2QjEHdW5pMDZCMgd1bmkwNkIzB3VuaTA2QjQHdW5pMDZCNQd1bmkwNkI2B3VuaTA2QjcHdW5pMDZCOAd1bmkwNkI5B3VuaTA2QkEHdW5pMDZCQgd1bmkwNkJDB3VuaTA2QkQHdW5pMDZCRgd1bmkwNkMwB3VuaTA2QzEHdW5pMDZDMgd1bmkwNkMzB3VuaTA2QzQHdW5pMDZDNQd1bmkwNkM2B3VuaTA2QzcHdW5pMDZDOAd1bmkwNkM5B3VuaTA2Q0EHdW5pMDZDQgd1bmkwNkNEB3VuaTA2Q0UHdW5pMDZDRgd1bmkwNkQwB3VuaTA2RDEHdW5pMDZEMgd1bmkwNkQzB3VuaTA2RDQJYWZpaTU3NTM0B3VuaTA2RDYHdW5pMDZENwd1bmkwNkQ4B3VuaTA2RDkHdW5pMDZEQQd1bmkwNkRCB3VuaTA2REMHdW5pMDZERAd1bmkwNkRFB3VuaTA2REYHdW5pMDZFMAd1bmkwNkUxB3VuaTA2RTIHdW5pMDZFMwd1bmkwNkU0B3VuaTA2RTUHdW5pMDZFNgd1bmkwNkU3B3VuaTA2RTgHdW5pMDZFOQd1bmkwNkVBB3VuaTA2RUIHdW5pMDZFRAlhZmlpNjI4NDMJYWZpaTYyODQ0CWFmaWk2Mjg0NQd1bmkwNkZBB3VuaTA2RkIHdW5pMDZGQwd1bmkwNkZEB3VuaTA2RkUGV2dyYXZlBndncmF2ZQZXYWN1dGUGd2FjdXRlCVdkaWVyZXNpcwl3ZGllcmVzaXMJQWRvdGJlbG93CWFkb3RiZWxvdwpBaG9va2Fib3ZlCmFob29rYWJvdmUQQWNpcmN1bWZsZXhhY3V0ZRBhY2lyY3VtZmxleGFjdXRlEEFjaXJjdW1mbGV4Z3JhdmUQYWNpcmN1bWZsZXhncmF2ZRRBY2lyY3VtZmxleGhvb2thYm92ZRRhY2lyY3VtZmxleGhvb2thYm92ZRBBY2lyY3VtZmxleHRpbGRlEGFjaXJjdW1mbGV4dGlsZGUTQWNpcmN1bWZsZXhkb3RiZWxvdxNhY2lyY3VtZmxleGRvdGJlbG93C0FicmV2ZWFjdXRlC2FicmV2ZWFjdXRlC0FicmV2ZWdyYXZlC2FicmV2ZWdyYXZlD0FicmV2ZWhvb2thYm92ZQ9hYnJldmVob29rYWJvdmULQWJyZXZldGlsZGULYWJyZXZldGlsZGUOQWJyZXZlZG90YmVsb3cOYWJyZXZlZG90YmVsb3cJRWRvdGJlbG93CWVkb3RiZWxvdwpFaG9va2Fib3ZlCmVob29rYWJvdmUGRXRpbGRlBmV0aWxkZRBFY2lyY3VtZmxleGFjdXRlEGVjaXJjdW1mbGV4YWN1dGUQRWNpcmN1bWZsZXhncmF2ZRBlY2lyY3VtZmxleGdyYXZlFEVjaXJjdW1mbGV4aG9va2Fib3ZlFGVjaXJjdW1mbGV4aG9va2Fib3ZlEEVjaXJjdW1mbGV4dGlsZGUQZWNpcmN1bWZsZXh0aWxkZRNFY2lyY3VtZmxleGRvdGJlbG93E2VjaXJjdW1mbGV4ZG90YmVsb3cKSWhvb2thYm92ZQppaG9va2Fib3ZlCUlkb3RiZWxvdwlpZG90YmVsb3cJT2RvdGJlbG93CW9kb3RiZWxvdwpPaG9va2Fib3ZlCm9ob29rYWJvdmUQT2NpcmN1bWZsZXhhY3V0ZRBvY2lyY3VtZmxleGFjdXRlEE9jaXJjdW1mbGV4Z3JhdmUQb2NpcmN1bWZsZXhncmF2ZRRPY2lyY3VtZmxleGhvb2thYm92ZRRvY2lyY3VtZmxleGhvb2thYm92ZRBPY2lyY3VtZmxleHRpbGRlEG9jaXJjdW1mbGV4dGlsZGUTT2NpcmN1bWZsZXhkb3RiZWxvdxNvY2lyY3VtZmxleGRvdGJlbG93Ck9ob3JuYWN1dGUKb2hvcm5hY3V0ZQpPaG9ybmdyYXZlCm9ob3JuZ3JhdmUOT2hvcm5ob29rYWJvdmUOb2hvcm5ob29rYWJvdmUKT2hvcm50aWxkZQpvaG9ybnRpbGRlDU9ob3JuZG90YmVsb3cNb2hvcm5kb3RiZWxvdwlVZG90YmVsb3cJdWRvdGJlbG93ClVob29rYWJvdmUKdWhvb2thYm92ZQpVaG9ybmFjdXRlCnVob3JuYWN1dGUKVWhvcm5ncmF2ZQp1aG9ybmdyYXZlDlVob3JuaG9va2Fib3ZlDnVob3JuaG9va2Fib3ZlClVob3JudGlsZGUKdWhvcm50aWxkZQ1VaG9ybmRvdGJlbG93DXVob3JuZG90YmVsb3cGWWdyYXZlBnlncmF2ZQlZZG90YmVsb3cJeWRvdGJlbG93Cllob29rYWJvdmUKeWhvb2thYm92ZQZZdGlsZGUGeXRpbGRlB3VuaTIwMDAHdW5pMjAwMQd1bmkyMDAyB3VuaTIwMDMHdW5pMjAwNAd1bmkyMDA1B3VuaTIwMDYHdW5pMjAwNwd1bmkyMDA4B3VuaTIwMDkHdW5pMjAwQRJ6ZXJvd2lkdGhub25qb2luZXIPemVyb3dpZHRoam9pbmVyD2xlZnR0b3JpZ2h0bWFyaw9yaWdodHRvbGVmdG1hcmsHdW5pMjAxMAd1bmkyMDExCmZpZ3VyZWRhc2gJYWZpaTAwMjA4DXVuZGVyc2NvcmVkYmwNcXVvdGVyZXZlcnNlZAd1bmkyMDJBB3VuaTIwMkIHdW5pMjAyQwd1bmkyMDJEB3VuaTIwMkUHdW5pMjAyRgZtaW51dGUGc2Vjb25kCWV4Y2xhbWRibAlyYWRpY2FsZXgHdW5pMjA1Rgd1bmkyMDZBB3VuaTIwNkIIdW5pMjA2QzsHdW5pMjA2RAd1bmkyMDZFCHVuaTIwNkY7CW5zdXBlcmlvcglhZmlpMDg5NDEGcGVzZXRhDW5ld3NoZXFlbHNpZ24IZG9uZ3NpZ24ERXVybwlhZmlpNjEyNDgJYWZpaTYxMjg5CWFmaWk2MTM1MgNPaG0JZXN0aW1hdGVkCG9uZXRoaXJkCXR3b3RoaXJkcwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQd1bmkyMjA2Cm9ydGhvZ29uYWwMaW50ZXJzZWN0aW9uC2VxdWl2YWxlbmNlBWhvdXNlDXJldmxvZ2ljYWxub3QKaW50ZWdyYWx0cAppbnRlZ3JhbGJ0CFNGMTAwMDAwCFNGMTEwMDAwCFNGMDEwMDAwCFNGMDMwMDAwCFNGMDIwMDAwCFNGMDQwMDAwCFNGMDgwMDAwCFNGMDkwMDAwCFNGMDYwMDAwCFNGMDcwMDAwCFNGMDUwMDAwCFNGNDMwMDAwCFNGMjQwMDAwCFNGNTEwMDAwCFNGNTIwMDAwCFNGMzkwMDAwCFNGMjIwMDAwCFNGMjEwMDAwCFNGMjUwMDAwCFNGNTAwMDAwCFNGNDkwMDAwCFNGMzgwMDAwCFNGMjgwMDAwCFNGMjcwMDAwCFNGMjYwMDAwCFNGMzYwMDAwCFNGMzcwMDAwCFNGNDIwMDAwCFNGMTkwMDAwCFNGMjAwMDAwCFNGMjMwMDAwCFNGNDcwMDAwCFNGNDgwMDAwCFNGNDEwMDAwCFNGNDUwMDAwCFNGNDYwMDAwCFNGNDAwMDAwCFNGNTQwMDAwCFNGNTMwMDAwCFNGNDQwMDAwB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveAZIMjIwNzMGSDE4NTQzBkgxODU1MQpmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlBkgxODUzMwlpbnZidWxsZXQJaW52Y2lyY2xlCm9wZW5idWxsZXQJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsB3VuaUUwMDAKdmF2c2hpbmRvdA1maW5hbGthZnNoZXZhDmZpbmFsa2FmcWFtYXRzCmxhbWVkaG9sYW0QbGFtZWRob2xhbWRhZ2VzaAlhZmlpNjI4ODEJYWZpaTU3MzkxC2NvbW1hYWNjZW50EHVuZGVyY29tbWFhY2NlbnQHdW5pRjAwNgd1bmlGMDA3B3VuaUYwMDgHdW5pRjAwOQd1bmlGMDBBB3VuaUYwMEIHdW5pRjAwQwd1bmlGMDBEB3VuaUYwMEUHdW5pRjAwRgd1bmlGMDEwB3VuaUYwMTEHdW5pRjAxMgd1bmlGMDEzB3VuaUYwMTQHdW5pRjAxNQd1bmlGMDE2B3VuaUYwMTcHdW5pRjAxOAd1bmlGMDE5B3VuaUYwMUEHdW5pRjAxQgd1bmlGMDFDB3VuaUYwMUQHdW5pRjAxRQd1bmlGMDFGB3VuaUYwMjAHdW5pRjAyMQd1bmlGMDIyB3VuaUYwMjMHdW5pRjAyNAd1bmlGMDI1B3VuaUYwMjYHdW5pRjAyNwd1bmlGMDI4B3VuaUYwMjkHdW5pRjAyQQd1bmlGMDJCB3VuaUYwMkMHdW5pRjAyRAd1bmlGMDJFB3VuaUYwMkYHdW5pRjAzMAd1bmlGMDMxB3VuaUZCMUQHdW5pRkIxRQd1bmlGQjFGB2FsdGF5aW4Lc2hpbnNoaW5kb3QKc2hpbnNpbmRvdBFzaGluZGFnZXNoc2hpbmRvdBBzaGluZGFnZXNoc2luZG90CWFsZWZwYXRhaAphbGVmcWFtYXRzCWFsZWZtYXBpcQliZXRkYWdlc2gLZ2ltZWxkYWdlc2gLZGFsZXRkYWdlc2gIaGVkYWdlc2gJdmF2ZGFnZXNoC3pheWluZGFnZXNoCXRldGRhZ2VzaAl5b2RkYWdlc2gOZmluYWxrYWZkYWdlc2gJa2FmZGFnZXNoC2xhbWVkZGFnZXNoCW1lbWRhZ2VzaAludW5kYWdlc2gMc2FtZWtoZGFnZXNoDWZpbmFscGVkYWdlc2gIcGVkYWdlc2gLdHNhZGlkYWdlc2gJcW9mZGFnZXNoCnJlc2hkYWdlc2gKc2hpbmRhZ2VzaAh0YXZkYWdlcwh2YXZob2xhbQdiZXRyYWZlB2thZnJhZmUGcGVyYWZlCWFsZWZsYW1lZAd1bmlGQjUxB3VuaUZCNTMHdW5pRkI1NAd1bmlGQjU1CWFmaWk2Mjk1OAlhZmlpNjI5NTYJYWZpaTUyOTU3B3VuaUZCNUIHdW5pRkI1Qwd1bmlGQjVEB3VuaUZCNUYHdW5pRkI2MAd1bmlGQjYxB3VuaUZCNjMHdW5pRkI2NAd1bmlGQjY1B3VuaUZCNjcHdW5pRkI2OAd1bmlGQjY5B3VuaUZCNkIHdW5pRkI2Qwd1bmlGQjZEB3VuaUZCNkYHdW5pRkI3MAd1bmlGQjcxB3VuaUZCNzMHdW5pRkI3NAd1bmlGQjc1B3VuaUZCNzcHdW5pRkI3OAd1bmlGQjc5CWFmaWk2Mjk2MQlhZmlpNjI5NTkJYWZpaTYyOTYwB3VuaUZCN2YHdW5pRkI4MAd1bmlGQjgxB3VuaUZCODMHdW5pRkI4NQd1bmlGQjg3B3VuaUZCODkJYWZpaTYyOTYyB3VuaUZCOEQJYWZpaTU3NTY3CWFmaWk2Mjk2NAlhZmlpNTIzMDUJYWZpaTUyMzA2CWFmaWk2Mjk2NwlhZmlpNjI5NjUJYWZpaTYyOTY2B3VuaUZCOTcHdW5pRkI5OAd1bmlGQjk5B3VuaUZCOUIHdW5pRkI5Qwd1bmlGQjlEB3VuaUZCOUYHdW5pRkJBMQd1bmlGQkE1B3VuaUZCQTYHdW5pRkJBOAd1bmlGQkE5CWFmaWk1NzQ3MAd1bmlGQkFGB3VuaUZCQjEHdW5pRkJENAd1bmlGQkQ1B3VuaUZCRDYHdW5pRkJEOAd1bmlGQkRBB3VuaUZCREMHdW5pRkJERgd1bmlGQkUxB3VuaUZCRTMHdW5pRkJFNQd1bmlGQkU2B3VuaUZCRTcJYWZpaTU3NTU1CWFmaWk1MjM2NAlhZmlpNjI4ODIJYWZpaTYyODgzCWFmaWk2Mjg4NAlhZmlpNjI4ODUJYWZpaTYyODg2CWFmaWk2NDA2MAlhZmlpNjQwNjEJYWZpaTY0MTg0CWFmaWk1MjM5OQlhZmlpNTI0MDAJYWZpaTYyNzUzCWFmaWk2Mjc1NAlhZmlpNjI3NTUJYWZpaTYyNzU2CWFmaWk2Mjc1OQlhZmlpNjI3NTcJYWZpaTYyNzU4CWFmaWk2Mjc2MAlhZmlpNjI3NjMJYWZpaTYyNzYxCWFmaWk2Mjc2MglhZmlpNjI3NjQJYWZpaTYyNzY3CWFmaWk2Mjc2NQlhZmlpNjI3NjYJYWZpaTYyNzcwCWFmaWk2Mjc2OAlhZmlpNjI3NjkJYWZpaTYyNzczCWFmaWk2Mjc3MQlhZmlpNjI3NzIJYWZpaTYyNzc2CWFmaWk2Mjc3NAlhZmlpNjI3NzUJYWZpaTYyNzc5CWFmaWk2Mjc3NwlhZmlpNjI3NzgJYWZpaTYyNzgwCWFmaWk2Mjc4MQlhZmlpNjI3ODIJYWZpaTYyNzgzCWFmaWk2Mjc4NglhZmlpNjI3ODQJYWZpaTYyNzg1CWFmaWk2Mjc4OQlhZmlpNjI3ODcJYWZpaTYyNzg4CWFmaWk2Mjc5MglhZmlpNjI3OTAJYWZpaTYyNzkxCWFmaWk2Mjc5NQlhZmlpNjI3OTMJYWZpaTYyNzk0CWFmaWk2Mjc5OAlhZmlpNjI3OTYJYWZpaTYyNzk3CWFmaWk2MjgwMQlhZmlpNjI3OTkJYWZpaTYyODAwCWFmaWk2MjgwNAlhZmlpNjI4MDIJYWZpaTYyODAzCWFmaWk2MjgwNwlhZmlpNjI4MDUJYWZpaTYyODA2CWFmaWk2MjgxMAlhZmlpNjI4MDgJYWZpaTYyODA5CWFmaWk2MjgxMwlhZmlpNjI4MTEJYWZpaTYyODEyCWFmaWk2MjgxNglhZmlpNTc0MTAJYWZpaTYyODE1CWFmaWk2MjgxOQlhZmlpNjI4MTcJYWZpaTYyODE4CWFmaWk2MjgyMglhZmlpNjI4MjAJYWZpaTYyODIxCWFmaWk2MjgyNQlhZmlpNjI4MjMJYWZpaTYyODI0CWFmaWk1NzQ0NwlhZmlpNjI4MjgJYWZpaTYyODI3CWFmaWk2MjgyOQlhZmlpNjI4MzAJYWZpaTYyODMzCWFmaWk2MjgzMQlhZmlpNjI4MzIJYWZpaTYyODM0CWFmaWk2MjgzNQlhZmlpNjI4MzYJYWZpaTYyODM3CWFmaWk2MjgzOAlhZmlpNjI4MzkJYWZpaTYyODQwCWFmaWk2Mjg0MQd1bmlGRkZDCWFmaWk1NzQ1OQlhZmlpNTc1NDMJYWZpaTU3NDk0CWFmaWk2NDI0MAlhZmlpNjQyNDEJYWZpaTYzOTU0CWFmaWk1NzM4MglhZmlpNjQyNDIJYWZpaTU3NTA0CWFmaWk1NzM2OQlhZmlpNTczNzAJYWZpaTU3MzcxCWFmaWk1NzM3MglhZmlpNTczNzMJYWZpaTU3Mzc0CWFmaWk1NzM3NQlhZmlpNTc0NzEJYWZpaTU3NDYwCWFmaWk1MjI1OAlhZmlpNjI4ODkJYWZpaTYyODg3CWFmaWk2Mjg4OAlhZmlpNjM3NTMJYWZpaTYzNzU0CWFmaWk2Mzc1OQlhZmlpNjM3NjMJYWZpaTYzNzk1CWFmaWk2Mjg5MQlhZmlpNjM4MDgJYWZpaTYyOTM4CWFmaWk2MzgxMAlhZmlpNjI5NDIJYWZpaTYyOTQ3CWFmaWk2MzgxMwlhZmlpNjM4MjMJYWZpaTYzODI0CWFmaWk2MzgzMwlhZmlpNjM4NDQJYWZpaTYzODQ2CWFmaWk2Mzg0OQlhZmlpNjM5MDQJYWZpaTYzOTA1CWFmaWk2MzkwNglhZmlpNjM5MDgJYWZpaTYzOTEwCWFmaWk2MzkxMglhZmlpNjI5MjcJYWZpaTYzOTQxCWFmaWk2MjkzOQlhZmlpNjM5NDMJYWZpaTYyOTQzCWFmaWk2Mjk0NglhZmlpNjM5NDYJYWZpaTYyOTUxCWFmaWk2Mzk0OAlhZmlpNjI5NTMJYWZpaTYzOTUwCWFmaWk2Mzk1MQlhZmlpNjM5NTIJYWZpaTYzOTUzCWFmaWk2Mzk1NglhZmlpNjM5NTgJYWZpaTYzOTU5CWFmaWk2Mzk2MAlhZmlpNjM5NjEJYWZpaTY0MDQ2CWFmaWk2NDA1OAlhZmlpNjQwNTkJYWZpaTYyOTQ1CWdseXBoMTAyMQthZmlpNTc1NDMtMgthZmlpNTc0NTQtMgthZmlpNTc0NTEtMglnbHlwaDEwMjUJZ2x5cGgxMDI2C2FmaWk1NzQ3MS0yC2FmaWk1NzQ1OC0yC2FmaWk1NzQ1Ny0yC2FmaWk1NzQ5NC0yC2FmaWk1NzQ1OS0yC2FmaWk1NzQ1NS0yC2FmaWk1NzQ1Mi0yCWdseXBoMTAzNAlnbHlwaDEwMzUJZ2x5cGgxMDM2C2FmaWk2Mjg4NC0yC2FmaWk2Mjg4MS0yC2FmaWk2Mjg4Ni0yC2FmaWk2Mjg4My0yC2FmaWk2Mjg4NS0yC2FmaWk2Mjg4Mi0yC2FmaWk1NzUwNC0yC2FmaWk1NzQ1Ni0yC2FmaWk1NzQ1My0yCWdseXBoMTA0NglnbHlwaDEwNDcLYWZpaTU3NTQzLTMLYWZpaTU3NDU0LTMLYWZpaTU3NDUxLTMJZ2x5cGgxMDUxCWdseXBoMTA1MgthZmlpNTc0NzEtMwthZmlpNTc0NTgtMwthZmlpNTc0NTctMwthZmlpNTc0OTQtMwthZmlpNTc0NTktMwthZmlpNTc0NTUtMwthZmlpNTc0NTItMwlnbHlwaDEwNjAJZ2x5cGgxMDYxCWdseXBoMTA2MgthZmlpNjI4ODQtMwthZmlpNjI4ODEtMwthZmlpNjI4ODYtMwthZmlpNjI4ODMtMwthZmlpNjI4ODUtMwthZmlpNjI4ODItMwthZmlpNTc1MDQtMwthZmlpNTc0NTYtMwthZmlpNTc0NTMtMwlnbHlwaDEwNzIJZ2x5cGgxMDczC2FmaWk1NzU0My00C2FmaWk1NzQ1NC00C2FmaWk1NzQ1MS00CWdseXBoMTA3NwlnbHlwaDEwNzgLYWZpaTU3NDcxLTQLYWZpaTU3NDU4LTQLYWZpaTU3NDU3LTQLYWZpaTU3NDk0LTQLYWZpaTU3NDU5LTQLYWZpaTU3NDU1LTQLYWZpaTU3NDUyLTQJZ2x5cGgxMDg2CWdseXBoMTA4NwlnbHlwaDEwODgLYWZpaTYyODg0LTQLYWZpaTYyODgxLTQLYWZpaTYyODg2LTQLYWZpaTYyODgzLTQLYWZpaTYyODg1LTQLYWZpaTYyODgyLTQLYWZpaTU3NTA0LTQLYWZpaTU3NDU2LTQLYWZpaTU3NDUzLTQJZ2x5cGgxMDk4CWdseXBoMTA5OQlnbHlwaDExMDAJZ2x5cGgxMTAxCWdseXBoMTEwMglnbHlwaDExMDMJZ2x5cGgxMTA0CWdseXBoMTEwNQlnbHlwaDExMDYJZ2x5cGgxMTA3CWdseXBoMTEwOAlnbHlwaDExMDkJZ2x5cGgxMTEwCWdseXBoMTExMQlnbHlwaDExMTIJZ2x5cGgxMTEzCWdseXBoMTExNAlnbHlwaDExMTUJZ2x5cGgxMTE2CWdseXBoMTExNwlnbHlwaDExMTgJZ2x5cGgxMTE5CWdseXBoMTEyMAlnbHlwaDExMjEJZ2x5cGgxMTIyCWdseXBoMTEyMwlnbHlwaDExMjQJZ2x5cGgxMTI1CWdseXBoMTEyNgthZmlpNTc0NDAtMgthZmlpNTc0NDAtMwthZmlpNTc0NDAtNAlnbHlwaDExMzQJZ2x5cGgxMTM1CWdseXBoMTEzNglnbHlwaDExNDcJZ2x5cGgxMTQ4CWdseXBoMTE1NAlnbHlwaDExNTUJZ2x5cGgxMjkyCWdseXBoMTI5MwlnbHlwaDEyOTQJZ2x5cGgxMjk1CWdseXBoMTMyMQlnbHlwaDEzMjIJZ2x5cGgxMzIzCWdseXBoMTMyNQlnbHlwaDEzMjYJZ2x5cGgxMzI3CWdseXBoMTMyOAlnbHlwaDEzMjkJZ2x5cGgxMzMwCWdseXBoMTMzMQlnbHlwaDEzMzIJZ2x5cGgxMzMzCWdseXBoMTMzNAlnbHlwaDEzMzUJZ2x5cGgxMzQzCWdseXBoMTM0NQdnbHlwaDQ3CWdseXBoMTM0OQlnbHlwaDEzNTEFZ2x5cGgJZ2x5cGgxMzY3CWdseXBoMTM2OAlnbHlwaDEzNjkJZ2x5cGgxMzcxCWdseXBoMTM3MglnbHlwaDEzNzMJZ2x5cGgxMzgzCWdseXBoMTM4NAlnbHlwaDEzODUJZ2x5cGgxMzg3CWdseXBoMTM4OAlnbHlwaDEzODkJZ2x5cGgxMzk5CWdseXBoMTQwMAlnbHlwaDE0MDEJZ2x5cGgxNDA5CWdseXBoMTQxMQlnbHlwaDE0MTMJZ2x5cGgxNDIxCWdseXBoMTQyMwlnbHlwaDE0MjYJZ2x5cGgxNDI5CWdseXBoMTQzMQlnbHlwaDE0MzMJZ2x5cGgxNDM1CWdseXBoMTQzNwlnbHlwaDE0MzkJZ2x5cGgxNDQxCWdseXBoMTQ0MglnbHlwaDE0NDMJZ2x5cGgxNDQ1CWdseXBoMTQ0NglnbHlwaDE0NDcJZ2x5cGgxNDQ5CWdseXBoMTQ1MAlnbHlwaDE0NTEJZ2x5cGgxNDUzCWdseXBoMTQ1NAlnbHlwaDE0NTUJZ2x5cGgxNDU3CWdseXBoMTQ1OAlnbHlwaDE0NTkJZ2x5cGgxNDYxCWdseXBoMTQ2MwlnbHlwaDE0NjQJZ2x5cGgxNDY1CWdseXBoMTQ2OAlnbHlwaDE0NjkJZ2x5cGgxNDcwCWdseXBoMTQ3MglnbHlwaDE0NzMJZ2x5cGgxNDc0CWdseXBoMTQ4MAlnbHlwaDE0ODEJZ2x5cGgxNDgyCWdseXBoMTQ4OAlnbHlwaDE0OTAJZ2x5cGgxNDkyCWdseXBoMTQ5MwlnbHlwaDE0OTQJZ2x5cGgxNDk2CWdseXBoMTQ5NwlnbHlwaDE0OTgJZ2x5cGgxNTAwCWdseXBoMTUwMQlnbHlwaDE1MDIJZ2x5cGgxNTA4CWdseXBoMTUwOQlnbHlwaDE1MTAJZ2x5cGgxNTEyCWdseXBoMTUxMwlnbHlwaDE1MTQJZ2x5cGgxNTIwCWdseXBoMTUyMQlnbHlwaDE1MjIJZ2x5cGgxNTI4CWdseXBoMTUyOQlnbHlwaDE1MzAJZ2x5cGgxNTMyCWdseXBoMTUzMwlnbHlwaDE1MzQJZ2x5cGgxNTM2CWdseXBoMTUzNwlnbHlwaDE1MzgJZ2x5cGgxNTQwCWdseXBoMTU0MQlnbHlwaDE1NDIJZ2x5cGgxNTQ0CWdseXBoMTU0NQlnbHlwaDE1NDYJZ2x5cGgxNTQ4CWdseXBoMTU0OQlnbHlwaDE1NTAJZ2x5cGgxNTU2CWdseXBoMTU1NwlnbHlwaDE1NTgJZ2x5cGgxNTYwCWdseXBoMTU2MglnbHlwaDE1NjMJZ2x5cGgxNTY0CWdseXBoMTU3MQlnbHlwaDE1ODMJZ2x5cGgxNTg3CWdseXBoMTU4OQlnbHlwaDE1OTAJZ2x5cGgxNTkxCWdseXBoMTU5MwlnbHlwaDE1OTkJZ2x5cGgxNjI5CWdseXBoMTYzMAlnbHlwaDE2MzEJZ2x5cGgxNjMzCWdseXBoMTYzNAlnbHlwaDE2MzUJZ2x5cGgxNjM3CWdseXBoMTYzOAlnbHlwaDE2MzkJZ2x5cGgxNjQ1CWdseXBoMTY0NglnbHlwaDE2NDcJZ2x5cGgxNjQ4CWdseXBoMTY0OQlnbHlwaDE2NTAJZ2x5cGgxNjUxCWdseXBoMTY1NAlnbHlwaDE2NTYJZ2x5cGgxNjU3CWdseXBoMTY1OAlnbHlwaDE2NTkJZ2x5cGgxNjYwCWdseXBoMTY2MQlnbHlwaDE2NjIJZ2x5cGgxNjYzCWdseXBoMTY2NAlnbHlwaDE2NjUJZ2x5cGgxNjY2CWdseXBoMTY2NwlnbHlwaDE2NjgJZ2x5cGgxNjY5CWdseXBoMTY3MAlnbHlwaDE2NzEJZ2x5cGgxNjcyCWds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) format('truetype'); +} diff --git a/frontend/delta/less/web/mixin.less b/frontend/delta/less/web/mixin.less new file mode 100644 index 0000000..2728079 --- a/dev/null +++ b/frontend/delta/less/web/mixin.less @@ -0,0 +1,87 @@ +.border-radius (@radius) { + border-radius: @radius; + -moz-border-radius: @radius; + -webkit-border-radius: @radius; +} + +.font-feature-settings(@foo, @bar) { + -webkit-font-feature-settings:"@foo","@bar"; + -moz-font-feature-settings:"@foo=1, @bar=1"; + -moz-font-feature-settings:"@foo","@bar"; + -ms-font-feature-settings:"@foo","@bar"; + -o-font-feature-settings:"@foo","@bar"; + font-feature-settings:"@foo","@bar"; +} + +.icon-font() { + font-family: 'clipperz-icons'; + .font-feature-settings("liga", "dlig"); + -webkit-font-smoothing: antialiased; + text-rendering:optimizeLegibility; +} + +.password-font() { + font-family: 'clipperz-password'; + -webkit-font-smoothing: antialiased; + text-rendering:optimizeLegibility; +} + +.animation (@animation, @duration, @fill-mode:none, @iteration-count:1) { + -webkit-animation-name: @animation; + -webkit-animation-duration: @duration; + -webkit-animation-fill-mode: @fill-mode; + -webkit-animation-iteration-count: @iteration-count; + + -moz-animation-name: @animation; + -moz-animation-duration: @duration; + -moz-animation-fill-mode: @fill-mode; + -moz-animation-iteration-count: @iteration-count; + + -ms-animation-name: @animation; + -ms-animation-duration: @duration; + -ms-animation-fill-mode: @fill-mode; + -ms-animation-iteration-count: @iteration-count; + + -o-animation-name: @animation; + -o-animation-duration: @duration; + -o-animation-fill-mode: @fill-mode; + -o-animation-iteration-count: @iteration-count; + + animation-name: @animation; + animation-duration: @duration; + animation-fill-mode: @fill-mode; + animation-iteration-count: @iteration-count; +} + +.transition (@item, @time, @function) { + -webkit-transition: @item @time @function; + -moz-transition: @item @time @function; + -o-transition: @item @time @function; + -ms-transition: @item @time @function; + transition: @item @time @function; +} + +.transform (@rotateAngle, @translateX, @translateY) { + -webkit-transform: rotate( @rotateAngle) translate(@translateX, @translateY); + -moz-transform: rotate( @rotateAngle) translate(@translateX, @translateY); + -ms-transform: rotate( @rotateAngle) translate(@translateX, @translateY); + -o-transform: rotate( @rotateAngle) translate(@translateX, @translateY); + transform: rotate( @rotateAngle) translate(@translateX, @translateY); +} + + +.animation-delay (@delay) { + -webkit-animation-delay: @delay; + -moz-animation-delay: @delay; + -ms-animation-delay: @delay; + -o-animation-delay: @delay; + animation-delay: @delay; +} + +.box-shadow (@xOffset, @yOffset, @size, @color) { + -webkit-box-shadow: @xOffset @yOffset @size @color; + -moz-box-shadow: @xOffset @yOffset @size @color; + -ms-box-shadow: @xOffset @yOffset @size @color; + -o-box-shadow: @xOffset @yOffset @size @color; + box-shadow: @xOffset @yOffset @size @color; +} diff --git a/frontend/delta/less/web/overlay.less b/frontend/delta/less/web/overlay.less new file mode 100644 index 0000000..bac3ca3 --- a/dev/null +++ b/frontend/delta/less/web/overlay.less @@ -0,0 +1,157 @@ +@import "mixin"; + +div.overlay { + z-index: 99999; + position: fixed; + top: 50%; + left: 50%; + width: 200px; + height: 200px; + margin-left: -100px; + margin-top: -100px; + background: rgba(0,0,0,0.8); + .border-radius(20px); + + .title { + color: #FFF; + font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-weight: bold; + text-align: center; + display: block; + font-size: 26px; + position: absolute; + bottom: 30px; + left: 0; + width: 100%; + } + + .icon { + position: relative; + display: inline-block; + width: 128px; + height: 128px; + top: 40%; + left: 50%; + margin-left: -64px; + margin-top: -64px; + + text-align: center; + vertical-align: middle; + + .icon-font(); + font-size: 96pt; + color: white; + text-shadow: none; + } + + &.ios-overlay-show { + .animation(ios-overlay-show, 750ms); + } + + + &.ios-overlay-hide { + .animation(ios-overlay-hide, 750ms, forwards); + } + + // http://37signals.com/svn/posts/2577-loading-spinner-animation-using-css-and-webkit + div.spinner { + position: relative; + width: 100px; + height: 100px; + left: 50% !important; + top: 40% !important; + + margin-left: -50px; + margin-top: -50px; + +// display: inline-block; + display: block; + + div { + width: 12%; + height: 26%; + background: #ffffff; + position: absolute; + left: 44.5%; + top: 37%; + opacity: 0; + .animation(fade, 1s, linear, infinite); + .border-radius(50px); + .box-shadow(0, 0, 3px, rgba(0,0,0,0.2)); + } + + div.bar01 {.transform( 0deg, 0, -142%); .animation-delay(-0.00000s);} + div.bar02 {.transform( 30deg, 0, -142%); .animation-delay(-0.91670s);} + div.bar03 {.transform( 60deg, 0, -142%); .animation-delay(-0.83300s);} + div.bar04 {.transform( 90deg, 0, -142%); .animation-delay(-0.75000s);} + div.bar05 {.transform(120deg, 0, -142%); .animation-delay(-0.66700s);} + div.bar06 {.transform(150deg, 0, -142%); .animation-delay(-0.58330s);} + div.bar07 {.transform(180deg, 0, -142%); .animation-delay(-0.50000s);} + div.bar08 {.transform(210deg, 0, -142%); .animation-delay(-0.41667s);} + div.bar09 {.transform(240deg, 0, -142%); .animation-delay(-0.33300s);} + div.bar10 {.transform(270deg, 0, -142%); .animation-delay(-0.25000s);} + div.bar11 {.transform(300deg, 0, -142%); .animation-delay(-0.16670s);} + div.bar12 {.transform(330deg, 0, -142%); .animation-delay(-0.08330s);} + + @-webkit-keyframes fade { + from {opacity: 1;} + to {opacity: 0.25;} + } + @-o-keyframes fade { + from {opacity: 1;} + to {opacity: 0.25;} + } + @keyframes fade { + from {opacity: 1;} + to {opacity: 0.25;} + } + } +} + +//======================================================== + +@-webkit-keyframes ios-overlay-show { + 0% { opacity: 0; } + 100% { opacity: 1; } +} +@-moz-keyframes ios-overlay-show { + 0% { opacity: 0; } + 100% { opacity: 1; } +} +@-ms-keyframes ios-overlay-show { + 0% { opacity: 0; } + 100% { opacity: 1; } +} +@-o-keyframes ios-overlay-show { + 0% { opacity: 0; } + 100% { opacity: 1; } +} +@keyframes ios-overlay-show { + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +//-------------------------------------------------------- + +@-webkit-keyframes ios-overlay-hide { + 0% { opacity: 1; } + 100% { opacity: 0; } +} +@-moz-keyframes ios-overlay-hide { + 0% { opacity: 1; } + 100% { opacity: 0; } +} +@-ms-keyframes ios-overlay-hide { + 0% { opacity: 1; } + 100% { opacity: 0; } +} +@-o-keyframes ios-overlay-hide { + 0% { opacity: 1; } + 100% { opacity: 0; } +} +@keyframes ios-overlay-hide { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +//======================================================== diff --git a/frontend/delta/less/web/style.less b/frontend/delta/less/web/style.less new file mode 100644 index 0000000..05ae794 --- a/dev/null +++ b/frontend/delta/less/web/style.less @@ -0,0 +1,730 @@ +// http://ethanschoonover.com/solarized +@solarize-Background-15: #002b36; +@solarize-Background-20: #073642; + +@solarize-Content-45: #586375; +@solarize-Content-50: #657b83; +@solarize-Content-60: #839496; +@solarize-Content-65: #93a1a1; + +@solarize-Background-92: #eee8d5; +@solarize-Background-97: #fdf6e3; + +@solarize-Accent-Yellow: #b58900; +@solarize-Accent-Orange: #cb4b16; +@solarize-Accent-Red: #dc322f; +@solarize-Accent-Magenta: #d33682; +@solarize-Accent-Violet: #6c71c4; +@solarize-Accent-Blue: #268bd2; +@solarize-Accent-Cyan: #2aa198; +@solarize-Accent-Green: #859900; + +@clipperz-orange: #ff9900; +@clipperz-blue: #1863a1; +@terminal-green: #23ff18; + +@text-color: @solarize-Content-50; +@background-color: #f8f8f8; + +//------------------------------------------------------------------ + +@side-margin: 10px; + +//================================================================== +/* + # box-sizing: { content-box | border-box | inherit }; + + # css flex box (also with LESSCSS mixin): + - https://github.com/ProLoser/Flexbox.less; + - https://gist.github.com/jayj/4012969 + +*/ +//================================================================== + +body { + font-family: "Source Code Pro"; + background: @background-color url('data:image/png;base64,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') top left; + font-size: 18pt; +} + +a { + cursor: pointer; +} + +.button { + min-height: 48px; + min-width: 48px; + + color: white; + font-size: 100%; + font-weight: 700; + border: 0px; + + padding-left: 20px; + padding-right: 20px; + + background-color: @solarize-Accent-Red; + .transition(background-color, 0.2s, linear); +// .transition(all, 0.2s, linear); + + &:hover { + }; + + &:disabled { + background-color: #c0c0c0; + &:hover { + }; + } +} + +div.page { + padding: 0px; + margin: 0px; + width: 100%; +// text-align: center; + + div.header { + h1 { + font-size: 36pt; + font-weight: 900; + color: @clipperz-orange; + margin: 0px @side-margin; + } + } + + div.content { + margin: 0px @side-margin; + } +} + + + +@Loading_outer-color: @solarize-Accent-Violet; +@Loading_inner-color: lighten(@Loading_outer-color, 30%); + +@Loading_h1-color: lighten(@Loading_inner-color, 70%); +@Loading_h3-color: @Loading_outer-color; + +#loadingPage { + background-image: -ms-radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* IE10 */ + background-image: -moz-radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* Mozilla Firefox */ + background-image: -o-radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* Opera */ + background-image: -webkit-radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* Webkit (Chrome 11+) */ + background-image: radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* Proposed W3C Markup */ + background-image: -webkit-gradient(radial, center center, 0, center center, 495, color-stop(0, @Loading_inner-color), color-stop(1, @Loading_outer-color)); /* Webkit (Safari/Chrome 10) */ + + div { + vertical-align: middle; + width: 100%; + text-align: center; + + h1 { + font-size: 40pt; + color: @Loading_h1-color; + margin-top: 5%; + margin-bottom: 5px; + } + + h3 { + font-size: 18pt; + color: @Loading_h3-color; + margin: 0px; + } + } +} + +#loginPage { + form { + label { + display: none; + } + input { + display: block; + border: 1px solid @solarize-Background-92; + .border-radius(6px); + padding: 5px; + margin-top: 5px; + margin-bottom: 10px; + font-size: 100%; + box-shadow:inset 0 0 0; + } + button { + } + } + + .registrationLink { + color: @solarize-Accent-Orange; + background: none; + &:before { + content: "> "; + }; + + a { + color: @solarize-Accent-Orange; + } + } +} + +#registrationPage { + + label { + display: none; + } + input { + display: block; + border: 1px solid @solarize-Background-92; + .border-radius(6px); + padding: 5px; + margin-top: 5px; + margin-bottom: 10px; + font-size: 100%; + box-shadow:inset 0 0 0; + } + + + .steps { + .step { + display: none; + + &.center { + display: block; + } + + h1 { + color: @solarize-Accent-Blue; + font-size: 24pt; + font-weight: 700; + margin: 0px; + } + p { + color: @solarize-Content-50; + font-size: 14pt; + font-weight: 100; + margin: 0px; + } + + &.TERMS_OF_SERVICE { + .checkboxBlock { + margin-top: 10px; + margin-bottom: 10px; + clear: both; + + input { + display: block; + float: left; + margin: 5px; + width: 30px; + } + + p { + font-size: 12pt; + font-weight: 500; + display: block; + + a { + color: @solarize-Accent-Red; + } + } + } + } + .stepIndex { + text-align: center; + .stepIndexItem { + font-weight: 900; + font-size: 28pt; + display: inline; + color: lightgrey; + + &.center { + color: gray; + } + } + } + .buttons { + text-align: center; + margin-top: 10px; + + .button { + margin: 10px; + text-align: center; + vertical-align: middle; + display: inline-block; + width: 80px; + + font-weight: 900; + line-height: 45px; + font-size: 24px; + + &.back { + + background-color: lightgrey; + +// &.step_-1 { +// visibility: hidden; +// } + } + + &.disabled { + background-color: #c0c0c0; + cursor: default; + } + } + } + } + } +} + +#cardListPage { + + >div { +// background-color: purple; + } + + .header { + border-bottom: 2px solid @solarize-Accent-Cyan; + display: inline-block; + width: 100%; + margin-bottom: 0px; + height: 46px; + + a.account { + .icon-font(); + color: @clipperz-orange; + display: block; + float: left; + + font-size: 28pt; + padding-top: 3px; + padding-left: 15px; + padding-right: 15px; + vertical-align: top; + } + + .features { + text-align: right; + display: block; + float: right; + padding-right: 5px; + height: 100%; + + a { + .icon-font(); + color: @solarize-Accent-Cyan; + display: inline-block; + font-size: 28pt; + padding-left: 10px; + padding-right: 10px; + height: 100%; + line-height: 33pt; + + &.selected { + background-color: @solarize-Accent-Cyan; + color: white; + } + } + } + } + + .searchBox { + background-color: @solarize-Accent-Cyan; + width: 100%; +// height: 30px; + clear: both; + + >div { + padding: 4px; + padding-top: 2px; + } + + input { + font-size: 14pt; + display: block; + border: 1px solid @solarize-Background-92; + .border-radius(6px); + box-shadow:inset 0 0 0; + width: 100%; + margin: 0px; + color: @solarize-Content-50; + } + } + + .content.cardList { + margin-left: 0px; + margin-right: 0px; + + .listItem { + min-height: 48px; +// line-height: 35pt; + line-height: 24pt; + cursor: pointer; + display: inline-table; + width: 100%; + + + &:nth-child(odd) { + background-color: @solarize-Background-92; + +// &:hover { +// background-color: @solarize-Background-97; +// }; + } + + &:nth-child(even) { +// &:hover { +// background-color: @solarize-Background-97; +// }; + } + + .labelWrapper { + float: left; + width: 100%; + + span { + margin: 0px; + margin-left: 42px; + margin-right: 30px; + display: block; + padding-top: 7px; + padding-bottom: 7px; + + color: @solarize-Accent-Red; + font-weight: 400; + } + } + + .faviconWrapper { + float: left; + width: 42px; + margin-left: -100%; + + .favicon { + width: 32px; + height: 32px; + padding: 8px 5px; + vertical-align: text-bottom; + } + } + + .detailLinkWrapper { + float: left; + width: 30px; + margin-left: -30px; + text-align: center; + padding-top: 7px; + + span { + color: @solarize-Accent-Cyan; + .icon-font(); + } + } + } + } +} + +#cardDetailPage { + .header { + border-bottom: 2px solid @solarize-Accent-Cyan; +// display: inline-table; + width: 100%; + margin-bottom: 0px; + height: 46px; + + .backWrapper { + float: left; + width: 48px; + margin-left: -100%; + + .back { + display: inline-block; + background-color: @solarize-Accent-Cyan; + padding: 11px; + box-sizing: border-box; + .icon-font(); + } + } + + .titleWrapper { + float: left; + width: 100%; + height: 48px; + overflow: hidden; + + .title { + margin-left: 48px; + margin-right: 48px; + display: inline-block; + + padding-left: 10px; + color: @solarize-Accent-Red; + font-weight: 400; + line-height: 36pt; + white-space: nowrap; + } + } + + .starWrapper { + float: left; + width: 48px; + margin-left: -48px; + text-align: center; + + .star { + font-size: 18pt; + line-height: 35pt; + color: @solarize-Accent-Magenta; + .icon-font(); + } + } + } + + .content { + overflow: scroll; + margin: 0px; + + .fields { + .listItem { + display: inline-table; + width: 100%; + font-size: 14pt; + border-bottom: 1px solid @solarize-Background-92; + + .fieldWrapper { + width: 100%; + float: left; + + .fieldInnerWrapper { + padding: 3px 10px 3px 10px; + margin: 0px; + margin-right: 48px; + display: block; + + .labelWrapper { + display: block; + .label { + color: @solarize-Accent-Orange; + font-size: 10pt; + font-weight: 300; + } + } + .valueWrapper { + display: block; + box-sizing: border-box; + + .value { + color: @solarize-Accent-Blue; + font-weight: 500; + + &.PASSWORD { + .password-font(); + font-size: 28pt; + } + } + } + } + } + .actionWrapper { + float: left; + width: 48px; + margin-left: -48px; + text-align: center; + + div { + font-size: 18pt; + line-height: 35pt; + color: @solarize-Accent-Cyan; + .icon-font(); + } + } + } + } + + .directLogins { +// @solarize-Accent-Yellow: #b58900; +// @solarize-Accent-Orange: #cb4b16; +// @solarize-Accent-Red: #dc322f; +// @solarize-Accent-Magenta: #d33682; +// @solarize-Accent-Violet: #6c71c4; +// @solarize-Accent-Blue: #268bd2; +// @solarize-Accent-Cyan: #2aa198; +// @solarize-Accent-Green: #859900; + .listItem { + min-height: 47px; + line-height: 35pt; + cursor: pointer; + display: inline-table; + width: 100%; + background-color: @solarize-Accent-Green; + border-bottom: 1px solid @solarize-Background-92; + font-size: 14pt; + + .labelWrapper { + float: left; + width: 100%; + + span { + margin: 0px; + margin-left: 42px; + margin-right: 48px; + display: block; + +// color: @solarize-Accent-Red; + color: white; + font-weight: 500; + } + } + + .faviconWrapper { + float: left; + width: 42px; + margin-left: -100%; + + .favicon { + width: 32px; + height: 32px; + padding: 8px 5px; + vertical-align: text-bottom; + } + } + + .directLoginLinkWrapper { + float: left; + width: 48px; + margin-left: -48px; + text-align: center; + + span { + font-size: 18pt; + color: white; + .icon-font(); + } + } + } + + } + } + + .footer { + .icon-font(); + color: white; + width: 100%; + position: fixed; + bottom: 0px; + display: none; + +// bottom: -100px; +// display: none; + + a { + display: inline-block; + text-align: center; + padding: 11px; + box-sizing: border-box; + + + &.cancel { + width: 33%; + background-color: @solarize-Accent-Red; + } + + &.save { + width: 67%; + background-color: @solarize-Accent-Green; + } + } + } +} + + +.icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { -moz-transform: rotate(0deg); } + 100% { -moz-transform: rotate(359deg); } +} +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(359deg); } +} +@-o-keyframes spin { + 0% { -o-transform: rotate(0deg); } + 100% { -o-transform: rotate(359deg); } +} +@-ms-keyframes spin { + 0% { -ms-transform: rotate(0deg); } + 100% { -ms-transform: rotate(359deg); } +} +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(359deg); } +} + + + +/* +================================== + +THREE COLUMN LAYOUT (left/right fixed size; center elastic) + +------------- ~~~~~~ ------------ +| | | | +| a | b | c | +| | | | +------------- ~~~~~~ ------------ + +================================== + +.listItem + .bWrapper + .b + .aWrapper + .a + .cWrapper + .c + +================================== + +.listItem { + + display: inline-table; + width: 100%; + + .aWrapper { + float: left; + width: <a.width>px; + margin-left: -100%; + + .a { + + } + } + + .bWrapper { + float: left; + width: 100%; + + + .b { + margin: 0px; + margin-left: <a.width>px; + margin-right: <c.width>px; + display: block; + } + } + + .cWrapper { + float: left; + width: <c.width>px; + margin-left: -<c.width>px; + + .c { + + } + } + +} +*/
\ No newline at end of file diff --git a/frontend/delta/properties/creditsAndCopyrights.txt b/frontend/delta/properties/creditsAndCopyrights.txt new file mode 100644 index 0000000..f4722c1 --- a/dev/null +++ b/frontend/delta/properties/creditsAndCopyrights.txt @@ -0,0 +1,569 @@ +@clipperz.license@ + +=============================================================================== + + This application is build using also the following libraries + +# MochiKit (http://www.mochikit.com) + - repository: @mochikit.repository@ (version: @mochikit.version@ - commit: @mochikit.commit@) + + * Software licence: https://github.com/mochi/mochikit/blob/master/LICENSE.txt + + | MochiKit is dual-licensed software. It is available under the terms of the + | MIT License, or the Academic Free License version 2.1. The full text of + | each license is included below. + | + | The MochiKit.Style.getElementPosition function is adapted from + | YAHOO.util.Dom.getXY v0.9.0. which is copyrighted by Yahoo! Inc. and + | licensed under the BSD license also reproduced in full below. + | + | MIT License + | =========== + | + | Copyright (c) 2005 Bob Ippolito. All rights reserved. + | + | Permission is hereby granted, free of charge, to any person obtaining a copy + | of this software and associated documentation files (the "Software"), to deal + | in the Software without restriction, including without limitation the rights + | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + | copies of the Software, and to permit persons to whom the Software is furnished + | to do so, subject to the following conditions: + | + | The above copyright notice and this permission notice shall be included in all + | copies or substantial portions of the Software. + | + | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + | + | + | Academic Free License v. 2.1 + | ============================ + | + | Copyright (c) 2005 Bob Ippolito. All rights reserved. + | + | This Academic Free License (the "License") applies to any original work of + | authorship (the "Original Work") whose owner (the "Licensor") has placed the + | following notice immediately following the copyright notice for the Original Work: + | + | Licensed under the Academic Free License version 2.1 + | + | 1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, + | non-exclusive, perpetual, sublicenseable license to do the following: + | + | a) to reproduce the Original Work in copies; + | b) to prepare derivative works ("Derivative Works") based upon the Original Work; + | c) to distribute copies of the Original Work and Derivative Works to the public; + | d) to perform the Original Work publicly; and + | e) to display the Original Work publicly. + | + | 2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, + | non-exclusive, perpetual, sublicenseable license, under patent claims owned or + | controlled by the Licensor that are embodied in the Original Work as furnished by + | the Licensor, to make, use, sell and offer for sale the Original Work and Derivative + | Works. + | + | 3) Grant of Source Code License. The term "Source Code" means the preferred form of + | the Original Work for making modifications to it and all available documentation + | describing how to modify the Original Work. Licensor hereby agrees to provide a + | machine-readable copy of the Source Code of the Original Work along with each copy + | of the Original Work that Licensor distributes. Licensor reserves the right to satisfy + | this obligation by placing a machine-readable copy of the Source Code in an information + | repository reasonably calculated to permit inexpensive and convenient access by You for + | as long as Licensor continues to distribute the Original Work, and by publishing the + | address of that information repository in a notice immediately following the copyright + | notice that applies to the Original Work. + | + | 4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any + | contributors to the Original Work, nor any of their trademarks or service marks, may + | be used to endorse or promote products derived from this Original Work without express + | prior written permission of the Licensor. Nothing in this License shall be deemed to + | grant any rights to trademarks, copyrights, patents, trade secrets or any other + | intellectual property of Licensor except as expressly stated herein. No patent license + | is granted to make, use, sell or offer to sell embodiments of any patent claims other + | than the licensed claims defined in Section 2. No right is granted to the trademarks + | of Licensor even if such marks are included in the Original Work. Nothing in this + | License shall be interpreted to prohibit Licensor from licensing under different terms + | from this License any Original Work that Licensor otherwise would have a right to license. + | + | 5) This section intentionally omitted. + | + | 6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You + | create, all copyright, patent or trademark notices from the Source Code of the Original + | Work, as well as any notices of licensing and any descriptive text identified therein as + | an "Attribution Notice." You must cause the Source Code for any Derivative Works that You + | create to carry a prominent Attribution Notice reasonably calculated to inform recipients + | that You have modified the Original Work. + | + | 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright + | in and to the Original Work and the patent rights granted herein by Licensor are owned + | by the Licensor or are sublicensed to You under the terms of this License with the + | permission of the contributor(s) of those copyrights and patent rights. Except as expressly + | stated in the immediately proceeding sentence, the Original Work is provided under this + | License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, + | without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A + | PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. + | This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to + | Original Work is granted hereunder except under this disclaimer. + | + | 8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort + | (including negligence), contract, or otherwise, shall the Licensor be liable to any person + | for any direct, indirect, special, incidental, or consequential damages of any character + | arising as a result of this License or the use of the Original Work including, without + | limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, + | or any and all other commercial damages or losses. This limitation of liability shall not + | apply to liability for death or personal injury resulting from Licensor's negligence to + | the extent applicable law prohibits such limitation. Some jurisdictions do not allow the + | exclusion or limitation of incidental or consequential damages, so this exclusion and + | limitation may not apply to You. + | + | 9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative + | Work, You must make a reasonable effort under the circumstances to obtain the express + | assent of recipients to the terms of this License. Nothing else but this License (or + | another written agreement between Licensor and You) grants You permission to create + | Derivative Works based upon the Original Work or to exercise any of the rights granted in + | Section 1 herein, and any attempt to do so except under the terms of this License (or + | another written agreement between Licensor and You) is expressly prohibited by U.S. copyright + | law, the equivalent laws of other countries, and by international treaty. Therefore, by + | exercising any of the rights granted to You in Section 1 herein, You indicate Your + | acceptance of this License and all of its terms and conditions. + | + | 10) Termination for Patent Action. This License shall terminate automatically and You may no + | longer exercise any of the rights granted to You by this License as of the date You + | commence an action, including a cross-claim or counterclaim, against Licensor or any + | licensee alleging that the Original Work infringes a patent. This termination provision + | shall not apply for an action alleging patent infringement by combinations of the Original + | Work with other software or hardware. + | + | 11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be + | brought only in the courts of a jurisdiction wherein the Licensor resides or in which + | Licensor conducts its primary business, and under the laws of that jurisdiction excluding + | its conflict-of-law provisions. The application of the United Nations Convention on Contracts + | for the International Sale of Goods is expressly excluded. Any use of the Original Work + | outside the scope of this License or after its termination shall be subject to the + | requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent + | laws of other countries, and international treaty. This section shall survive the termination + | of this License. + | + | 12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages + | relating thereto, the prevailing party shall be entitled to recover its costs and expenses, + | including, without limitation, reasonable attorneys' fees and costs incurred in connection + | with such action, including any appeal of such action. This section shall survive the + | termination of this License. + | + | 13) Miscellaneous. This License represents the complete agreement concerning the subject matter + | hereof. If any provision of this License is held to be unenforceable, such provision shall + | be reformed only to the extent necessary to make it enforceable. + | + | 14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower + | case, means an individual or a legal entity exercising rights under, and complying with all + | of the terms of, this License. For legal entities, "You" includes any entity that controls, + | is controlled by, or is under common control with you. For purposes of this definition, + | "control" means (i) the power, direct or indirect, to cause the direction or management of + | such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or + | more of the outstanding shares, or (iii) beneficial ownership of such entity. + | + | 15) Right to Use. You may use the Original Work in all ways not otherwise restricted or + | conditioned by this License or by law, and Licensor promises not to interfere with or be + | responsible for such uses by You. + | + | This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission is + | hereby granted to copy and distribute this license without modification. This license may not + | be modified without the express written permission of its copyright owner. + | + | + | BSD License + | =========== + | + | Copyright (c) 2006, Yahoo! Inc. + | All rights reserved. + | + | Redistribution and use of this software in source and binary forms, with or without modification, + | are permitted provided that the following conditions are met: + | + | * Redistributions of source code must retain the above copyright notice, this list of + | conditions and the following disclaimer. + | * Redistributions in binary form must reproduce the above copyright notice, this list of + | conditions and the following disclaimer in the documentation and/or other materials provided + | with the distribution. + | * Neither the name of Yahoo! Inc. nor the names of its contributors may be used to endorse or + | promote products derived from this software without specific prior written permission of + | Yahoo! Inc. + | + | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + | WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +# React.js (http://facebook.github.io/react/) + - repository: @reactjs.repository@ (version: @reactjs.version@ - commit: @reactjs.commit@) + + * Software licence: https://github.com/facebook/react/blob/master/LICENSE + + | Apache License + | Version 2.0, January 2004 + | http://www.apache.org/licenses/ + | + | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + | + | 1. Definitions. + | + | "License" shall mean the terms and conditions for use, reproduction, + | and distribution as defined by Sections 1 through 9 of this document. + | + | "Licensor" shall mean the copyright owner or entity authorized by + | the copyright owner that is granting the License. + | + | "Legal Entity" shall mean the union of the acting entity and all + | other entities that control, are controlled by, or are under common + | control with that entity. For the purposes of this definition, + | "control" means (i) the power, direct or indirect, to cause the + | direction or management of such entity, whether by contract or + | otherwise, or (ii) ownership of fifty percent (50%) or more of the + | outstanding shares, or (iii) beneficial ownership of such entity. + | + | "You" (or "Your") shall mean an individual or Legal Entity + | exercising permissions granted by this License. + | + | "Source" form shall mean the preferred form for making modifications, + | including but not limited to software source code, documentation + | source, and configuration files. + | + | "Object" form shall mean any form resulting from mechanical + | transformation or translation of a Source form, including but + | not limited to compiled object code, generated documentation, + | and conversions to other media types. + | + | "Work" shall mean the work of authorship, whether in Source or + | Object form, made available under the License, as indicated by a + | copyright notice that is included in or attached to the work + | (an example is provided in the Appendix below). + | + | "Derivative Works" shall mean any work, whether in Source or Object + | form, that is based on (or derived from) the Work and for which the + | editorial revisions, annotations, elaborations, or other modifications + | represent, as a whole, an original work of authorship. For the purposes + | of this License, Derivative Works shall not include works that remain + | separable from, or merely link (or bind by name) to the interfaces of, + | the Work and Derivative Works thereof. + | + | "Contribution" shall mean any work of authorship, including + | the original version of the Work and any modifications or additions + | to that Work or Derivative Works thereof, that is intentionally + | submitted to Licensor for inclusion in the Work by the copyright owner + | or by an individual or Legal Entity authorized to submit on behalf of + | the copyright owner. For the purposes of this definition, "submitted" + | means any form of electronic, verbal, or written communication sent + | to the Licensor or its representatives, including but not limited to + | communication on electronic mailing lists, source code control systems, + | and issue tracking systems that are managed by, or on behalf of, the + | Licensor for the purpose of discussing and improving the Work, but + | excluding communication that is conspicuously marked or otherwise + | designated in writing by the copyright owner as "Not a Contribution." + | + | "Contributor" shall mean Licensor and any individual or Legal Entity + | on behalf of whom a Contribution has been received by Licensor and + | subsequently incorporated within the Work. + | + | 2. Grant of Copyright License. Subject to the terms and conditions of + | this License, each Contributor hereby grants to You a perpetual, + | worldwide, non-exclusive, no-charge, royalty-free, irrevocable + | copyright license to reproduce, prepare Derivative Works of, + | publicly display, publicly perform, sublicense, and distribute the + | Work and such Derivative Works in Source or Object form. + | + | 3. Grant of Patent License. Subject to the terms and conditions of + | this License, each Contributor hereby grants to You a perpetual, + | worldwide, non-exclusive, no-charge, royalty-free, irrevocable + | (except as stated in this section) patent license to make, have made, + | use, offer to sell, sell, import, and otherwise transfer the Work, + | where such license applies only to those patent claims licensable + | by such Contributor that are necessarily infringed by their + | Contribution(s) alone or by combination of their Contribution(s) + | with the Work to which such Contribution(s) was submitted. If You + | institute patent litigation against any entity (including a + | cross-claim or counterclaim in a lawsuit) alleging that the Work + | or a Contribution incorporated within the Work constitutes direct + | or contributory patent infringement, then any patent licenses + | granted to You under this License for that Work shall terminate + | as of the date such litigation is filed. + | + | 4. Redistribution. You may reproduce and distribute copies of the + | Work or Derivative Works thereof in any medium, with or without + | modifications, and in Source or Object form, provided that You + | meet the following conditions: + | + | (a) You must give any other recipients of the Work or + | Derivative Works a copy of this License; and + | + | (b) You must cause any modified files to carry prominent notices + | stating that You changed the files; and + | + | (c) You must retain, in the Source form of any Derivative Works + | that You distribute, all copyright, patent, trademark, and + | attribution notices from the Source form of the Work, + | excluding those notices that do not pertain to any part of + | the Derivative Works; and + | + | (d) If the Work includes a "NOTICE" text file as part of its + | distribution, then any Derivative Works that You distribute must + | include a readable copy of the attribution notices contained + | within such NOTICE file, excluding those notices that do not + | pertain to any part of the Derivative Works, in at least one + | of the following places: within a NOTICE text file distributed + | as part of the Derivative Works; within the Source form or + | documentation, if provided along with the Derivative Works; or, + | within a display generated by the Derivative Works, if and + | wherever such third-party notices normally appear. The contents + | of the NOTICE file are for informational purposes only and + | do not modify the License. You may add Your own attribution + | notices within Derivative Works that You distribute, alongside + | or as an addendum to the NOTICE text from the Work, provided + | that such additional attribution notices cannot be construed + | as modifying the License. + | + | You may add Your own copyright statement to Your modifications and + | may provide additional or different license terms and conditions + | for use, reproduction, or distribution of Your modifications, or + | for any such Derivative Works as a whole, provided Your use, + | reproduction, and distribution of the Work otherwise complies with + | the conditions stated in this License. + | + | 5. Submission of Contributions. Unless You explicitly state otherwise, + | any Contribution intentionally submitted for inclusion in the Work + | by You to the Licensor shall be under the terms and conditions of + | this License, without any additional terms or conditions. + | Notwithstanding the above, nothing herein shall supersede or modify + | the terms of any separate license agreement you may have executed + | with Licensor regarding such Contributions. + | + | 6. Trademarks. This License does not grant permission to use the trade + | names, trademarks, service marks, or product names of the Licensor, + | except as required for reasonable and customary use in describing the + | origin of the Work and reproducing the content of the NOTICE file. + | + | 7. Disclaimer of Warranty. Unless required by applicable law or + | agreed to in writing, Licensor provides the Work (and each + | Contributor provides its Contributions) on an "AS IS" BASIS, + | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + | implied, including, without limitation, any warranties or conditions + | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + | PARTICULAR PURPOSE. You are solely responsible for determining the + | appropriateness of using or redistributing the Work and assume any + | risks associated with Your exercise of permissions under this License. + | + | 8. Limitation of Liability. In no event and under no legal theory, + | whether in tort (including negligence), contract, or otherwise, + | unless required by applicable law (such as deliberate and grossly + | negligent acts) or agreed to in writing, shall any Contributor be + | liable to You for damages, including any direct, indirect, special, + | incidental, or consequential damages of any character arising as a + | result of this License or out of the use or inability to use the + | Work (including but not limited to damages for loss of goodwill, + | work stoppage, computer failure or malfunction, or any and all + | other commercial damages or losses), even if such Contributor + | has been advised of the possibility of such damages. + | + | 9. Accepting Warranty or Additional Liability. While redistributing + | the Work or Derivative Works thereof, You may choose to offer, + | and charge a fee for, acceptance of support, warranty, indemnity, + | or other liability obligations and/or rights consistent with this + | License. However, in accepting such obligations, You may act only + | on Your own behalf and on Your sole responsibility, not on behalf + | of any other Contributor, and only if You agree to indemnify, + | defend, and hold each Contributor harmless for any liability + | incurred by, or claims asserted against, such Contributor by reason + | of your accepting any such warranty or additional liability. + | + | END OF TERMS AND CONDITIONS + | + | APPENDIX: How to apply the Apache License to your work. + | + | To apply the Apache License to your work, attach the following + | boilerplate notice, with the fields enclosed by brackets "[]" + | replaced with your own identifying information. (Don't include + | the brackets!) The text should be enclosed in the appropriate + | comment syntax for the file format. We also recommend that a + | file or class name and description of purpose be included on the + | same "printed page" as the copyright notice for easier + | identification within third-party archives. + | + | Copyright [yyyy] [name of copyright owner] + | + | Licensed under the Apache License, Version 2.0 (the "License"); + | you may not use this file except in compliance with the License. + | You may obtain a copy of the License at + | + | http://www.apache.org/licenses/LICENSE-2.0 + | + | Unless required by applicable law or agreed to in writing, software + | distributed under the License is distributed on an "AS IS" BASIS, + | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + | See the License for the specific language governing permissions and + | limitations under the License. + + + +# Add to Home Screen (http://cubiq.org/add-to-home-screen) + - repository: @addtohomescreen.repository@ (version: @addtohomescreen.version@ - commit: @addtohomescreen.commit@) + + * Software licence: https://github.com/facebook/react/blob/master/LICENSE + + | This software is released under the MIT License. + | + | Copyright (c) 2013 Matteo Spinelli, http://cubiq.org/ + | + | Permission is hereby granted, free of charge, to any person obtaining + | a copy of this software and associated documentation files (the "Software"), + | to deal in the Software without restriction, including without limitation + | the rights to use, copy, modify, merge, publish, distribute, sublicense, + | and/or sell copies of the Software, and to permit persons to whom the Software + | is furnished to do so, subject to the following conditions: + | + | The above copyright notice and this permission notice shall be included in + | all copies or substantial portions of the Software. + | + | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + | THE SOFTWARE. + + + +# Yahoo! UI Library (http://developer.yahoo.com/yui/) + - package version: 0.12 + + Copyright © 2005-2006 Yahoo! Inc. All rights reserved + * Copyright notes: http://docs.yahoo.com/info/copyright/copyright.html + * Software licence: http://developer.yahoo.com/yui/license.txt + + | Software License Agreement (BSD License) + | + | Copyright (c) 2006, Yahoo! Inc. + | All rights reserved. + | + | Redistribution and use of this software in source and binary forms, with or without modification, are + | permitted provided that the following conditions are met: + | + | * Redistributions of source code must retain the above + | copyright notice, this list of conditions and the + | following disclaimer. + | + | * Redistributions in binary form must reproduce the above + | copyright notice, this list of conditions and the + | following disclaimer in the documentation and/or other + | materials provided with the distribution. + | + | * Neither the name of Yahoo! Inc. nor the names of its + | contributors may be used to endorse or promote products + | derived from this software without specific prior + | written permission of Yahoo! Inc. + | + | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + | WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + | ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +# YUI-ext (http://www.yui-ext.com) + - repository: http://yui-ext.googlecode.com/svn/trunk/ (revision: 120) + + * Software licence: http://yui-ext.googlecode.com/svn/trunk/src/licence.txt + + | yui-ext + | Copyright (c) 2006, Jack Slocum + | All rights reserved. + | + | Redistribution and use in source and binary forms, with or without modification, + | are permitted provided that the following conditions are met: + | + | * Redistributions of source code must retain the above copyright notice, + | this list of conditions and the following disclaimer. + | * Redistributions in binary form must reproduce the above copyright notice, + | this list of conditions and the following disclaimer in the documentation + | and/or other materials provided with the distribution. + | * Neither the name yui-ext nor the names of its contributors + | may be used to endorse or promote products derived from this software + | without specific prior written permission. + | + | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + | IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + | EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +# Big Integer Library v. 5.0 + - code downloaded on March 5, 2007 from http://www.leemon.com/crypto/BigInt.js + + | Big Integer Library v. 5.0 + | Created 2000, last modified 2006 + | Leemon Baird + | www.leemon.com + | + | This file is public domain. You can use it for any purpose without restriction. + | I do not guarantee that it is correct, so use it at your own risk. If you use + | it for something interesting, I'd appreciate hearing about it. If you find + | any bugs or make any improvements, I'd appreciate hearing about those too. + | It would also be nice if my name and address were left in the comments. + | But none of that is required. + + + +# Other code snippets used in the first demo of the program, and still present just to be able to + read record previously written using these same functions: + + - Code downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip + File used: jsSha2/sha256.js + + | A JavaScript implementation of the Secure Hash Algorithm, SHA-256 + | Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/ + | Distributed under the BSD License + | Some bits taken from Paul Johnston's SHA-1 implementation + + + - Code downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip + Files used: entropy.js, aesprng.js, md5.js, aes.js, utf-8.js + + + - Code downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js + + | A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + | Digest Algorithm, as defined in RFC 1321. + | Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. + | Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + | Distributed under the BSD License + | See http://pajhome.org.uk/crypt/md5 for more info. + + + +# General notes + The code in this page has been processed with a JavaScript compressor and is thus + difficult to read. + To get the exact version of the code used to build this application you + can take a look here: + - http://www.clipperz.com/security_privacy/security_code_review + diff --git a/frontend/delta/properties/delta.properties.json b/frontend/delta/properties/delta.properties.json new file mode 100644 index 0000000..c23e6a8 --- a/dev/null +++ b/frontend/delta/properties/delta.properties.json @@ -0,0 +1,136 @@ +{ + "copyright.values": { + "mochikit.repository": "https://github.com/mochi/mochikit.git", + "mochikit.version": "master", + "mochikit.commit": "6f26f745d5d915540aa0fc6c34fda24952891a9d", + + "reactjs.repository": "https://github.com/facebook/react.git", + "reactjs.version": "0.4.1", + "reactjs.commit": "0cac12d375264a8a232a426d6d6cc8074a94000a", + + "addtohomescreen.repository": "https://github.com/cubiq/add-to-homescreen.git", + "addtohomescreen.version": "2.0.8", + "addtohomescreen.commit": "4d375840079bcea994cc5795a568802400c7a793" + }, + + "html.template": "index_template.html", + + "js": [ + "MochiKit/Base.js", + "MochiKit/Iter.js", + "-- MochiKit/Logging.js", + "-- MochiKit/DateTime.js", + "-- MochiKit/Format.js", + "MochiKit/Async.js", + "MochiKit/DOM.js", + "MochiKit/Style.js", + "-- MochiKit/LoggingPane.js", + "-- MochiKit/Color.js", + "MochiKit/Signal.js", + "-- MochiKit/Position.js", + "MochiKit/Selector.js", + "-- MochiKit/Visual.js", + + "React/react-0.4.1.js", + "Cubiq/add2home.js", + + "Clipperz/YUI/Utils.js", + "Clipperz/YUI/DomHelper.js", + + "Clipperz/ByteArray.js", + "Clipperz/Base.js", + "Clipperz/Async.js", + "Clipperz/CSVProcessor.js", + "Clipperz/KeePassExportProcessor.js", + "Clipperz/Date.js", + "Clipperz/DOM.js", + "Clipperz/Logging.js", + "Clipperz/Signal.js", + "-- Clipperz/Style.js", + "-- Clipperz/Visual.js", + "Clipperz/Set.js", + "-- Clipperz/Profile.js", + "Clipperz/KeyValueObjectStore.js", + + "Clipperz/Crypto/SHA.js", + "Clipperz/Crypto/AES.js", + "Clipperz/Crypto/AES_2.js", + "Clipperz/Crypto/PRNG.js", + "Clipperz/Crypto/BigInt.js", + "Clipperz/Crypto/Base.js", + "Clipperz/Crypto/SRP.js", + "Clipperz/Crypto/RSA.js", + + "Clipperz/PM/Strings/Strings_defaults.js", + "Clipperz/PM/Strings/Strings_en-US.js", + "-- # Clipperz/PM/Strings/Strings_en-GB.js", + "-- # Clipperz/PM/Strings/Strings_en-CA.js", + "-- Clipperz/PM/Strings/Strings_it-IT.js", + "-- Clipperz/PM/Strings/Strings_pt-BR.js", + "-- # Clipperz/PM/Strings/Strings_pt-PT.js", + "-- Clipperz/PM/Strings/Strings_ja-JP.js", + "-- Clipperz/PM/Strings/Strings_zh-CN.js", + "-- Clipperz/PM/Strings/Strings_es-ES.js", + "-- Clipperz/PM/Strings/Strings_fr-FR.js", + "-- # Clipperz/PM/Strings/Strings_de-DE.js", + "-- # Clipperz/PM/Strings/Strings_el-GR.js", + "-- # Clipperz/PM/Strings/Strings_ru-RU.js", + "-- # Clipperz/PM/Strings/Strings_he-IL.js", + "Clipperz/PM/Strings.js", + "-- Clipperz/PM/Strings/MessagePanelConfigurations.js", + + "Clipperz/PM/Date.js", + + "Clipperz/PM/Toll.js", + "Clipperz/PM/Proxy.js", + "Clipperz/PM/Proxy/Proxy.JSON.js", + "Clipperz/PM/Proxy/Proxy.Offline.js", + "Clipperz/PM/Proxy/Proxy.Offline.DataStore.js", + "Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js", + "Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js", + + "Clipperz/PM/Connection.js", + "Clipperz/PM/Crypto.js", + "Clipperz/PM/PIN.js", + "-- Clipperz/PM/BookmarkletProcessor.js", + + "Clipperz/PM/DataModel/EncryptedRemoteObject.js", + "Clipperz/PM/DataModel/User.js", + "Clipperz/PM/DataModel/User.Header.Legacy.js", + "Clipperz/PM/DataModel/User.Header.RecordIndex.js", + "Clipperz/PM/DataModel/User.Header.Preferences.js", + "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js", + "Clipperz/PM/DataModel/User.Subscription.js", + "Clipperz/PM/DataModel/Record.js", + "Clipperz/PM/DataModel/Record.Version.js", + "Clipperz/PM/DataModel/Record.Version.Field.js", + "Clipperz/PM/DataModel/DirectLogin.js", + "Clipperz/PM/DataModel/DirectLoginInput.js", + "Clipperz/PM/DataModel/DirectLoginBinding.js", + "Clipperz/PM/DataModel/DirectLoginFormValue.js", + "Clipperz/PM/DataModel/OneTimePassword.js", + + "-- Clipperz/PM/UI/Web/Components/BaseComponent.js", + "-- Clipperz/PM/UI/Web/Components/Overlay.js", + "-- Clipperz/PM/UI/Web/Components/LoginForm.js", + "-- Clipperz/PM/UI/Web/Components/RegistrationWizard.js", + + "-- Clipperz/PM/UI/Web/Controllers/MainController.js", + + "Clipperz/PM/UI/Components/Overlay.js", + "Clipperz/PM/UI/Components/PageTemplate.js", + "Clipperz/PM/UI/Components/LoginForm.js", + "Clipperz/PM/UI/Components/RegistrationWizard.js", + "Clipperz/PM/UI/Components/CardList.js", + "Clipperz/PM/UI/Components/CardDetail.js", + "Clipperz/PM/UI/Components/ErrorPage.js", + + "Clipperz/PM/UI/MainController.js", + "Clipperz/PM/UI/DirectLoginController.js", + "main.js" + ], + + "css": [ + "web.css" + ] +} diff --git a/frontend/delta/properties/manifest.webapp b/frontend/delta/properties/manifest.webapp new file mode 100644 index 0000000..cd18e01 --- a/dev/null +++ b/frontend/delta/properties/manifest.webapp @@ -0,0 +1,17 @@ +{ + "name": "Clipperz", + "description": "Keep it to yourself: store and manage your password and online credentials", + "launch_path": "/delta/index.html", + "icons": { + "16": "https://www.clipperz.com/manifests/logo/16.png", + "32": "https://www.clipperz.com/manifests/logo/32.png", + "30": "https://www.clipperz.com/manifests/logo/30.png", + "60": "https://www.clipperz.com/manifests/logo/60.png", + "128": "https://www.clipperz.com/manifests/logo/128.png" + }, + "developer": { + "name": "Clipperz", + "url": "https://www.clipperz.com" + }, + "default_locale": "en" +}
\ No newline at end of file diff --git a/frontend/delta/tests/tests/Components/CardDetail/User.data.js b/frontend/delta/tests/tests/Components/CardDetail/User.data.js new file mode 100644 index 0000000..ba60878 --- a/dev/null +++ b/frontend/delta/tests/tests/Components/CardDetail/User.data.js @@ -0,0 +1,972 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +testData = { + + //------------------------------------------------------------------------- + + 'simpleLogin_001': { + 'users': [ + { + 'username': "joe", + 'passphrase': "eoj", + 'version': "0.2", + 'connectionVersion': "0.2", + 'records': { + 'record 1': { + 'notes': "Some notes here", + 'fields': [ + { 'name': "username", 'value': "joe", 'type': "text" }, + { 'name': "password", 'value': "1234", 'type': "password" } + ], + 'directLogins': { + "record 1 direct login": { + 'configuration': "", + 'bindings': [ + ], + 'favicon': "http://www.example.com/favicon.ico" + } + } + } + }, + 'otp': [ + "12345678 90abcdef 12345678 90abcdef", + "fedcba09 87654321 fedcba09 87654321" + ] + } + ] + }, + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_data': { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { + s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', + v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', + statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', + userDetailsVersion: '0.3', + records: { + '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { + data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009', + currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', + versions: { + '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { + header: '####', + data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', + version: '0.2', + creationDate: 'Wed Mar 14 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + } + } + }, + '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { + data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', + version: '0.3', + creationDate: 'Fri Oct 17 16:49:20 CEST 2008', + updateDate: 'Mon Oct 27 08:58:49 CET 2008', + accessDate: 'Mon Jan 19 16:09:39 CET 2009', + currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', + versions: { + '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { + header: '####', + data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', + version: '0.3', + creationDate: 'Fri Oct 17 17:00:31 CEST 2008', + updateDate: 'Fri Oct 17 17:00:31 CEST 2008', + accessDate: 'Fri Oct 17 17:00:31 CEST 2008' + }, + '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { + header: '####', + data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', + version: '0.3', + creationDate: 'Fri Oct 17 16:49:20 CEST 2008', + updateDate: 'Fri Oct 17 16:49:20 CEST 2008', + accessDate: 'Fri Oct 17 16:54:23 CEST 2008' + }, + '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { + header: '####', + data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', + version: '0.3', + creationDate: 'Fri Oct 17 17:00:13 CEST 2008', + updateDate: 'Fri Oct 17 17:00:13 CEST 2008', + accessDate: 'Fri Oct 17 17:00:13 CEST 2008' + }, + '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { + header: '####', + data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==', + version: '0.3', + creationDate: 'Fri Oct 17 16:59:31 CEST 2008', + updateDate: 'Fri Oct 17 16:59:31 CEST 2008', + accessDate: 'Fri Oct 17 16:59:31 CEST 2008' + }, + '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { + header: '####', + data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==', + version: '0.3', + creationDate: 'Mon Oct 27 08:58:49 CET 2008', + updateDate: 'Mon Oct 27 08:58:49 CET 2008', + accessDate: 'Mon Jan 19 16:09:39 CET 2009' + }, + 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { + header: '####', + data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', + version: '0.3', + creationDate: 'Fri Oct 17 16:57:17 CEST 2008', + updateDate: 'Fri Oct 17 16:57:17 CEST 2008', + accessDate: 'Fri Oct 17 16:57:17 CEST 2008' + }, + 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { + header: '####', + data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', + version: '0.3', + creationDate: 'Fri Oct 17 16:58:00 CEST 2008', + updateDate: 'Fri Oct 17 16:58:00 CEST 2008', + accessDate: 'Fri Oct 17 16:58:00 CEST 2008' + }, + 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': { + header: '####', + data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=', + version: '0.3', + creationDate: 'Fri Oct 17 17:01:59 CEST 2008', + updateDate: 'Fri Oct 17 17:01:59 CEST 2008', + accessDate: 'Mon Oct 27 08:57:58 CET 2008' + } + } + }, + '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 14:53:11 CET 2007', + updateDate: 'Tue Apr 17 19:17:52 CEST 2007', + accessDate: 'Mon Jan 19 16:09:25 CET 2009', + currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', + versions: { + '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { + header: '####', + data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', + version: '0.2', + creationDate: 'Tue Apr 17 19:13:41 CEST 2007', + updateDate: 'Tue Apr 17 19:13:41 CEST 2007', + accessDate: 'Tue Apr 17 19:13:41 CEST 2007' + }, + '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': { + header: '####', + data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y', + version: '0.2', + creationDate: 'Wed Mar 14 14:53:11 CET 2007', + updateDate: 'Wed Mar 14 14:53:11 CET 2007', + accessDate: 'Wed Mar 14 15:24:35 CET 2007' + }, + '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': { + header: '####', + data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==', + version: '0.2', + creationDate: 'Wed Mar 14 15:33:00 CET 2007', + updateDate: 'Wed Mar 14 15:33:00 CET 2007', + accessDate: 'Tue Apr 17 19:12:56 CEST 2007' + }, + '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { + header: '####', + data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', + version: '0.2', + creationDate: 'Wed Mar 14 15:26:35 CET 2007', + updateDate: 'Wed Mar 14 15:26:35 CET 2007', + accessDate: 'Wed Mar 14 15:26:35 CET 2007' + }, + '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { + header: '####', + data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', + version: '0.2', + creationDate: 'Wed Mar 14 15:30:09 CET 2007', + updateDate: 'Wed Mar 14 15:30:09 CET 2007', + accessDate: 'Wed Mar 14 15:30:09 CET 2007' + }, + '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { + header: '####', + data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', + version: '0.2', + creationDate: 'Tue Apr 17 19:17:52 CEST 2007', + updateDate: 'Tue Apr 17 19:17:52 CEST 2007', + accessDate: 'Mon Jan 19 16:09:25 CET 2009' + }, + '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': { + header: '####', + data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==', + version: '0.2', + creationDate: 'Wed Mar 14 15:27:35 CET 2007', + updateDate: 'Wed Mar 14 15:27:35 CET 2007', + accessDate: 'Wed Mar 14 15:27:35 CET 2007' + }, + 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': { + header: '####', + data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2', + version: '0.2', + creationDate: 'Tue Apr 17 19:15:09 CEST 2007', + updateDate: 'Tue Apr 17 19:15:09 CEST 2007', + accessDate: 'Tue Apr 17 19:17:01 CEST 2007' + } + } + }, + '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { + data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==', + version: '0.3', + creationDate: 'Wed Mar 14 18:39:35 CET 2007', + updateDate: 'Mon Oct 27 09:16:14 CET 2008', + accessDate: 'Mon Jan 19 16:09:35 CET 2009', + currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', + versions: { + '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { + header: '####', + data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', + version: '0.2', + creationDate: 'Wed Mar 14 18:39:55 CET 2007', + updateDate: 'Wed Mar 14 18:39:55 CET 2007', + accessDate: 'Mon Oct 27 09:07:56 CET 2008' + }, + '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': { + header: '####', + data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9', + version: '0.3', + creationDate: 'Mon Oct 27 09:09:11 CET 2008', + updateDate: 'Mon Oct 27 09:09:11 CET 2008', + accessDate: 'Mon Oct 27 09:15:58 CET 2008' + }, + '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': { + header: '####', + data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=', + version: '0.2', + creationDate: 'Wed Mar 14 18:39:35 CET 2007', + updateDate: 'Wed Mar 14 18:39:35 CET 2007', + accessDate: 'Wed Mar 14 18:39:35 CET 2007' + }, + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', + version: '0.3', + creationDate: 'Mon Oct 27 09:16:14 CET 2008', + updateDate: 'Mon Oct 27 09:16:14 CET 2008', + accessDate: 'Mon Jan 19 16:09:35 CET 2009' + } + } + }, + '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { + data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA', + version: '0.2', + creationDate: 'Wed Mar 14 16:01:24 CET 2007', + updateDate: 'Wed Mar 14 16:01:24 CET 2007', + accessDate: 'Mon Jan 19 16:10:11 CET 2009', + currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', + versions: { + '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { + header: '####', + data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu', + version: '0.2', + creationDate: 'Wed Mar 14 16:01:24 CET 2007', + updateDate: 'Wed Mar 14 16:01:24 CET 2007', + accessDate: 'Mon Jan 19 16:10:11 CET 2009' + } + } + }, + '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { + data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', + version: '0.3', + creationDate: 'Mon Jan 05 17:45:25 CET 2009', + updateDate: 'Mon Jan 05 17:45:25 CET 2009', + accessDate: 'Mon Jan 19 16:10:21 CET 2009', + currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d', + versions: { + '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': { + header: '####', + data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn', + version: '0.3', + creationDate: 'Mon Jan 05 17:45:25 CET 2009', + updateDate: 'Mon Jan 05 17:45:25 CET 2009', + accessDate: 'Mon Jan 19 16:10:21 CET 2009' + } + } + }, + '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { + data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', + version: '0.2', + creationDate: 'Tue Apr 17 16:36:08 CEST 2007', + updateDate: 'Tue Apr 17 16:36:08 CEST 2007', + accessDate: 'Mon Jan 19 16:09:33 CET 2009', + currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', + versions: { + 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { + header: '####', + data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==', + version: '0.2', + creationDate: 'Tue Apr 17 16:36:08 CEST 2007', + updateDate: 'Tue Apr 17 16:36:08 CEST 2007', + accessDate: 'Mon Jan 19 16:09:33 CET 2009' + } + } + }, + '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { + data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', + version: '0.2', + creationDate: 'Mon Apr 02 19:12:44 CEST 2007', + updateDate: 'Mon Apr 02 19:12:44 CEST 2007', + accessDate: 'Mon Jan 19 16:10:08 CET 2009', + currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', + versions: { + '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { + header: '####', + data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==', + version: '0.2', + creationDate: 'Mon Apr 02 19:12:44 CEST 2007', + updateDate: 'Mon Apr 02 19:12:44 CEST 2007', + accessDate: 'Mon Jan 19 16:10:08 CET 2009' + } + } + }, + '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { + data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==', + version: '0.2', + creationDate: 'Wed Mar 14 19:09:05 CET 2007', + updateDate: 'Wed Mar 14 19:09:05 CET 2007', + accessDate: 'Mon Jan 19 16:10:15 CET 2009', + currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', + versions: { + 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { + header: '####', + data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', + version: '0.2', + creationDate: 'Wed Mar 14 19:09:05 CET 2007', + updateDate: 'Wed Mar 14 19:09:05 CET 2007', + accessDate: 'Mon Jan 19 16:10:15 CET 2009' + } + } + }, + '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { + data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', + version: '0.3', + creationDate: 'Mon Jan 05 17:44:30 CET 2009', + updateDate: 'Mon Jan 05 17:44:30 CET 2009', + accessDate: 'Mon Jan 19 16:10:18 CET 2009', + currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b', + versions: { + '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': { + header: '####', + data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2', + version: '0.3', + creationDate: 'Mon Jan 05 17:44:30 CET 2009', + updateDate: 'Mon Jan 05 17:44:30 CET 2009', + accessDate: 'Mon Jan 19 16:10:18 CET 2009' + } + } + }, + '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': { + data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=', + version: '0.2', + creationDate: 'Tue May 01 01:10:17 CEST 2007', + updateDate: 'Tue May 01 01:13:27 CEST 2007', + accessDate: 'Mon Jan 19 16:10:02 CET 2009', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { + header: '####', + data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8', + version: '0.2', + creationDate: 'Tue May 01 01:10:17 CEST 2007', + updateDate: 'Tue May 01 01:10:17 CEST 2007', + accessDate: 'Tue May 01 01:10:17 CEST 2007' + }, + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=', + version: '0.2', + creationDate: 'Tue May 01 01:13:27 CEST 2007', + updateDate: 'Tue May 01 01:13:27 CEST 2007', + accessDate: 'Mon Jan 19 16:10:02 CET 2009' + } + } + }, + '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { + data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', + version: '0.2', + creationDate: 'Wed Mar 21 16:29:06 CET 2007', + updateDate: 'Wed Mar 21 16:29:06 CET 2007', + accessDate: 'Mon Jan 19 16:10:01 CET 2009', + currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + versions: { + '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': { + header: '####', + data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd', + version: '0.2', + creationDate: 'Wed Mar 21 16:29:06 CET 2007', + updateDate: 'Wed Mar 21 16:29:06 CET 2007', + accessDate: 'Mon Jan 19 16:10:01 CET 2009' + } + } + }, + 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': { + data: 'HxkHstm/nWfD4tTwtaDqycSrP6vR7O9JUQrVXp90Z+prnnvuUMH3SbOlv+AQZFJotuM9VVOh52yWcl8TuSJ5SYR6pwmZVcK9GJd3aRH48wBRrsi9do+pgyxmzfpBm+CMnUtI63LMPfyz/zPndUQSke5+G/Q1b8ZddaShjYHWHEifjdswmKg68FOSu7RuElR/FwRCBwuT02vMRdrjwxSxxM5zWB3vqzN4xKi/jkvqGgIc21m8adTQoxAJARleZiyWXzfPO/MpUs3vA6nxH6ZO1kEayGw3ZAR3nFBiW0UjjdXCBI2b4PcUP0nSJKetRSiudo2cUKfYxsWgEPoG+PM/CQFdnlfGcPf4d0QYnkU+JHff99mLJRmz7VWH7ZeW10NTxzTEr47diHLpyufZ4knnRgfhfKtwOvgmG1n1lXyXDRVTeyfCCX+mB5qdB79ujqon1BiLOGQfLWZ8bDyTZAakpcRJb8qk3zP004XwN5BpO+jC2waMcUEuH62gSQeelGZ19pzBiRz8kn3ZZ8iviX46Wwk3X1TTke9teF7t6Pop4pRkaAj2z2ji0mqWtv4T/3QW4Xgf1mKaT2t8ZaucGvZ3jrxm0CW/Ra3Cy1v1APwRPvKnY5i/WPDS1elq3vNF0NY7EQbXrxBX7hgGpUGRcHSKYsuftIquJFv0HV31jRhd99nZz6Otx82xidWbroIS+37o2Rr56X/AwkLn3DgH+V/YAK24z3Otku+lbaorXnv6C8ZDUhcce2CjgEuCFPmv928YOahgmE0Q0uKniwVXgXACevvACEsduvW32JhI4D4cjRWcSzB6YhqXE8QYCQwK97OykJ30Szd/ZYykiXjdjymyqFOmI9tZqi/PUOKRJ9NhYZaVAeLEFUunvKJWHNs50CqElw6z7nAvBwYyEVvvc+rSpMb2Z/KAWLMzv5R3MeITVUph/RlRlMIrJr0lBhmghnLRt6cGRQcDA2Si3tGAm34K+BpxVbTK0ilTrwzCfaE3Q+dvBTFRcZzMcPFLHL7Mho1/kNMb5S0izIpsNPCb26yH/gueYghVmhRL76HQAH79k00uJcyXt57AYlOYQM7FKDHWciWtJDOMNjVFDYQJJSAS39HukwrLnAdqCNrabrS+AuWhX+CqmMlKQ0PRszjtT7oQaAcgJd0uPOVz3IsjyZ/CmrzSxM+c4iPXugkiiyS2HYU7EEz9IEDvoqwv3Djcy4+3oxPUdmIJGMz2Mk5UXMDyMpqfuujirZI5r5WQWWQLivD9mid5RWDiQp2NYwpnQ/J0emEpWFlf/XkmXW+Em/A0+DOeJtHB729WsKYEvMWOB1nuITkqPJShf8FVEunHzUuLKsG3Hf5yEc3isB5rWGO8hPCueVUKgiS/NSCxQ+iinBTO3gUl+hzK+yaajQUomCx7+N9/n5HTLM5kFsUxZ8gfG3LMEK1iaza4KZeS8Hmb58NU3e3MI0FvlZHa787LqNO226awx3sX/nuTMX+LXx9v8/AMrkRdbzlcYbe6xWRWcBGiTirbTV/CXMgCdop60xfRqCskQPbfj89zpHQS/GiTJjhUwh6XKc/TpbjQJ6OZ6dAQBDxexPa+sjr70kLARxeUhvDUytp/zd/A5OBpuZ0aUz530aQEj8BCAk18vdUks7TWcpiw+/Lq//QLu/9uLU/rLanu2DFUYGXo7bJzy2QpzuoHqKDqa3anK9Gs34NfcIjUbeMUyCzd6CFj+1vGNIk4zZi44PZvmqxZXI8XcxboTpnheNRksjw36FbhIKWMWksIIq+mh4XMnkQcS83PB9rwMHsYY4nKfCwddYfRlbVjcjX+jSlz0r6Oh3KxVDP6dt37CPo8DGMvXSeU4LFMcYBkZ/Q57sH3/gyblyHK8OqYX3pzbnkCqoaOwAseBrQYMel3OgSLt1nAxzhN+ZicCLhpSYHCcHYDcg9xoa/1u4uEMJ0JC+/OzU7xp3nC4OgSYxVzL+gBNnqX4Plep7oikvE7+qymqwtoEhEEuaO5pbOdPG4I7NknL+u/RazjXdy3IGyfUPCCQKsjAEbAkD6OBZZf4St21e4sSgV/anAYFGr87fHMPtXhBxH6QTQPgWqrK75Lr/RaOLihrQHgVhcQHYcTD7nTtPNelbJKx5aGOFtcqykaVizLzrflZWXnk+QAjHo6Hsn/edm7Hbna+JTlyVsttp2vcs8kHQk6xcCpi2kR7nJwb+6kntEEPZAyuFQVwvdkqyC5nAecdg==', + version: '0.3', + creationDate: 'Thu Feb 12 12:45:43 CET 2009', + updateDate: 'Thu Feb 12 12:54:37 CET 2009', + accessDate: 'Thu Feb 12 12:54:37 CET 2009', + currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a', + versions: { + '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': { + header: '####', + data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==', + version: '0.3', + creationDate: 'Thu Feb 12 12:54:37 CET 2009', + updateDate: 'Thu Feb 12 12:54:37 CET 2009', + accessDate: 'Thu Feb 12 12:54:37 CET 2009' + }, + '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': { + header: '####', + data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==', + version: '0.3', + creationDate: 'Thu Feb 12 12:45:43 CET 2009', + updateDate: 'Thu Feb 12 12:45:43 CET 2009', + accessDate: 'Thu Feb 12 12:45:43 CET 2009' + }, + '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': { + header: '####', + data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==', + version: '0.3', + creationDate: 'Thu Feb 12 12:47:39 CET 2009', + updateDate: 'Thu Feb 12 12:47:39 CET 2009', + accessDate: 'Thu Feb 12 12:47:39 CET 2009' + } + } + }, + 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': { + data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw', + version: '0.2', + creationDate: 'Wed Mar 14 15:51:17 CET 2007', + updateDate: 'Wed Apr 25 11:14:05 CEST 2007', + accessDate: 'Mon Jan 19 16:10:12 CET 2009', + currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926', + versions: { + '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': { + header: '####', + data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==', + version: '0.2', + creationDate: 'Wed Mar 14 15:51:17 CET 2007', + updateDate: 'Wed Mar 14 15:51:17 CET 2007', + accessDate: 'Wed Apr 25 10:37:27 CEST 2007' + }, + '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': { + header: '####', + data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO', + version: '0.2', + creationDate: 'Wed Apr 25 10:39:26 CEST 2007', + updateDate: 'Wed Apr 25 10:39:26 CEST 2007', + accessDate: 'Wed Apr 25 10:39:26 CEST 2007' + }, + '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': { + header: '####', + data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg', + version: '0.2', + creationDate: 'Wed Apr 25 11:14:05 CEST 2007', + updateDate: 'Wed Apr 25 11:14:05 CEST 2007', + accessDate: 'Mon Jan 19 16:10:12 CET 2009' + }, + '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': { + header: '####', + data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=', + version: '0.2', + creationDate: 'Wed Apr 25 10:51:49 CEST 2007', + updateDate: 'Wed Apr 25 10:51:49 CEST 2007', + accessDate: 'Wed Apr 25 10:51:49 CEST 2007' + }, + 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': { + header: '####', + data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==', + version: '0.2', + creationDate: 'Wed Apr 25 11:01:21 CEST 2007', + updateDate: 'Wed Apr 25 11:01:21 CEST 2007', + accessDate: 'Wed Apr 25 11:01:21 CEST 2007' + }, + 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': { + header: '####', + data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=', + version: '0.2', + creationDate: 'Wed Apr 25 10:59:57 CEST 2007', + updateDate: 'Wed Apr 25 10:59:57 CEST 2007', + accessDate: 'Wed Apr 25 10:59:57 CEST 2007' + }, + 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': { + header: '####', + data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+', + version: '0.2', + creationDate: 'Wed Apr 25 10:38:17 CEST 2007', + updateDate: 'Wed Apr 25 10:38:17 CEST 2007', + accessDate: 'Wed Apr 25 10:38:17 CEST 2007' + }, + 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': { + header: '####', + data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=', + version: '0.2', + creationDate: 'Wed Apr 25 10:56:58 CEST 2007', + updateDate: 'Wed Apr 25 10:56:58 CEST 2007', + accessDate: 'Wed Apr 25 10:56:58 CEST 2007' + }, + 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': { + header: '####', + data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==', + version: '0.2', + creationDate: 'Wed Apr 25 10:58:33 CEST 2007', + updateDate: 'Wed Apr 25 10:58:33 CEST 2007', + accessDate: 'Wed Apr 25 10:58:33 CEST 2007' + } + } + }, + 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 16:06:54 CET 2007', + updateDate: 'Tue Apr 17 19:23:41 CEST 2007', + accessDate: 'Mon Jan 19 16:10:23 CET 2009', + currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf', + versions: { + '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': { + header: '####', + data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==', + version: '0.2', + creationDate: 'Wed Mar 14 17:27:40 CET 2007', + updateDate: 'Wed Mar 14 17:27:40 CET 2007', + accessDate: 'Wed Mar 14 19:00:21 CET 2007' + }, + '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': { + header: '####', + data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl', + version: '0.2', + creationDate: 'Wed Mar 14 16:09:07 CET 2007', + updateDate: 'Wed Mar 14 16:09:07 CET 2007', + accessDate: 'Wed Mar 14 16:39:40 CET 2007' + }, + '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': { + header: '####', + data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST', + version: '0.2', + creationDate: 'Wed Mar 14 19:01:05 CET 2007', + updateDate: 'Wed Mar 14 19:01:05 CET 2007', + accessDate: 'Tue Apr 17 19:20:33 CEST 2007' + }, + '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': { + header: '####', + data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb', + version: '0.2', + creationDate: 'Wed Mar 14 17:17:20 CET 2007', + updateDate: 'Wed Mar 14 17:17:20 CET 2007', + accessDate: 'Wed Mar 14 17:22:06 CET 2007' + }, + 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': { + header: '####', + data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg', + version: '0.2', + creationDate: 'Wed Mar 14 16:06:54 CET 2007', + updateDate: 'Wed Mar 14 16:06:54 CET 2007', + accessDate: 'Wed Mar 14 16:06:54 CET 2007' + }, + 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': { + header: '####', + data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v', + version: '0.2', + creationDate: 'Tue Apr 17 19:23:41 CEST 2007', + updateDate: 'Tue Apr 17 19:23:41 CEST 2007', + accessDate: 'Mon Jan 19 16:10:23 CET 2009' + }, + 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': { + header: '####', + data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC', + version: '0.2', + creationDate: 'Tue Apr 17 19:22:08 CEST 2007', + updateDate: 'Tue Apr 17 19:22:08 CEST 2007', + accessDate: 'Tue Apr 17 19:22:08 CEST 2007' + } + } + }, + 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': { + data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3', + version: '0.2', + creationDate: 'Wed Mar 14 16:36:20 CET 2007', + updateDate: 'Mon Jul 09 15:10:15 CEST 2007', + accessDate: 'Mon Jan 19 16:09:28 CET 2009', + currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130', + versions: { + '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': { + header: '####', + data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD', + version: '0.2', + creationDate: 'Wed Mar 14 16:51:02 CET 2007', + updateDate: 'Wed Mar 14 16:51:02 CET 2007', + accessDate: 'Wed Mar 14 16:51:02 CET 2007' + }, + '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': { + header: '####', + data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=', + version: '0.2', + creationDate: 'Mon Jul 09 15:10:15 CEST 2007', + updateDate: 'Mon Jul 09 15:10:15 CEST 2007', + accessDate: 'Mon Jan 19 16:09:28 CET 2009' + }, + '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': { + header: '####', + data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw', + version: '0.2', + creationDate: 'Wed Mar 21 12:56:43 CET 2007', + updateDate: 'Wed Mar 21 12:56:43 CET 2007', + accessDate: 'Wed Apr 25 09:59:58 CEST 2007' + }, + '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': { + header: '####', + data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm', + version: '0.2', + creationDate: 'Sat May 19 11:26:44 CEST 2007', + updateDate: 'Sat May 19 11:26:44 CEST 2007', + accessDate: 'Mon Jul 09 15:08:39 CEST 2007' + }, + '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': { + header: '####', + data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC', + version: '0.2', + creationDate: 'Wed Mar 14 16:38:54 CET 2007', + updateDate: 'Wed Mar 14 16:38:54 CET 2007', + accessDate: 'Wed Mar 14 16:38:54 CET 2007' + }, + 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': { + header: '####', + data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15', + version: '0.2', + creationDate: 'Wed Mar 14 16:36:20 CET 2007', + updateDate: 'Wed Mar 14 16:36:20 CET 2007', + accessDate: 'Wed Mar 14 16:38:12 CET 2007' + }, + 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': { + header: '####', + data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q', + version: '0.2', + creationDate: 'Wed Apr 25 10:04:29 CEST 2007', + updateDate: 'Wed Apr 25 10:04:29 CEST 2007', + accessDate: 'Sat May 19 11:22:01 CEST 2007' + }, + 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': { + header: '####', + data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5', + version: '0.2', + creationDate: 'Wed Mar 14 16:52:12 CET 2007', + updateDate: 'Wed Mar 14 16:52:12 CET 2007', + accessDate: 'Wed Mar 21 12:16:29 CET 2007' + } + } + }, + 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': { + data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=', + version: '0.2', + creationDate: 'Wed Mar 14 16:20:58 CET 2007', + updateDate: 'Wed Mar 14 16:47:01 CET 2007', + accessDate: 'Mon Jan 19 16:10:06 CET 2009', + currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28', + versions: { + '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': { + header: '####', + data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=', + version: '0.2', + creationDate: 'Wed Mar 14 16:45:40 CET 2007', + updateDate: 'Wed Mar 14 16:45:40 CET 2007', + accessDate: 'Wed Mar 14 16:45:40 CET 2007' + }, + '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': { + header: '####', + data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=', + version: '0.2', + creationDate: 'Wed Mar 14 16:47:01 CET 2007', + updateDate: 'Wed Mar 14 16:47:01 CET 2007', + accessDate: 'Mon Jan 19 16:10:06 CET 2009' + }, + 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': { + header: '####', + data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=', + version: '0.2', + creationDate: 'Wed Mar 14 16:20:58 CET 2007', + updateDate: 'Wed Mar 14 16:20:58 CET 2007', + accessDate: 'Wed Mar 14 16:43:46 CET 2007' + } + } + }, + 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { + data: 'wydFTEk0nYCge8y1yaWx1jgcGHA2Eze1tEMc/dMN1CPO54lJDvG7S09AIsiCZpBVmXxoLQ4Q5kolUP9nGsIvMwWH2DRkEC+uKGYDXxHViyhqWlmdTMxSteRyblSd2S0sinSUR/BnRrTwdR6qGSrSIEIpk5jEWBajLqKNJVgBQ/iIEdCMJt2JIHoZpC5tTmyEMNgqbeZFOWckeKeWaaJAq1645epETwpJE7i/CuH6A6dED4TXLPciXWi2OVvDm58Mu45BV7GFxyZEgZUAl322RXU1BFJDNqybU5MUIqXo2IoNotuGdIaEFmBy61blqFJvbPn6lInC91guXtSBH2Vz4q4Nhwi38BJ0e2mtsEfcs1akQ4eoUmNqbWo7YWXGOb4pocefzEXhBYtDJKJT/Djp96hH3UeoguUJMQjuw4Z0O3um8ZvPjOlMNWP98UbQFpmjPHz/VxVxJSXqqaw0zr0i+9dCBl4ybRE3RnHAOy9FeV6fMsZeSRv6BiXIQXqExku2bWbPQgQXMGsfxLZtkPoP9T4p32H8LE2qaAe2kc71u5ANdx0S6iegBHOjMd+7S+icZFEip7xL4wxo1W2gJWBI8OQX7jOKTsdsKbaCgL5NofHI/y08d+5U4vdYHeYyNShY1JGGrI3dIsLu7K37Hw0yPyI/YtsvGAOka1V5BT1XlVvQmJJJBuJFeZpBpHd5RnOu6gGyllLf35KYQLXg5T7OZtADi94dLa8pY3EN5pt/PA07iLzAg5ztUQ3FELVPDZ68l1l0jHsin37xoVX9C9FNJPxsM/qV3aX0uadIaLjtZDBVAt5J5k4d3NZ+NjP+iBWvYH0Id6ZQ8Aw681FBaJCOdA+5dTmVTOjBR77oaytkuO4FLIFvmzpTyTdsP7UYb8YAyR/UoL/wfvavSD98MveTFSb6cmV/wNJgiTUJwh1R7gfn0o/5C1zzamNX4EdyZS7n1YGNLRVSGfoklBC3osjloXCq4UmE1Z9VkwM3Iw1IHiV///fmtqemzsEQ8r5xO5LuafYWuZjTyt4sbnFfo9xvKjDAjs82zLYGBouByE/zHyFDR+kls2M+wNkR7MCEz9mmGxp06ZYJSowEp745FxBPw0jqyS3MUG8gZs5u/JizQKENp3SxqmBOKKQHlN+N9YjueebnZimKiJ0KIOhp8qMuMpZwuZSysh4ET26tPyT1A3tEceOpZsbJXibV4rU5SZMWGMfkMz5HS2RBNtVlZuDt3l4sCtMDIKYRfx+V3qRNG8lLNQx+R8F6EHMSYXYQnld2KEhfQMLfUFHH8toxbEeYS62VdyraANstkkR+w04Hb6ndC7OTDC7XWQ9SNbWeR7NAVPMFtsce74J8csbFPUB8wiKzNUiWUUkkWVjI0l4EGLDuiRtvvQL47FhTsPHFIR0SA47t9L5748aZgxIL2WfrZXOQ4OhQ1cRvAJGAYwG/E2yHYlU96ciPPJIoAFB/izbkz6H9I3+TPcKrqk0Lo6NqoXcWU852WGeHD2Lg94OCY/NXsQ65U4Fxp1pcYdo+TpHW6tTs8Rcu8zR8HCOAAVH8H10P9FeuNrYRVili/feLh91Z18c6j92yy8FkapTQf0N1xuW6BMHEqMzl70QMyoMojuE4RSHcsC5vtrKb3V+R1aPPrGyOC1iR3jwepHRPR9RwNY2ZhyftQVCabe5BriF5H8IqnZBTT7+9OGj2ORfwxhlm6+GkrSJB39jLtDp7t8QCRGzfRd7EvaMeLKcOci6yE4aRrQhunQ2bC00oNhhWrIGWkqYHmvVygeM6LHUgWkFp/oXNtJv7ZF5vabvFa1pGC4lEYVJx9RoPDr83C4bfsHUsXE5polQzdS4ZEE7Ey3o3HlLZNbywfF3xuq3ia8FzDexn+6dBMorsD96kIRI8quA9ttVbpTB4NEE3niK4xSXjw4vHl3JCVuTtRfEUn3p0jWToCerLzFbninfSR9GELzjNElRdgvkiL4bmrn4O9/ACJkGVQKaNkKrwBveG7AxW1c4oZ4IswjSSMP6vJZ12rREBwabp3xFlfpgzeqP4HZzPPtLvEbkZ9eN7sISG1+m+R1LTO7Y5z7jgKB4HOkCXOxCreiR6g4ziBn6mEH3uAQc6c3r6uJwojZ+vXUjs4mdNlDpthuUxOa3DwzevmhlXRWkrUhxv9yqNuyI7Zgxsf+3YslxUQ6drxru/Ohiti3xWfBIRazMLxNw0Y2l/Vf+8PkbNenP8/StjvzAPVPfAoD5PA4L825pQz2oW5OydPA1gaBDuTLC3hyh1f9EreD10fMLeZJbdh79H5/qxqb792WlN6/KU/1Ux6Cf5bvQ8liphtFkNeaQsJZziGc2P6qxAQqufxRUykqB1Sjdfq5SagMkH0l5jpe5hKhL6INdizjs+vxlGrf572bIiw7J/RjYBtwbahy1SMvB/UzMkr7x0TuA9wMlu03Gqgh9RYVrMSPwZB4o1lq0YWF5ou0gU4wrtVCb9nUB6J8PntnacslObJAIPvltGYkANRuKUxA0ai9CE9LcpMmeOSGEh8jfaU/71duASe2xf4BYEsigVqDkhUYKxPWd9pbslifiRXjSWV1gHHAxAdjfXby3qkKRZeud29A61K2nyaGVLLCRTtEszGdePNUgrtN5CEK4UcieBRwT/xBchUgRpNWoTKYcQkTyMv6NAyJVfhIrkvMwoj4QRU51ByH6VszwDjtbm4T8euVhw4R95ww5VCJvDYRmyY2F2e39HXb3+72Bc3rLS1r0oD7JIdoYqOdyqGSNWOTsVh3c2nxlE2SSoOjbAIpP3lna6J4KrOyBC/GZ7fH7mUIPrFqMqIaBRGh8UcH2P3awGv/kDCngbFUTUyS8uFhX0C5IrBPfyYi2/JKw44v7KEf24RMREIrfmN/3V4Osi2fSKYk3J/Ba3H/TlDxZblY9sed0RlEdN+/qMpW5gsbKM26l6qBQa7rM8v3mwJNYHNBWOPOjdSeNyVao0NSsFDhZjHUyLabHQ4pbMcDO1ntApixnW47b/To5pKeLfXkOFoig7uUYp8J4mQHuO+rZ8iprWkj6SMZLzioeGqySUH7l4l7VF0abgKURJMBJQuMN+MmZGpK9sgWp5Cu7zZol/Ko9cTawV/8oB8uEwK5HUoyy03AYsxaA2J/5lPNz7G3tFqlWFDwyksMeTvlxOTtbWN1KatZrnpdurlMPhCmqYxaWgXgOaloRNVZ91RQ64bU/hnyP1zFfcewznSURG5dfysEV26W+q2z4ImceUlwWE5ITTlpRhGCF530isLFMaEUGtUQj9ANTKhgjKjigWTVMfM7WlchgZrJZq/s9+McGcYRr3LV24W/53EOcTJwZ1x92aUrDRXX1m9JD65PlSk67azucUjBkO8N7qFtGFhqOHOMfbZYD6FO1pqf89zPrxOgBVtk3RCUCGoRxcE3GynJApc7WNSJfp1Smdsw/iEUmMdWp2of5K2tnsYeBNmY9Alba/I5vy85oP7M0F98HdZw72rz6OcjnDVrRve+QDjYIpKq5N9abuEH1RvKYIesh+xzUSQiB+fMqlYguU4RIPX6C9MRY5A+UNzR4oVz/MUsJJWVtvBFr7rTAxem18YKCnuGe0IjSPpIe7o0dK5pZ8DayHlz1cPVij781DMCsAS4TIDvVEQiq83D1iZfQFRqjqZklPqYxJF4/W5C8kSYMnq8R3zeZA5E5VFLPX+W4tv/8CcbklDdjjk1NsDHfYQyNCvTrpQDU+4jLzVbdPS9FxlG47APqNlWjPDdU4VodmziT1WVYHi1UmJxtiYft0b6Z3NhTY5qoB+HAgWPSQ0Jncwmaulhnw/dXjc3CKPwDSFcYbU0zzZY0w3/+MY/pdOI3pd9OMr9WQsCmGmoFiqLpSuRTVgnADsBx8yzth1GkkjqW6fxgBKi/5zXisCRRezMh424P5nTFlG5UQ605FiPujd69IQuCyYVBSygufwU40U6z7kXjvTFVf2HhNM4XYFe0vBEK+nfRApzaHIi75gLcnCsoWCNh9MgHenKopuvZswWpC5SXF6Hj5Cgz8totUS4Sswj4szlHrMOm4L0Cfdb1GGR12wrD5nvY+ukxLf4Owgs8/bzXxppxfu0kQWHiYzDozZqZWwUOwM9eP/gTTSM7b1pE4Eqkrsi9Gg9hW805zzKTOzK6pnmKD8OAxmTJA+IbwEIKKlD+8vsx2Zq2KkXw8GjthBkxUN2Q5CbdzOdP8y9FW7knoSBuxhFwKX3FHztWVq7/I6/a27Ps2JzRmxMLV8Nku8A+aDCpeNecUdLsZVrKJUgG4YwC9DynVC8nwD2ILjdDs5B3II26wwIeo5RjUU+7R4XiaaaHFJS5/4eQVQxTMd0WOSJjxr41hHHmGTm5gniwIKbmoxrV17IwK9fc+ZmJtF1BbkXkS1NAPH2p7QlRqzUGJxB+dqdF8plLtWb7oiw1NO3mW5CyiZRS0TP5A5XVKDVtGEuxFga0UyAbtHoEdXQp1x7ZUKUD6ohp1Kap2o32X5hQkyqJXVOM6lShg+FVbNiqiy1zHHTkGQbVIskbZmrOmutdriPzI0r82PyfJYkg9Pp+zT0hlqlzJmLl7xmlC8f2b49Rw8eDWXpZLsTP5TWWyBLjc5On6dYXZsRtUYtKO58MhMeZ8cF+rl7rXFjJZ+CHlGVHb46fCFzMWPYGL8ckwml9q85A09py0rCNX2nwjKDqPj7zVc2uQ3jZ/AFJJtZhN9CCQjPMCIf1eSyT/sq0K6a7VJFcpVN1ILcG3I/UFvIHBbdreGgOD/urc3RGQDxIcmCqXLtURrGvcSWxxOJ/hzNkheM5IM8WudTvrFB6//hTp/ls9zo+Qr3adsAvN8NoIcIAEM3Q39LBzZ5gaQzkJjsVL2z/EvbcV9t9AgAH5XHTaPFnjUsc+mVoyP2gx36EjYA3A/VzMLHw3atjP7Oj4CLN+YEdcthsWylkGotaE1DmBTb6ZQQSPIN6Kv/FOTfpxB8zzHO1UJJA6aNqdRlMlnorKrcwqe5VmE8uEdxHJDPa4HMycnVMI1em6upBUatrBSqRSbO0B8k6IXMRZto4iOLQXk77tZcfrY0INZh/ltSmBlh6GylVGHPNjyDJOZ3eENlejscysnE9epNIGqCbRxSWvhGxYWovm/BJKxl16nMIGKJ5ZyL4FBekG1oDgcKj/cqViIdbv9QgeuaPHS3qsAalZEIOa6hK4sw/Gagm/iuvyHemzxAJ3v+yUfBO/oqU5JtO+8Sd7FrArU8I4yAKLRCo5o/7orRsg/mqmVgoHJ8giKSulg2+IAnzbID+E7NVj8VNnI5cODHQXrcfZo/Sr1ZH0RGkm9XjBS7vghFRTE68/pJl88dU+Notu33tfRkMxLUefs7Hy1cYdUIujAbmo9GFc3Spk5go3uyWoz0t+IGszDapEhORidAaBhPWStf0tZEyKRMWnIZol+2RLzz2OAZBCVrzgVF9RfL9jdqVxlssyLevnN283RuGeZrdUPY8nNhYhG4J2c8ngH4PJLmIKBZDYBWkvx0fgaGBgHO2fEtCO5GyZqvFeNi16qLwo9le+eWj3FXlamf5Ebv2Wvq79j9lP6zBUgomhwlBShcDgkv8RjVVCQagmZ5h5Y3akIgcQrWroWpoViYhnu46CWj/YEArLYRHODg3oQDLjIYgArZbN4awnDWTFrRpA/cOqfMNlq+pOvutwLZMdJllu4JfiX7F2z4TKd43DqwHzdVCWuKsIuYBp52ei2x51o1bXLHte+NqduFMtuwNxqzkF6PIV88AgfldvMiVQfCuBle6mx63E10rnYyclR+wuBJ+erP2/4NkWexqvrG5yuH2D1/Oq', + version: '0.2', + creationDate: 'Wed Mar 14 13:35:58 CET 2007', + updateDate: 'Thu May 10 15:01:21 CEST 2007', + accessDate: 'Mon Jan 19 16:09:54 CET 2009', + currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec', + versions: { + '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': { + header: '####', + data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3', + version: '0.2', + creationDate: 'Wed Mar 14 13:35:58 CET 2007', + updateDate: 'Wed Mar 14 13:35:58 CET 2007', + accessDate: 'Wed Mar 14 13:35:58 CET 2007' + }, + '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': { + header: '####', + data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=', + version: '0.2', + creationDate: 'Wed Mar 14 19:24:49 CET 2007', + updateDate: 'Wed Mar 14 19:24:49 CET 2007', + accessDate: 'Wed Mar 14 19:24:49 CET 2007' + }, + '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': { + header: '####', + data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz', + version: '0.2', + creationDate: 'Wed Mar 14 17:41:15 CET 2007', + updateDate: 'Wed Mar 14 17:41:15 CET 2007', + accessDate: 'Wed Mar 14 17:41:15 CET 2007' + }, + '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': { + header: '####', + data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=', + version: '0.2', + creationDate: 'Wed Mar 14 19:25:28 CET 2007', + updateDate: 'Wed Mar 14 19:25:28 CET 2007', + accessDate: 'Thu May 10 15:00:47 CEST 2007' + }, + '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': { + header: '####', + data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=', + version: '0.2', + creationDate: 'Wed Mar 14 14:46:36 CET 2007', + updateDate: 'Wed Mar 14 14:46:36 CET 2007', + accessDate: 'Wed Mar 14 17:40:01 CET 2007' + }, + 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': { + header: '####', + data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=', + version: '0.2', + creationDate: 'Thu May 10 15:01:21 CEST 2007', + updateDate: 'Thu May 10 15:01:21 CEST 2007', + accessDate: 'Mon Jan 19 16:09:54 CET 2009' + }, + 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': { + header: '####', + data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=', + version: '0.2', + creationDate: 'Wed Mar 14 17:43:29 CET 2007', + updateDate: 'Wed Mar 14 17:43:29 CET 2007', + accessDate: 'Wed Mar 14 19:23:51 CET 2007' + } + } + }, + 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': { + data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA', + version: '0.3', + creationDate: 'Wed Mar 14 17:39:39 CET 2007', + updateDate: 'Wed Feb 13 15:29:04 CET 2008', + accessDate: 'Mon Jan 19 16:09:41 CET 2009', + currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74', + versions: { + '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': { + header: '####', + data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==', + version: '0.2', + creationDate: 'Wed Mar 14 17:39:39 CET 2007', + updateDate: 'Wed Mar 14 17:39:39 CET 2007', + accessDate: 'Tue Apr 17 19:09:44 CEST 2007' + }, + '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': { + header: '####', + data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==', + version: '0.2', + creationDate: 'Tue Apr 17 19:12:39 CEST 2007', + updateDate: 'Tue Apr 17 19:12:39 CEST 2007', + accessDate: 'Wed Feb 13 15:27:04 CET 2008' + }, + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=', + version: '0.3', + creationDate: 'Wed Feb 13 15:29:04 CET 2008', + updateDate: 'Wed Feb 13 15:29:04 CET 2008', + accessDate: 'Mon Jan 19 16:09:41 CET 2009' + }, + '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': { + header: '####', + data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=', + version: '0.3', + creationDate: 'Wed Feb 13 15:28:28 CET 2008', + updateDate: 'Wed Feb 13 15:28:28 CET 2008', + accessDate: 'Wed Feb 13 15:28:28 CET 2008' + }, + 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': { + header: '####', + data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==', + version: '0.2', + creationDate: 'Tue Apr 17 19:11:33 CEST 2007', + updateDate: 'Tue Apr 17 19:11:33 CEST 2007', + accessDate: 'Tue Apr 17 19:11:33 CEST 2007' + } + } + }, + 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': { + data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==', + version: '0.2', + creationDate: 'Wed Mar 14 18:43:29 CET 2007', + updateDate: 'Wed Mar 14 18:43:29 CET 2007', + accessDate: 'Mon Jan 19 16:09:30 CET 2009', + currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a', + versions: { + '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': { + header: '####', + data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h', + version: '0.2', + creationDate: 'Wed Mar 14 18:43:29 CET 2007', + updateDate: 'Wed Mar 14 18:43:29 CET 2007', + accessDate: 'Mon Jan 19 16:09:30 CET 2009' + } + } + } + } + } + } + }, + + //------------------------------------------------------------------------- + + 'test_test_offline_copy_data': { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': { + s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460', + v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13":"0"},"data":"Ki9chN/ker5c+7zB5NinstllVq1Vs+N5pezZIohKVVa15VLSIyre3DRilRoldy/94LbGaEM3SZsMlf28hYbWySln3ekNMIB+MItaYb8urw+8U6n8+QaRMAClHXukfi8te2d1OIlgjbrBQNMmzBorjIs="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"YgSYIsDeVT87bfiASQqXA2E9"},"version":"0.1"}', + statistics: '6Kupec1ZD7Dw0WzK7pPesnLE', + userDetailsVersion: '0.3', + records: { + '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13': { + data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==', +// data: 'bXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==', + version: '0.3', + creationDate: 'Tue May 05 01:28:36 PDT 2009', + updateDate: 'Tue May 05 01:28:36 PDT 2009', + accessDate: 'Tue May 05 01:28:36 PDT 2009', + currentVersion: 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d', + versions: { + 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d': { + header: '####', + data: 'Pc18C1A9NwNlecbOtOOAEymNZD5oq20ZvPqMfiCyNhkcmaN9sEnifF31epZSjpDw4XM4ex3HFhhITttXlCrossDVYB8z00k6XsFruCkdwFRmBjb2PdrdZFAkGQeS/8xTarYWgiflkfGocGqVm6EUq1gh8QLE173Jzo15LOSuzuSS90BTMvcsqzzRrIEe+9jwF9/ehLyQ5yYxNImFGQQ2jkW0KiZsjyEbQAGry7B1/AiSUBaGYHYzcB3bFgXnzC3ecPwL+ENZ+azpTd143WneuVMUJrWNp3S+9ZRzboRzcYV6Ax3nOLPS7LTc+e9j9s4CrPvc1L6pG23AzNByDWst0JrqhN37yp67EVVrFQfUDWcKgZyyA/M82q1TVScx+I4A+g9ASC+PdQ3+M5+EOtEfClkgYJFqzXqwPKYwBv4CBKxikS2Vt8x40271kjmVYyGQOIRTo1UKn6u07TS5hxdEgEI+WdukG52813USiD8bQFbN0r4VhjFSqKMAJoItjqvafBNBl+OXYQ1p1zRCXP7wHS4/F7mvrK98gSuIsBgfL+/q9rExXaxIZJNSbs1HGAXR1TxYSvyKZvLa', + version: '0.3', + creationDate: 'Tue May 05 01:28:36 PDT 2009', + updateDate: 'Tue May 05 01:28:36 PDT 2009', + accessDate: 'Tue May 05 01:28:36 PDT 2009' + } + } + } + } + } + } + }, + + //------------------------------------------------------------------------- + + 'test_test_offline_copy_data_withExtraVersion': { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': { + s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460', + v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53":"0"},"data":"YjlNzXUO9m0EXdi5fUguA6RjR5jc2mwuHkpMsHAheExR2zpoV6OJx8tBTdUGqDBAlbIn6xUx2TT+dzgjic/XubgKNsv6JpTvnfiW6ZMWiebKXVigoZw7L5EvmcHjVLI8aoIhVEj4ADwkh9qHm0Kt1zFGQPwwJfo="},"directLogins":{"index":{},"data":"4W5csD8DxlxeXVRROk7wVbXi"},"preferences":{"data":"/DjOoFcgquxUbW5ye2LrpsKM"},"oneTimePasswords":{"data":"DEqkd74lLAGtG4YKRPniBNBU"},"version":"0.1"}', + statistics: 'EkRr9wEXi/WOlZfCXphn9kfx', + userDetailsVersion: '0.3', + records: { + '75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53': { + data: '/gtNfde5l2J9eeg+rlBHZtqO4RDaWNQwaMEluOVowKdUlGAYjo9FU0NwKsA9CM3ST4sTYl0mylP3C/AGybO8/9sTCkEn20wi0slharA61Rk8uB2lNjCICZB4l3ZGvD4AHKucu8YQzxpWop5dTN8f4us5eJ2VjvJPLqUzSKZL4g+6MiKbjQ==', + version: '0.3', + creationDate: 'Tue May 05 18:47:53 CEST 2009', + updateDate: 'Tue May 05 18:48:59 CEST 2009', + accessDate: 'Tue May 05 18:48:59 CEST 2009', + currentVersion: '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b', + versions: { + '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564': { + header: '####', + data: 'MZGx+tQAecxJNl6UbWHIM8g416Qa8DfWtGo7f2vLkPBbhsr20xnZ233oPqIGceG5/6WMssQd9c8U81urISK+4Ar8zHGUxTdIYLZaDq33Q0uF5vO7OsaBcjL7m+tX7zB+e/eu0ABbqvt+saMsZKKSdIZv2KNbAg5VTiL7GjWuowM23tWgiUBgX3eO5fnUUQWVkBygk0qy2O45oNfb1XcbsGMCfS4YPF9GB/wGSQKG8keMoy1ZWZh4nG+Pdx2ymIrYKLv8T+i7jtWEbyhvEglb7TadCMBBF0pnkYvG3F29skWooZC92dy5213o+3/uSKi0od5tAbvSYZHjT5hDulUtmjRFGq4ZRERLqvrZs9Sg8G2mjtf8Ta99Hob8WLxyGF9x7s1LcLPERtdsP9qCD+I0WtwrDiodl/sPQ/5s3G2S+M/YejKXBvG3AWwoO1gkdhec3+d3meFNvCr0hKNzotrHmDLC4tGyZIaAcBmPQ8xSD5KmNJJFU+V0QIdiEYKnPjo95oSmKyK1UtIoPrWCahfYSKXh+aW53XnzY4JKHRER9vWwdJzz', + version: '0.3', + creationDate: 'Tue May 05 18:47:53 CEST 2009', + updateDate: 'Tue May 05 18:47:53 CEST 2009', + accessDate: 'Tue May 05 18:47:53 CEST 2009' + }, + '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7': { + header: '####', + data: 'Y38v4jhKwcsW8LDTigIhtdLJ2zgv+1rSutqyu0AilBQeSTe4D0rnapZZTW/mNnD5IGpWKFoEl8+WGj1zvGzleNdkOa08nWJEYDNe2h0+FjBSHBUAgH5fraezomRWzJ/Z5HHFiZuFfpjt2BHd0Y3Not6AuL3aBgjjkEai90r2o59Xr70maUwo1UqmtVg3gvX067MC3hlqhNIp390J8LFiSj8Z4US9x/WzVR5Xx069+0PFMBwipq9WJPrcfTPwvP6xVa+J8BCJk3HtboRutq1ZhhHpibm+TY3Xl3gFTTCHWDZCSJ4Rm1dWkyqpx51u/AVg2TC+ljFLKv7hq3euVZNMLNMY2BqoCkcb+w6dFLDs3WfPAW0aQN2P++GFa/eVpN90YxAeXufjsXKaArTMjGWKiHqyU1iVVI8N1QEiFYjjBV1GvkJxog5PjtAzJF++qwHDIa+gJ+NnOfenVF0wIRMCEnpGyvbg3SkUoenKFoHO0IcSP2CW2RWV/GAmiEZEuVD393mKi5B6fpjdO9JVPNyz0i0kW++dtzInwPnglhOAY1ywT0ExOBLIEr8=', + version: '0.3', + previousVersion: '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564', + previousVersionKey: 'f45/Sx3jMC8CgdT8cjfcC4ApA8xMXABFO48jiTh5VjJfTlVqw3NnHRO2KDBIhy0znPvP2AKlpKQHruW8LQno7YLyhEIXh4ChjMUjJsFFwB/LUg==', + creationDate: 'Tue May 05 18:48:11 CEST 2009', + updateDate: 'Tue May 05 18:48:11 CEST 2009', + accessDate: 'Tue May 05 18:48:11 CEST 2009' + }, + '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b': { + header: '####', + data: 'tkiW41JHOfbYOt2KHx1HtDJEzxbfVS1Y2HJQqdQZ73zhvxnkWLw/X6FMiBexLeoKXO1H9NIWS884MzEO782vg8QRxTizg66Yye+q1Hox+QsaEoaD4UQ54XV1duTOB/XS5P0P9DFvtIz9msEu8GJrvizAdxu/7FG2b5XfENDkwqIzydI7JMfGC0JzDnfGvYkWqoL8jx3Joxa7TNqN4he4v771Ho1ZoUv3Pp7ZGwBU+btl6Q9mcycSf5KXdTw+6nDjfQh8qyts/u7O5xPFh2Yn8zS48x95I4SA4yFKtERU3pLAxIkcZWVb17xT8xlbPESreZ0RyYSR0CgW0wPMxkLHH1uqWycTa7yIxUhyn+JK9jCl4eDa/KUSGbN1yb6pOyjGuev1vHEZv3bOmO52RVVIdMHTe3LezCKY8xpDqtQKSfAvFg1TmabugXePXB+KvPbDDWI5otDEIwLYhDFcSn2FyqUEATSzeU2o1uXO+ffbU3QBrwr27tsreughWSP7905FQbEEshsRUc2Xt92WhTnVM6W74Y0bMLWjTrXbu+hNsjtFYYN6gtezcltnB58MVw==', + version: '0.3', + previousVersion: '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7', + previousVersionKey: 'XtJ8Ub99GXIkxErIPr0HaIrRqlAO0Naa/tPwUA51K2D5R6R3CR6QbHd3GpkCnu+y+bcEIRYrQqgabi3LROYT+1SZ9B9FctX6FyaTjYEazFdCvg==', + creationDate: 'Tue May 05 18:48:59 CEST 2009', + updateDate: 'Tue May 05 18:48:59 CEST 2009', + accessDate: 'Tue May 05 18:48:59 CEST 2009' + } + } + } + } + } + } + }, + + //------------------------------------------------------------------------- + 'syntaxFix': "" +} diff --git a/frontend/delta/tests/tests/Components/CardDetail/cardDetail_test.js b/frontend/delta/tests/tests/Components/CardDetail/cardDetail_test.js new file mode 100644 index 0000000..458f2ef --- a/dev/null +++ b/frontend/delta/tests/tests/Components/CardDetail/cardDetail_test.js @@ -0,0 +1,51 @@ +/* + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +*/ + +Clipperz.PM.RunTime = {}; +MochiKit.DOM.addLoadEvent(function () { + var deferredResult; + var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + + Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + Clipperz.PM.Strings.Languages.initSetup(); + + Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.MainController(); + Clipperz.PM.RunTime.mainController.run({'shouldShowRegistrationForm':false}); + + deferredResult = new Clipperz.Async.Deferred("CardDetail_test.init", {trace:false}); + +/* * / + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'doLogin', {username:'test', passphrase:'test'}); + deferredResult.wait(1); + deferredResult.addCallback(function () { console.log("SHOW RECORD");}); + deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'showRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); +/ **/ + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); +/**/ + + deferredResult.callback(); + + return deferredResult; +}); diff --git a/frontend/delta/tests/tests/Components/CardDetail/index.html b/frontend/delta/tests/tests/Components/CardDetail/index.html new file mode 100644 index 0000000..7f4752c --- a/dev/null +++ b/frontend/delta/tests/tests/Components/CardDetail/index.html @@ -0,0 +1,169 @@ +<!-- + +Copyright 2008-2013 Clipperz Srl + +This file is part of Clipperz, the online password manager. +For further information about its features and functionalities please +refer to http://www.clipperz.com. + +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + +* Clipperz 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 Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Clipperz. If not, see http://www.gnu.org/licenses/. + +--> + +<html> +<head> + <title>Card Dialog NEW - test</title> + + <meta http-equiv="content-type" content="text/html; charset=utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- user-scalable=no, maximum-scale=1.0 --> + + <meta name="apple-mobile-web-app-capable" content="yes" /> + <meta name="apple-mobile-web-app-status-bar-style" content="black" /> + + <meta name="HandheldFriendly" content="True"> + <meta name="MobileOptimized" content="320"> + +<!-- link rel="apple-touch-icon-precomposed" ... --> + <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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"> + <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,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"> + <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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"> + <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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"> + + <meta http-equiv="cleartype" content="on"> + <meta name="apple-mobile-web-app-capable" content="yes"> + + + + + <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> + <script type="text/javascript" src="../../../../js/React/react-0.4.1.js"></script> + + <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/PIN.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Subscription.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/Overlay.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/PageTemplate.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/LoginForm.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/RegistrationWizard.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/CardList.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/CardDetail.js'></script> + <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/ErrorPage.js'></script> + + <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/MainController.js'></script> + + + <script type='text/javascript' src='./User.data.js'></script> + <script type='text/javascript' src='./cardDetail_test.js'></script> +<script> + Clipperz_IEisBroken = false; + Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>') +</script> + +<!--[if IE]><script> +Clipperz_IEisBroken = true; +</script><![endif]--> + + <link rel="stylesheet" type="text/css" href="../../../../css/web.css" /> + +</head> +<body> + +<div id="mainDiv"> + <div class="page" id="loadingPage"> + <div> + <h1>clipperz</h1> + <h3 class="clipperzPayoff">keep it to yourself</h3> + </div> + </div> + <div class="page right" id="loginPage"></div> + <div class="page right" id="registrationPage"></div> + <div class="page right" id="cardListPage"></div> + <div class="page right" id="cardDetailPage"></div> + <div class="page right" id="accountPage"></div> + <div class="page right" id="preferencesPage"></div> + <div class="page right" id="errorPage"></div> +</div> +<div class="overlay" id="overlay"> + <div class="spinner"> + <div class="bar01"></div> + <div class="bar02"></div> + <div class="bar03"></div> + <div class="bar04"></div> + <div class="bar05"></div> + <div class="bar06"></div> + <div class="bar07"></div> + <div class="bar08"></div> + <div class="bar09"></div> + <div class="bar10"></div> + <div class="bar11"></div> + <div class="bar12"></div> + </div> + <span class="icon done" style="display:none">done</span> + <span class="icon failed" style="display:none">failed</span> + <span class="title">loading</span> +</div> + +</body> +</html> diff --git a/frontend/gamma/html/index_template.html b/frontend/gamma/html/index_template.html index ba7c311..b80a34f 100644 --- a/frontend/gamma/html/index_template.html +++ b/frontend/gamma/html/index_template.html @@ -1,79 +1,79 @@ <html> <head> <title>@page.title@</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <!-- @copyright@ --> @css@ <link rel="shortcut icon" href="./clipperz.ico" /> <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> <script> Clipperz_IEisBroken = false; Clipperz_normalizedNewLine = '\n'; - Clipperz_dumpUrl = "/../dump/"; + Clipperz_dumpUrl = "@dump.path@"; Clipperz_version = "@application.version@"; "use strict"; </script> <!--[if IE]><script> Clipperz_IEisBroken = true; Clipperz_normalizedNewLine = '\x0d\x0a'; </script><![endif]--> @js_LINKED@ </head> <body> <div id="mainDiv"> <div id="loading"> <div> <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a --> <h1>clipperz</h1> <h3 class="clipperzPayoff">keep it to yourself!</h3> <!-- h5>loading ...</h5 --> </div> </div> @js_EMBEDDED@ </div> <!-- div id="applicationVersionType" class="@application.version.type@"></div --> <script> Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@}); /*offline_data_placeholder*/ /* * / MochiKit.DOM.addLoadEvent(function () { Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); - MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'j', passphrase:'j'}); +// MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); }); / * */ </script> <!-- --> <!-- div id="javaScriptAlert"> <div class="mask"></div> <div class="message"> <div class="header"></div> <div class="body"> <div class="alertLogo"></div> <div class="alert"> <h1>Attention!</h1> <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p> <h3>Javascript is required to access Clipperz.</h3> <h5>Please enable scripting or upgrade your browser.</h5> </div> </div> <div class="footer"></div> </div> </div --> <!-- --> </body> </html> diff --git a/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js index 85d55c0..72460ba 100644 --- a/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js +++ b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js @@ -1,349 +1,349 @@ /* Copyright 2008-2013 Clipperz Srl This file is part of Clipperz, the online password manager. For further information about its features and functionalities please refer to http://www.clipperz.com. * Clipperz is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * Clipperz 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 Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License along with Clipperz. If not, see http://www.gnu.org/licenses/. */ //============================================================================= // // E N G L I S H A M E R I C A N ( en_US ) // //============================================================================= Clipperz.PM.Strings.Languages['en-us'] = { /* // Login page - description 'clipperzServiceDescription': "\ <!-- FIX CSS DONE --> \ <h2>Keep it to yourself!</h2>\ <ul>\ <li>\ <h3>Clipperz is:</h3>\ <ul>\ <li><p>a secure and simple password manager</p></li>\ <li><p>an effective single sign-on solution</p></li>\ <li><p>a digital vault for your personal data</p></li>\ </ul>\ </li>\ <li>\ <h3>With Clipperz you can:</h3>\ <ul>\ <li><p>store and manage your passwords and online credentials</p></li>\ <li><p>login to your web services without entering any username or password</p></li>\ <li><p>protect all your sensitive data: codes for burglar alarms, PINs, credit card numbers, …</p></li>\ <li><p>share secrets with family members and associates (coming soon)</p></li>\ </ul>\ </li>\ <li>\ <h3>Clipperz benefits:</h3>\ <ul>\ <li><p>free and completely anonymous</p></li>\ <li><p>access it any time from any computer</p></li>\ <li><p>no software to download and nothing to install</p></li>\ <li><p>avoid keeping secrets on your PC or on paper</p></li>\ </ul>\ </li>\ <li>\ <h3>Clipperz security:</h3>\ <ul>\ <li><p>your secrets are locally encrypted by your browser before being uploaded to Clipperz</p></li>\ <li><p>the encryption key is a passphrase known only to you</p></li>\ <li><p>Clipperz hosts your sensitive data in encrypted form and could never actually access the data in its plain form</p></li>\ <li><p>Clipperz is built upon standard encryption schemes, nothing fancies or homemade</p></li>\ <li><p>you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!</p></li>\ </ul>\ </li>\ <li>\ <a href=\"http://www.clipperz.com\" target=\"_blank\">Learn more</a>\ </li>\ </ul>", 'loginFormTitle': "login with your Clipperz account", 'loginFormUsernameLabel': "username", 'loginFormPassphraseLabel': "passphrase", 'loginFormDontHaveAnAccountLabel': "don\'t have an account?", 'loginFormCreateOneLabel': "create one", 'loginFormForgotYourCredentialsLabel': "forgot your credentials?", 'loginFormAarghThatsBadLabel': "aargh! that\'s bad!", 'loginFormAfraidOfMaliciousScriptsLabel': "afraid of malicious scripts?", 'loginFormVerifyTheCodeLabel': "verify the code", 'loginFormButtonLabel': "Login", 'loginFormOneTimePasswordCheckboxLabel': "use a one-time passphrase", 'loginFormOneTimePasswordCheckboxDescription': "", // Login page - language selection 'loginPanelSwithLanguageDescription': "<h5>Switch to your preferred language</h5>", // Login page - browser compatibility 'browserCompatibilityDescription': "<p>Have a better and safer Clipperz experience with Firefox. However Clipperz works just fine also with Opera, Safari and MS Internet Explorer!</p>", // Login with OTP - message panel 'OTPloginMessagePanelInitialTitle': "Logging in using a one-time passphrase", 'OTPloginMessagePanelInitialText': "Sending OTP credentials …", 'OTPloginMessagePanelLoadingTitle': "Logging in using a one-time passphrase", 'OTPloginMessagePanelLoadingText': "Fetching encrypted authentication data from the server …", 'OTPloginMessagePanelProcessingTitle': "Logging in using a one-time passphrase", 'OTPloginMessagePanelProcessingText': "Local decryption of authentication data", // Regular login - message panel 'loginMessagePanelInitialTitle': "Logging in …", 'loginMessagePanelInitialText': "---", 'loginMessagePanelInitialButtonLabel': "Cancel", 'loginMessagePanelConnectedTitle': "Connected", 'loginMessagePanelConnectedText': "Done", 'loginMessagePanelFailureTitle': "Error", 'loginMessagePanelFailureText': "Login failed", 'loginMessagePanelFailureButtonLabel': "Close", // Regular login - message panel - connection 'connectionLoginSendingCredentialsMessageTitle': "Verifying credentials", 'connectionLoginSendingCredentialsMessageText': "Sending credentials", 'connectionLoginCredentialsVerificationMessageTitle': "Verifying credentials", 'connectionLoginCredentialsVerificationMessageText': "Performing SRP authentication", 'connectionLoginDoneMessageTitle': "Verifying credentials", 'connectionLoginDoneMessageText': "Connected", // Regular login - message panel - user 'userLoginPanelUpgradingUserCredentialsMessageTitle': "Verifying credentials", 'userLoginPanelUpgradingUserCredentialsMessageText': "Upgrading your credentials to a new authentication schema", 'userLoginPanelConnectedMessageTitle': "User authenticated", 'userLoginPanelConnectedMessageText': "Successfully logged in", 'userLoginPanelTryingAnOlderConnectionSchemaMessageTitle': "Verifying credentials", 'userLoginPanelTryingAnOlderConnectionSchemaMessageText': "Trying an older authentication schema", 'userLoginPanelLoadingUserDataMessageTitle': "User authenticated", 'userLoginPanelLoadingUserDataMessageText': "Downloading encrypted card headers from Clipperz", 'userLoginPanelDecryptingUserDataMessageTitle': "User authenticated", 'userLoginPanelDecryptingUserDataMessageText': "Local decryption of card headers", 'userLoginPanelDecryptingUserStatisticsMessageTitle': "User authenticated", 'userLoginPanelDecryptingUserStatisticsMessageText': "Local decryption of usage statistics", // Registration page - splash alert 'splashAlertTitle': "Welcome to Clipperz!", 'splashAlertText': "\ <!-- FIX CSS DONE! --> \ <p>Some security advice</p>\ <ul>\ <li><p>Storing your data at Clipperz is as secure as the passphrase you choose to protect them. Nobody can access them unless they know your passphrase.</p></li>\ <li><p>If you are going to use Clipperz for safeguarding sensitive and critical information please make sure to use a strong passphrase. The longer the better!</p></li>\ <li><p>Clipperz will not be able to recover a lost passphrase!</p></li>\ </ul>\ <p>For any further information, please refer to <a href=\"http://www.clipperz.com\" target=\"_blank\">Clipperz</a> website.</p>", 'splashAlertCloseButtonLabel': "Ok", // Registration page - form 'registrationFormTitle': "create your account", 'registrationFormUsernameLabel': "username", 'registrationFormPassphraseLabel': "passphrase", 'registrationFormRetypePassphraseLabel': "re-enter passphrase", 'registrationFormSafetyCheckLabel': "I understand that Clipperz will not be able to recover a lost passphrase.", -'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>.", +'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='https://www.clipperz.com/terms_service' target='_blank'>Terms of Service</a>.", 'registrationFormDoYouAlreadyHaveAnAccountLabel': "do you already have an account?", 'registrationFormSimplyLoginLabel': "simply login", 'registrationFormButtonLabel': "Register", // Registration page - warning messages 'registrationFormWarningMessageNotMatchingPassphrases': "Your passphrases don't match, please re-type them.", 'registrationFormWarningMessageSafetyCheckNotSelected': "Please read and check all the boxes below.", 'registrationFormWarningMessageTermsOfServiceCheckNotSelected': "You need to agree to the Terms of Service.", // Registration page - message panel 'registrationMessagePanelInitialTitle': "Creating account …", 'registrationMessagePanelInitialText': "---", 'registrationMessagePanelInitialButtonLabel': "Cancel", 'registrationMessagePanelRegistrationDoneTitle': "Registration", 'registrationMessagePanelRegistrationDoneText': "Done", 'registrationMessagePanelFailureTitle': "Registration failed", 'registrationMessagePanelFailureButtonLabel': "Close", // Registration page - message panel - connection 'connectionRegistrationSendingRequestMessageText': "Verifying credentials", 'connectionRegistrationSendingCredentialsMessageText': "Sending credentials", // Registration page - splash panel 'registrationSplashPanelTitle': "Security advice", 'registrationSplashPanelDescription': "<p>These are your Clipperz credentials, take good care of them. Clipperz will never display your username and passphrase a second time!</p>", 'registrationSplashPanelUsernameLabel': "username", 'registrationSplashPanelPassphraseLabel': "passphrase", 'registrationSplashPanelShowPassphraseButtonLabel': "show passphrase", // Header links 'donateHeaderLinkLabel': "donate", 'creditsHeaderLinkLabel': "credits", 'feedbackHeaderLinkLabel': "feedback", 'helpHeaderLinkLabel': "help", 'forumHeaderLinkLabel': "forum", // Menu labels 'recordMenuLabel': "cards", 'accountMenuLabel': "account", 'dataMenuLabel': "data", 'contactsMenuLabel': "contacts", 'toolsMenuLabel': "tools", 'logoutMenuLabel': "logout", 'lockMenuLabel': "lock", // Lock dialog 'lockTitle': "The account is locked", 'lockDescription': "<p>To unlock your account, please enter your passphrase.</p>", 'unlockButtonLabel': "Unlock", // Account panel - change passphrase 'changePasswordTabLabel': "Change your passphrase", 'changePasswordTabTitle': "Change your passphrase", 'changePasswordFormUsernameLabel': "username", 'changePasswordFormOldPassphraseLabel': "old passphrase", 'changePasswordFormNewPassphraseLabel': "new passphrase", 'changePasswordFormRetypePassphraseLabel': "re-enter new passphrase", 'changePasswordFormSafetyCheckboxLabel': "I understand that Clipperz will not be able to recover a lost passphrase.", 'changePasswordFormSubmitLabel': "Change passphrase", // Account panel - change passphrase - warning messages 'changePasswordFormWrongUsernameWarning': "Wrong username", 'changePasswordFormWrongPassphraseWarning': "Wrong passphrase", 'changePasswordFormWrongRetypePassphraseWarning': "Your passphrases don't match, please re-type them.", 'changePasswordFormSafetyCheckWarning': "Please read and check the box below.", // Account panel - change passphrase - progress dialog 'changePasswordFormProgressDialogTitle': "Changing user credentials", 'changePasswordFormProgressDialogEmptyText': "---", 'changePasswordFormProgressDialogConnectedMessageTitle': "Connected", 'changePasswordFormProgressDialogConnectedMessageText': "Done", 'changePasswordFormProgressDialogErrorMessageTitle': "Error", 'changePasswordFormProgressDialogErrorMessageText': "Credentials change failed!", 'changeCredentialsPanelEncryptingDataMessageTitle': "Changing your passphrase", 'changeCredentialsPanelEncryptingDataMessageText': "Local encryption of card headers", 'changeCredentialsPanelCreatingNewCredentialsMessageTitle': "Changing your passphrase", 'changeCredentialsPanelCreatingNewCredentialsMessageText': "Updating your credentials", 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle': "Changing your passphrase", 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageText': "Uploading your encrypted credentials to Clipperz", 'changeCredentialsPanelDoneMessageTitle': "Changing your passphrase", 'changeCredentialsPanelDoneMessageText': "Done", // Account panel - OTP 'manageOTPTabLabel': "Manage your one-time passphrases", 'manageOTPTabTitle': "Manage your one-time passphrases", 'manageOTPTabDescription': "\ <p>A one-time passphrase works like your regular passphrase, but can be used only once.</p>\ <p>If the same passphrase is used again at a later stage in a login attempt it will be rejected and the login process will fail.</p>\ <p>Immediately after a successful login, your one-time passphrase will be deleted preventing any fraudulent access.</p>\ <p>One-time passphrases are an excellent choice if one is concerned about keyloggers or spyware infections that may be collecting data from compromised machines.</p>\ <p><b>It's strongly advisable to use one-time passphrases when accessing Clipperz from public terminals, such as Internet cafes and libraries.</b></p>", // Account panel - OTP - OTP table 'oneTimePasswordReadOnlyMessage': "\ <h6>Sorry!</h6>\ <p>You cannot manage your one-time passphrases when using the offline version of Clipperz.</p>", 'oneTimePasswordLoadingMessage': "\ <h6>Loading data</h6>\ <p>Please wait …</p>", 'oneTimePasswordNoPasswordAvailable': "\ <h6>No one-time passphrase available</h6>\ <p>Click the “New” button above to add one-time passphrases to your account.</p>", 'createNewOTPButtonLabel': "New", 'deleteOTPButtonLabel': "Delete", 'printOTPButtonLabel': "Print", 'disabledOneTimePassword_warning': "disabled", 'oneTimePasswordSelectionLink_selectLabel': "Select:", 'oneTimePasswordSelectionLink_all': "all", 'oneTimePasswordSelectionLink_none': "none", 'oneTimePasswordSelectionLink_used': "used", 'oneTimePasswordSelectionLink_unused': "unused", //Account panel - OTP - saving new OTP dialog 'saveOTP_encryptUserDataTitle': "Saving one-time passphrase", 'saveOTP_encryptUserDataText': "Processing new OTP credentials …", 'saveOTP_encryptOTPDataTitle': "Saving one-time passphrase", 'saveOTP_encryptOTPDataText': "Local encryption of authentication data …", 'saveOTP_sendingDataTitle': "Saving one-time passphrase", 'saveOTP_sendingDataText': "Sending authentication data to the server …", 'saveOTP_updatingInterfaceTitle': "Saving one-time passphrase", 'saveOTP_updatingInterfaceText': "Updating interface", // Account panel - preferences 'accountPreferencesLabel': "Preferences", 'accountPreferencesTabTitle': "Preferences", 'accountPreferencesLanguageTitle': "Language", 'accountPreferencesLanguageDescription': "<p>Choose your preferred language from the list below.</p>", 'showDonationReminderPanelTitle': "Donation reminders", 'showDonationReminderPanelDescription': "<p>Show donation reminders</p>", 'saveUserPreferencesFormSubmitLabel': "Save", 'cancelUserPreferencesFormSubmitLabel': "Cancel", // Account panel - preferences - saving dialog 'accountPreferencesSavingPanelTitle_Step1': "Saving preferences", 'accountPreferencesSavingPanelText_Step1': "Local encryption of your preferences", 'accountPreferencesSavingPanelTitle_Step2': "Saving preferences", 'accountPreferencesSavingPanelText_Step2': "Sending encrypted preferences to Clipperz", // Account panel - login history 'accountLoginHistoryLabel': "Login history", 'loginHistoryTabTitle': "Login history", 'loginHistoryReadOnlyMessage': "\ <h6>Sorry!</h6>\ <p>The login history is not available while using the offline version of Clipperz.</p>", 'loginHistoryLoadingMessage': "\ <h6>Loading data</h6>\ <p>Please wait …</p>", 'loginHistoryLoadedMessage': "\ <h6>Your latest 10 logins</h6>\ <p></p>", 'loginHistoryIPLabel': "IP", 'loginHistoryTimeLabel': "date", 'loginHistoryCurrentSessionText': "current session", 'loginHistoryReloadButtonLabel': "Reload login history", // Account panel - delete account 'deleteAccountTabLabel': "Delete your account", 'deleteAccountTabTitle': "Delete your account", 'deleteAccountFormUsernameLabel': "username", 'deleteAccountFormPassphraseLabel': "passphrase", 'deleteAccountFormSafetyCheckboxLabel': "I understand that all my data will be deleted and that this action is irreversible.", 'deleteAccountFormSubmitLabel': "Delete my account", //Account panel - delete account - warnings 'deleteAccountFormWrongUsernameWarning': "Wrong username", 'deleteAccountFormWrongPassphraseWarning': "Wrong passphrase", 'deleteAccountFormSafetyCheckWarning': "Please read and check the box below.", //Account panel - delete account - confirmation 'accountPanelDeletingAccountPanelConfirmationTitle': "ATTENTION", 'accountPanelDeleteAccountPanelConfirmationText': "Are your sure you want to delete your account?", 'accountPanelDeleteAccountPanelConfirmButtonLabel': "Yes", 'accountPanelDeleteAccountPanelDenyButtonLabel': "No", //Account panel - delete account - confirmation diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js index 06746d1..cd5faa6 100644 --- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js +++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js @@ -1,350 +1,350 @@ /* Copyright 2008-2013 Clipperz Srl This file is part of Clipperz, the online password manager. For further information about its features and functionalities please refer to http://www.clipperz.com. * Clipperz is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * Clipperz 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 Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License along with Clipperz. If not, see http://www.gnu.org/licenses/. */ Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) { args = args || {}; Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments); this._tabPanelController = null; this._initiallySelectedTab = args.selected || 'CREDENTIALS'; this._tabPanelControllerConfiguration = { 'CREDENTIALS': { tab: 'credentialsTab', panel: 'credentialsTabpanel' }, 'CHECK_CREDENTIALS': { tab: 'checkCredentialsTab', panel: 'checkCredentialsTabpanel' }, 'TERMS_OF_SERVICE': { tab: 'termsOfServiceTab', panel: 'termsOfServiceTabpanel' }, 'CREATE_USER': { tab: 'createUserTab', panel: 'createUserTabpanel' } //, /* 'LOGIN': { tab: 'loginTab', panel: 'loginTabpanel' } */ }; return this; } //============================================================================= Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, { //------------------------------------------------------------------------- 'toString': function () { return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component"; }, //========================================================================= 'disableAllPanels': function () { this.tabPanelController().selectTab(null); }, //------------------------------------------------------------------------- 'enableCredentialsPanel': function () { this.tabPanelController().selectTab('CREDENTIALS'); }, 'enableCheckCredentialsPanel': function () { this.tabPanelController().selectTab('CHECK_CREDENTIALS'); }, 'enableTermsOfServicePanel': function () { this.tabPanelController().selectTab('TERMS_OF_SERVICE'); }, 'enableCreateUserPanel': function () { this.tabPanelController().selectTab('CREATE_USER'); }, // 'enableLoginPanel': function () { // this.tabPanelController().selectTab('LOGIN'); // }, //========================================================================= 'shouldShowElementWhileRendering': function() { return false; }, //========================================================================= 'tabPanelController': function () { if (this._tabPanelController == null) { this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({ component:this, configuration:this._tabPanelControllerConfiguration }); MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected') } return this._tabPanelController; }, //------------------------------------------------------------------------- 'renderSelf': function() { this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [ {tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[ {tag:'div', cls:'header', children:[ {tag:'div', cls:'title', children:[ {tag:'h3', id:this.getId('title'), html:"Create new user"} ]} ]}, {tag:'div', id:this.getId('body'), cls:'body', children:[ {tag:'div', cls:'tabContainer', children:[ {tag:'ul', cls:'tabs', children:[ {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]}, {tag:'li', id:this.getId('checkCredentialsTab'), children:[{tag:'span', html:"credentials check"}]}, {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]}, {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]} //, // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]}, ]}, {tag:'ul', cls:'tabPanels', children:[ {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[ {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]}, {tag:'ul', cls:'credentials', children:[ {tag:'li', children:[{tag:'span', cls:'label', html:"username"}, {tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]}, {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"}, {tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]} ]} ]}, {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[ {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]}, {tag:'ul', cls:'credentials', children:[ {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"}, {tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]} ]} ]}, {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[ {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]}, {tag:'ul', cls:'termsOfService', children:[ {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('awareOfUnrecoverablePassphrase')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('awareOfUnrecoverablePassphrase'), html:"I understand that Clipperz will not be able to recover a lost passphrase."}]}, - {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>."}]} + {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='https://www.clipperz.com/terms_service' target='_blank'>Terms of Service</a>."}]} ]} ]}, {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[ {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]}, {tag:'ul', cls:'createUserStates', children:[ {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]}, {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]}, {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]} ]} ]} //, // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[ // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]}, // ]} ]} ]} ]}, {tag:'div', id:this.getId('footer'), cls:'footer', children:[ {tag:'div', cls:'buttonArea', children:[ // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"}, // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"} ]} ]} ]}, {tag:'div', cls:'clear'} ]}); this.tabPanelController().setup(); // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent'); MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent'); MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); }, //------------------------------------------------------------------------- /* 'resetContent': function () { this.getElement('username').value = ''; this.getElement('passphrase').value = ''; }, */ //------------------------------------------------------------------------- 'displayElement': function() { return this.getElement('panel'); }, //------------------------------------------------------------------------- 'handleTabSelected': function (aSelectedTab) { /* switch (aSelectedTab) { case 'DETAILS': break; case 'DIRECT_LOGINS': MochiKit.Style.hideElement(this.getElement('backToDirectLoginList')); break; case 'SHARING': break; } */ }, //========================================================================= 'username': function () { return this.getElement('username').value; }, 'usernameElement': function () { return this.getElement('username'); }, 'passphrase': function () { return this.getElement('passphrase').value; }, 'rePassphrase': function () { return this.getElement('re-passphrase').value; }, 'awareOfUnrecoverablePassphrase': function () { return this.getElement('awareOfUnrecoverablePassphrase').value; }, 'readTermsOfService': function () { return this.getElement('readTermsOfService').value; }, //========================================================================= /* 'incrementUpdateFaviconCounter': function () { this._updateFaviconCounter ++; }, 'decrementUpdateFaviconCounter': function () { this._updateFaviconCounter --; }, 'updateFaviconCounter': function () { return this._updateFaviconCounter; }, */ //------------------------------------------------------------------------- /* 'updateFavicon': function () { this.decrementUpdateFaviconCounter(); if (this.updateFaviconCounter() == 0) { this.setFavicon(this.favicon()); } }, */ //========================================================================= /* 'bindingComponents': function () { return this._bindingComponents; }, 'clearAllBindingsComponents': function () { MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove')); this._bindingComponents = []; this.getElement('bindings').innerHTML = ''; }, 'addBindingComponent': function (aBindingComponent) { this.bindingComponents().push(aBindingComponent); aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'})); }, */ //========================================================================= /* 'formValueComponents': function () { return this._formValueComponents; }, 'clearAllFormValueComponents': function () { MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove')); this._formValueComponents = []; this.getElement('formValues').innerHTML = ''; }, 'addFormValueComponent': function (aFormValueComponent) { this.formValueComponents().push(aFormValueComponent); aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'})); }, */ //========================================================================= 'changedValue': function (anEvent) { MochiKit.Signal.signal(this, 'changedValue', anEvent); this.incrementUpdateFaviconCounter(); MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon')); }, //------------------------------------------------------------------------- 'handleBackClick': function (anEvent) { anEvent.preventDefault(); MochiKit.Signal.signal(this, 'back'); }, //========================================================================= 'bottomMargin': function () { var result; // TODO: WTF!!! // result = MochiKit.Style.getElementPosition(this.element())['y'] + // MochiKit.Style.getElementDimensions(this.element())['h']; // result = MochiKit.Style.getElementPosition(this.getElement('footer'))['y']; // result = 450; result = Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] + Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] - 60; return result; }, //========================================================================= 'focusOnUsernameElement': function () { MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus')); }, 'focusOnRePassphraseElement': function () { this.getElement('re-passphrase').focus(); }, /* diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js index df3ca0c..1f183dc 100644 --- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js +++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js @@ -1,65 +1,65 @@ /* Copyright 2008-2013 Clipperz Srl This file is part of Clipperz, the online password manager. For further information about its features and functionalities please refer to http://www.clipperz.com. * Clipperz is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * Clipperz 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 Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License along with Clipperz. If not, see http://www.gnu.org/licenses/. */ Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); Clipperz.PM.UI.Web.Components.PageFooter = function(args) { args = args || {}; Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments); return this; } //============================================================================= Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, { //------------------------------------------------------------------------- 'toString': function () { return "Clipperz.PM.UI.Web.Components.PageFooter component"; }, //------------------------------------------------------------------------- 'renderSelf': function(/*aContainer, aPosition*/) { this.append(this.element(), [ {tag:'div', cls:'footerWrapper', children:[ {tag:'div', cls:'footerContent', children:[ {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'}, {tag:'span', cls:'copyright', html:'Copyright © 2009-2013 Clipperz Srl'}, - {tag:'a', href:'http://www.clipperz.com/terms_of_service', target:'_blank', html:'terms of service'}, + {tag:'a', href:'https://www.clipperz.com/terms_service', target:'_blank', html:'terms of service'}, {tag:'a', href:'http://www.clipperz.com/privacy_policy', target:'_blank', html:'privacy policy'}, {tag:'div', cls:'applicationVersion', htmlString:'application version: <a href="https://github.com/clipperz/password-manager/tree/' + Clipperz_version + '" target="github">' + Clipperz_version + '</a>'} ]} ]} ]); Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e"); }, //------------------------------------------------------------------------- __syntaxFix__: "syntax fix" }); diff --git a/scripts/builder/backendBuilder.py b/scripts/builder/backendBuilder.py index b4ee990..ad6595c 100755 --- a/scripts/builder/backendBuilder.py +++ b/scripts/builder/backendBuilder.py @@ -1,145 +1,148 @@ #!/usr/bin/env python # -*- coding: UTF-8 -*- import sys, os, json import shutil import hashlib from functools import reduce from operator import add from itertools import izip import main #=================================================================== class BackendBuilder(object): def __init__ (self, projectTargetDir, frontends, versions, settings): self.projectTargetDir = projectTargetDir self.frontends = frontends self.versions = versions self.settings = settings # -------------------------------------------------------------------------- def name (self): raise NotImplementedError() def relativePath (self): raise NotImplementedError() def compileCode (self): raise NotImplementedError() def createPackage (self): raise NotImplementedError() # -------------------------------------------------------------------------- def sourceFolder (self): return os.path.join(main.projectBaseDir() , 'backend', self.relativePath(), 'src') def tempFolder (self): return os.path.join(self.projectTargetDir, '.tmp', self.relativePath()) def frontEndTempFolder (self): return self.tempFolder() def developmentTargetFolder (self): return os.path.join(self.projectTargetDir, 'development') def targetFolder (self): return os.path.join(self.projectTargetDir, self.relativePath()) # -------------------------------------------------------------------------- def writeToFolder (self, folder, filename, content): file = open(os.path.join(folder, filename), 'w') file.write(content.encode('utf-8')) file.close() - def configureIndexContent (self, indexContent, requestPathPrefix = ".."): +# def configureIndexContent (self, indexContent, requestPathPrefix = ".."): + def configureIndexContent (self, indexContent): result = indexContent - result = result.replace( '@request.path@', requestPathPrefix + '/' + self.settings['request.path'] ) +# result = result.replace( '@request.path@', requestPathPrefix + '/' + self.settings['request.path'] ) + result = result.replace( '@request.path@', self.settings['request.path'] ) + result = result.replace( '@dump.path@', self.settings['dump.path'] ) result = result.replace( '@should.pay.toll@', self.settings['should.pay.toll'] ) return result def formatMAC (self, value): x = iter(value) return ' '.join([reduce(add, tup) for tup in izip(x, x, x, x)]) def logChecksums (self, content, message): md5Digest = self.formatMAC(hashlib.md5(content.encode('utf-8')).hexdigest()) shaDigest = self.formatMAC(hashlib.sha1(content.encode('utf-8')).hexdigest()) sha256Digest = self.formatMAC(hashlib.sha256(content.encode('utf-8')).hexdigest()) print "-----" print message + ": " + md5Digest + " (md5)" print message + ": " + shaDigest + " (sha1)" print message + ": " + sha256Digest + " (sha256)" print "=====" def shouldCompileCode (self): return ('debug' in self.versions) or ('install' in self.versions) def run (self): print self.name() + " - RUN" if self.shouldCompileCode(): self.compileCode() for frontend in self.frontends: if (frontend.module == frontend.submodule): submoduleExtension = '' else: submoduleExtension = '.' + frontend.submodule main.createFolder(os.path.join(self.frontEndTempFolder(), frontend.module)) if 'debug' in self.versions: frontend.copyResourcesToFolder(self.frontEndTempFolder()) index = self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG')) self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index_debug' + submoduleExtension + '.html'), index) if 'install' in self.versions: index = self.configureIndexContent(frontend.assemble()) self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index' + submoduleExtension + '.html'), index) self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index" + submoduleExtension + ".html checksum") self.createPackage() # if 'development' in self.versions: # for frontend in self.frontends: # if (frontend.module == frontend.submodule): # submoduleExtension = '' # else: # submoduleExtension = '.' + frontend.submodule # # print "FRONTEND module: " + frontend.module # print "FRONTEND submodule: " + frontend.submodule # ## main.createFolder(os.path.join(self.developmentTargetFolder(), frontend.module)) # main.createFolder(self.developmentTargetFolder()) # # index = self.configureIndexContent(frontend.assemble(assemblyMode='DEVELOPMENT', versionType='DEBUG'), self.settings['development.settings']['url']) ## self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module, 'index_development' + submoduleExtension + '.html'), index) # self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module + submoduleExtension + '.html'), index) #=================================================================== diff --git a/scripts/builder/backends/phpBuilder.py b/scripts/builder/backends/phpBuilder.py index c928aa0..c928aa0 100755..100644 --- a/scripts/builder/backends/phpBuilder.py +++ b/scripts/builder/backends/phpBuilder.py diff --git a/scripts/builder/frontendBuilder.py b/scripts/builder/frontendBuilder.py index e52c31e..b72179f 100644 --- a/scripts/builder/frontendBuilder.py +++ b/scripts/builder/frontendBuilder.py @@ -1,420 +1,381 @@ #!/usr/bin/env python # -*- coding: UTF-8 -*- import sys, os, re import cssmin import jsmin import codecs import shutil import StringIO import urllib import main #=============================================================================== class FrontendBuilder(object): def __init__ (self, frontend, settings, repositoryVersion): if '.' in frontend: moduleComponents = frontend.split('.') self.module = moduleComponents[0] self.submodule = moduleComponents[1] else: self.module = frontend self.submodule = frontend self.settings = settings self.projectDir = main.projectBaseDir() # self.repository = repository.repositoryWithPath(self.projectDir) self.repositoryVersion = repositoryVersion self.processedFiles = {} #--------------------------------------------------------------------------- def name (self): raise NotImplementedError() + def projectResourceTypes (self): + raise NotImplementedError() def copyStaticResources (self, targetFolder): raise NotImplementedError() #--------------------------------------------------------------------------- def log (self, message): module = self.module if (self.module != self.submodule): module = module + "." + self.submodule print "frontend [" + module + "]: " + message def absolutePathForSources (self): return os.path.join(self.projectDir, 'frontend', self.module) def absolutePathForSourceFile (self, basePath, file): return os.path.join(self.absolutePathForSources(), basePath, file) def absolutePathForTargetFile (self, folder, basePath, file): return os.path.join(folder, self.module, basePath, file) def filterFiles (self, files): result = [] for file in files: if file.startswith('--'): pass else: result.append(file) return result def copyResources (self, sourceFolder, destinationFolder, fileType): if fileType in self.settings: for file in self.filterFiles(self.settings[fileType]): src = self.absolutePathForSourceFile(fileType, file) dst = self.absolutePathForTargetFile(destinationFolder, fileType, file) main.createFolder(os.path.dirname(dst)) shutil.copy2(src, dst) else: srcFolder = os.path.join(self.absolutePathForSources(), fileType) dstFolder = os.path.join(destinationFolder, self.module, fileType) if not(os.path.exists(dstFolder)): shutil.copytree(srcFolder, dstFolder) # try: # shutil.copytree(srcFolder, dstFolder) # except: # pass def copyResourcesToFolder (self, targetFolder): - self.copyResources(self.projectDir, targetFolder, 'css') - self.copyResources(self.projectDir, targetFolder, 'js') - self.copyResources(self.projectDir, targetFolder, 'images') +# self.copyResources(self.projectDir, targetFolder, 'css') +# self.copyResources(self.projectDir, targetFolder, 'js') +# self.copyResources(self.projectDir, targetFolder, 'images') + for resoureceType in self.projectResourceTypes(): + self.copyResources(self.projectDir, targetFolder, resoureceType) self.copyStaticResources(targetFolder) def loadFilesContent (self, basePath, files): result = "" for file in self.filterFiles(files): try: fileHandler = codecs.open(self.absolutePathForSourceFile(basePath, file), 'r', 'utf-8') except: print "FILE: " + file result += fileHandler.read() + '\n' fileHandler.close() return result def template (self): processedFile = 'html_template' if not self.processedFiles.has_key(processedFile): # self.processedFiles[processedFile] = self.loadFilesContent('html', ['index_template.html']) self.processedFiles[processedFile] = self.loadFilesContent('html', [self.settings['html.template']]) return self.processedFiles[processedFile] def cssminCompressor (self, css): # package found here: # - http://stackoverflow.com/questions/222581/python-script-for-minifying-css/2396777#2396777 # actual downloaded version: http://pypi.python.org/pypi/cssmin/0.1.4 return cssmin.cssmin(css) def regexCssCompressor (self, css): # http://stackoverflow.com/questions/222581/python-script-for-minifying-css/223689#223689 # remove comments - this will break a lot of hacks :-P css = re.sub( r'\s*/\*\s*\*/', "$$HACK1$$", css ) # preserve IE<6 comment hack css = re.sub( r'/\*[\s\S]*?\*/', "", css ) css = css.replace( "$$HACK1$$", '/**/' ) # preserve IE<6 comment hack # url() doesn't need quotes css = re.sub( r'url\((["\'])([^)]*)\1\)', r'url(\2)', css ) # spaces may be safely collapsed as generated content will collapse them anyway css = re.sub( r'\s+', ' ', css ) # shorten collapsable colors: #aabbcc to #abc css = re.sub( r'#([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3(\s|;)', r'#\1\2\3\4', css ) # fragment values can loose zeros css = re.sub( r':\s*0(\.\d+([cm]m|e[mx]|in|p[ctx]))\s*;', r':\1;', css ) for rule in re.findall( r'([^{]+){([^}]*)}', css ): # we don't need spaces around operators selectors = [re.sub( r'(?<=[\[\(>+=])\s+|\s+(?=[=~^$*|>+\]\)])', r'', selector.strip() ) for selector in rule[0].split( ',' )] # order is important, but we still want to discard repetitions properties = {} porder = [] for prop in re.findall( '(.*?):(.*?)(;|$)', rule[1] ): key = prop[0].strip().lower() if key not in porder: porder.append( key ) properties[ key ] = prop[1].strip() # output rule if it contains any declarations if properties: print "%s{%s}" % ( ','.join( selectors ), ''.join(['%s:%s;' % (key, properties[key]) for key in porder])[:-1] ) return css def compressCSS (self, css): self.log("compressing CSS") #return self.regexCssCompressor(css) return self.cssminCompressor(css) #========================================================================== def compressJS_jsmin (self, js, description): self.log("compressing " + description + " code") original = StringIO.StringIO(js) output = StringIO.StringIO() jsMinifier = jsmin.JavascriptMinify() jsMinifier.minify(original, output) result = output.getvalue() original.close() output.close() return result def compressJS_closureCompiler (self, js, description): # Googles Closure compiler # java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js result = js return result def compressJS (self, js, description): return self.compressJS_jsmin(js, description) #return self.compressJS_closureCompiler(js, description) #========================================================================== def packBookmarklet (self, bookmakeletCode, version): replacers = [ ('isLoginForm', 'ilf'), ('findLoginForm', 'flf'), ('findLoginForm', 'flf'), ('formParameters', 'fp' ), ('pageParameters', 'pp' ), ('serializeJSON', 'sj' ), ('reprString', 'rs' ), ('logFormParameters', 'lfp'), ('loadClipperzBookmarklet', 'lcb'), ('loginForm', 'lf' ), ('parameters', 'p' ), ('inputElementValues', 'iev'), ] result = self.compressJS(bookmakeletCode, version + " bookmarklet") result = re.sub('\n', ' ', result) # Fit all in a single line # result = re.sub('\s+', ' ', result) # Collapse "redundant" spaces. WARNING: this could have some evil side effects on constant strings used inside to code!! # result = re.sub('\s?([,\+=\(\)\{\};])\s?', '\\1', result) for replacer in replacers: result = re.sub(replacer[0], replacer[1], result) # <!-- escaping required to handle the bookmarklet code within the javascript code --> result = re.sub('\://', '%3a%2f%2f', result) result = re.sub('/', '%2f', result) # result = re.sub('"', '%22', result) result = re.sub('"', '\\"', result) result = re.sub('\"', '%22', result) result = re.sub('\'', '%22', result) result = re.sub('\\\\', '%5c', result) result = result.strip() result = 'javascript:' + result -# replacers = [ -# ('aForm', '_1' ), -# ('inputFields', '_2' ), -# ('passwordFieldsFound', '_3' ), -# ('aDocument', '_6' ), -# ('aLevel', '_7' ), -# # ('result', '_8' ), -# ('documentForms', '_9' ), -# ('iFrames', '_c' ), -# ('anInputElement', '_d' ), -# ('options', '_f' ), -# ('option', '_12'), -# ('aLoginForm', '_13'), -# # ('action', '_17'), -# ('radioValues', '_18'), -# ('radioValueName', '_19'), -# ('inputElement', '_1a'), -# ('elementValues', '_1b'), -# ('radioValue', '_1c'), -# ('values', '_1d'), -# ('objtype', '_21'), -# ('useKey', '_27'), -# ('bookmarkletDiv', '_28'), -# ('someParameters', '_29'), -# ('anException', '_2a'), -# ('newDiv', '_2b'), -# ('base_url', '_2c'), -# ('help_url', '_2d'), -# ('logo_image_url', '_2e'), -# ('background_image_url','_2f'), -# ('close_image_url', '_30'), -# # ('bookmarklet_textarea','_31'), -# ('innerHTML', '_32'), -# ] -# for replacer in replacers: -# result = re.sub('([^\.])' + replacer[0], '\\1' + replacer[1], result) - -# replacers = [ -# ('headNode', '_1' ), -# ('clipperzScriptNode', '_2' ), -# ] -# for replacer in replacers: -# result = re.sub('([^\.])' + replacer[0], '\\1' + replacer[1], result) - -# result = re.sub(';', ';\n', result) - return result - def bookmarklet (self): cacheKey = 'bookmarklet' if not self.processedFiles.has_key(cacheKey): result = 'bookmarklet="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet.js']), "regular") + '";bookmarklet_ie="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet_IE.js']), "IE") + '";' self.processedFiles[cacheKey] = result else: result = self.processedFiles[cacheKey] return result def replaceTemplatePlaceholders (self, pageTitle, copyright, css, code, jsLoadMode, version, versionType): result = self.template() result = result.replace('@page.title@', pageTitle) result = result.replace('@copyright@', copyright) result = result.replace('@css@', css) #result = result.replace('@bookmarklet@', bookmarklet) result = result.replace('@application.version@', version) result = result.replace('@application.version.type@', versionType) result = result.replace('@js_' + jsLoadMode + '@', code) result = re.sub('@js_[^@]+@', '', result) return result def assembleCopyrightHeader (self): processedFile = 'copyright' if not self.processedFiles.has_key(processedFile): #self.log("assembling copyright header") copyrightValues = self.settings['copyright.values'] license = self.loadFilesContent('../../properties', ['license.txt']) result = self.loadFilesContent('properties', ['creditsAndCopyrights.txt']) result = re.sub('@clipperz.license@', license, result) for key in copyrightValues: result = re.sub('@'+key+'@', copyrightValues[key], result) self.processedFiles[processedFile] = result return self.processedFiles[processedFile] def cssTagsForFiles (self, basePath, files): #<link rel="stylesheet" type="text/css" href="./css/reset-min.css" /> return '\n'.join(map(lambda file: '<link rel="stylesheet" type="text/css" href="' + basePath + '/' + file + '" />', files)) def cssTagForContent (self, content): return '<style type="text/css">' + content + '</style>' def scriptTagsForFiles (self, basePath, files): #<script type='text/javascript' src='./js/src/bookmarklet.js'></script> return '\n'.join(map(lambda file: '<script type="text/javascript" src="' + basePath + '/' + file + '" charset="utf-8"></script>', files)) def scriptTagForContent (self, content): return '<script>' + content + '</script>' def assembleVersion (self, pageTitle, copyright, css, js, jsLoadMode, version, versionType): cacheKey = version + "-" + versionType if not self.processedFiles.has_key(cacheKey): result = self.replaceTemplatePlaceholders(pageTitle, copyright, css, js, jsLoadMode, version, versionType) self.processedFiles[cacheKey] = result else: result = self.processedFiles[cacheKey] #self.log("# cacheKey:\n" + result) return result def assemble (self, assemblyMode='INSTALL', versionType='LIVE'): if versionType == 'LIVE': pageTitle = "Clipperz - " + self.module else: pageTitle = "Clipperz - " + self.module + " [" + versionType + " - " + assemblyMode +"]" if assemblyMode == 'INSTALL': copyright = self.assembleCopyrightHeader() css = self.cssTagForContent(self.compressCSS(self.loadFilesContent('css', self.settings['css']))) js = self.scriptTagForContent( self.bookmarklet() + '\n' + self.compressJS(self.loadFilesContent('js', self.settings['js']), "application") ) jsLoadMode = 'EMBEDDED' elif assemblyMode == 'DEBUG': copyright = self.assembleCopyrightHeader() css = self.cssTagsForFiles('./css', self.filterFiles(self.settings['css'])) - js = self.scriptTagForContent(self.bookmarklet()) + \ + js = self.scriptTagForContent( + self.bookmarklet()) + \ '\n' + \ - self.scriptTagsForFiles('./js', self.filterFiles(self.settings['js'])) + self.scriptTagsForFiles('./js', self.filterFiles(self.settings['js']) + ) jsLoadMode = 'LINKED' elif assemblyMode == 'DEVELOPMENT': copyright = "" css = self.cssTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'css')), self.filterFiles(self.settings['css'])) - js = self.scriptTagForContent(self.bookmarklet()) + \ + js = self.scriptTagForContent( + self.bookmarklet()) + \ '\n' + \ - self.scriptTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'js')), self.filterFiles(self.settings['js'])) + self.scriptTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'js')), self.filterFiles(self.settings['js']) + ) jsLoadMode = 'LINKED' versionType = 'development' else: raise NotImplementedError() return self.assembleVersion( pageTitle = pageTitle, copyright = copyright, css = css, js = js, jsLoadMode = jsLoadMode, version = self.repositoryVersion, versionType = versionType ) diff --git a/scripts/builder/frontends/betaBuilder.py b/scripts/builder/frontends/betaBuilder.py index c5a3e76..9b32404 100644 --- a/scripts/builder/frontends/betaBuilder.py +++ b/scripts/builder/frontends/betaBuilder.py @@ -1,14 +1,17 @@ from frontendBuilder import FrontendBuilder import shutil class BetaBuilder(FrontendBuilder): def name(self): return "/beta builder" + def projectResourceTypes (self): + return ['js', 'css', 'images'] + def copyStaticResources (self, targetFolder): for file in self.filterFiles(self.settings['staticResources']): src = self.absolutePathForSourceFile('staticResources', file) dst = self.absolutePathForTargetFile(targetFolder, '', file) shutil.copy2(src, dst) diff --git a/scripts/builder/frontends/deltaBuilder.py b/scripts/builder/frontends/deltaBuilder.py new file mode 100644 index 0000000..a341a83 --- a/dev/null +++ b/scripts/builder/frontends/deltaBuilder.py @@ -0,0 +1,16 @@ +from frontendBuilder import FrontendBuilder +import shutil + +class DeltaBuilder(FrontendBuilder): + + def name(self): + return "/delta builder" + + def projectResourceTypes (self): + return ['js', 'css'] + + def copyStaticResources (self, targetFolder): + pass + + def bookmarklet (self): + return ""
\ No newline at end of file diff --git a/scripts/builder/frontends/gammaBuilder.py b/scripts/builder/frontends/gammaBuilder.py index a6ecb7b..c56fb1b 100644 --- a/scripts/builder/frontends/gammaBuilder.py +++ b/scripts/builder/frontends/gammaBuilder.py @@ -1,27 +1,30 @@ from frontendBuilder import FrontendBuilder import shutil class GammaBuilder(FrontendBuilder): def name(self): return "/gamma builder" + def projectResourceTypes (self): + return ['js', 'css', 'images'] + def copyStaticResources (self, targetFolder): resourcesToCopy = [ # {'folder': 'html', 'source': 'exit_template.html', 'target': 'exit.html'}, {'folder': 'html', 'source': 'exit_template.html', 'target': 'logout.html'}, {'folder': 'css', 'source': 'static.css', 'target': 'static.css'} ] for resource in resourcesToCopy: src = self.absolutePathForSourceFile(resource['folder'], resource['source']) dst = self.absolutePathForTargetFile(targetFolder, '', resource['target']) shutil.copy2(src, dst) # src = self.absolutePathForSourceFile('html', 'exit_template.html') # dst = self.absolutePathForTargetFile(targetFolder, '', 'exit.html') # shutil.copy2(src, dst) # src = self.absolutePathForSourceFile('css', 'static.css') # dst = self.absolutePathForTargetFile(targetFolder, '', 'static.css') # shutil.copy2(src, dst) diff --git a/scripts/builder/frontends/gamma_mobileBuilder.py b/scripts/builder/frontends/gamma_mobileBuilder.py index f2e80c9..677a2b0 100644 --- a/scripts/builder/frontends/gamma_mobileBuilder.py +++ b/scripts/builder/frontends/gamma_mobileBuilder.py @@ -1,9 +1,12 @@ from frontendBuilder import FrontendBuilder class Gamma_MobileBuilder(FrontendBuilder): def name(self): return "/gamma.mobile builder" + def projectResourceTypes (self): + return ['js', 'css', 'images'] + def copyStaticResources (self, targetFolder): pass diff --git a/scripts/proxy/main.py b/scripts/proxy/main.py index 107ba16..8ce4989 100755 --- a/scripts/proxy/main.py +++ b/scripts/proxy/main.py @@ -1,95 +1,102 @@ from twisted.internet import reactor from twisted.web import proxy, server, http, resource, static from posixpath import basename, dirname import copy import sys import os import pprint #-------------------------------------------------------------------- def scriptDir (): return os.path.dirname(sys.argv[0]) def projectBaseDir (): return os.path.abspath(scriptDir() + '/../..') def projectTargetDir(): return projectBaseDir() + '/target/' #-------------------------------------------------------------------- class ClipperzTestSite(server.Site): def __init__(self, resource, logPath=None, timeout=60 * 60 * 12): server.Site.__init__(self, resource, logPath, timeout) def getResourceFor(self, request): - if request.uri.startswith('/json') or request.uri.startswith('/dump'): + uri = request.uri + uri = uri.split("?", 1)[0] + uri = uri.split("#", 1)[0] + if uri.startswith('/json') or uri.startswith('/dump'): request.site = self request.sitepath = copy.copy(request.prepath) result = resource.getChildForRequest(self.resource, request) else: - pathParts = request.uri.split('/') + pathParts = uri.split('/') version = pathParts[1] if pathParts[2].startswith('index.'): contentType = 'text/html' absoluteFilePath = os.path.join(projectTargetDir(), 'dev', version, pathParts[2]) result = static.File(absoluteFilePath, contentType) - + elif pathParts[2].endswith('.webapp'): + contentType = 'application/x-web-app-manifest+json' +# absoluteFilePath = os.path.join(projectTargetDir(), 'dev', version, pathParts[2]) + absoluteFilePath = os.path.join(projectBaseDir(), 'frontend', version, 'properties', pathParts[2]) + result = static.File(absoluteFilePath, contentType) else: # http://homer.local:8888/beta/css/clipperz/images/loginInfoBackground.png # pathParts: ['', 'beta', 'css', 'clipperz', 'images', 'loginInfoBackground.png'] try: imagePathIndex = pathParts.index('images') resourceType = 'images' for _ in range(2, imagePathIndex): del pathParts[2] except: resourceType = pathParts[2] basePath = projectBaseDir() + '/frontend' if resourceType == 'images': - fileExtension = os.path.splitext(request.uri)[1] + fileExtension = os.path.splitext(uri)[1] if fileExtension == '.png': contentType = 'image/png' elif fileExtension == '.jpg': contentType = 'image/jpeg' elif fileExtension == '.gif': contentType = 'image/gif' else: print "ERROR - unknown image extension: " + fileExtension absoluteFilePath = basePath + '/'.join(pathParts) else: resourceType = pathParts[2] if resourceType == 'css': contentType = 'text/css' elif resourceType == 'js': contentType = 'text/javascript' else: contentType = 'text/html' - absoluteFilePath = basePath + request.uri + absoluteFilePath = basePath + uri result = static.File(absoluteFilePath, contentType) return result def main (): - site = ClipperzTestSite(proxy.ReverseProxyResource('localhost', 8084, '/java-backend')) + site = ClipperzTestSite(proxy.ReverseProxyResource('localhost', 8080, '/java-backend')) reactor.listenTCP(8888, site) reactor.run() if __name__ == "__main__": main() |